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 の書き方が若干違ってきます。これについては後述。
「送る」メニューの 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 については下記を参照してください。
rpt_sample02.zipを解凍すると、rmarkdown, RmdRuby というフォルダができます。
どちらのフォルダにもrmdファイルのサンプルが入っています。
どのrmdファイルも、「送る」メニューの該当項目を呼び出して処理できます。
YAMLヘッダについて既に「rmarkdownのYAMLヘッダ」に書いたので、rmarkdownフォルダにあるrmdファイルに関してあまり説明を加えるべきところはありませんが、rptパッケージとの関連で少し補足します。
beamerでは日本語を扱う関係から、予め ‘luatexja.tex’ というファイルを作って置いて、それをTeX原稿のヘッダ部分に取り込みます。
次の2行からなるファイルです。
\usepackage{luatexja}
\hypersetup{unicode=true}
’luatexja.tex’ というファイル名は、実は何でもかまいません。任意です。
「送る」メニューから i386_rmarkdown (または x64_rmarkdown)を選んだときは、この2行のファイルが自動的に作られます。
’$$luatexja.tex’ という名前のファイルです。
このファイルは、処理が終了すると削除されます。
なのでユーザーは、このファイルのことを意識する必要はありません。
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版を参照して下さい。
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に盛り込まれるということになります。
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との違いに焦点を当てながら解説します。
rubyのライブラリ kramdown でhtmlを生成します。pandocと異なる点がいろいろあります。
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 を使って挿入する必要はありません。
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の文字コードは 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
があると、どれが実行されるかは不定です。
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 = 12
は kpdf.size = 12
と書くのが本来ですが、kpdf.
を省略できます。
どのような項目を指定できるかは、下のサイトを参照してください。
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 には他のオプションを追加することができます。
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を生成する場合は、特殊文字をうまく調整してくれます。
全角文字にしたり、円記号を挿入するといった必要はありません。
YAMLヘッダのoutputで word_document を指定すれば、MS-Wordのdocxファイルが作成されます。
これは、pandocにより作成されます。kramdownは関与しません。
以下で説明する save または run がYAMLヘッダに書かれていると、MS-Wordが起動して次ぎの調整が施されます。
YAMLヘッダに save: ".doc"
という行があると、docxでなくdocファイルで保存されます。
test.rmd を処理した場合は test.doc ができます。
save: "MyTest.doc"
とすれば、rmdファイルの名前が何であれ MyTest.doc というファイル名になります。
指定できる拡張子は次のとおり(ドット記号省略)。
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 のような 違う拡張子にするのがいいかもしれません。