マクロツイーター

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

Pandocでメタデータはテンプレート変数になるかならないか

「Pandoc Advent Calendar 2019」を埋めてみた。

adventar.org

アドベントカレンダー1日目の記事では、Pandocにおける「テンプレート変数」と「メタデータ」について詳しく解説されている。

そこには以下のような記述がある。

3. Pandocフィルタはメタデータにアクセスできるが、テンプレートの変数にはアクセスできない

しかし、実際に(LaTeX出力用の)フィルタを実装していると、「フィルタからテンプレート変数を設定したい」場合が時々ある。

もちろん、当該の記事に

「テンプレート変数を与えるために、YAMLメタデータブロックで変数(=メタデータ)を定義する」というテクニックが便利です。

と書かれているように、「テンプレート変数の代わりにメタデータを使う」というテクニックは存在する。でも果たしてそれはいつでも通用するのだろうか。

Pandocのマニュアルには次のようにある。(下線は筆者による)

emplates contain variables, which allow for the inclusion of arbitrary information at any point in the file. They may be set at the command line using the -V/--variable option. If a variable is not set, pandoc will look for the key in the document’s metadata, which can be set using either YAML metadata blocks or with the -M/--metadata option.

これを読む限りは「テンプレート変数の代わりにメタデータを使う」というテクニックは「ユーザが当該のテンプレート変数を(-Vオプションなどで)設定していない」ことが前提になりそうである。

調べてみた

※最新版(2.8.0.1版)のPandocを用いた。

次のテンプレートを用意する。

[foo.html]
$for(foo)$$foo$$endfor$

※複数の値が指定されることを見越してループにしておく。

このテンプレートを用いて、空のMarkdownファイル“empty.md”をHTMLに変換することを考える。

pandoc empty.md --template=foo.html -o out1.html

その際に、テンプレート変数・メタデータの設定のオプションの組合せとして、次の4つを試してみる。

  • ①追加オプションなし。
  • -V foo=V1 : テンプレート変数のfooを設定する。
  • -M foo=M1メタデータfooを設定する。
  • -V foo=V1 -M foo=M1 : テンプレート変数とメタデータの両方を設定する。

    その結果

変数 メタデータ 出力
なし なし (空)
V1 なし V1
なし M1 M1
V1 M1 V1

マニュアルの記述の通りで、テンプレート変数が既に設定されている場合は、「メタデータを代わりに設定する」という技法は使えない、という結果になった。

もう少し調べてみる

結論は出たが、事のついでとして、もう少し複雑な場合を調べてみることにする。

複数の値を指定してみた

先の実験と同じ設定で、-V-Mオプションを反復することで複数の値を指定してみることにする。

  • ①追加オプションなし。
  • -V foo=V1 -V foo=V2
  • -M foo=M1 -M foo=M2
  • -V foo=V1 -M foo=M1 -V foo=V2 -M foo=M2

結果は以下の通り。

変数 メタデータ 出力
なし なし (空)
V1V2 なし V2
なし M1M2 M1M2
V1V2 M1M2 V2
  • やはりテンプレート変数が設定済の場合はメタデータの値は使われない。
  • テンプレート変数は1つの値しか保持できない。対して、メタデータ-Mを繰り返すことで複数の値を保持できる。

header-includesも試してみた

header-includes変数については、「テンプレート変数を指定する」「メタデータを指定する」の他に「ヘッダファイルを指定する(-Hオプション)」という方法も存在する。

  • 先ほどのテンプレートでfooheader-includesに置き換えた新しいテンプレート“header.html”を用意する。
  • H1だけ書かれたファイル“h1”とH2だけ書かれたファイル“h2”を用意する。
  • -V-M-Hの各々について「2つ指定する」「指定しない」としたものの全ての組合せ(8通り)を試してみる。

例えば、-V-M-Hの全てを2つ指定する場合のコマンド行は以下のようになる。

pandoc empty.md --template=header.html -o out2.html \
    -V header-includes=V1 -M header-includes=M1 -H h1 \
    -V header-includes=V2 -M header-includes=M2 -H h2

結果は以下の通り。

