LoginSignup
5
8

More than 1 year has passed since last update.

RMarkDown でPDF出力

Last updated at Posted at 2021-03-19

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が通って、無事に出力された!

image.png

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!

できた!

image.png

他にも色々と参考になった。

図表番号を入れる・参照する。

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中の日本語出力

print()だと以下の通り、漢字の出力うまくいかない。
image.png

cat()だとうまくいく。
image.png

markdown記法での表の調整

表タイトルと相互参照

自作の表の上に一行空白行を置いて、Table: *****と書けばよい。相互参照はlatexの基本に則って、\label{}をつければOK.

Table: 有意であった施策 \labe{有意であった施策}

項目|内容|
|:--|:--|
Q8|ほげほげほげ
Q6|ほげほげほげ

image.png

Markdown記法での表の列幅

2行目に配置指示と合わせて記載するハイフン-の数で決まるようだ。

|クラスタ|名前|特徴
|:--|:--|:---|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。

image.png

|クラスタ|名前|特徴
|:--|:--|:------------------|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。

image.png

任意の行で横罫線を引く

横罫線を引きたい個所のすぐ下の行頭に\hlineを置けばよい。

|クラスタ|名前|特徴
|:--|:--|:---|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
\hline グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。

image.png

注意点として、\hlineの直後は半角スペースを置かないといけない。また、行頭の縦罫線|は省略するか、\hlineを縦罫線の後に置く。縦罫線の前に\hlineを置いてしまうと空白のセルが1つできてしまう。

#そのほか参考:

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8