TeX & LaTeX Advent Calendar 2021
昨年(2020年)の「TeX & LaTeX Advent Calendar」はこんな感じでした。
というわけで、今年はこれを些かも参考にせずに、自分が素敵だと思うネタを全力でぶつけていきましょう!
昨年(2020年)の「TeX & LaTeX Advent Calendar」はこんな感じでした。
というわけで、今年はこれを些かも参考にせずに、自分が素敵だと思うネタを全力でぶつけていきましょう!
案の定!!
TeX & LaTeX Advent Calendar 2021
とっておきのTeX/LaTeXネタを皆で持ち寄って楽しむ
「TeX & LaTeX Advent Calendar」
今年はいよいよ10回目の開催となります。
皆さんの、心をこめた素敵なネタを例によってお待ちしております!
※ ハッシュタグは「#texadvent2021」
※ TeX/LaTeX初心者大歓迎。 (重要)
※ TeX/LaTeX非初心者大歓迎。
例によって、重点テーマですが、当初の案としてはこういうのを考えていました。
今年の某アドベントカレンダーの重点テーマの案🙃#TeX #texadvent #TeX言語 pic.twitter.com/8uMjzMK2iv
— 某ZR(ざんねん🙃) (@zr_tex8r) 2021年10月22日
ところが、ツイッタァーでアンケートをとってみたところ、TeX言語は人気的にイマイチでした。
【投票🗳】今年の
— 某ZR(ざんねん🙃) (@zr_tex8r) 2021年10月23日
「TeX & LaTeX Advent Calendar」※開催未定
の重点テーマはどれ?💁#TeX #texadvent
※単なるアンケートです🙃
というわけで、結局、重点テーマはコレにしました。
↓コレ🙃#TeX #TeX言語 #expl3 #texadvent2021 pic.twitter.com/kwGntyLK0b
— 某ZR(ざんねん🙃) (@zr_tex8r) 2021年11月11日
今年の重点テーマ
今年の重点テーマはコレです。
「TeX言語(とか)しましょう!」(La)TeXの大きな特徴の一つは 「プログラミングにより自分で新しい機能を実装できる」 ということです。
TeXでのプログラミングといえば、以前はTeX言語するしかなかったのですが、
今ではexpl3やLuaといった別の選択肢も現れています。
また、TeXの実行中に言語処理系を呼び出すという方法もよく使われています。
「TeXでのプログラミング」の魅力を大いに語りましょう!
重点テーマの指す範囲については、「(La)TeXの実行と密接に関わる形でプログラムを実行する」話であれば全て該当する、と考えてください。
少しわかりにくいですが、今年の重点テーマ
— 某ZR(ざんねん🙃) (@zr_tex8r) 2021年11月13日
「TeX言語(とか)しましょう!」
は
・TeX言語🤮しましょう!🤯
・expl3しましょう!😵💫
・LuaTeXでLuaしましょう!🙂
・PythonTeXしましょう!😀
あたりのものを全部含みます。#TeX #TeXLaTeX #texadvent2021 #TeX言語 #expl3
例によって「重点テーマ」は「制限」ではありません。
(前略)……以下のいずれかテーマに該当する何かを書きます。
このように、以前と同じく、TeXに関連するもの(LaTeXとか、plain TeXとか、ConTeXtとか、MetaPostとか、Re:VIEWとか、\expandafter 筋トレとか、……)なら何でも構いません。
皆さんの、心温まるTeXネタで寒い冬を乗り越えましょう☃︎!
前回の続き。今回が最終回で、LuaTeXについて。
※\U~
の系列についてはXeTeXの記事を参照。
※一般の注意事項については初回の記事を参照。
\begincsname‹トークン列›\endcsname
★:「‹トークン列›
を完全展開して得られる文字トークン列を脱トークン化した文字列を名前とする制御綴」について、その制御綴が定義済ならそのトークン、未定義なら空に展開される。
\csname
と同様に、完全展開の結果に制御綴が含まれる場合はエラーになる。\csname
と異なり“\relax
化”の副作用を決して起こさない。\csstring‹トークン›
:トークンが文字トークンの場合は、その文字。制御綴の場合はその名前。
\string
と異なり制御綴名の前に\escapechar
の文字は前置されない。\directlua
[‹整数:名前番号›
]{‹文字列›}
☆:引数の文字列をLuaコードとして実行する。
\dvifeedback
:何これ?
\pdffeedback
と同じ使用法だろうが、マニュアルに未記載。\dvivariable
:何これ?
\pdfvariable
と同じ使用法だろうが、マニュアルに未記載。。\fontid‹フォント›
:そのフォントを一意に指定する番号(整数)。
\pdffontname
(LuaTeXでは\pdffeedback fontname
)と同等なのかもしれない。\formatname
:使用中のフォーマットについて、フォーマット作成時(ダンプ実行時)の\jobname
の値。
\ifcondition
:展開しても何も起こらず、また「条件判断に関する内部状態」も変化させないが、「条件不成立による読み飛ばし」の際にはこのプリミティブは「if-トークンの一種である」と見なされる。
\@gobble\if
」と同じ役割のはず。\immediateassigned{‹トークン列›}
☆:引数のトークン列に書かれた「TeXの代入文」(複数可)を実行する。
\immediateassignment‹代入文›
☆:直後に続く単一の「TeXの代入文」を実行する。
\immediateassigned
と同じ。\lastnamedcs
★:最後の\csname
、\ifcsname
、\begincsname
の実行で生成された制御綴のトークン。
\ifcsname
、\begincsname
を用いて当該制御綴が未定義だった場合は「無効な制御綴を表す特殊なトークン」になる。\ifcsname
と\begincsname
は副作用をもつ。\luaescapestring{‹文字列›}
:その文字列に対して「Luaの文字列リテラル」用のエスケープを適用した結果の文字列。
""
は付かない。\luatexbanner
:エンジンのバナー文字列。
\luatexrevision
:エンジンのリビジョン番号。
\luatexversion
は読取専用整数パラメタである。\luatexrevision
は2
に展開される(ドットは付かない)。\luatexversion
は109になる。\mathstyle
:現在の数式スタイルを表す整数。
\pdffeedback‹名前›
:指定の名前の「PDFフィードバック」の値を返す。
\pdffeedback creationdate
」はpdfTeXの\pdfcreationdate
に相当する。\pdffeedback
はその引数を含めて一回の展開で「値を表す文字列」に展開される。例えば、\pdffeedback pageref‹整数›
は(pdfTeXの\pdfpageref‹整数›
と同じく)一回展開すると整数値の文字列になる。‹名前›
の読取が独特である。
\pdfvariable‹名前›
★:指定の名前の「PDF変数」を意味とする単一トークン。
\pdfvariable compresslevel
」はpdfTeXの\pdfcompresslevel
(整数パラメタ)に相当する。\pdfvariable
を一回展開すると「当該のパラメタ(データ型はPDF変数の種類により異なる)を意味とする単一のトークン*6」になる。例えば「\pdfvariable compresslevel
」の一回展開は整数パラメタとなる。‹名前›
の読取の挙動は\pdffeedback
と同じ。\scantextokens{‹トークン列›}
☆:「引数のトークン列を(展開せずに)脱トークン化した結果の文字列」を内容とする仮想的な入力ファイルを作って、以降はこの仮想的なファイルから読み込むようにする。
\scantokens
の変種で、より「マクロの展開」に近い動作になるようにしたもので、以下の点が異なる:
\endlinchar
の文字が付かない。*1:Luaチャンク名は、Luaインタプリタからの情報表示の際に用いられる。
*2:つまり厳密にいうと「Luaから吐かれたもの」は展開結果ではない。展開結果は空であることになるので☆印を付けた。
*3:厳密にいうと:普通にトークン列を実行していった際に、展開不能であるトークンは「代入文を開始するもの」でなければならない。
*4:従って通常の(非INIの)使用においては、Luaバイトコードレジスタは「フォーマット作成時(INIモード)に登録された関数」を読み出すのに専ら利用され、それ以外の用途ではLua関数テーブルが利用される。
*5:後者の場合、警告を出した上で、\pdffeedbackを無かったことにして引数として読んだトークン列をバッファに返す。
*6:ここでいう「パラメタを意味とするトークン」というのは\dayや\parindentの類(TeXbookでは“parameter”と呼ばれている)のことであり「パラメタトークン」(TeXbookでは“parameter token”)のことではない。
「某I◯Cが人類に打ち克った証」たる某近代ナンチャラが最終日を迎える中、東京では……(中略)……ゆきだるま☃!
今日は、皆さんお待ちかねの、#ナントカの日!☺#ナントカ #の日 pic.twitter.com/q7qXHVVc8g
— 某ZR(ざんねん🙃) (@zr_tex8r) 2021年8月7日
というわけで、コロナ禍にも負けず、某I◯Cにも負けず、今年も普段通りの「ゆきだるま☃の日」がやってきました!
さて☃といえばフォントですが、5年ほど前に、「ヒラギノ角ゴシック」の☃がチョット話題になりました。
ヒラギノ角ゴシックW0~W9を一列に並べてみて今さら気づいたのだけれど,ヒラギノ角ゴシックのゆきだるまって,W0だけ他とデザインが違う!帽子が黒くて,口が少し笑顔気味になってる。なぜこれだけデザインが違うのだろう……。開発者のイースターエッグ!? pic.twitter.com/jEW7WI3STE
— Yusuke Terada (@doraTeX) 2016年10月4日
ヒラギノフォントといえば「☃が無表情」なことで有名ですが、後から追加された「W0」だけ、なぜか☃がチョット笑顔で、しかも帽子が黒いのです。この件が話題になったときのツイッタァーの反応がまとめられています。
……おや、一人だけ、変なことを言ってますね……。
バリアブル・フォント☃#違う #違う #違う pic.twitter.com/LP6iwGsDy7
— 某ZR(ざんねん🙃) (@zr_tex8r) 2016年10月5日
バリアブルフォント(variable font)というのは、2016年にOpenTypeの仕様に追加された「Font Variation」という機能を利用したフォントのことで、粗くいうと「一つのファミリの中の変種を“無限に”作る」ことを可能としています。例えば、先の話にあったようにヒラギノフォントにはW0・W1・……・W8・W9の10個のウェイト(字の太さ)が用意されていますが(これはこれでスゴイわけですが)、ウェイトを”バリアブル”にしたフォントでは、ユーザは「W5.5」とか「W3.14159」とかに相当する中間のウェイトを利用できます。いわば、ウェイトの種類が“無限”に増やせるわけです1。
欧文のバリアブルフォントは既に数多く発表されていましたが、今年(2021年)の4月に、フリーの和文フォント「源ノ角ゴシック」について、そのバリアブルフォント版が公開されました。
これを機にして日本でもバリアブルフォントの技術に注目が集まっているようです。先月には、「全角ダーシの太さ・長さが自由に調節できるフォント」が公開されました。
欧文フォントに続いて和文フォントの世界にもバリアブルフォントの時代が到来したとなれば、☃文フォントの世界にもバリアブルフォントが求められるのは必然の流れでしょう。
☃について「“無限に”変えたいもの」といえば、やっぱり帽子やマフラーの色でしょう。(カラー絵文字のフォントがあることからわかるように、現在のOpenTypeの仕様では「色付きのグリフ」がサポートされています。)
しかし残念ながら現状では、Font Variationの仕組で変化させる対象となるのは、グリフの輪郭線の点の座標に限られるようです2。
一方で、「笑顔と無表情の間で“無限の”バリエーションを作る」ことであれば、これは輪郭線の変化なので実現できそうです。
というわけで、さっそく作ってみました。
※詳しい話はまた後日🙃
というわけで、笑顔の☃も、無表情の☃も、不機嫌な☃も、すべて素敵!
前回の続き。今回はXeTeXについて。
※一般の注意事項については初回の記事を参照。
\XeTeXgenerateactualtext
は読書可の整数パラメタ。\XeTeXglyphbounds‹フォント›‹位置›
は読取専用の寸法パラメタ。\XeTeXinputencoding
など*2)があるが、(恐らくTeXにそういう概念がないため)実際にはこれはパラメタでなく一般命令である。つまり、これらのプリミティブで設定した値を読み出すことはできない。\XeTeXOTfeaturetag
は読取専用整数パラメタであり展開不能である。\XeTeXinterchartoks‹クラス1›‹クラス2›
はトークン列パラメタである。\XeTeXglyphname‹フォント›‹整数:グリフ番号›
:そのフォントの指定のグリフ番号(GID)に対応するグリフ名(文字列)。
\XeTeXfeaturename‹フォント›‹整数:featureコード›
:AATのfeatureの名前(文字列)。
\XeTeXvariationname‹フォント›‹整数:variationコード›
:AATのvariationの名前(文字列)。
以下のものはpdfTeXのプリミティブを名前を変えて採用したもの。
\ifprimitive
☆:pdfTeXの\ifpdfprimitive
と同じ。\normaldeviate
:pdfTeXの\pdfnormaldeviate
と同じ。\strcmp{‹文字列1›}{‹文字列2›}
:pdfTeXの\pdfstrcmp
と同じ、ただしUnicode対応になっている。\uniformdeviate
:pdfTeXの\pdfuniformdeviate
と同じ。名前がU
で始まる拡張プリミティブはUnicodeに関するもので、この命名法はXeTeXとLuaTeXで名前を共通にすることを意図している。とはいっても必ずしも両方のエンジンで実装されているとは限らない。
\Uchar‹整数:文字コード›
:その文字コードを持ち、\the-文字列の規則におけるカテゴリコードを持った文字トークン。言い換えると、その文字コードの文字1つだけからなる\the-文字列。
※XeTeX・LuaTeX・e-(u)pTeXで利用可能。
\Ucharcat‹整数:文字コード›‹整数:カテゴリコード›
★:指定の文字コードとカテゴリコードを持つ文字トークン。
※XeTeX・e-(u)pTeXで利用可能。
\Umathcharclass‹整数:文字コード›
:その文字に対する数式クラス*3の値(整数)。
※LuaTeXで利用可能。
\Umathcharfam‹整数:文字コード›
:その文字に対する数式ファミリの値(整数)。
※LuaTeXで利用可能。
\Umathcharslot‹整数:文字コード›
:その文字に対する数式スロット(数式フォント中の文字コード)の値(整数)。
※LuaTeXで利用可能。
前回の続き。今回はpdfTeXについて。
※一般の注意事項については初回の記事を参照。
\lastkern
)ことが多いが、pdfTeXでは「その値を表す\the-文字列に展開する展開可能プリミティブ」であることが多い。\pdfincludechars
が展開可能プリミティブとして挙げられているが、実際には展開不能であるようだ。恐らくこれは単純な記述ミス……?pdfTeXの追加のif-トークン ☆:
\ifincsname
\ifpdfabsdim‹整数比較›
\ifpdfabsnum‹寸法比較›
\ifpdfprimitive‹トークン›
\expanded{‹トークン列›}
★:そのトークン列の完全展開の結果。
\leftmarginkern‹整数:ボックス番号›
: ボックスの左側マージンカーンの幅(寸法)。
\pdfcolorstackinit
[page
] [direct
]{‹文字列:PDF命令列›}
◇: 色スタックを新規作成した上で、その色スタック番号(整数)に展開される。
\pdfcreationdate
:処理開始日時をPDF日時形式で現した文字列。
D:20060102150405+07'00'
のような形式。\pdfescapehex{‹文字列›}
:その文字列の16進ダンプの文字列。
\pdfescapename{‹文字列›}
:その文字列に対して「PDF名前」用のエスケープを適用した結果の文字列。
\pdfescapestring{‹文字列›}
:その文字列に対して「PDF文字列」用のエスケープを適用した結果の文字列。
()
は付かない。\pdffiledump
[offset‹整数:開始位置›
] [length‹整数:長さ›
]{‹文字列:ファイル名›}
:そのファイルの指定の位置の内容(バイト列)の16進ダンプの文字列。
\pdffilemoddate{‹文字列:ファイル名›}
:そのファイルの更新日時をPDF日時形式で現した文字列。
\pdffilesize{‹文字列:ファイル名›}
:そのファイルのサイズ(整数)。
\pdffontname‹フォント›
:そのフォントを一意に指定する番号(整数)。
F‹番号›
という名前がそのフォントに対応する。\pdffontobjnum‹フォント›
:そのフォントに対応するPDFのFontオブジェクトの番号(整数)。
\pdffontsize‹フォント›
:そのフォントのサイズ(寸法)。
\pdfinsertht‹整数:insert番号›
:そのinsertの現状での高さ(寸法)。
\pdflastmatch‹整数›
:最後に実行した正規表現検索(\pdfmatch
)の指定番号のマッチの情報で、「‹位置›->‹文字列›
」という形式の文字列。
-1->
」となる。\pdfmatch
[icase
] [subcount‹整数:グループ数上限›
]{‹文字列:パターン›}{‹文字列:検索対象›}
◇:正規表現検索を行った上で、結果を表す整数に展開される。
\pdfmdfivesum
[file
]{‹文字列›}
:その文字列のMD5ハッシュ値の16進ダンプの文字列。
file
オプション付きの場合は、‹文字列›
の名前のファイルのハッシュ値になる。\pdfpageref‹整数:ページ番号›
:そのページ番号に対するPDFのPageオブジェクトの番号(整数)。
\pdfstrcmp{‹文字列1›}{‹文字列2›}
:2つの文字列を比較した結果を表す整数。
\pdftexbanner
:エンジンのバナー文字列。
This is pdfTeX, …
」のような文字列。\pdftexrevision
:エンジンのリビジョン番号。
\pdftexversion
は読取専用整数パラメタである。\pdftexrevision
は21
に展開される(ドットは付かない)。\pdftexversion
は140になる。\pdfunescapehex{‹文字列:16進ダンプ›}
:その16進ダンプが表す文字列。
\pdfuniformdeviate‹整数:上限›
:0以上‹上限›
未満の一葉乱数(整数)。
\pdfxformname‹整数›
:その番号のFormオブジェクトを一意に指定するTeX内で使用される番号(整数)。
Fm‹番号›
という名前が当該のFormオブジェクトに対応する。\pdfximagebbox‹整数:Image番号›‹整数:位置番号›
:その番号のImageオブジェクトのバウンディングボックスの、位置番号に対応する座標値(寸法)。
rightmarginkern‹整数:ボックス番号›
: ボックスの右側マージンカーンの幅(寸法)。
そして最後に特殊なもの。
\pdfprimitive
は「直後の制御綴を、それが現在保持している値とは無関係に、同名のpdfTeXのプリミティブを保持するものと見なす」という、やや特殊な働きを持つ。\pdfprimitive\制御綴…
が展開可能であるかは、「\制御綴
と同名のプリミティブ」が展開可能であるかに依存する。
※一般の注意事項については初回の記事を参照。
\kcatcode
の値)になる。もし和文カテゴリコードが15だったら、アレなこと*1になる。
\jfont
や\tfont
も使える。\ifdbox‹整数:ボックス番号›
\ifddir
\ifjfont‹フォント›
\ifmbox‹整数:ボックス番号›
\ifmdir
\iftbox‹整数:ボックス番号›
\iftdir
\iftfont‹フォント›
\ifybox‹整数:ボックス番号›
\ifydir
“漢字コード変換子”、すなわち\euc‹整数›
、\jis‹整数›
、\kuten‹整数›
、\sjis‹整数›
:「当該の漢字コードでの符号値が引数の整数に等しい和文文字の、内部漢字コードでの符号値」の十進表記文字列。
\ptexrevision
:pTeXのリビジョン番号の文字列。
\ptexversion
・\ptexminorversion
は読取専用整数パラメタである。\kansuji‹整数›
:その整数の(一〇方式の)漢数字表記の文字列。負数の場合は空になる。
\kansujichar
で漢数字として使用する文字を変更できる。\ucs‹整数›
e-pTeX独自(つまり、“非eのpTeX系”にも“非pTeX系”にもない)のプリミティブは存在する*2のだが、その中には展開可能のものはなさそう。
※\Uchar
・\Ucharcat
についてはXeTeXの記事を参照。