メモ:rmarkdown
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
メモ:rmarkdown [2020/12/24 11:40] – [PDF出力用の基本設定] Wiki Editor | メモ:rmarkdown [2023/06/22 11:00] (現在) – [RStudio ServerでRMarkdownのチャンク出力のフォント設定] Wiki Editor | ||
---|---|---|---|
行 30: | 行 30: | ||
- \setmainfont{Century} | - \setmainfont{Century} | ||
- \setsansfont{Century} | - \setsansfont{Century} | ||
- | - \setjamainfont{IPAexMincho} | + | |
+ | # 日本語フォント設定 | ||
+ | # 太字指定の場合のフォントをオプションで指定 | ||
+ | # 太字指定(\textbf)でゴシック体にする。kableExtraのrow_specなどのBold設定の場合など | ||
+ | | ||
- \setjasansfont{IPAexGothic} | - \setjasansfont{IPAexGothic} | ||
- \usepackage{float} | - \usepackage{float} | ||
行 43: | 行 47: | ||
- \sectiondot{section} # セクション番号に「.」を追加 | - \sectiondot{section} # セクション番号に「.」を追加 | ||
#- \renewcommand{\thesection}{\arabic{section}} # セクション番号のフォーマットを変更するとき | #- \renewcommand{\thesection}{\arabic{section}} # セクション番号のフォーマットを変更するとき | ||
+ | | ||
- \renewcommand{\labelitemi}{■} | - \renewcommand{\labelitemi}{■} | ||
- \renewcommand{\labelitemii}{$\circ$} | - \renewcommand{\labelitemii}{$\circ$} | ||
行 85: | 行 89: | ||
# 余白を調整するとそのままでは本文文字にページ番号などが被る場合がある | # 余白を調整するとそのままでは本文文字にページ番号などが被る場合がある | ||
# fancyhdrパッケージで調整する。複雑なヘッダ、フッタも作成できるが、とりあえず余白との兼ね合いを調整するためだけに読み込み | # fancyhdrパッケージで調整する。複雑なヘッダ、フッタも作成できるが、とりあえず余白との兼ね合いを調整するためだけに読み込み | ||
- | - \usepackage{fancyhdr} | + | |
- | - \pagestyle{fancy} # ページスタイルを適用 | + | |
- | - \lhead{} # ヘッダ左 | + | |
- | - \chead{} # ヘッダ中央 | + | |
- | - \rhead{} # ヘッダ右・・・いずれも空にする | + | |
- | - \renewcommand{\headrulewidth}{0.0pt} # ヘッダの区切り線を消す | + | |
- | - \cfoot{\thepage} # フッタ中央にページ番号記載 | + | |
+ | |||
+ | # footerの位置調整 | ||
+ | - \setlength{\footskip}{10mm} | ||
| | ||
documentclass: | documentclass: | ||
行 106: | 行 113: | ||
| | ||
# Latexのfloatを使う場合の図表のfloatオプションを設定 | # Latexのfloatを使う場合の図表のfloatオプションを設定 | ||
- | knitr:: | + | |
+ | | ||
| | ||
# キャッシュの設定。執筆中は時間短縮のためキャッシュを有効に。最後にOff | # キャッシュの設定。執筆中は時間短縮のためキャッシュを有効に。最後にOff | ||
行 122: | 行 130: | ||
## 1. cairo_pdf を使う方法 | ## 1. cairo_pdf を使う方法 | ||
# * family には OS にインストールされているフォント名を指定する。 | # * family には OS にインストールされているフォント名を指定する。 | ||
- | | + | knitr:: |
- | knitr:: | + | |
} | } | ||
``` | ``` | ||
行 134: | 行 141: | ||
| | ||
``` | ``` | ||
- | + | ===== YAMLヘッダの注意点 ===== | |
+ | YAMLヘッダからLatexのプリアンブルにコマンドを渡すとき、「# | ||
+ | |||
+ | |||
+ | - \foobar{# | ||
+ | |||
+ | |||
+ | 上記ではエラーとなるため | ||
+ | |||
+ | |||
+ | - ' | ||
+ | |||
+ | |||
+ | のように、シングルクォートでくくるとよい。 | ||
+ | |||
+ | |||
+ | ===== RmarkdownにLatexコマンドを直接埋め込む ===== | ||
+ | Rmarkdown内に「\」で始まるコマンドを直接書けば、単純なコマンドならばpandocが自動的にLatexコマンドと判断してそのまま利用できる。しかし、複雑なコマンドは文字列として解釈されてしまい、Latexソースに変換する段階でエスケープされてしまう。それを回避するためには、Latexチャンクで直接Latexコマンドを記載するとよい。 | ||
+ | |||
+ | ```{=latex} | ||
+ | Latexコマンド... | ||
+ | |||
+ | ``` | ||
+ | |||
+ | チャンクに「=latex」と指定すれば、チャンク内はすべてLatexにそのまま渡される。 | ||
===== パラグラフ間の余白(パラグラフ送り) ===== | ===== パラグラフ間の余白(パラグラフ送り) ===== | ||
行 252: | 行 283: | ||
float.pos = " | float.pos = " | ||
) | ) | ||
+ | |||
+ | ==== 数値の桁そろえ ==== | ||
+ | texregでも、次のトピックのようにPDF出力時にsiunitxを利用して桁そろえができる。 | ||
+ | |||
+ | オプションに以下を与えれば自動的に適用される。指定しなければ、有意水準のマークがつくとずれてしまう。 | ||
+ | siunitx = TRUE | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== 数字の桁そろえ ===== | ||
+ | RmarkdownからPDに表を出力する際に、表内の数値の桁をそろえる場合の方法。数値だけの表であれば、基本的にKableで設定できるが、有意水準を示す「***」マークなどを含める場合に、マークの分だけずれてしまう。理想的には、小数点の位置など、マークを抜いた数値部分の桁が揃ってほしい。それを実現するパッケージがLatexの「siunitx」。 | ||
+ | |||
+ | 使い方は、YAMLでパッケージを読み込む。 | ||
+ | < | ||
+ | - \usepackage{siunitx} | ||
+ | #- \newcolumntype{d}{S[table-format=3.2]} | ||
+ | #- \newcolumntype{d}{S[table-format=+3]} | ||
+ | </ | ||
+ | |||
+ | 次に、kableのalignオプションで、桁そろえを適用する列に「S」を設定する。ないしは「S[オプション]」のように、siunitxのオプションも一緒に設定する。オプションは、上記のように別の文字にカラムタイプを設定し、その文字を設定してもよい。 | ||
+ | |||
+ | knitr:: | ||
+ | caption=" | ||
+ | align = c(" | ||
+ | digits = 3, | ||
+ | format.args = list(nsmall=3) | ||
+ | ... | ||
+ | |||
+ | ついでに、数字だけの桁そろえは、小数点以下の桁数はdigitsで指定し、その桁まで少数がない場合に0で埋めるには、format.argsにnsmallを与えると、その桁まで必ず表示される。 | ||
+ | |||
+ | なお、siunitxを利用すると" | ||
+ | |||
+ | # 色を付ける行にextra_latex_afterでLatexのオプションを与えて色を付ける。 | ||
+ | ## なお、ここでの指定はヘッダではなく表の内容の1行目が「0」として、色を付ける行数を指定する。 | ||
+ | row_spec(c(2, | ||
+ | |||
===== 図のテキスト回り込み ===== | ===== 図のテキスト回り込み ===== | ||
行 298: | 行 366: | ||
ということで、何とか回り込みを設定できるものの、いろいろと問題が多い。素直にRmarkdownから指定できるようになってほしい。 | ということで、何とか回り込みを設定できるものの、いろいろと問題が多い。素直にRmarkdownから指定できるようになってほしい。 | ||
+ | |||
+ | ===== knitrボタンとrender() ===== | ||
+ | |||
+ | Rstudioのknitボタンではうまくいくのに、コンソールからrender()関数でRmdファイルを呼び出してPDFを生成するとき、kableExtraでテーブルにいろいろやっている場合にエラーが出る。スマートな解決ではないが、一応原因らしきものがわかった。原因の追究に役立ったのは以下。 | ||
+ | |||
+ | * [[https:// | ||
+ | |||
+ | 基本的には、knitボタンとrender()関数は同じはずだが、render()関数のenvirの設定などで異なる場合があるらしい。しかし、envir=new.env()としても、エラーは変わらない。上記URLで言及されているが、kableExtraパッケージは、ロードされた段階でYAMLヘッダに必要なLatexパッケージをロードする処理が入っているらしい。knitボタンを押すと、これらが正常に機能するのでうまくPDFまで変換できる。これをreder()関数で処理すると、不足するLatexパッケージをロードしないため、LatexからPDFに変換するところで未定義のコマンドなどが生じてエラーとなる。 | ||
+ | |||
+ | YAMLヘッダのpdf_documentのオプションで「keep_tex: | ||
+ | |||
+ | kableExtraパッケージが必要とするLatexパッケージは、同パッケージのkableExtra_latex_packages()関数で確認できる。ここで出力されるパッケージをあらかじめYAMLヘッダに含めておくと問題が発生しない。 | ||
+ | |||
+ | > kableExtra:: | ||
+ | header-includes: | ||
+ | - \usepackage{booktabs} | ||
+ | - \usepackage{longtable} | ||
+ | - \usepackage{array} | ||
+ | - \usepackage{multirow} | ||
+ | - \usepackage{wrapfig} | ||
+ | - \usepackage{float} | ||
+ | - \usepackage{colortbl} | ||
+ | - \usepackage{pdflscape} | ||
+ | - \usepackage{tabu} | ||
+ | - \usepackage{threeparttable} | ||
+ | - \usepackage{threeparttablex} | ||
+ | - \usepackage[normalem]{ulem} | ||
+ | - \usepackage[utf8]{inputenc} | ||
+ | - \usepackage{makecell} | ||
+ | - \usepackage{xcolor} | ||
+ | |||
+ | キャッシュが問題らしいということで、もう少し検証を進めてみた。RstudioでRセッションを再起動し、その直後(環境に何もロードしていない状態)にしてrender()関数を呼ぶと、上記の処理をしなくても問題なくPDFに変換される。ただし、同じ関数をもう一度呼ぶとエラーになる。このとき、既に環境としてkableExtraがロードしているため問題になるようだ。render()関数のenvirにnew.env()を設定しても、完全に真っ新な環境から始まるわけではないため、既にkableExtraが読み込まれた状態だと判断されるのだろうか。 | ||
+ | |||
+ | この問題に行き当たったのは、連続的にPDFを生成しようとしてrender()関数をループで呼び出したときにエラーが出たことである。knitボタンを使う場合、Rstudioの新しい環境を用意したうえで作業が行われるが、Rスクリプトからrender()関数を呼ぶ場合は、new.env()を与えても、結局は現在のglobal環境から派生した新しい環境になる(Rスクリプトがわで用意した変数に、renderで呼び出したRmdファイル内からアクセスできている)ので、kableExtraパッケージがロードされている前提でうごいてしまい、YAMLヘッダにLatexパッケージが読み込まれないような気がする。rstudioapi:: | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== 丸囲み文字 ===== | ||
+ | |||
+ | Rmarkdownで丸囲み文字を出力するには、Latexのコマンドを使って以下のようにする。 | ||
+ | |||
+ | \raise0.2ex\hbox{\textcircled{\scriptsize{1}}} | ||
+ | |||
+ | しかし、行頭で用いるとエラーになってしまう。 | ||
+ | |||
+ | ! You can't use `\raise' | ||
+ | |||
+ | はっきりわかっていないが、\raiseコマンドを行頭に持ってくると「垂直モード」で利用していると判定されてエラーになってしまうようだ。\raiseは無くてもかまわないが、行が若干ずれるため見栄え的には入れたい。そこで色々試した結果、行頭に持ってくる場合は以下の設定があまり問題ないようである。 | ||
+ | |||
+ | \indent\raise0.2ex\hbox{\textcircled{\scriptsize{4}}} | ||
+ | または | ||
+ | \noindent\raise0.2ex\hbox{\textcircled{\scriptsize{4}}} | ||
+ | |||
+ | インデントを入れてやることで、行内だと判断できるようになるようだ。どちらを使うかは、行頭のインデントの絶対設定と合わせておけばよいだろう。 | ||
+ | |||
+ | |||
+ | ===== 丸囲み数字等のフォント ===== | ||
+ | Rmarkdownからxelatexを経由してPDFを作成する際に、丸囲み数字など(①)がフォント抜けで豆腐になっていたのを解決。問題は単純なフォント設定だったが、フォント設定は基本的に変えたくなかったので、いろいろ調査してわかったこと。 | ||
+ | |||
+ | xelatexはTTFフォントを直接指定することができる便利なtexなので、Rmarkdownからの出力はこれを利用している。この時、日本語を利用するために以下の設定をしている。ドキュメントクラスの読み込みでfontspecやzxjatypeはusepackageをしなくてもよいかもしれない。 | ||
+ | |||
+ | RmakdownのYAMLヘッダ(該当箇所のみ) | ||
+ | documentclass: | ||
+ | classoption: | ||
+ | header-includes: | ||
+ | # 欧文フォントの指定 | ||
+ | - \usepackage{fontspec} | ||
+ | - \setmainfont{Times New Roman} | ||
+ | - \setsansfont{Times New Roman} | ||
+ | # 和文フォントの指定 | ||
+ | - \usepackage{zxjatype} | ||
+ | - \setCJKmainfont[BoldFont=IPAexGothic]{IPAexMincho} | ||
+ | - \setCJKsansfont{IPAexGothic} | ||
+ | |||
+ | |||
+ | Texソースでは以下のように展開される。 | ||
+ | \documentclass[xelatex, | ||
+ | \setmainfont{Century} | ||
+ | \setsansfont{Century} | ||
+ | \setCJKmainfont[BoldFont=IPAexGothic]{IPAexMincho} | ||
+ | \setCJKsansfont{IPAexMincho} | ||
+ | |||
+ | 使っているフォントはともかくとして、以上の設定でだいたいスムーズにタイプセットしてPDFがうまく生成されていたのだが、丸囲み数字などがフォント抜けしてしまい、その都度丸囲み数字を生成するコードを挿入していた。文章を書いている場合には、自分で丸囲み数字を使う箇所を認識しているので問題はないが、アンケートの自由記述欄などテキストデータを読み込んで、一括して整形・出力するようなコードを書くと、どうしても入力された文字に混ざってしまう。逐一見つけて置換などをしても、気づかないフォント抜けなどが発生してしまうことがあり、いままで気づいた文字を置換リストに貯めていたが、非効率だしユニコードの世界では解決できるはずだと思い調査。 | ||
+ | |||
+ | 原因は非常に単純な点にあった。問題は、丸囲み数字の箇所が「欧文」として扱われており、Times New Romanにコードポイントに対応するフォントが用意されておらず、フォントが抜けてしまう様だった。試しに欧文フォントをIPAフォントに変えてみると、ごく普通に丸囲み数字もPDFで表示できる。丸囲み数字を入力するのが日本語IMEで変換するため、てっきり日本語の全角文字扱いだと思っていたが、かつてと異なりユニコードでは①はU+2460というコードポイントが割り当てられており、このコードが入力されている。そして、このコードがある範囲がxelatexでは欧文として扱われるため、欧文フォントの設定が適用されていたためにフォント抜けが発生していた。 | ||
+ | |||
+ | 単純な解決策は、欧文もすべて日本語フォントにすること。IPAex明朝などは、半角文字もきれいに出力できるので、これはこれでよい。しかし、どうしてお欧文には別フォントを利用したい場合、丸囲み数字の箇所だけフォント指定するとか、段落単位で逐一フォント指定するとか個別対応が必要となる。これでは、個別に置換するのと手間はあまり変わらない。そこで以下を参考に設定を追加。 | ||
+ | |||
+ | |||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | \xeCJKDeclareSubCJKBlock{kigou}{" | ||
+ | |||
+ | 上記のように、xeCJKパッケージの\xeCJKDeclareSubCJKBlockで、和文として扱うコードの範囲を指定してやる。単純に和文として扱うだけなら、上記のように必要な個所のコードを指定すれば、全体で設定している和文フォントが利用される。「kana」は識別名なので何でもよい。範囲の指定は、コードポイントでも、コードポイントに対応する文字でも指定できるようだ。また、必要に応じてここで指定したブロックだけ別フォントを割り当てることも可能。< | ||
+ | |||
+ | \xeCJKDeclareSubCJKBlockでASCII以外のほぼすべてのコードポイントを指定していたが、やはり横着したのはよくなかった。詳細は調べていないが、ここで指定されたブロックは、文字送りや禁則処理のルールが別扱いになるようで、「。」が行頭に出てしまったりと、美しい組版にあらない。ということで、記号が入っているブロックに絞って指定する。とりあえず「" | ||
+ | |||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== kableから出力されるLatexコードを加工する ===== | ||
+ | |||
+ | kableExtraのcollapse_rowsを使って繰り返しのあるセルをまとめてBooktabs形式の罫線を引くと、まとめたセルの縦方向の位置がおかしくなる。 | ||
+ | |||
+ | collapse_rows(1: | ||
+ | | ||
+ | この場合、縦に結合したセル内の文字が、結合していない行の一番上の行と同じところに来てほしいが、自動的にはそろわない。kableExtraの作者によると、Latexのmultirowの長さ計算の問題らしい。latex_hline=" | ||
+ | |||
+ | collapse_rows(1: | ||
+ | gsub(" | ||
+ | |||
+ | このように、\multirowのコマンドの部分の< | ||
+ | |||
+ | ===== kableで出力するテーブル内の文字の回転 ===== | ||
+ | ラベルに長い文字列を使うようなとき、表頭の文字列を90度回転して縦方向にしたい時がある。その場合は、kableExtraのrow_specを使えばよい。 | ||
+ | |||
+ | kable() %> | ||
+ | .... %>% | ||
+ | .... %>% | ||
+ | row_spec(0, angle = -90) | ||
+ | |||
+ | これで0行目=ヘッダの文字列を90度回転できる。この他にも、セルごとに個別に設定するには、cell_specも使える。 | ||
+ | |||
+ | DATA[1, 5] <- cell_spec(DATA[1, | ||
+ | |||
+ | cell_specはセル内にLatexなりHTMLのコードを直接埋め込む。したがって、個々のセルに対して処理を行っておく必要がある。テーブルのヘッダの場合は、cell_specを利用して必要なコードを埋め込んだヘッダのベクトルを生成し、kableのcol.namesに渡すという手間がかかる。なおcell_specはLatexのコードをデータに直接埋め込むので、kabelのオプションで「escape=FALSE」を指定しておかないと、コードがそのまま文字として出力されてしまう。 | ||
+ | |||
+ | 上記は両方指定しても効果を発揮する。そのため、行全体を90度回転させ、特定のセルだけ-90度回転するように指定すれば、そのセルだけ回転させないということができる。 | ||
+ | |||
+ | 文字列を回転する際に、回転の中心点を決めることができる。angleを指定すると、Latex側では\rotateboxで文字列が回転される。この時、標準では文字列の左端を中心に回転が行われる。「angle=90」ならば、文字列の先頭を中心に反時計回りに回転するので、行内の全てのセルにangle=90が設定されている場合、文字列の先頭が下にきて先頭がセルの下で揃うことになる。逆に「angle=-90」とすると、文字列の先頭を中心に時計回りに回転するため、文字列の先頭が上にきてセルの上で先頭が揃う。 | ||
+ | |||
+ | この時、angle=-90で時計回りに回転しつつ、文字列をセルの下で揃えたい場合には、回転の中心を文字列の末尾=右端にする必要がある。右端を中心に時計回りすると、行頭が持ち上がる形で回転し、文字列はセルの下側で揃うことになる。しかしkableExtra側ではオプションがないので、Latexのコマンドで調整する。angleを設定した際に利用される\rotateboxのオプションは以下の通り。 | ||
+ | |||
+ | \rotatebox[回転の中心など]{角度}{対象の文字列} | ||
+ | |||
+ | kableExtraでは\rotateboxの回転の中心は指定されずデフォルトでハードコーディングされているため、このページに記載したようにLatexのコードを文字列として変数に入れ無理やり正規表現で書き換えるか、一時的に\rotateboxコマンドの定義を書き換える。後者の場合は、以下のようにする。 | ||
+ | |||
+ | \let\orgrotatebox\rotatebox% | ||
+ | \renewcommand{\rotatebox}[2]{\orgrotatebox[origin=r]{# | ||
+ | |||
+ | 基本的には、renewcommandで\rotateboxの定義をオプションを指定した状態に書き換えることで、kableから呼ばれたときに、改変された\rotateboxが用いられるため、文字列の右端を中心に回転され目的の挙動となる。ここで注意が必要なのは、\rotateboxの再定義に\rotateboxコマンドを直接使うと、再帰的に展開されてリソースを食い尽くしてエラーとなる(ハマった)。そこで、いったん\letコマンドを使って一旦「\rotatebox」を「\orgrotatebox」にコピーしておき、コピーしたコマンドを使って\rotateboxの定義を再定義する。コピーしておいたコマンドは、ここでの変更を元に戻す際にも使う。なお、行末の「%」はコマンドは、Latexで単一改行が空白として扱われてコマンドが連続したように解釈され、不用意なエラーを生じることを回避するもので、ここでは必要ないかもしれない。 | ||
+ | |||
+ | \renewcommandの使い方は | ||
+ | |||
+ | \renewcommand{対象のコマンド}[引数の数]{再定義したコマンドの内容} | ||
+ | |||
+ | なので、ここでは\orgrotateboxにコピーしたオリジナルの\rotateboxを使って、オプションの回転中心点を決める[origin=r]を指定した状態の\rotateboxコマンドを再定義している。origin=rで文字列の右端を回転軸にする。他にもx, | ||
+ | |||
+ | |||
+ | ===== RStudio ServerでRMarkdownのチャンク出力のフォント設定 ===== | ||
+ | |||
+ | RStudioでRMarkdownファイルを作成すると、チャンクの出力をインラインで確認できる。この時、ggplot等でグラフを出力する場合のグラフィックデバイスはTools > Global Options > General > Graphics > Graphics Device > Backendで指定できる。ここでCairoやAGGを選択すれば日本語も出力できるが、デフォルトのフォントの指定ができない。 | ||
+ | |||
+ | ggplot等でフォントの指定をしなければ、標準のfallbackフォントが使われる。RStudio ServerをLinuxで動かしていると、Linux側の設定に従う。そのままでも日本語は表示されるといえばされるが、字形がどうも中国語っぽいものが使われるので、任意のものにしたい。 | ||
+ | |||
+ | そこで、Linuxの標準のフォント設定を変更する。RStudio以外にも影響するが、他も変更したいので問題なし。これでRStudioのセッションを再起動すれば、フォールバックフォントが変更されているのでチャンクのインラインプレビューの描画にも反映される。本来は上記のグラフィックデバイスの設定に追加オプションでフォント等の指定もできるとよいのだが。。 | ||
+ | |||
+ | * / | ||
+ | |||
+ | <?xml version=" | ||
+ | < | ||
+ | < | ||
+ | <match target=" | ||
+ | <test qual=" | ||
+ | < | ||
+ | </ | ||
+ | <edit name=" | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | <match target=" | ||
+ | <test qual=" | ||
+ | < | ||
+ | </ | ||
+ | <edit name=" | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | <match target=" | ||
+ | <test qual=" | ||
+ | < | ||
+ | </ | ||
+ | <edit name=" | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | <match target=" | ||
+ | <test qual=" | ||
+ | < | ||
+ | </ | ||
+ | <edit name=" | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | <match target=" | ||
+ | <test qual=" | ||
+ | < | ||
+ | </ | ||
+ | <edit name=" | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
メモ/rmarkdown.1608777623.txt.bz2 · 最終更新: 2020/12/24 11:40 by Wiki Editor