変数 メタデータ ヘッダファイル 出力
なし なし なし (空)
V1V2 なし なし V2
なし M1M2 なし M1M2
V1V2 M1M2 なし V2
なし なし h1h2 H1H2
V1V2 なし h1h2 V2H1H2
なし M1M2 h1h2 H1H2
V1V2 M1M2 h1h2 V2H1H2
  • テンプレート変数での指定とヘッダファイルでの指定は共存する。それらの少なくとも一方が指定済の場合はメタデータの値は使われない。
  • ヘッダファイルは複数指定できる。
  • テンプレート変数の値(高々1つ)の後にヘッダファイルの値(指定順で複数)が並ぶ。

まとめ

やっぱり、「フィルタの実装の内部でheader-includesを設定する」ための確実な方法は存在しない?

f:id:zrbabbler:20191203031734p:plain:w300
(画像は本文と関係ありません)

やっぱりアドベントがはじまった ― \begin{texadvent2019}

f:id:zrbabbler:20191125025549p:plain
TeX & LaTeX アドベントカレンダー 2019

TeX界における年末の恒例イベントとなったと言わんばかりのアドベントカレンダーが今年も始まりました。

重点テーマ

今年の重点テーマはコレです。

やっぱりLua(La)TeXしよう

「LuaTeXはいいぞ」とやっぱりよく言われますが、具体的に何がいいのかはやっぱり十分に知られていません。熱狂的なLuaTeXファンの皆さん、是非ともLuaTeXの魅力についてやっぱり熱く語りましょう!

※例によって、重点テーマはやっぱり「必須」ではありません。あんまりLuaTeXでないTeXネタ、さっぱりLuaTeXでないTeXネタ、なんでもやっぱり歓迎しております。

で、初日のネタは

こちらになります。

まだ参加できます!

