rptパッケージとrmarkdown

T. Yoshiizumi

2017/03/04


<目 次>


1. rmarkdownを扱うための準備

 rptパッケージにはrmarkdownを扱うためのソフトウェアが一通り入っています。

 \rpt\bat または \rpt\bat64 の下にある rpt_set.bat を実行すると、
Windowsの「送る」メニューに次のものが加わります。

    

 マイコンピュータ(explorer)において、
rmarkdown用のファイル test.rmd に焦点を当て、
「送る」メニューを開いて i386_rmarkdown (または x64_rmarkdown)を選びます。

 すると、test.rmd が処理されて test.html などのファイルが新たにできます。

 また、log.txt というファイルもできます。Rとpandocの処理過程がこれに記録されています。

 原稿ファイル test.rmd の文字コードは、日本語Windowsの標準である Shift_JIS(正確には cp932)にします。他の文字コードだとエラーになります。

 できあがる test.html の文字コードは utf-8 です。

    

 rmarkdown の他に RmdRuby というのもあります。

 「送る」メニューの i386_RmdRuby (または x64_RmdRuby) は、
やはり test.rmd を処理するためのものですが、
rmarkdown + pandoc ではなく knitr + ruby で処理します。

 原稿ファイル test.rmd の書き方が若干違ってきます。これについては後述。

目次に戻る


2. 「送る」メニューとバッチコマンド

 「送る」メニューの i386_rmarkdown を選んだ場合、i386_rmarkdown.bat というバッチコマンドが実行されます。

 x64_rmarkdown だと x64_rmarkdown.bat です。

 バッチファイルは、一つのrmdファイルを処理します。

 複数を処理することはできません。

 マイコンピュータ(explorer)で複数のrmdファイルを選択してから「送る」メニューを呼び出しても、一つのrmdファイルしか処理されません。

    

 バッチコマンドの中では、Rプログラム $$MyTemp.r を書き出し、
Rcmd.exe でそれを実行しています。

 Rcmdの処理が終了したら $$MyTemp.r は削除されます。

 $$MyTemp.r の中身は次のとおり。

library(rmarkdown)
library(knitr)
infile.rmd <- "%~nx1"
render(infile.rmd)

 %~nx1 は、バッチコマンドに与えられた第1引数(フォルダ名を取り除いたもの)を指します。

 処理対象のrmdファイルの名前は、Rの変数 infile.rmd に代入されます。

 rmdファイルの中でその infile.rmd という変数名を参照することができます。

    

[補足] \rpt\with というフォルダにあるRプログラムの取り込み

 実際のバッチコマンドには、\rpt\with というフォルダの下にある *.r (Rプログラムファイル)を source() で取り込む記述も含まれています。

 ごちゃごちゃするので上では省略しました。

 使用頻度の高い関数定義などを書いた自作の *.r があれば、\rpt\with の下に置くと、いちいち取り込む手間が省けます。

 rptパッケージでは multirmd.r, tjsf.r の二つがあり、それらが取り込まれます。

 拡張子を ‘.r’ でなく ‘.txt’ などに変更すれば取り込まれなくなります。

 なお、multirmd.r, tjsf.r については下記を参照してください。

目次に戻る


3. rmdファイルのサンプル

 rpt_sample02.zipを解凍すると、rmarkdown, RmdRuby というフォルダができます。

 どちらのフォルダにもrmdファイルのサンプルが入っています。

  1. rmarkdown フォルダ
  2. RmdRuby フォルダ

 どのrmdファイルも、「送る」メニューの該当項目を呼び出して処理できます。

目次に戻る


4. rmarkdownフォルダにあるrmdファイル

 YAMLヘッダについて既に「rmarkdownのYAMLヘッダ」に書いたので、rmarkdownフォルダにあるrmdファイルに関してあまり説明を加えるべきところはありませんが、rptパッケージとの関連で少し補足します。

(1) beamerを扱う際の留意点

 beamerでは日本語を扱う関係から、予め ‘luatexja.tex’ というファイルを作って置いて、それをTeX原稿のヘッダ部分に取り込みます。

 次の2行からなるファイルです。

\usepackage{luatexja}
\hypersetup{unicode=true}

 ’luatexja.tex’ というファイル名は、実は何でもかまいません。任意です。

 「送る」メニューから i386_rmarkdown (または x64_rmarkdown)を選んだときは、この2行のファイルが自動的に作られます。

 ’$$luatexja.tex’ という名前のファイルです。

 このファイルは、処理が終了すると削除されます。

 なのでユーザーは、このファイルのことを意識する必要はありません。

目次に戻る


(2) pdfファイルの作成にかかる時間

 pandocでpdfを生成する場合 LaTeX を用います。

 その際、なぜか処理に分単位の時間がかかります。

 Windows7 (64 bit)の環境で試したところでは数ページのpdfができるのに、
32bitコマンドを使ったときで2分強(130秒程度)、
64bitコマンドでも2分弱(110秒程度)かかります。

 ちょっと「かかりすぎだろう」と感じますが、時間短縮の方法が分かりません。

 後述の knitr + ruby の方法、
つまり kramdownによりTeXの原稿を生成してからplatexにかける方法の場合
20秒からせいぜい30秒でpdfができあがります。

 これでも「もっと短縮できないか」と感じますが、
pandoc + LaTeX の場合に何か良い方法はないものでしょうか。

*注意: rptパッケージをSDカードやUSBメモリーなどに入れている場合(つまり、Cドライブ以外に入れている場合)、二分どころか20分以上かかったりします。
それについてはもう一つのデータ処理パッケージ2017版を参照して下さい。

目次に戻る


(3) html生成時の画像の扱い

 rmarkdownでhtmlを生成した場合、画像データがhtmlの中に盛り込まれます。

 サンプルの htmlRmarkdown.rmd を処理すると sample_a.png という画像データが書き出されますが、これがhtmlに盛り込まれます。

 そのため sample_a.png を削除してしまっても、ブラウザでhtmlを開くと画像が表示されます。

 画像データが base64 という方式でテキストデータに変換され、そのテキストがhtmlの中に取り込まれます。

 なので、htmlのサイズが大きくなります。

 そうしたくない場合は、YAMLヘッダに self_contained: false という1行を書き加えます。

output:
  html_document:
    self_contained: false
    md_extensions: -ascii_identifiers
    pandoc_args: [
      "--toc",
      "--toc-depth=2"
    ]

 上のようなYAMLヘッダで test.rmd を処理した場合、
test_files というフォルダができて、
highlightjs, jquery などに関連するファイルが書き出されます。

 self_contained: false を指定しなければ、
それら一式がhtmlに盛り込まれるということになります。

目次に戻る


5. RmdRubyフォルダにあるrmdファイル

 RmdRubyフォルダにあるrmdファイルは、「送る」メニューの i386_RmdRuby (または x64_RmdRuby)を呼び出して処理します。

 こちらは、統計ソフトRとrubyで処理します。

 成果物は、新たなフォルダの中にできます。

 test.rmd を処理した場合でいうと、test_output というフォルダが設けられ、処理により新たにできたファイル一式がそこに入ります。

 処理の流れは次のとおりです。

 まず、Rのknitrライブラリでrmdファイルをmdファイルに変換し、
それをrubyのkramdownによってhtmlやLaTeXに変換します。

 YAMLヘッダで pdf_document が指定されたときは、LaTeXの原稿をplatexでpdfファイルに変換します。

 word_document が指定された場合は、kramdownを用いず pandocでdocxファイルを生成します。rmarkdownの場合と同じです。

 ただ、YAMLヘッダに run: true といった指定があると、docxファイルをMS-Wordで読み込んで更なる調整を加えます。

 RmdRubyの方は、一度に指定できる出力形式は一つだけです。

 YAMLヘッダのoutputに html_document, pdf_document の二つが指定されていても一つにしか対応しないので注意して下さい。

 以下、rmarkdownとの違いに焦点を当てながら解説します。

    

(1) htmlファイル生成時のポイント

 rubyのライブラリ kramdown でhtmlを生成します。pandocと異なる点がいろいろあります。

tableの大枠罫線の付加

 Rの kable() で生成される表に、罫線属性を付加することができます。

 rmd記述の一例を掲げると次のとおり。

```{r echo=FALSE}
kable(x)
```
{: border="1"}

 上は <table border="1"> に変換されます。大枠の罫線がつきます。

 もちろん border属性以外も付加できます。

 更にいうと、{: ...} による属性付加は、tableにかぎらず様々な要素に適用できます。詳細は kramdown のサイト参照。

    

