マクロツイーター

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

TeX言語のマクロも“1回展開”にしたい話

1回展開を実現するにはLuaしないといけない問題

某アドベントカレンダーの最終日の記事では、LuaTeXで「“1回展開”のマクロ」を実現する方法について解説した。

ただし、この記事にある方法では、機能の実現の部分(具体的には「YYYY/MM/DD形式で出力する」という機能)をLuaで実装する必要がある。

-- Luaでの実装
function xx.todayYMD()
  tex.sprint(("%04d/%02d/%02d"):format(
      tex.year, tex.month, tex.day))
end

Lua言語自体はTeX言語よりもずっと習得しやすい言語ではあるが、それでも「LuaTeX上のLuaコードでTeXに関連した機能を実現する」にはそれなりの知識(例えばtexライブラリの使用法など)の習得が必要であり、決して自明ではない。

何より、(例の記事の流れに従うと)機能要件を実現するための「完全展開可能(ただし“先頭~”ではない)なTeX言語のコード」が既に得られている。

% TeX言語での実装
\def\todayYMD{%
  \the\year/\two@digits\month/\two@digits\day}

そうであれば、この「完全展開可能なコードから“1回展開”のマクロが作れる」ほうが、フツーのTeX言語者(※要定義)にとっては便利なのは間違いないだろう。

ixquickmacroパッケージ

というわけで、作ってみた

ixquickmacroパッケージは開発者用のパッケージで、以下の機能を提供する。

  • \defquickmacro\制御綴{<定義本体>}\制御綴を1回展開すると「<定義本体>の完全展開」になるように、\制御綴の意味をローカルに定義する。
  • \gdefquickmacro\制御綴{<定義本体>}\defquickmacroのグローバル定義版。

※現状では、引数をもつマクロはサポートされない。

このパッケージを利用すると、先に示した「TeX言語による完全展開可能な\todayYMDの定義」について、\def\defquickmacroに変えるだけで、“1回展開”の\todayYMDが実現できる。

\defquickmacro\todayYMD{%
  \the\year/\two@digits\month/\two@digits\day}

例の記事で使った\xInspectマクロをここでも利用して、“1回展開”が実現できているかを確かめてみよう。

\documentclass{article}
\usepackage{ixquickmacro}
\makeatletter %!!!!!!!!!!!!!!!!!!!!!!!!! TeX code BEGIN
% 例の \xInspect
\def\xInspect#1{\typeout{%
  once->\unexpanded\expandafter{#1}^^J%
  twice->\unexpanded\expandafter\expandafter\expandafter{#1}^^J%
  full->#1}}

%% "1回展開"な \todayYMD の定義
\defquickmacro\todayYMD{%
  % 中のコードは単に"完全展開可能"に過ぎない
  \the\year/\two@digits\month/\two@digits\day}

\makeatother  %!!!!!!!!!!!!!!!!!!!!!!!!! TeX code END
\begin{document}

\xInspect{\todayYMD}

\stop

このソースをlualatexでコンパイルすると、\xInspectによる端末出力は以下のようになる。

once->2019/12/31
twice->2019/12/31
full->2019/12/31

ixquickmacroパッケージを利用することで、Luaを知らなくても、TeX言語の知識だけで“1回展開”のマクロを作ることができた。スバラシイ。


*「ところで」
ZR「ん?」
*「マクロを“1回展開”にできると何が嬉しいわけ?」
ZR「何だろうねえ」
*「えっ!? 明確なメリットは存在しないの? だったら、この記事もtexadvent2019の記事も単なるくだらないTeX芸でしかないんじゃないの?」
ZR「というわけで、皆さん、来年も当(くだらない)ブログをよろしくお願いします!」

今年もやっぱりMerry TeXmas! ― \end{texadvent2019}

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

アドベントカレンダーやっぱり完走!

TeXmas!
\expandafter\expandafter\expandafter\expandafter\expandafter  \catcode
` =  7 \  ,  %  4\:=\  #  !  4  #  /  $  %\:   &\:`  "\:`_'12% 2019/ %
\:   #1\  ,  %  4\,\  ,  %  4\  0  $  &  /  5  4  0  5  4  }1% 12/25 %
\,\  $&\  $  5  -  0#\:`\  ;1\:`\  =2\  $  %  &\ {  =\:`\#6\ \:`@  }11
\,\?\  '  $  %  &\?\  3&{\  #  /  5  .  4@0_\@  7  (  )  ,  %  .  5  -
{\  #  /  5  .  4@<'400}\  $  /{\  )  &  .  5  -\  #  !  4  #  /  $  %
\  #  /  5  .  4@=15_\  #  !  4  #  /  $  %\  #  /  5  .  4@12_\  &  )
\  !  $  6  !  .  #  %\  #  /  5  .  4@1_  =\  *&}\  ,  /  .  '\?\  *&
#1\  54  %  58  -  !  3{  =\ \?\  $  5  -  0{\  %  6  %  2  9  *  /  "
\  %  8  0  !  .  $  !  &  4  %  2{\  4  (  %\  %  6  %  2  9  *  /  "
\  3&}\  $&  =\ \ \?\,{\  )  .  0  5  4_  ,  !  4  %  8.  ,  4  8_}  =
\  3  #  2  /  ,  ,  -  /  $  %\:`\&  }12\  2  %  ,  !  8\:'40  }10_\,
(↑pdftex -etex -iniコンパイル

というわけで、8回目の開催となる TeX & LaTeX Advent Calendar 2019 も、素敵なTeXネタを途絶えさせることなくやっぱり無事にクリスマスの日を迎えられました。今年の参加者は全部で23名、うち8名が初参加でした。参加者の皆様に心からの感謝をやっぱり捧げたいと思います。

今年の重点テーマは「やっぱりLua(La)TeXしよう」でした。改めてやっぱり振り返ってみると、様々な面から「LuaTeXの特徴」を紹介した記事がやっぱり多く、テーマとして一定の役割をやっぱり果たせたのではないでしょうか。これをきっかけにしてLua(La)TeXにやっぱり興味を持つ人が増えることになればやっぱり幸いです。

TeX & LaTeX Advent Calendar 2019 を楽しんでくれた皆さんに、

やっぱりありがとう!

そして

*  *  *

*「去年の記事の文章になんでもかんでも『やっぱり』を付ければ済む、という考えがいくら何でもヒドすぎる」
ZR「あっ、そこは『やっぱりヒドすぎる』じゃないとやっぱりイマイチ」
*「………………」

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を用いた。

[2019/12/14追記] 2.8.0.1版の挙動の一部は過去版の挙動と食い違っていて、どうやらこれは“不具合”だったようです。2019/12/05リリースの2.8.1版で“修正”されたため、この版の動作に基づいて記述を修正しました。

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

[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 なし V1V2
なし M1M2 M1M2
V1V2 M1M2 V1V2
  • やはりテンプレート変数が設定済の場合はメタデータの値は使われない。
  • テンプレート変数は1つの値しか保持できない。テンプレート変数とメタデータのいずれもオプション(-V-M)を繰り返すことで複数の値を保持できる。
    ※2.8版~2.8.0.1版ではテンプレート変数が1つの値しか持てないという“不具合”があった。

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

まとめ

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

f:id:zrbabbler:20191214213336p: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 ネタでやっぱり寒い冬を乗り越えましょう☃︎