自分でも理解するために。
さて、RMarkdownでコードを埋め込んだ際、行番号をいれたいという要求がありますね。Atusyさんの下記のブログのようにするとHTMLとPDF形式は対応できるようです。良かったよかった。
補足をする。
先のページではhighlight: pygment
としていますが、さっき書いた記事のとおりの他のhighlightでも有効です。ただし、何かしらのhighlightの指定が必要です。
これはhtml_documentがやっているのか、Pandocがやっているのか?
答えは後者。これは、
output: html_document: highlight: tango keep_md: True
のように、keep_md: True
を追加して中間ファイルであるMarkdownファイルが削除されないようにして確認すればわかる。対象となるコード部分になにも差異がないことがわかるだろう。ということは、Pandocが行っている(実際にはhighlightingを有効にしないと出てこないため、skylightingがやっているかもしれない。保留)
余談
ちなみに、コードブロック(Rのコードチャンクではなく、ここはコードのブロックですよと示す場合)はバッククォートでも良いが、チルダ(~)でも書ける。また、ブロックに対してcssでclassを指定する場合は{.numberLines}のように書けるので、
~~~ {.r .numberLines} plot(iris) 3+3 ~~~
のようにも書ける。実にどうでも良いことだが…。ちなみに、rの前に.をつけているのでこのコードは実行されない。というか、チルダの場合はR MarkdownのRのチャンクコード(実行可能なコード)としては扱われないので注意。
cssがやっているわけではないようだ。
ぱっと思いついたのはcssのカウンターで行番号をつけることをしているのだろう、そう思って検索してみたのです。以下に事例がある。
https://codepen.io/elomatreb/pen/hbgxp
ただこれだと、各行がcodeとかspanとかのタグで囲われていないといけない。Pandocで変換されたhtmlファイルを確認するとわかるが、実際にはそのようになっておらず、全体をcodeタグで囲っている。つまり、この方法では行番号をつけることは出来ないことになる。
実際に動いている場所はココ
一部抜粋。
startNumber = firstNum, lineAnchors = any (`elem` ["line-anchors", "lineAnchors"]) classes, numberLines = any (`elem` ["number","numberLines", "number-lines"]) classes,
これを見ると、行番号を示すには"number","numberLines", "number-lines"のいずれかが指定されていればよいことがわかる。
実のところ、これはマニュアルに書いてあるのであった。
このあたり読んでるはずなのに全部忘れてしまう…
宿題
ということで、skylightingライブラリが絡んでいるっぽいのでちょっと調べないとこれ以上はかけないことがわかりましたー。Pandocの沼は深いだけでなく広い…。
そして、Wordでも行番号が欲しいですね。調べましょう。
ということで、これらは宿題です。いかがでしたか?ブログになってしまいましたねぇ。まぁそんなこともあるさ。
Enjoy!!