スタイルシートの取り込み

 <head> …… </head> のところにスタイルシートの定義を取り込みたい場合、YAMLヘッダに下の記述を盛り込みます。

headpart: "MyStyle.css"

 MyStyle.css というファイルを予め用意しておきます。

 MyStyle.css というファイル名は任意です。適当な名前で大丈夫です。

 あるいは、cssの定義をYAMLヘッダに埋め込んでおきたいときは、たとえば下のようにします。

headpart: [
  '<style type="text/css">',
  'table, th, td { border: 2px #808080 solid; }',
  '</style>'
]

 これにより htmlの中のどのtableについても、大枠と各セルに罫線が付きます。

 headpart によるhtmlヘッダの挿入は、スタイルシートの定義にかぎらず何でもかまいません。

 JavaScript関係の定義を挿入することもできます。

 なお、数式表示のための mathjax 関連の記述は、自動的に挿入されるので headpart を使って挿入する必要はありません。

   

目次の生成とkramdownのオプション指定

 htmlに目次を盛り込むときのYAMLヘッダの例を掲げます。

output:
  html_document:
    toc: true
    kramdown_args:
      toc_levels: [1,2]

 toc: true があると、markdownの原稿に目次生成用の記述が書き加えられます。下の2行です。

* contents list
{:toc}

 pandocの場合は --toc オプションで目次生成を指示できますが、kramdownでは目次生成を指示するオプションはありません。

 その代わり、rmdの原稿の適当な箇所に咲きの2行を書いておけば、YAMLヘッダで toc: true を書かなくても目次を盛り込むことができます。

 先の2行を書いた箇所に目次が配置されます。

 2行を書くのが面倒なときは、toc: true を記述して下さい。

 それから、kramdownのオプションは kramdown_args で指定します。

 toc_levels: [1,2] は、目次に盛り込む見出しレベルの指定です。h1, h2 だけを盛り込みたいときにこのように指定します。

    

生成されるhtmlの文字コードをUTF-8にしたい場合

 生成されるhtmlの文字コードは Shift_JIS です。

 UTF-8 にしたいときは、rpt_sample02.zip を解凍してできる xtra フォルダにある !utf8.rb をカレントディレクトリに置いた上でrmdファイルを処理します。

 そうすると UTF-8 の html ができます。

 ただし、ソースファイルのrmdファイルは、Shift_JIS(cp932)で書いておいて下さい。

 i386_RmdRuby.bat, x64_RmdRuby.bat は、カレントディレクトリに !*.rb に該当するファイルがあると、それを実行します。その場合、バッチコマンドに組み込まれているrubyスクリプトは実行されません。

 自分好みのrubyスクリプトを !*.rb のファイル名で保存しておけば、それが実行されます。erbとの併用により、おもしろいことができるかも。

 カレントディレクトリに複数の !*.rb があると、どれが実行されるかは不定です。

目次に戻る


(2) 簡易pdfの生成 kpdf_document

 YAMLヘッダの output として kpdf_document を指定すると、rubyの kramdown + prawn によってpdfファイルを生成します。

 LaTeXを用いません。なので処理時間が短くて済みます。

 ただ、目次を生成できない、数式を書き込めないといった制約があります。

 画像は png, jpg を取り込めるようです。

 こったpdfにする必要がなく、作成時間をかけたくない場合に選択してみてください。

    

 文字フォントの大きさ、用紙サイズ、縦長・横長などを指定したいときは
YAMLヘッダに kpdf_set を書き込みます。たとえば下のとおり。

title: "Test Document"
author: "Black Lady"
date: "2017-02-11"
output: kpdf_document
kpdf_set: [
  'size = 12',
  'dopt = {:page_size=>"A4", :page_layout=>:portrait}'
]

 上は、文字サイズ 12ポイント、用紙サイズ a4、縦長の指定例です。これがデフォルトです。

 横長にするには :portrait:landscape にします。

 kpdf_set の中身は、文字列から構成される配列です。

 各文字列が ruby の eval() によって実行されます。

 size = 12kpdf.size = 12 と書くのが本来ですが、kpdf. を省略できます。

 どのような項目を指定できるかは、下のサイトを参照してください。

