マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

「サイゼリヤで1000円あれば最大何kcal摂れるのか」をPandocで解いてみた

どうやら、TeXを使うと計算と組版を一気にやってしまえて最高、なようです。

ところで、皆さんご存知の通りTeXアレなわけですが、どうやら聞くところによると、Pandocも相当アレなようです。

となると、サイゼリヤで1000円あれば最大何kcal摂れるのか」をPandocで一気に計算して組版する、というネタがあって然るべきなのは、当然の帰結でしょう。

というわけで、やってみました

方針

サイゼリヤ問題を解くMarkdown文書

[sample.md]

# 問題

予算1000円以内で,サイゼリヤで最大カロリーを摂取するような注文の仕方を求めよ。ただしサイゼリヤの料理のメニューは以下の通りとする。

[一覧](./menu.csv){.saizeriya-list}

# 解答

以下の通り。

[解答](./menu.csv){.saizeriya-solve badget=1000}

[menu.csv]

彩りガーデンサラダ,130,299
小エビのサラダ,115,349
やわらかチキンのサラダ,134,299
わかめサラダ,92,299
イタリアンサラダ,196,299
……(略)……

書式の説明

特定のクラスを付けたリンク要素を書くと、その部分がフィルタによって置き換えられます。

次のように、クラスにsaizeriya-listを指定したリンクを書くと、指定のメニューファイルを読み込んでメニューの一覧の箇条書きを生成してその場に出力します。(テキストは出力されません。)

[テキスト](メニューファイルのパス){.saizeriya-list}

クラスにsaizeriya-solveを指定したリンクを書くと、指定のメニューファイルを読み込んでサイゼリヤ問題を解き、その解答を表組にしたものを出力します。この際に予算額badgetという属性で指定します。

[テキスト](メニューファイルのパス){.saizeriya-solve badget=予算額}

さっそくPandocしてみる

以下のコマンドで、先のMarkdown文書(sample.md)をWord文書に変換します。

pandoc sample.md --lua-filter=saizeriya.lua -o sample.docx

※「Wordは嫌だ」という人は、出力ファイル名のsample.docxの拡張子を変えて別の形式を選びましょう。例えばsample.odtとするとOpenDocument形式になります。sample-out.mdのようにすると別ファイルにMarkdown形式で出力できます。

出力されたWord文書(sample.docx)を開いてみると、メニュー一覧が正しく挿入されていることが判ります。

※以下の出力結果はPandoc 2.7.2(最新版)によるものです。

f:id:zrbabbler:20190525154330p:plain
sample.docx 1ページ目冒頭

そして、最後のページをみると、例の栄養満点な3点セットが、無事に出力されていました。

f:id:zrbabbler:20190525154405p:plain
sample.docx 4ページ目

まとめ

たとえTeX言語ができなくても、Pandocがあれば計算と組版を一気にやれます! スゴイ!(えっ)