niszetの日記

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

「Rmarkdown でチャンクとその出力に行番号を付ける」をもうちょっと見てみる

自分でも理解するために。

さて、RMarkdownでコードを埋め込んだ際、行番号をいれたいという要求がありますね。Atusyさんの下記のブログのようにするとHTMLとPDF形式は対応できるようです。良かったよかった。

blog.atusy.net

補足をする。

先のページではhighlight: pygmentとしていますが、さっき書いた記事のとおりの他のhighlightでも有効です。ただし、何かしらのhighlightの指定が必要です。

niszet.hatenablog.com

これは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

www.sylvaindurand.org

www.studiomic.net

ただこれだと、各行がcodeとかspanとかのタグで囲われていないといけない。Pandocで変換されたhtmlファイルを確認するとわかるが、実際にはそのようになっておらず、全体をcodeタグで囲っている。つまり、この方法では行番号をつけることは出来ないことになる。

実際に動いている場所はココ

github.com

一部抜粋。

                  startNumber = firstNum,
                  lineAnchors = any (`elem`
                        ["line-anchors", "lineAnchors"]) classes,
                  numberLines = any (`elem`
                        ["number","numberLines", "number-lines"]) classes,

これを見ると、行番号を示すには"number","numberLines", "number-lines"のいずれかが指定されていればよいことがわかる。

実のところ、これはマニュアルに書いてあるのであった。

pandoc.org

このあたり読んでるはずなのに全部忘れてしまう…

宿題

ということで、skylightingライブラリが絡んでいるっぽいのでちょっと調べないとこれ以上はかけないことがわかりましたー。Pandocの沼は深いだけでなく広い…。

そして、Wordでも行番号が欲しいですね。調べましょう。

ということで、これらは宿題です。いかがでしたか?ブログになってしまいましたねぇ。まぁそんなこともあるさ。

Enjoy!!