Nylog

R Markdownでpdf出力する時の図の位置設定

2019-09-09

R Markdown・knitr・pandocを利用して、Markdownで記述した文章と、R言語で集計した図表を自動的にpdfなどにまとめることができます。 図表を画像化してレポートに貼る必要がなくなるため、論文・レポートの作成に非常に便利です。

しかし、pdfに出力する際に、Markdown記法で挿入した画像が常にページ上方に表示されるという仕様があり、構成によっては文章と画像の順番が非常にわかりにくくなることがありました。

解決策がstack overflowに載っていたのですが、日本語記事ではその解決策に関する言及がなかったため書いておきます。

症状

下のようなMarkdownを書いたとします。

# 章1
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。

![アヤメ](./iris.jpeg){#fig:01 width=30%}

あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。

# 章2
あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。

通常のpandocであれば、

  1. 章1の段落1
  2. 画像
  3. 章1の段落2
  4. 章2

という順番になるはずですが、下の画像のように、画像が一番上に来てしまいます。

表示位置をコード記述位置に変更する

stack overflowのQAに記載されていますが、このコードでは、pandocが出力するlatexコードのfigureの表示位置オプションを、コード記述位置に表示する “H” オプションに置き換えます。 該当のコードを、rmd冒頭のyamlヘッダで指定しているtexファイル・styファイルに記述します。

\usepackage{float}
\let\origfigure\figure
\let\endorigfigure\endfigure
\renewenvironment{figure}[1][2] {
    \expandafter\origfigure\expandafter[H]
} {
    \endorigfigure
}

画像ごとにhtbpの指定はできないため、画像の挿入位置や画像の高さなどに気を使う必要がありますが、わかりにくい位置に画像が表示されることを防ぐことができます。

実装例

画像位置設定や段落字下げ設定といった、styファイルの記述例などをGitHubに公開しています。

参考