Skip to content

Instantly share code, notes, and snippets.

@K4zuki
Last active July 31, 2023 22:20
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save K4zuki/d20fba0e832be8740815e9fb9e488415 to your computer and use it in GitHub Desktop.
Save K4zuki/d20fba0e832be8740815e9fb9e488415 to your computer and use it in GitHub Desktop.
pandoc-crossrefとdocxとLuaフィルタ

pandoc-crossrefとdocxとLuaフィルタ(1)

この記事は何

pandoc + pandoc-crossrefフィルタを使ってdocxドキュメントを作ろうとしてちょっとめんどくさかったこととその解決策

pandoc-crossrefで画像を並べるやつがうまくいかない件

このあたりを参考に、複数の画像に小番号を つけて並べたかったんだけど、縦積みはともかく横に並べるのはうまくいかない。

例えば次のコードは横並びに画像が3枚並んで下にそれぞれabcという番号がついて(ところでこの番号付けルールは設定で変更できる。マニュアル見てね!)、 その下にFigure 1: Tiled Figures a - Subfigure 1、 b - Subfigure 2、 c - Subfigure 3みたいなのができる。DOCX出力でなければね!

::: {#fig:tiled-figures}
![Subfigure 1](image1.png){width=50mm #fig:tiled-figures-1}
![Subfigure 2](image2.png){width=50mm #fig:tiled-figures-1}
![Subfigure 3](image3.png){width=50mm #fig:tiled-figures-1}

Tiled Figures
:::

これを解決するのに役に立ったのが自作Luaフィルタコレクション の中のtable-width.lua

このフィルタを使うと、GitHub風の表組を使って求めた結果が得られます。こんなかんじ

::: {#fig:tiled-figures}

::: {.table noheader=true}

|   |   |   |
|---|---|---|
| ![Subfigure 1](image1.png){width=50mm #fig:tiled-figures-1} | ![Subfigure 2](image2.png){width=50mm #fig:tiled-figures-1} | ![Subfigure 3](image3.png){width=50mm #fig:tiled-figures-1} |

:::

Tiled Figures
:::

原稿が横に伸びるのが難点ですねー。IDEとかの自動折返し機能と相性悪いかも。 コマンドはこんな感じになります。

$ pandoc input.md output.html --lua-filter=table-width.lua --filter=pandoc-crossref

フィルタの適用順に注意が必要です。Luaフィルタが先、pandoc-crossrefが後。

以上! (タイトルに(1)とついてるし続けるよ (続くとは言っていない)続いた!

pandoc-crossrefとdocxとLuaフィルタ(2)

続いちゃったね

この記事は何

pandoc + pandoc-crossrefフィルタを使ってdocxドキュメントを作ろうとしてちょっとめんどくさかったこととその解決策 の続き

GitHubの表組だとちょっと問題があるね!

余計なセル

先の記事で表セルに1枚ずつ、3枚画像が横並びになったはずですが、おそらく余計なものがついてきます。table-width.luanoheader=trueを与えてますが、 このままだとheader rowをbody rowsの先頭に持っていくだけです。その結果、余計な空の表セルが画像の上に現れます。いまのところ、これはこのフィルタの仕様です。 改善しました。続編記事にて!

Luaフィルタを追加して、CSVから読み込ませる

自作Luaフィルタコレクションの中に csv2table.luaというのがあるので、これを使います。

CSVファイルを作る

こんなかんじでtiled.csvを作ります。

"![Subfigure 1](image1.png){width=50mm #fig:tiled-figures-1}","![Subfigure 2](image2.png){width=50mm #fig:tiled-figures-1}","![Subfigure 3](image3.png){width=50mm #fig:tiled-figures-1}"

組み合わせる

前回のコードと組み合わせると、こんな感じになります。nocaption=trueをつけて、表タイトルの自動生成を抑制します。

::: {#fig:tiled-figures}

::: {.table noheader=true}

[](tiled.csv){.table nocaption=true}

:::

Tiled Figures
:::

コマンドは以下のようになります。csv2table.luaを最初に適用します。

$ pandoc input.md output.html --lua-filter=csv2table.lua --lua-filter=table-width.lua --filter=pandoc-crossref

これで、

  1. CSVからHeader Rowのみで構成された表を生成する(csv2table.lua
  2. Header RowをBody Rowsの先頭に移動する→Body Rowのみで構成された表になる(余計なセル問題が解決)(table-width.lua
  3. 表番号と小番号をつける(pandoc-crossref

の順に処理されます。

以上!

# フィルタコレクションがtarleb=サンにマークされてる やばい

pandoc-crossrefとdocxとLuaフィルタ(3)

この記事は何

pandoc + pandoc-crossrefフィルタを使ってdocxドキュメントを作ろうとしてちょっとめんどくさかったこととその解決策 の続き の続き

1行だけの表を作るのがちょっと楽になります

わざわざ別ファイルに表を書き出さなくても1行の表を作れるように、table-width.luaを更新しました。

もとのソース(最終形態)をちょっとだけ改造して、画像の並びをHeader Rowに置きます。Body Rowsも書いておきます。

::: {#fig:tiled-figures}

::: {.table noheader=true}

| ![Subfigure 1](image1.png){width=50mm #fig:tiled-figures-1} | ![Subfigure 2](image2.png){width=50mm #fig:tiled-figures-1} | ![Subfigure 3](image3.png){width=50mm #fig:tiled-figures-1} |
|---|---|---|
|   |   |   |

:::

Tiled Figures
:::

これだけ。

コマンドももとに戻ります。そのかわり記述が横長になりがちな欠点が...

$ pandoc input.md output.html --lua-filter=table-width.lua --filter=pandoc-crossref

以上!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment