niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) pagedownパッケージを使ってR言語でCSS組版を体験したい

これはR Advent Calendar 2018 12日目の記事です。

ちょっと先週末に時間が取れなかったので、内容が中途半端になっています…すみません。週末に加筆予定です。

先日、R MarkdownからWord文書を作成するといったことをしてみました1niszetkoubou.booth.pm

R界隈ではPandocを使用したhtmlやpdfの文書生成環境は不動の地位を保っていますが、組版ガチ?勢的には「Pandocを使って~」というのはあまり珍しいことではないようです2。とはいえ、別にツールがすごいから良い/悪いという話はなく、reproducibilityの高いドキュメントの生成環境があるということが大事なんですよね。

ただ、この話を始めると話がそれにそれてしまうので、おススメの書籍のリンクを貼って先に進みます。

www.kyoritsu-pub.co.jp

www.kyoritsu-pub.co.jp

CSS組版

世の中にはCSS組版3というものがあります。これは、文書の構造を書くhtmlに対して見栄えを定義するCSSファイルの機能を使い、通常は一枚の(区切りがなく、スクロールして下に下に…とずっと続く形の)ページから、Wordやpdfのようにページ区切りのhtmlを作ってしまう、というものです4

これはCSS側で定義されていて、これを実装しているブラウザ上で表示させればページごとに区切った表示で見ることが出来ます。また、印刷機能を使えばpdf化も出来、pdf化できるということは同人誌も作れるということです5

CSSのページ化まわりについて調べるにはこちらの日本語訳を見たほうが良いのではと思います。

CSS Paged Media Module Level 3 (日本語訳)

一般的(?)6CSS組版界隈ではVivliostyleを使うことが多いようです。私が参考にしているページをいくつか貼ります。

Markdown+CSS組版での技術系同人誌制作時の環境 | 吉川ウェブ

www.slideshare.net

blog.fieldnotes.jp

R言語でもCSS組版をしたい

さて、R言語でもCSS組版したいですよね?そんなパッケージあるのでしょうか?あります。pagedownパッケージです。

github.com

このパッケージの開発にはknitrパッケージなどで有名なYihui Xie氏が関わっていて、内部では先に挙げたVivliostyleではなく、Paged.jsという これまた新しいパッケージを使っています。Paged.jsは開発が継続中です。そのためか日本語の情報がまだほとんどありません…7

しかし、pagedownパッケージを使う分にはこの手の知識はなくても大丈夫です。良しなにやってくれてしまいます。

なお、Paged.jsはGitHubではなくGitLab上で開発が進んでいるようです。

gitlab.pagedmedia.org

Library – Paged Media

おそらくですが、pagedownパッケージの実装は今後大きく変わることも予想されます。そのため、この記事では「ちょっと動かしてみる程度」の解説をしてみます。いえこれは決して調べる時間がなかったからではなくてですね…ごにょごにょ。

実際のところ、ちゃんと理解するためにはR Markdown、Pandocの各種オプションを含めた仕様、HTMLとCSSの仕様、Luaフィルタの仕様(とそもそもLua言語の理解)、Paged.jsライブラリの理解・・・と要素技術がかなり複雑になっています。この辺りはいずれまた…。

pagedownパッケージで作られたページ化されたhtmlは公式のサイトを見るのが手っ取り早いです。

pagedown.rbind.io

また、pagedownパッケージは名刺、ページ化されたhtml、ポスター、レジュメなどいろんなアウトプットが定義されています。これはREADMEが整備されてきたので、そちらを参照すると良いと思います。すごいですね。

github.com

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!!


  1. 唐突の宣伝…^^;

  2. 技術書典に参加したniszetの感想です。

  3. くみはんと読みますね

  4. 間違ってたらマサカリを…

  5. ただし、フォントの埋め込みについては色々課題がありそうで、現在調査中…。

  6. CSS組版自体が一般的かどうかはさておいて…

  7. 自分で調べていくしかないのか…。