kpdf.rbについて

目次に戻る


(3) platexによるpdfの生成

 YAMLヘッダのoutputで pdf_document を指定すると、
rubyのkramdownでLaTeXの原稿を作成し、
それをplatexコマンドでpdfファイルに変換します。

 test.rmd を処理した場合でいうと、test_output というフォルダの中にTeX関連のファイル一式が入ります。

 成果物であるpdfファイルのほか、test.tex, test.dvi, test.log などが入っているはずです。

 その中に make_pdf.bat というのもあります。

 test.tex を修正してpdfを作り直したいときは、この make_pdf.bat を実行してみて下さい。

    

 YAMLヘッダには documentclass, classoption を記述できます。例をあげると下のとおり。

documentclass: jsarticle
classoption: a4paper,11pt

 documentclass の指定がないときは jarticle になります。

 次のようにすると jsarticle でスライドのpdfを作ることができます。

documentclass: jsarticle
classoption: slide,papersize

 もちろん classoption には他のオプションを追加することができます。

    

YAMLヘッダにおけるLaTeXの特殊文字の扱いに注意

 i386_RmdRuby.bat または x64_RmdRuby.bat でLaTeXを利用することになる場合、

 YAMLヘッダの title, author, date の記述では、LaTeXの特殊文字の扱いに注意してください。

 特殊文字とは次のものです(いずれも半角)。

# $ % & _ { } < > \ ^ | ~

 これらは、全角文字にしてしまうか、半角の円記号でエスケープします。円記号でエスケープできないものもあるので注意。

 たとえば下のように書きます。

---
title: "Test\\#1 to create a PDF file"
author: "Black Lady"
date: "2017/03/04"
output: pdf_document
documentclass: jsarticle
classoption: a4paper,11pt
---

 i386_RmdRuby.bat または x64_RmdRuby.bat では、YAMLヘッダにLaTeXの特殊文字が含まれていると、それをうまく調整できません。

 ご面倒ですが、rmdファイル作成時に気に留めておいてください。

 なお、i386_rmarkdown.bat または x64_rmarkdown.bat でpdfを生成する場合は、特殊文字をうまく調整してくれます。

 全角文字にしたり、円記号を挿入するといった必要はありません。

目次に戻る


(4) MS-Wordのファイル生成

 YAMLヘッダのoutputで word_document を指定すれば、MS-Wordのdocxファイルが作成されます。

 これは、pandocにより作成されます。kramdownは関与しません。

 以下で説明する save または run がYAMLヘッダに書かれていると、MS-Wordが起動して次ぎの調整が施されます。

    

saveオプション

 YAMLヘッダに save: ".doc" という行があると、docxでなくdocファイルで保存されます。

 test.rmd を処理した場合は test.doc ができます。

 save: "MyTest.doc" とすれば、rmdファイルの名前が何であれ MyTest.doc というファイル名になります。

 指定できる拡張子は次のとおり(ドット記号省略)。

    

runオプション

 YAMLヘッダに run: true という行があると、MS-Wordが起動されて先述した調整が行われます。

 runオプションには配列を指定することもできます。それにより、たとえば二段組の文書にしたりできます。

output:
  word_document:
    run: [
      "段組数  2", "段組境界線  true",
      "標準日本語フォント  MS 明朝", "標準欧文フォント  Century",
      "標準フォントサイズ  10.5"
    ]

 指定できるのは次の項目です。

 上記項目に関する調整・変更は pandoc の処理の後で行われます。

 pandoc が目次を生成するとき、上記のデフォルト値を前提にしているので、後で文字サイズや段組を変更すると、つじつまが合わなくなります。ご注意ください。

 それから、「用紙の横幅 210.0」を指定しても 209.9 になります。なぜかは分かりません。以前のpandocでは 210.0 になっていたのですが……

    

 「rptパッケージとrmarkdown」は以上です。

 rmarkdown, RmdRuby の二種類の処理方法があるので、 test.rmd というファイルを作ったとして、 それがどちらの方法で処理するファイルなのか忘れてしまいそうです。

 rmdファイルの拡張子は ‘.rmd’ でなくてもかまわないので、 RmdRuby用のファイルは、test.kmd のような 違う拡張子にするのがいいかもしれません。