TeX & LaTeX Advent Calendar 2019(#texadvent2019)は

まだまだ参加者募集中です。

LaTeXなネタ、TeX言語なネタ、expl3なネタ、Overleafなネタ、dvisvgmなネタ、lwarpなネタ、LuaHBTeXなネタ、tlmgrなネタ、その他ナントカカントカ、お持ちの方はぜひぜひ、

やっぱりご参加おねがいします!

もう空きが残りわずかとなっています。登録はやっぱりお早めに!


あっ、ぱんどっく な人はこっち。

Pandoc Advent Calendar 2019

やっぱり去年のアレ(アレな方)を振り返ってみる

f:id:zrbabbler:20191123154250p:plain
TeX & LaTeX Advent Calendar 2019

昨日非アレでしたが、今度はアレな方の振り返り。

昨年(2018年)の「TeX & LaTeX Advent Calendar」はこんな感じでした。

12/01zr_tex8r自分がどのLaTeXを使ってるか知りたい話
12/02puripuri2100LuaLaTeXで部誌を作った話
12/03h-kitagawaMetaPost (luamplib, gmp) で☃
12/04golden_luckyTeXでEPSファイルを使うな、は本当か
12/05tamuratakVSCode拡張のLaTeX Workshopにコントリビュートした話
12/06uwabamiTeX on Debian 10 (Buster)
12/07champs20ベースラインとかjis.tfmとか ( プログラム )
12/08CareleSmith9TeX 言語したい人は大学図書館に行ってみよう!
12/09aminophen私と TeX Live と LuaTeX の近況レポート
12/10wtsnjpreverxii.tex: TeX でリバーシを遊ぶ(翻訳)
12/11p_typo添字のお話
12/12kn1chtptex2pdfがghq管理下のリポジトリでPDFを作成できないことがある
12/13mattskalaTeXLiveからMediaWikiのために最小のインストールは何ですか?
12/14p_typoLuaLaTeXでPDF/X-4やPDF/X-1aなPDF生成する
12/15mod_poppoLuaLaTeXでダウンロードカードを作った話
12/16asciianpost.md · GitHub
12/17trueroadLuaLaTeXでLilyPondを使って楽譜の入った文書を作る
12/18keisuke495500自転車で北海道一周してきたのでGPSログをLaTeXで表示する
12/19doraTeXTeX で乱数を使う
12/20isaribi_saitohLuaLaTeXで和字コマンドを操ろう(newunicodecharパッケージ)
12/21tasusuTikZのgraph記法とgraph drawing
12/22zr_tex8r例の「verb の呪い」を LuaTeX の力で打破する(bxrawstr パッケージ)
12/23munepi\futurelet のお勉強で作った漢文訓点スタイル
12/24golden_luckyGitHub - k16shikano/yafootnote: Yet Another \footnote
12/25Yasunarijlreqの多書体化

というわけで、今年はこれを皆目参考にせずに、自分がやっぱり素敵だと思うネタを全力でぶつけていきましょう!

去年のアレを振り返ってみる(※ただし非アレ)

アドベントカレンダー宣伝も済ませたので、恒例に従って、去年の振り返りをやりましょう。

昨年(2018年)のアドベントカレンダーはこんな感じでした。

12/01puripuri2100SATySFiでカスタマイズが容易なクラスファイルを作成した
12/02hanachinRelease Herokuでも元気に動くSATySFi
12/03zr_tex8rSATySFi のデモ文書をチョット素敵にする
12/04na4zagin3SATySFi でイオニア式記数法
12/05bd_gfngfnThe SATySFi​book Web公開版 第1版
12/06youzSATySFiで数式を生成する ~アッカーマン関数編~
12/07hanachinRelease Regexp正規表現(しなさい)
12/08zr_tex8rSATySFiで素敵な文字を出力する
12/09bd_gfngfnSATySFiのテキスト出力モードのプロトタイプ
12/10zr_tex8rSATySFiの標準クラスで長いタイトルを無事に出力する(アレな)方法
12/11youzSATySFiの可換図式パッケージの使い方
12/12bd_gfngfnSATySFiによるMarkdown文書からのPDF出力
12/13youzSATySFiで数式を生成する ~ラムダ計算編~
12/14puripuri2100SATySFiでフォントを変更する方法
12/15puripuri2100ぷりにゃん on Twitter
12/16youzSATySFiでお絵描き
12/17matsud224PDFハイパーリンク
12/18zr_tex8rSATySFi で文書作成が容易なクラスファイルを作成した(※ただし画期的)
12/19puripuri2100ぷりにゃん on Twitter
12/20youzSATySFiでテントを描くコマンド作った
12/21mtsg4codeSATySFiで複数行コメントの簡単な実現方法について
12/22puripuri2100SATySFiでTeX関係のロゴ
12/23hsjoihsSATySFi<s>ライトユーザー</s>分かってないマンの所感
12/24bd_gfngfnSATySFiに多段階計算を入れる構想
12/25puripuri2100SATySFi で文書作成が容易なMarkdown用のクラスファイルを作成した(※ただし画期的)

えっ、コレジャナイ……? まあ、たまには非アレなアドベントカレンダーを振り返るのもいいでしょう。

ちなみに、「SATySFi Advent Calendar」は今年も開催されています。

空き枠が残りわずかなので、非アレな組版エンジンの話をしたい人は早めに登録を済ませておきましょう!

今年もやっぱりTeXでAdvent Calendarする件について

やっぱりやります!!

f:id:zrbabbler:20191123154250p:plain
TeX & LaTeX Advent Calendar 2019

TeXLaTeX Advent Calendar 2019

とっておきのTeXLaTeXネタを皆で持ち寄って楽しむ
TeXLaTeX Advent Calendar」
今年で8回目の開催となります。
皆さんの、心をこめた素敵なネタをやっぱりお待ちしております!
ハッシュタグは「#texadvent2019
TeXLaTeX 初心者大歓迎。 (重要)
TeXLaTeX 非初心者大歓迎。

今年の重点テーマは……コレです!

今年の重点テーマ

今年の重点テーマはコレです。
「やっぱりLua(La)TeXしよう」

昨年の重点テーマは「とにかくLua(La)TeXしよう」ということで、
LuaTeX/LuaLaTeXに関する素敵な記事がたくさん集まりました。
しかし、LuaTeXを使い始めようと試みる人もさらに増えています。
LuaTeXに関する知見をもっともっと広めていきましょう。

LuaTeX がやっぱりもっと普及すべきだと思っている皆さん、その理想の実現にやっぱり必要なのはあなたの書く貴重な記事です。TeX界隈の人々に「LuaTeXをやっぱり使ってみよう」と思わせるような、そんな素敵な記事をやっぱり書いてみましょう。

例によって「重点テーマ」はやっぱり「制限」ではありません。

(前略)……以下の何れかテーマに該当する何かを書きます。

「やっぱりLua(La)TeXしよう」に大いに関連するTeXLaTeXネタ。
「やっぱりLua(La)TeXしよう」にチョット関連するTeXLaTeXネタ。
「やっぱりLua(La)TeXしよう」にサッパリ関連しないTeXLaTeXネタ。

このように、やっぱり以前と同じく、TeXに関連するもの(LaTeX、plain TeX、ConTeXt、Texdoc、Latexmk、arara、ClutTeX、llmk、……)ならやっぱり何でも構いません。

皆さんの、心温まる TeX ネタでやっぱり寒い冬を乗り越えましょう☃︎

TeX Liveで絶対に使えるLaTeXパッケージ・クラスの一覧

「絶対に使える」とは

ここでは、TeX LiveのLaTeX用の最小構成である「scheme-basic」に含まれる、という意味だということにする。TeX Live系のTeX配布(MacTeXやBasicTeX1も含む)でLaTeXを使っている環境であれば、以下で挙げる一覧に含まれるパッケージやクラスは必ずインストールされていることが期待できる。

scheme-basicで使えるLaTeXパッケージ・クラス

凡例

  • TeX Live 2019の2019/11/17あたりの版。
  • 「:」の前にあるのはTeX Liveのパッケージ名。(LaTeXのパッケージ名ではない。)
  • 「:」の後に、そのTeX Liveパッケージに属するLaTeXのパッケージ・クラスを列挙した(「.cls」を付けたのがクラス、それ以外がパッケージ)。ただし、*比較的著名なものに限って列挙している。
  • LaTeXパッケージ・クラスを含まないTeX Liveパッケージ(バイナリやフォントの配布など)は省略している。

一覧

  • ae: ae, aecompl
  • amscls: amsart.cls, amsproc, amsthm
  • amsfonts: amsfonts, amssymb, eucal
  • amsmath: amsbsy, amscd, amsmath, amstext
  • babel: babel
  • babelbib: babelbib
  • bibtex: apalike
  • carlisle: remreset, scalefnt
  • colorprofiles: colorprofiles
  • colortbl: colortbl
  • dvips: colordvi, rotate
  • etex-pkg: etex
  • fancyhdr: fancyhdr
  • fix2col: fix2col
  • geometry: geometry
  • graphics: color, graphics, graphicx, keyval, lscape, trig
  • hyperref: backref, hyperref, nameref
  • ifplatform: ifplatform
  • iftex: ifetex, ifluatex, ifpdf, iftex, ifvtex, ifxetex
  • latex: alltt, article.cls, book.cls, exscale, fix-cm, fixltx2e, fontenc, ifthen, inputenc, latexrelease, letter.cls, ltxdoc.cls, makeidx, minimal.cls, report.cls, shortvrb, slides.cls, syntonly, textcomp, tracefnt
  • lm: lmodern
  • ltxmisc: bibcheck, concrete, topcapt
  • luaotfload: luaotfload
  • mflogo: mflogo
  • mfnfss: oldgerm, pandora
  • natbib: natbib, bibentry
  • oberdiek: aliascnt, atbegshi, atenddvi, attachfile2, auxhook, bmpsize, bigintcalc, bookmark, catchfile, epstopdf, etexcmds, hologo, hyphsubst, ifdraft, iflang, infwarerr, intcalc, kvoptions, letltxmacro, listingsutf8, mleftright, pagesel, pdfescape, pdflscape, pdftexcmds, picture, rerunfilecheck, soulutf8, stringenc, zref
  • pslatex: pslatex
  • psnfss: avant, helvet, mathpazo, mathptmx, utopia
  • pspicture: pspicture
  • tools: afterpage, array, bm, calc, dcolumn, delarray, enumerate, ftnright, hhline, indentfirst, layout, longtable, multicol, shellesc, showkeys, tabularx, theorem, varioref, verbatim, xr, xspace
  • url: url

補足

  • 原則として、特定の言語(日本語など)専用のものはscheme-basicには含まれない。
  • Babelは本体は含むが、言語定義ファイル(*.ldf)は含まれない。
    • ただし英語の定義ファイル(english.ldf)は含まれる。(定義ファイルが全くないと、実質的にbabelの読込ができなくなるため。)
    • 分綴パターンファイル群(hyph-utf8パッケージ)は含まれる。
  • iftexパッケージについて:(※ここでは「LaTeXの意味でのパッケージ」のことを「.sty」で表す)
    • 2019年10月にLaTeX3チームによる「新しいiftex.sty」がリリースされた。これは「古いiftex.sty」および従来の“if*tex.sty”を置き換えるものである。
    • 「新しいiftexパッケージ」はこの「新しいiftex.sty」に加えて、互換性のためのiftexのラッパーであるifetex.sty、ifluatex.sty、ifpdf.sty、ifvtex.sty、ifxetex.styを含む。
    • 「新しいiftex.sty」は(ifptex.styと同じ意味で)\ifptex\ifuptex命令も提供する。ifptex.sty、ifuptex.styはそのまま存続している(\ifstrictptexなどはifptex.styにしかない)が、これらはscheme-basicには含まれない。
    • 「新しいiftex.sty」が登場する以前の状況としては、ifpdf.sty・ifvtex.sty(oberdiekパッケージ)、ifluatex.sty(ifluatexパッケージ)、ifxetex.sty(ifxetexパッケージ)がscheme-basicに含まれていた。「古いiftex.sty」(iftexパッケージ)は含まれなかった。

おまけ

scheme-basicの「全てのTeX Liveパッケージ」および「全てのLaTeXパッケージ・クラス」を列挙したリストをGistに掲載した。


  1. BasicTeXは、TeX Liveの構成についてはscheme-basicを採用している。つまり、LateXパッケージ・クラスに関しては、本記事の一覧で挙げたTeX Liveパッケージに含まれるものだけがインストールされている。BasicTeXにおけるTeX Liveの構成についてはscheme-basicではなくてscheme-small(basicよりは大きい)でした。

それでも1SATySFiを作ってみた件

*「今日はきりたんぽの日!」
ZR「ですね」
*「ですね、じゃないでしょう!? 毎年恒例の1TeXネタは?」
ZR「恒例っていっても去年はなかったじゃん」
*「一応ツイッタァーに何かありますよ」
ZR「まあとにかく、1TeXに関してこれ以上ネタを見つけ出すのは無理がある」
*「エーッ! 1TeXがダメだとしても、世の中には“TeX以外”もあるでしょう。例えば“1SATySFi”とかを作れば?」
ZR「SATySFiには“catcodeの概念”がないから字句解析規則が変えられない。要するに想定された書式、現状では“本来のSATySFi言語”とMarkdown、それ以外を読み込めるようにするのは無理。まあ、将来に多段階計算の構想が発展すれば可能性はあるんだろうけど」
*「エーッ! 1SATySFiは作れないの!? きりたんぽの日のネタも作れないなんて、SATySFiはオワコン!!」

どうにかして1SATySFiを作ってみた

SATySFiをオワコンにしてしまうのは忍びないので、無理やり作ってみた

インストールは以下のようにする($LIBROOTはライブラリルート)。

  • 1satysfi.satyh$LIBROOT/dist/packages/
  • 1satysfi.satysfi-md$LIBROOT/dist/md/

……ん、md? そう、要するに「Markdownとして読み込ませる」という手段を使っている。

さっそく1SATySFi文書を作ってみる

1SATySFiのソースは、1TeXと同様に「文字コードを“1”の1進数で表したもの」を改行で区切って書く。

[hello.1saty]
    111111111111111111111111111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111111111111
    11111111111111111111111111111111
    1111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111111111111111111111111111111111
    111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111111111111111111111111111111111111111111111111111
    1111111111111111111111111111111111111111111111111111111111111111111111
    111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
    111111111111111111111111111111111

ここで注意であるが、各行の先頭に空白文字4つを入れる必要がある。なぜかというと「結局Markdownだから」である。

もう一つ1TeXと異なる点として、1進数表記にする前の元のテキストは「出力する文字列そのもの」とする。SATySFi言語のコードではないことに注意。

文字コードの10(つまり1111111111)を入力すると出力において改行が起こる。

さっそく1SATySFi文書をコンパイルしてみる

Markdownとしてコンパイルするので--markdown 1satysfiというオプションが必要である。

satysfi --markdown 1satysfi hello.1saty

コンパイル結果は……。

f:id:zrbabbler:20191110231231p:plain
hello.1satyの組版結果

スバラシイ。

まとめ

*「アレレ? SATySFiのコードを1進数にするんじゃないの? このままだと『あらゆるSATySFi文書を“1”だけで表記する』ことになってないから全然ダメじゃん」 ZR「………………」