pandocのコードブロックに境界線を追加するにはどうすればよいですか?

Aug 22 2020

コードブロックを含むMarkdownファイルを作成し、pandocを使用してDOCXとPDFの両方にビルドします。具体的には次のとおりです。

pandoc myfile.md --to=docx --defaults=defaults.yml -o myfile.docx
pandoc myfile.md --to=latex --defaults=defaults.yml -o myfile.pdf

このdefaults.ymlファイルは、LaTeXマージンを指定し、目次を含めるだけです。

出力は非常に見栄えがしますが、コードブロックの周囲に境界線を付けて、周囲のテキストから視覚的に分離できるようにしたいと思います。

このTeXStackExchangeの質問は、ハイライトスタイルを暗いテーマに変更することを提案していますが、私の読者は間違いなく明るいテーマを好むでしょう。

このSOの質問は、listingsパッケージへの切り替えを示唆していますが、pandocのデフォルトよりもはるかに醜いコードが生成されます。(その投稿も6歳で、それ以来pandocは大きく変化しています。)

これらの欠点の1つがない方法はありますか?

回答

2 tarleb Aug 22 2020 at 00:04

LaTeXの場合、高度にカスタマイズ可能なtcolorboxパッケージを使用してコードブロックをラップし、Luaフィルターを介して必要なコードを挿入できます。

function raw_tex (t)
  return pandoc.RawBlock('tex', t)
end

--- Wrap code blocks in tcolorbox environments
function CodeBlock (cb)
  return {raw_tex'\\begin{tcolorbox}', cb, raw_tex '\\end{tcolorbox}'}
end

--- Ensure that the longfbox package is loaded.
function Meta (m)
  m['header-includes'] = {raw_tex '\\usepackage{tcolorbox}'}
  return m
end

詳細については、tcolorboxのドキュメントを参照してください。


Docxの方が簡単です。「ソースコード」テキストスタイルを変更してから、変更したドキュメントをとして使用し--reference-docます。