Rmarkdownを使ってレポートをPDF出力させたい。
で、見様見真似でネットの情報を探しながらやったが、なかなかうまくいかなかった。
以下、それへの対応。
インストール
まずは、RStudioを一回インストールしなおして0からスタート。
んでから、以下ページを参考に、tinytexをインストール。
rmarkdownファイルの作成
rmarkdownをRStudioから作るときに、デフォルトで入っているものから、以下のページを参考にYAMLを変更。
output:
pdf_document:
latex_engine: xelatex
documentclass: bxjsarticle
classoption: xelatex,ja=standard
geometry: no
pdfcropとghostscriptがない!と怒られる。
でknitすると、以下のエラー。
Tool(s) not installed or not in PATH: pdfcrop, ghostscript
以下のページを参考に、pdfcropとghostscriptをインストールしてみた。
PDFcropは以下のコマンドをたたく。
tinytex::tlmgr_install("pdfcrop")
Ghostscriptは以下からDL,Install. 環境変数でパス通すのも忘れずに。
geometryパッケージ関係で怒られる。
再度knit.
今度は以下のエラー。
LaTeX Error: Option clash for package geometry.
で以下のページを参考にしてみる。
こちらのページではPandocの設定を弄るとある。
やけど、弄ろうにも、このページに記載していある通りに出力に--templateなんで書かれてないし、フォルダを探し回ってもそれっぽいファイルも見つからない。バージョンが違うからか?
どうしようか。。。と再度ググってみると、以下のページを発見。
こちらの最後の注釈に少し書いてあるように、geometry: no
を消す。
無事出力!
するとknitが通って、無事に出力された!
font問題発生
YAMLの書き方で、以下のような書き方もある。これは最初のリンクで紹介したページを参考にしたもの。
output:
pdf_document:
latex_engine: xelatex
documentclass: bxjsarticle
header-includes:
- \usepackage{zxjatype}
- \usepackage[ipa]{zxjafont}
ってことで、これでやってみたら、「フォントが見つからん」って怒られた。
! Package fontspec Error: The font "IPAMincho" cannot be found.
tinytex::tlmgr_install("ipaex")
をやってみてフォントをインストールしてみる。
けどやっぱりだめ。
ipaexフォントを以下のページからダウンロードしてきて、Windowsに直接インストールしてみてもだめ。
うーん・・・と思って、ふと思ったのが、ipaexのフォントやのに、プリアンブルの指定がipa
なのがおかしいんちゃうん?っていう点。
てことで、プリアンブルをipaexに変えてみた。
output:
pdf_document:
latex_engine: xelatex
documentclass: bxjsarticle
header-includes:
- \usepackage{zxjatype}
- \usepackage[ipaex]{zxjafont}
するとうまくいった!!
あー、眠た~~~~。
ggplot2を含む箇所でコンパイルエラー!
うまくいったと思って、じゃあ、自分のデータ分析結果をknitしようとしたら、以下のコンパイルエラー。
! File ended while scanning use of \@xverbatim.
<inserted text>
\par
<*> Report.tex
エラー: LaTeX failed to compile Report.tex. See https://yihui.org/tinytex/r/#debugging for debugging tips. See Report.log for more info.
一個一個切り分けて原因を探ると、ggplot2 で描いた画像を出力させるところでエラーが出てる。
とうことでググると、以下の情報を見つける。
最初のオプション指定の個所で
knitr::opts_chunk$set(
dev = "cairo_pdf",
dev.args = list(family = "ipaexg")
)
とすればよいとのこと。Cairo_pdfというツールがあるのでそれを使う、というのとfontにipaexgを使えという指定。
ということでこれを設定して、knit!
できた!
他にも色々と参考になった。
図表番号を入れる・参照する。
ggplotの出力に対して図キャプションをつけたいし、文章の中で引用したい。
おなじく、表として出力させるものには表番号をつけたい。
ということでその方法は以下の通り。
図番号
各Chunkの最初の{r}に以下のようにすることで、そのチャンクが出力する図に対してキャプションが付与される。
こういう仕様から、当然、各チャンクが出力する図は1つしか設定できないということですな。
引用したい場合には、\\label{}
をキャプションの中に書き込む。受けたい場合は\ref{}
でok。
{r fig.cap="ほげほげほげ \\label{fig:ほげほげほげ}"}
(2021/3/21追記)
キャプションの中に_
が含まれていると、コンパイルは通るけど、うまくキャプションの処理ができなくなるみたい。
出力されるtexを見てみたら、図の描画指示の部分に\textbackslashってタグが付いてた。なんでかわからんけど、_
は避ける!
表番号
まず表を出力させるためには、表の中身をデータフレームの形で用意しておく必要がある。
その上で、knitrパッケージのkable関数を使う。
例えば以下のような感じ。引用させたい場合のlabelの書き方は図と同じ。
r<-describe(dataset[c("Q1_1","Q1_2","Q1_3")])
description<- data.frame(
Q = c("Q1_1","Q1_2","Q1_3"),
n = r$n,
Mean=r$mean,
SD = r$sd
)
kable(description,
caption = "問1の3つの質問の記述統計量 \\label{tab:Q1_description}" )
kable関数をそのままコンソールに出力させてみると、要はデータフレームをmarkdown記法の表に書き換えてるだけ。
ちなみに上でやっているのは、psychパッケージのdescribe関数で記述統計量を出した後、そのうちのn数と平均と標準偏差だけを表として出力させたいということで、describeの出力から、n数と平均と標準偏差を取り出して、データフレームとして格納している。
タイトルと目次と本文の間にそれぞれ改ページを入れたい。
要はtexなので、texと同じ乗りで\newpage
が使えるし、\tableofcontents
が使える。
これを使って、明示的に目次を作らせればよい。
なお\tableofcontents
で目次を作らせるときには、YAMLのなかの目次作成指示の個所はtoc: no
にしないといけない。
あと\tableofcontents
で目次を作らせると、デフォルトではレベル2(subsection
)までしか表示されない。なので、レベル3(subsubsection
)まで表示させたい場合には以下のようにレベル設定する。
ということでYAMLヘッダの直後に以下を書き込む。
\newpage
\setcounter{tocdepth}{3}
\tableofcontents
\newpage
chunk中の日本語出力
markdown記法での表の調整
表タイトルと相互参照
自作の表の上に一行空白行を置いて、Table: *****
と書けばよい。相互参照はlatexの基本に則って、\label{}
をつければOK.
Table: 有意であった施策 \labe{有意であった施策}
項目|内容|
|:--|:--|
Q8|ほげほげほげ
Q6|ほげほげほげ
Markdown記法での表の列幅
2行目に配置指示と合わせて記載するハイフン-
の数で決まるようだ。
|クラスタ|名前|特徴
|:--|:--|:---|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。
|クラスタ|名前|特徴
|:--|:--|:------------------|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。
任意の行で横罫線を引く
横罫線を引きたい個所のすぐ下の行頭に\hlin
eを置けばよい。
|クラスタ|名前|特徴
|:--|:--|:---|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
\hline グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。
注意点として、\hline
の直後は半角スペースを置かないといけない。また、行頭の縦罫線|
は省略するか、\hline
を縦罫線の後に置く。縦罫線の前に\hline
を置いてしまうと空白のセルが1つできてしまう。
#そのほか参考: