これはR Advent Calendar 2018 12日目の記事です。
ちょっと先週末に時間が取れなかったので、内容が中途半端になっています…すみません。週末に加筆予定です。
先日、R MarkdownからWord文書を作成するといったことをしてみました1。 niszetkoubou.booth.pm
R界隈ではPandocを使用したhtmlやpdfの文書生成環境は不動の地位を保っていますが、組版ガチ?勢的には「Pandocを使って~」というのはあまり珍しいことではないようです2。とはいえ、別にツールがすごいから良い/悪いという話はなく、reproducibilityの高いドキュメントの生成環境があるということが大事なんですよね。
ただ、この話を始めると話がそれにそれてしまうので、おススメの書籍のリンクを貼って先に進みます。
CSS組版
世の中にはCSS組版3というものがあります。これは、文書の構造を書くhtmlに対して見栄えを定義するCSSファイルの機能を使い、通常は一枚の(区切りがなく、スクロールして下に下に…とずっと続く形の)ページから、Wordやpdfのようにページ区切りのhtmlを作ってしまう、というものです4。
これはCSS側で定義されていて、これを実装しているブラウザ上で表示させればページごとに区切った表示で見ることが出来ます。また、印刷機能を使えばpdf化も出来、pdf化できるということは同人誌も作れるということです5。
CSSのページ化まわりについて調べるにはこちらの日本語訳を見たほうが良いのではと思います。
CSS Paged Media Module Level 3 (日本語訳)
一般的(?)6にCSS組版界隈ではVivliostyleを使うことが多いようです。私が参考にしているページをいくつか貼ります。
Markdown+CSS組版での技術系同人誌制作時の環境 | 吉川ウェブ
R言語でもCSS組版をしたい
さて、R言語でもCSS組版したいですよね?そんなパッケージあるのでしょうか?あります。pagedown
パッケージです。
このパッケージの開発にはknitr
パッケージなどで有名なYihui Xie氏が関わっていて、内部では先に挙げたVivliostyleではなく、Paged.jsという
これまた新しいパッケージを使っています。Paged.jsは開発が継続中です。そのためか日本語の情報がまだほとんどありません…7。
しかし、pagedown
パッケージを使う分にはこの手の知識はなくても大丈夫です。良しなにやってくれてしまいます。
なお、Paged.jsはGitHubではなくGitLab上で開発が進んでいるようです。
おそらくですが、pagedown
パッケージの実装は今後大きく変わることも予想されます。そのため、この記事では「ちょっと動かしてみる程度」の解説をしてみます。いえこれは決して調べる時間がなかったからではなくてですね…ごにょごにょ。
実際のところ、ちゃんと理解するためにはR Markdown、Pandocの各種オプションを含めた仕様、HTMLとCSSの仕様、Luaフィルタの仕様(とそもそもLua言語の理解)、Paged.jsライブラリの理解・・・と要素技術がかなり複雑になっています。この辺りはいずれまた…。
pagedown
パッケージで作られたページ化されたhtmlは公式のサイトを見るのが手っ取り早いです。
また、pagedown
パッケージは名刺、ページ化されたhtml、ポスター、レジュメなどいろんなアウトプットが定義されています。これはREADMEが整備されてきたので、そちらを参照すると良いと思います。すごいですね。
pagedown::html_letter
のフォーマットを使って、実際に実行されたコマンドは R Markdownタブで見ることが出来るので見てみると下のようになっています。
"C:/Program Files/RStudio/bin/pandoc/pandoc" +RTS -K512m -RTS let.utf8.md --to html4 --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash-implicit_figures+smart --output let.html --email-obfuscation none --wrap preserve --lua-filter "C:/Users/niszet/Documents/R/win-library/3.5/pagedown/resources/lua/uri-to-fn.lua" --lua-filter "C:/Users/niszet/Documents/R/win-library/3.5/pagedown/resources/lua/loft.lua" --lua-filter "C:/Users/niszet/Documents/R/win-library/3.5/pagedown/resources/lua/footnotes.lua" --standalone --section-divs --template "C:\Users\niszet\Documents\R\win-library\3.5\pagedown\resources\html\paged.html" --highlight-style pygments --number-sections --include-in-header "C:\Users\niszet\AppData\Local\Temp\RtmpY9ZL5X\rmarkdown-str4a0c154d42a.html" --mathjax
このように、Luaフィルターが3つも使われていることがわかります。Pandocで処理する際に、内部での取り扱いを変える必要があるためです。つまり、R側の処理としては実はあまり手を入れておらず、そのため、keep_md: trueとしてMarkdownの中間ファイルを見てもRのコードが評価されただけなのでCSS組版要素はあまり見れないと思います。
また、このPandocが内部でどのように解釈しているか?についてはバージョンによって大きく変わることがあります。そのため、Luaフィルタ内にPandocのバージョンの指定があったりします。pagedown
パッケージのREADMEにあるように、
This package requires a recent version of Pandoc (>= 2.2.3). If you use RStudio, you are recommended to install the Preview version (>= 1.2.1070), which has bundled Pandoc 2.3.1, otherwise you need to install Pandoc separately.
と、Preview versionを使うことを推奨されています。
生成されたhtmlの中を見てみると、
<link href="let_files/paged-0.0.22/css/default.css" rel="stylesheet" /> <link href="let_files/paged-0.0.22/css/letter.css" rel="stylesheet" /> <script src="let_files/paged-0.0.22/js/config.js"></script> <script src="let_files/paged-0.0.22/js/paged.js"></script> <script src="let_files/paged-0.0.22/js/hooks.js"></script>
のように、ばっちりとpaged.jsが含まれていることがわかりますね。これもtemplateに仕込んであるから、なのですが…。
また、生成したhtmlファイルは、
pagedown::chrome_print()
を使ってpdf化することが出来ます。これ単体でも便利かもしれません(そうかな?)
しかしこのパッケージ、いったいどんな需要があって作られているのか、謎ですね…。
Enjoy!!