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. 自分で調べていくしかないのか…。

R MarkdownでWord文書を作ろうの再販が開始されました。

今更ですが、告知。

Twitterの方では適宜呟いていましたが、BOOTH様にて入庫処理が完了し、取り扱いが開始されました。

niszetkoubou.booth.pm

ネコポスでも送れるようにしてるので、うまいことやってみてください…。

あと、他の方のと合わせて複数冊でもある程度までなら送料一定とかあるはずなので、うまく使ってみてください(ちゃんと使ったことがないのでアドバイスできない…

あと、全然作れていないサポートページはこちら!

github.com

本書の文句はIssueで投げよう!

以上です!よろしくおねがいします!!

(R) 各地のRコミュニティに参加するという名目で旅に行きたい。

現在把握している分だけ、とりあえずぺたぺたとリンクを貼る。

SappoRo.R

SappoRo.R – 北海道を中心とした統計解析環境「R」の勉強会

はこだてでR

kokucheese.com

Tsukuba.R

数年振りに復活。1回目に参加。2回目は年明けにある予定(Tokyo.Rがない2月かな?)

www.meetup.com

github.com

公式アカウント twitter.com

Tokyo.R

tokyor.connpass.com

公式アカウント twitter.com

Japan.R

japanr.connpass.com

Nagoya.R

atnd.org

Kobe.R

Kobe.R | Doorkeeper

HiRoshima.R

(最近は活動していない)

hiroshimar.connpass.com

Hijiyama.R

(2017年11月にFinal) atnd.org

Fukuoka.R

fukuoka-r.connpass.com

ひとまずわかった分だけ。ちょっとこの記事はメンテしていきたい気持ち。

他にもこんなのがありまっせ!というのがあればご連絡いただけるとありがたいです~~

Enjoy!!

ノートPCのバッテリーの交換をした。

なんか膨らんでたんですよね…。

ちょっと前からノートPCの左手側がなんかもこって膨らんでいるのが気にはなっていたものの、何だろう?って思っていたのですが、どうやらバッテリーが膨らんでいたご様子。2年ちょっと使っていたのでまぁこういうこともありますね。

DELLのサポートサイトに従って作業したらバッテリー交換自体はうまくいきました。ネジの頭がなんか舐められてませんかねぇ…大丈夫ですかねぇ…。まぁ次交換する必要が出たら多分本体買い替えだからいいかな。

XPS 13 サービスマニュアル

今回、バッテリーはAmazonで売ってたのでそれを使ったんですが、一回全然違うやつ頼んでしまったので型番とかちゃんと調べようね(書いてありました。完全に私のミス)

あと、パソコン用の精密ドライバーセットが必要です。ネジ、なんでいろんな種類使ってるんだろう…って感じですが、まぁ組立作業時に間違った順序でやってしまうことを避けるためなのかな。知らないけど。

4種類くらいネジがあったので、対応するやつが必要です。私は↓のを使いましたが、これはDELLのXPS13に対応していることが書かれていたからですね。他のPCだと違うのだろうか。まぁ大体一緒かな。わからん…。

Amazon CAPTCHA

というわけで、もうしばらく現行のノートPCで過ごしそうですが、そろそろメモリが多いやつが欲しいなぁって気持ちなので、春ごろには買い替えたいですね。たくさん稼いでたくさん買おう。そんな感じ。

(R) R MarkdownからWord文書の作成を容易にするためのパッケージ開発を始めました。

といっても、ooxml吐くだけの関数群なわけですが…。

さて、12/1に行われたJapan.Rに参加してきました。

japanr.connpass.com

今回は登壇せず、先月もTokyo.Rに行っていないので近頃は全然R成分がなかったのですが、やはり行くと刺激を受けますね。

というわけで、「R MarkdownでWord文書を作ろう」の課題を解決するべく、Word文書作成を容易化するためのパッケージを作成しました。

github.com

まだ全然出来てませんが…。とりあえずnew page追加するのとかは便利だと思うので、使ってみてフィードバックとかいただければ。

しかし、色々と闇の方向にしか手を出していない気がしますねぇ…。まぁ、しゃーない、か?

あと、商品のページを公開するのを忘れていました。まだ入庫待ちなので買えませんが。よろしくです。

niszetkoubou.booth.pm

Enjoy!!

技術書典5にサークル側で出展したのです。

これはniszetの感想文です…。

この記事は技術同人誌 その2 Advent Calendar 2018の2日目の記事です。枠が空いていたので折角なので書いてみます。

adventar.org

タイトルの通り、技術書典5で初めてサークルとして参加しました。楽しかったのでざっくり経緯とか何書いたのかとか、とりとめなく書いていきます。

なぜサークル側で参加しようと思い立ったのか…

技術書典は2から一般で参加してて、4までは普通に参加していたのですが、4あたりから自分も何か書いてみたいなぁという気持ちがちょっと出てきていたんですね1

そんななか、せとあずさんから背中を押すような発言が…。

最終的には80ページにもなってしまいましたが、軽い気持ちで始めてみるのが良いと思います。意外となんとかなるですね(なんとかすれば)

何を書いたのか

お仕事の事を書いて、後で色々問題になると嫌なので、そうなるとR言語しかないかな~…と2

しかし、R言語を使った解析みたいな内容は、それこそ商業誌の方で飽和気味ではというくらいに出版されていて、わざわざ同人誌を書いてどうなる…?という感じでした。

色々考えて、商業誌には絶対にならないだろうテーマにすれば同人誌で書く意味もあるんじゃないかしらん…?と思い至って「R MarkdownでWord文書を作ろう」を書くことになりました。

内容はタイトル通り、R Markdownを使ってWordを作るのですが、R Markdownからの変換はPandocが行っているため、実質Pandoc本という感じになりました。PandocもWord関係は情報があるようでなかったので内容的にはいい感じにニッチな部分が狙えたのでは?と思います。

大変だったこと

執筆そのものも初めて、イベントで売る側になるのも初めて、書く内容もある程度は決まったものの、これから調べていかねば…というところで色々と大変でした。

ただ、事前に購入してたワンストップ本のおかげで、初心者が躓きそうな点はかなり事前に理解して避けることが出来たと思います。とても助かりました…。

booth.pm

執筆そのものも、丁度いいタイミングでもくもくイベントがあり、ここでかなり進捗が出せました。人がいて適度に緊張感があるのが良いのですかねぇ。その分とても疲れましたが…。色々聞こうかなとも思っていたのですが、思ったより書く方に集中してました。こういうイベントはあると初心者には特にうれしいですね。

techbookfest.connpass.com

また、サークル向けガイドを事前に読んでおくべし!ってツイートをみて、事前に十分読んでおいたので迷いはなかった気がします。

techbookfest.org

とはいえ、それでも前日は緊張で寝れないし、当日はあたふたしてふらふらしてましたが…。あっという間の一日でしたね。

売れ行き

これはうれしい誤算でしたが、当日は92部が来ていただいた方の手に渡りました。当初、30部くらい売れれば御の字でしょうと思っていたので、どこに需要があるのかわかりませんね。

ただ、技術書典の熱みたいなもので買うって場合も多いと思うので、技術書典というお祭りがあってこそのこの数なのかなとは思っています。

まだ需要があるようなので、増刷してみました。必要な人に届くと良いですねぇ…。

しかし、入稿時点で何部刷るのかは全然わかりませんね。1週間前、前日、当日あたりで上昇カーブが全然違うので全くわからない…。かといって、チェック数は発行部数よりも多くて「これは瞬殺か?」と思った一方で予定数出たのが4時半ごろだったので、当日さらに勢いがつく…!といったことは弊サークルではなかったのでした。

しかし、見本誌は2つ置いてあったので気になった方もちゃんと中身を見れたのではないかと思います。これもワンストップ本に書いてあったポイントですね。

サポート

↑のイベント的サポートもありがたかったですが、当日の売り子さんを買って出ていただいた蒼さやさんやレビューしてくれた後輩たち、Twitterでつながった書く仲間・・・といろいろと助けてもらいました。

文章書くのは自分でやらねばですが、周りの視点があると良いですね。 逆に、イベント参加してみたいけど書くことがナイ…という方はそういう参加の仕方もあるのかなとも思いました。是非是非。

今後

直近では再販nightというイベントに参加させていただきます。たぶんまだイベント参加できるはず…興味のある方はぜひ…。

techbook-and-ethanol.connpass.com

あと、ようやくBOOTHに商品情報を公開しました。入庫処理待ちです。

niszetkoubou.booth.pm

また、今回の知見を反映してRのパッケージを(ようやく)作り始めました。

github.com

既に次回に向けてちょっと書き始めてみました。今回は1か月くらいでバタバタしていたので、次回はもう少しうまくやりたい(し、もっといろいろやってみたい)なと思っています。

総合的にみてイベントは楽しかったし、今後も続けていければなと思ってます。よろしくです。

なんかほとんど宣伝な気もしますが。

別の記事で参加者側の記事も書いてみたいですね。

ではではっ


  1. 技術同人誌を読んだページ数ならなかなかのモンですよ。ということでそれについても書きたい気持ち。

  2. ディスクリートとか自分で基板起こしたみたいな話なら大丈夫…かな?

(R) RのinlineのコードチャンクをR Markdown中で表示させる方法

Rのコードを表示させたいという人だけが必要とする情報・・・

こちらの記事にありました。

rviews.rstudio.com

こんな感じに書けばよいわけですね。

`` `r "\u0060r rmd2docxsup::newpage()\u0060"` ``

これで、コード例として示せるようになりました。

github.com

「R MarkdownでWord文書を書こう」の課題であった、10.13や10.15がこれで解決かな。本文中のbacktickはまたちょっと違うかもしれないけど、上記のとおりrのコードとして文字コードを評価させれば良いので一応解決はするのかな。あまり美しくはないんだけど…。

Enjoy!!