マクロツイーター

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

去年のアレ(アレ)を振り返ってみる

f:id:zrbabbler:20211112160938g:plain
TeX & LaTeX Advent Calendar 2021

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

12/01trueroadLuaLaTeX で pdfx パッケージを使い PDF/A に準拠した PDF を作る
12/02bd_gfngfnTeX言語の条件分岐の展開規則と \hop トリック +応用
12/03h20y6m(u)pLaTeXでもjlreqクラスで多書体化したい
12/04wtsnjpOnline.tex 2020 を開催した話
12/05doraTeX帳票生成ツールとしての LaTeX の活用
12/06kn1cht学振特別研究員申請のための科研費LaTeX Tips
12/07CareleSmith9[TeX] [LaTeX] LaTeX の数式でイイ感じに惑星記号を使う [mathabx]
12/08skyy_writingTeX/LaTeX ミーム集【初心者向け】
12/09bd_gfngfnTeX言語で型なしλ計算を評価するVMを書いた話
12/10CareleSmith9[TeX] hmtrump パッケージでトランプのルールを記述する
12/11zr_tex8rLaTeXで出力PDFのバージョンを指定する ~bxpdfverパッケージ~
12/12abenori\futurelet
12/13trueroadPDF/A に電子署名してみる
12/14CareleSmith9[TeX] mleftright パッケージと LaTeX 超入門の読書感想文
12/15domperorOnline.tex 2020 #TeX野望 の伏線回収(くずし字連綿をやってみた話ほか)
12/16T.Streamscsnowmanを拡張してみた話
12/17aminophen日本語 TeX 開発コミュニティの活動近況
12/18tamuratakGithub Actions 上の Windows に TeX Live をインストールする
12/19hid_alma1026fewerfloatpagesパッケージの概略
12/20wtsnjpllmk の基本
12/21mattskalaqrcodeのパッケージもスゴイ
12/22MusicDumpLaTeX 文章で手書き文字を書く ~tegakiパッケージ~
12/23munepiMarkdown原稿からPandocしてLaTeX組版する本作り
12/247danmoroboshiLaTeX 初心者が一番知るべきただ一つのコマンド
12/25zr_tex8r徹底攻略! pxchfonを使いこなそう

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

今年も案の定TeXでAdvent Calendarする件について

案の定!!

f:id:zrbabbler:20211112160938g:plain
TeX & LaTeX Advent Calendar 2021

TeXLaTeX Advent Calendar 2021

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

例によって、重点テーマですが、当初の案としてはこういうのを考えていました。

ところが、ツイッタァーでアンケートをとってみたところ、TeX言語は人気的にイマイチでした。

というわけで、結局、重点テーマはコレにしました。

今年の重点テーマ

今年の重点テーマはコレです。
TeX言語(とか)しましょう!」

(La)TeXの大きな特徴の一つは 「プログラミングにより自分で新しい機能を実装できる」 ということです。
TeXでのプログラミングといえば、以前はTeX言語するしかなかったのですが、
今ではexpl3やLuaといった別の選択肢も現れています。
また、TeXの実行中に言語処理系を呼び出すという方法もよく使われています。
TeXでのプログラミング」の魅力を大いに語りましょう!

重点テーマの指す範囲については、「(La)TeXの実行と密接に関わる形でプログラムを実行する」話であれば全て該当する、と考えてください。

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

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

  • TeX言語(とか)しましょう!」に大いに関連するTeXLaTeXネタ。
  • TeX言語(とか)しましょう!」にチョット関連するTeXLaTeXネタ。
  • TeX言語(とか)しましょう!」にサッパリ関連しないTeXLaTeXネタ。

このように、以前と同じく、TeXに関連するもの(LaTeXとか、plain TeXとか、ConTeXtとか、MetaPostとか、Re:VIEWとか、\expandafter 筋トレとか、……)なら何でも構いません。

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

TeXのプリミティブで展開可能なやつ(5)

前回の続き。今回が最終回で、LuaTeXについて。

\U~の系列についてはXeTeXの記事を参照。

LuaTeX関連の注意事項

※一般の注意事項については初回の記事を参照。

  • だめだ LuaTeXなにもわからない😭

LuaTeXのやつ

  • \begincsname‹トークン列›\endcsname ★:「‹トークン列›を完全展開して得られる文字トークン列を脱トークン化した文字列を名前とする制御綴」について、その制御綴が定義済ならそのトークン、未定義なら空に展開される。

    • \csnameと同様に、完全展開の結果に制御綴が含まれる場合はエラーになる。
    • \csnameと異なり“\relax化”の副作用を決して起こさない。
  • \csstring‹トークン›トークンが文字トークンの場合は、その文字。制御綴の場合はその名前。

    • \stringと異なり制御綴名の前に\escapecharの文字は前置されない
  • \directlua[‹整数:名前番号›]{‹文字列›} ☆:引数の文字列をLuaコードとして実行する。

    • 名前番号を指定した場合は、チャンク名*1lua.name[‹名前番号›]の値が指定される。
    • 実行後、「LuaライブラリのTeXバッファ出力機能によって出力された文字列」を内容とする仮想的な入力ファイルを作って、以降はこの仮想的なファイルから読み込むようにする。
      Luaプログラムを実行する他のプリミティブについても実行後の処理方式は同様である*2
    • LuaライブラリでTeXトークンを出力することも可能なはずだけど、その扱いの詳細については未調査。
    • なお\lateluaは展開不能である。
  • \dvifeedback何これ?

    • 多分\pdffeedbackと同じ使用法だろうが、マニュアルに未記載。
  • \dvivariable何これ?

    • 多分\pdfvariableと同じ使用法だろうが、マニュアルに未記載。。
  • \fontid‹フォント›:そのフォントを一意に指定する番号(整数)。

    • 実装上は\pdffontname(LuaTeXでは\pdffeedback fontname)と同等なのかもしれない。
  • \formatname:使用中のフォーマットについて、フォーマット作成時(ダンプ実行時)の\jobnameの値。

    • INIモードにおいては空になる。
  • \ifcondition:展開しても何も起こらず、また「条件判断に関する内部状態」も変化させないが、「条件不成立による読み飛ばし」の際にはこのプリミティブは「if-トークンの一種である」と見なされる。

    • 要するに「if-均衡を回復させるための\@gobble\if」と同じ役割のはず。
  • \immediateassigned{‹トークン列›} ☆:引数のトークン列に書かれた「TeXの代入文」(複数可)を実行する。

    • つまり普通のTeXの代入を展開限定文脈で実行できる
    • 引数は「TeXの代入文」のみからなる*3必要がある。
    • 代入文の種類には制限がある(例えばボックスの代入は不可)らしい。
  • \immediateassignment‹代入文› ☆:直後に続く単一の「TeXの代入文」を実行する。

    • 実行される代入文が1つであることを除いて\immediateassignedと同じ。
  • \lastnamedcs ★:最後の\csname\ifcsname\begincsnameの実行で生成された制御綴のトークン。

    • \ifcsname\begincsnameを用いて当該制御綴が未定義だった場合は「無効な制御綴を表す特殊なトークン」になる。
    • 従って厳密にいうとLuaTeXでは\ifcsname\begincsnameは副作用をもつ。
  • \luabytecode‹整数› ☆:その番号のLuaバイトコードレジスタが保持するLua関数を実行する。

  • \luaescapestring{‹文字列›}:その文字列に対して「Luaの文字列リテラル」用のエスケープを適用した結果の文字列。

    • 外側のクオート""は付かない。
  • \luafunction‹整数› ☆:Lua関数テーブルのその番号の項目が保持するLua関数を実行する。

    • Lua関数テーブルの値(Lua関数)はフォーマットに保存されない*4
  • \luatexbanner:エンジンのバナー文字列。

  • \luatexrevision:エンジンのリビジョン番号。

    • なお\luatexversionは読取専用整数パラメタである。
    • 例えばバージョン番号が「1.9.2」の場合、\luatexrevision2に展開される(ドットは付かない)。\luatexversionは109になる。
  • \mathstyle:現在の数式スタイルを表す整数。

    • 値:0=D、1=D′、2=T、3=T′、4=S、5=S′、6=SS、7=SS′、-1=数式外。
    • TeXの数式読取の仕組に起因する制限のため、実用するには\Ustackと組み合わせる必要がある(参照)
  • \pdffeedback‹名前›:指定の名前の「PDFフィードバック」の値を返す。

    • 「PDFフィードバック」は何らかの「PDF機能に関する読取専用のパラメタ」を表し、名前によって互いに区別される。
    • これらはpdfTeXにおいては「読取専用のパラメタである」または「値に展開される」ような個別のプリミティブとして提供されていた。例えば、「\pdffeedback creationdate」はpdfTeXの\pdfcreationdateに相当する。
    • \pdffeedbackはその引数を含めて一回の展開で「値を表す文字列」に展開される。例えば、\pdffeedback pageref‹整数›は(pdfTeXの\pdfpageref‹整数›と同じく)一回展開すると整数値の文字列になる。
    • 引数の‹名前›の読取が独特である。
      • \pdffeedbackの後に続くトークン列を順次展開していって、それまでに得た文字トークン列が「有効な名前の一つに一致する」か「有効な名前のどの接頭辞とも一致しなくなる(制御綴に当たった場合も含む)」時点で終結する*5
      • 従ってこの引数については「終結用に吸収されるトークン」という規定が存在せず、直後に続く空白トークンや\relaxは常に有効になる。
  • \pdfvariable‹名前› ★:指定の名前の「PDF変数」を意味とする単一トークン。

    • 「PDF変数」は何らかの「PDF機能に関する読書可のパラメタ」を表し、名前によって互いに区別される。
    • これらはpdfTeXにおいては「読書可のパラメタ」である個別のプリミティブとして提供されていた。例えば、「\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が人類に打ち克った証」たる某近代ナンチャラが最終日を迎える中、東京では……(中略)……ゆきだるま☃!

というわけで、コロナ禍にも負けず、某I◯Cにも負けず、今年も普段通りの「ゆきだるま☃の日」がやってきました!

フォントについて語ってみる

さて☃といえばフォントですが、5年ほど前に、「ヒラギノ角ゴシック」の☃がチョット話題になりました。

nlab.itmedia.co.jp

ヒラギノフォントといえば「☃が無表情」なことで有名ですが、後から追加された「W0」だけ、なぜか☃がチョット笑顔で、しかも帽子が黒いのです。この件が話題になったときのツイッタァーの反応がまとめられています。

togetter.com

……おや、一人だけ、変なことを言ってますね……。

f:id:zrbabbler:20210808155437p:plain
アレな人(ざんねん🙃)

バリアブルフォントについて語ってみる

バリアブルフォント(variable font)というのは、2016年にOpenTypeの仕様に追加された「Font Variation」という機能を利用したフォントのことで、粗くいうと「一つのファミリの中の変種を“無限に”作る」ことを可能としています。例えば、先の話にあったようにヒラギノフォントにはW0・W1・……・W8・W9の10個のウェイト(字の太さ)が用意されていますが(これはこれでスゴイわけですが)、ウェイトを”バリアブル”にしたフォントでは、ユーザは「W5.5」とか「W3.14159」とかに相当する中間のウェイトを利用できます。いわば、ウェイトの種類が“無限”に増やせるわけです1

欧文のバリアブルフォントは既に数多く発表されていましたが、今年(2021年)の4月に、フリーの和文フォント「源ノ角ゴシック」について、そのバリアブルフォント版が公開されました。

blog.adobe.com

これを機にして日本でもバリアブルフォントの技術に注目が集まっているようです。先月には、「全角ダーシの太さ・長さが自由に調節できるフォント」が公開されました。

欧文フォントに続いて和文フォントの世界にもバリアブルフォントの時代が到来したとなれば、☃文フォントの世界にもバリアブルフォントが求められるのは必然の流れでしょう。

☃文バリアブルフォントについて検討してみる

☃について「“無限に”変えたいもの」といえば、やっぱり帽子やマフラーの色でしょう。(カラー絵文字のフォントがあることからわかるように、現在のOpenTypeの仕様では「色付きのグリフ」がサポートされています。)

f:id:zrbabbler:20210808161322p:plain
さっきのツイートにある画像

しかし残念ながら現状では、Font Variationの仕組で変化させる対象となるのは、グリフの輪郭線の点の座標に限られるようです2

一方で、「笑顔と無表情の間で“無限の”バリエーションを作る」ことであれば、これは輪郭線の変化なので実現できそうです。

☃文バリアブルフォントを作ってみる

というわけで、さっそく作ってみました

github.com

※詳しい話はまた後日🙃

まとめ

というわけで、笑顔の☃も、無表情の☃も、不機嫌な☃も、すべて素敵!

f:id:zrbabbler:20210808205032p:plain


  1. バリアブルフォントの技術が最もよく用いられるのは「ウェイト(太さ)の変化」に対してですが、その他に「字幅の変化」「傾きの変化」に対してもよく使われます。

  2. 一応「variationの軸の値と連動してグリフ置換を行う」みたいな仕組はあるようなので、色の違うグリフを多数用意して“疑似的に”実現するという手段はありえますが、それだとそもそもバリアブルフォントである意味があまりなさそうです。

TeXのプリミティブで展開可能なやつ(4)

前回の続き。今回はXeTeXについて。

XeTeX関連の注意事項

※一般の注意事項については初回の記事を参照。

  • 各プリミティブの種別が何であるかについてのマニュアルの記述がかなりアレ。例えば、読取専用パラメタ(だから展開不能)なのに“Expands to …”と書いてあったり*1、読書可パラメタなのに一般命令であるかのように書かれていたり。大体は「機能から自然に予想される種別」になっているようである。例えば:
    • \XeTeXgenerateactualtextは読書可の整数パラメタ。
    • \XeTeXglyphbounds‹フォント›‹位置›は読取専用の寸法パラメタ。
  • 従って、情報読取系のプリミティブで展開可能なのは、「文字列を返すもの」に限られる。
  • ちなみに、XeTeXには「文字列型のパラメタ」のようにみえるプリミティブ(\XeTeXinputencodingなど*2)があるが、(恐らくTeXにそういう概念がないため)実際にはこれはパラメタでなく一般命令である。つまり、これらのプリミティブで設定した値を読み出すことはできない。
  • OpenTypeの各種タグは整数値として扱われている(例えばfeature tagの“ital”は0x76657274という整数値)。なので例えば\XeTeXOTfeaturetagは読取専用整数パラメタであり展開不能である。
  • \XeTeXinterchartoks‹クラス1›‹クラス2›トークン列パラメタである。

XeTeXのやつ

  • \XeTeXglyphname‹フォント›‹整数:グリフ番号›:そのフォントの指定のグリフ番号(GID)に対応するグリフ名(文字列)。

  • \XeTeXfeaturename‹フォント›‹整数:featureコード›:AATのfeatureの名前(文字列)。

  • \XeTeXvariationname‹フォント›‹整数:variationコード›:AATのvariationの名前(文字列)。

以下のものはpdfTeXのプリミティブを名前を変えて採用したもの。

  • \ifprimitive ☆:pdfTeXの\ifpdfprimitiveと同じ。
  • \normaldeviate:pdfTeXの\pdfnormaldeviateと同じ。
  • \strcmp{‹文字列1›}{‹文字列2›}:pdfTeXの\pdfstrcmpと同じ、ただしUnicode対応になっている。
    ※文字列の比較は「UTF-16のユニット列」として(あるいは「UTF-16BEのバイト列」と考えても同値)行われる。従って、BMP外の文字が含まれる場合は必ずしもUnicode符号値の順にはならない。
  • \uniformdeviate:pdfTeXの\pdfuniformdeviateと同じ。

“U~”なやつ

名前がUで始まる拡張プリミティブはUnicodeに関するもので、この命名法はXeTeXとLuaTeXで名前を共通にすることを意図している。とはいっても必ずしも両方のエンジンで実装されているとは限らない。

  • \Uchar‹整数:文字コード›:その文字コードを持ち、\the-文字列の規則におけるカテゴリコードを持った文字トークン。言い換えると、その文字コードの文字1つだけからなる\the-文字列。
    ※XeTeX・LuaTeX・e-(u)pTeXで利用可能。

    • e-(u)pTeXの場合、文字コードが256以上の場合は和文文字トークンが生成される。※従って、文字コードの範囲は「欧文または和文として有効な値」となる。
    • e-upTeXでの和文カテゴリコードは\the-文字列の規則に従うが、例外的に、その文字の和文カテゴリコードが15のときは、代わりに和文カテゴリコードが18の和文文字トークンを生成する。
  • \Ucharcat‹整数:文字コード›‹整数:カテゴリコード› ★:指定の文字コードとカテゴリコードを持つ文字トークン。
    ※XeTeX・e-(u)pTeXで利用可能。

    • e-upTeXの場合、カテゴリコードが16以上の場合には(文字コードとカテゴリコードを和文のものと見なして)和文文字トークンが生成される。なお、文字コードが0~127の範囲の和文文字トークンは生成できない。
    • e-pTeXでは和文文字トークンが和文カテゴリコードを保持しないため、\Ucharcatは欧文専用になる。
    • カテゴリコードとして有効な値は、1~4、6~8、10~13である。ただしe-upTeXでは和文として16~19が指定できて、カテゴリコードが和文か欧文かに応じて文字コードの有効範囲も異なることに注意。
  • \Umathcharclass‹整数:文字コード›:その文字に対する数式クラス*3の値(整数)。
    ※LuaTeXで利用可能。

  • \Umathcharfam‹整数:文字コード›:その文字に対する数式ファミリの値(整数)。
    ※LuaTeXで利用可能。

  • \Umathcharslot‹整数:文字コード›:その文字に対する数式スロット(数式フォント中の文字コード)の値(整数)。
    ※LuaTeXで利用可能。

(続く)

*1:もちろんパラメタだから\theを付ければ展開されるのであるが。

*2:具体的には\XeTeXinputencoding、\XeTeXdefaultencoding、\XeTeXlinebreaklocaleの3つ。

*3:「文字に対する数式クラス・数式ファミリ・数式スロット」というのは元祖TeXの数式コードに対応する概念である。例えば、文字Xに対する数式コード(\mathcode`\X)が"7158だとすると「数式クラスは7、数式ファミリは1、数式スロットは"58」ということになる。

TeXのプリミティブで展開可能なやつ(3)

前回の続き。今回はpdfTeXについて。

pdfTeX関連の注意事項

※一般の注意事項については初回の記事を参照。

  • 整数・寸法・グルー値の情報を返すプリミティブは、他のエンジンでは「読取専用のパラメタ」として提供される(例えば\lastkern)ことが多いが、pdfTeXでは「その値を表す\the-文字列に展開する展開可能プリミティブ」であることが多い。
  • pdfTeXのマニュアルでは\pdfincludecharsが展開可能プリミティブとして挙げられているが、実際には展開不能であるようだ。恐らくこれは単純な記述ミス……?

pdfTeXのやつ

  • pdfTeXの追加のif-トークン ☆:

    • \ifincsname
    • \ifpdfabsdim‹整数比較›
    • \ifpdfabsnum‹寸法比較›
    • \ifpdfprimitive‹トークン›
  • \expanded{‹トークン列›} ★:そのトークン列の完全展開の結果。

    • つまり“展開の加速”(一回展開で完全展開を引き起こす)ができる。
    • 「pdfTeX拡張プリミティブ」という扱いなのであるが、事情があって、一番先にLuaTeXで実装された。pdfTeXで実装されたのはずっと後になってからである(参考)
  • \leftmarginkern‹整数:ボックス番号›: ボックスの左側マージンカーンの幅(寸法)。

  • \pdfcolorstackinit[page] [direct]{‹文字列:PDF命令列›} ◇: 色スタックを新規作成した上で、その色スタック番号(整数)に展開される。

  • \pdfcreationdate:処理開始日時をPDF日時形式で現した文字列。

    • 「PDF日時形式」はD:20060102150405+07'00'のような形式。
  • \pdfescapehex{‹文字列›}:その文字列の16進ダンプの文字列。

    • 「16進ダンプ」は各文字の符号値の16進表記(0埋め、大文字)を並べたもの。
  • \pdfescapename{‹文字列›}:その文字列に対して「PDF名前」用のエスケープを適用した結果の文字列。

  • \pdfescapestring{‹文字列›}:その文字列に対して「PDF文字列」用のエスケープを適用した結果の文字列。

    • PDF文字列を現す外側の丸括弧()は付かない。
  • \pdffiledump[offset‹整数:開始位置›] [length‹整数:長さ›]{‹文字列:ファイル名›}:そのファイルの指定の位置の内容(バイト列)の16進ダンプの文字列。

  • \pdffilemoddate{‹文字列:ファイル名›}:そのファイルの更新日時をPDF日時形式で現した文字列。

  • \pdffilesize{‹文字列:ファイル名›}:そのファイルのサイズ(整数)。

  • \pdffontname‹フォント›:そのフォントを一意に指定する番号(整数)。

    • PDF中でF‹番号›という名前がそのフォントに対応する。
  • \pdffontobjnum‹フォント›:そのフォントに対応するPDFのFontオブジェクトの番号(整数)。

  • \pdffontsize‹フォント›:そのフォントのサイズ(寸法)。

  • \pdfinsertht‹整数:insert番号›:そのinsertの現状での高さ(寸法)。

  • \pdflastmatch‹整数›:最後に実行した正規表現検索(\pdfmatch)の指定番号のマッチの情報で、「‹位置›->‹文字列›」という形式の文字列。

    • 位置は0起点。指定番号のマッチが無効の時は「-1->」となる。
    • 一般の正規表現検索の慣習に従い、番号0は全体のマッチを表す。もし最後の検索が失敗だった場合は0も含めて全てのマッチが無効になる。
  • \pdfmatch[icase] [subcount‹整数:グループ数上限›]{‹文字列:パターン›}{‹文字列:検索対象›} ◇:正規表現検索を行った上で、結果を表す整数に展開される。

    • 値:−1=不正パターンエラー、0=失敗、1=成功。
    • icaseオプションは大小文字同一視指定。
    • POSIX拡張正規表現に従うようである(多分egrepのものと同じ)。
  • \pdfmdfivesum[file]{‹文字列›}:その文字列のMD5ハッシュ値の16進ダンプの文字列。

    • fileオプション付きの場合は、‹文字列›の名前のファイルのハッシュ値になる。
  • \pdfnormaldeviate:平均0、標準偏差65536の正規分布に従う乱数(整数)。

  • \pdfpageref‹整数:ページ番号›:そのページ番号に対するPDFのPageオブジェクトの番号(整数)。

  • \pdfstrcmp{‹文字列1›}{‹文字列2›}:2つの文字列を比較した結果を表す整数。

    • 値:−1=文字列1が小、0=等しい、1=文字列1が大。
    • e-(u)pTeXの場合、和文文字はUTF-8のバイト列に変換した上で比較される。(※内部漢字コードは無関係)
    • XeTeXの場合(プリミティブ名は\strcmp)、文字列をUTF-16のユニット列に変換した上で比較する。従って、BMP外の文字が含まれる場合は必ずしもUnicode符号値の順にはならない。
  • \pdftexbanner:エンジンのバナー文字列。

    • 「バナー文字列」とは起動時に端末に出力される「This is pdfTeX, …」のような文字列。
  • \pdftexrevision:エンジンのリビジョン番号。

    • なお\pdftexversionは読取専用整数パラメタである。
    • 例えばバージョン番号が「1.40.21」の場合、\pdftexrevision21に展開される(ドットは付かない)。\pdftexversionは140になる。
  • \pdfunescapehex{‹文字列:16進ダンプ›}:その16進ダンプが表す文字列。

    • 16進数字の英字は大文字でも小文字でもよい。16進数字以外の文字は無視される。
  • \pdfuniformdeviate‹整数:上限›:0以上‹上限›未満の一葉乱数(整数)。

  • \pdfxformname‹整数›:その番号のFormオブジェクトを一意に指定するTeX内で使用される番号(整数)。

    • PDF中でFm‹番号›という名前が当該のFormオブジェクトに対応する。
  • \pdfximagebbox‹整数:Image番号›‹整数:位置番号›:その番号のImageオブジェクトのバウンディングボックスの、位置番号に対応する座標値(寸法)。

    • 位置番号:1=左下隅x、2=左下隅y、3=右上隅x、4=右上隅y。
  • rightmarginkern‹整数:ボックス番号›: ボックスの右側マージンカーンの幅(寸法)。

そして最後に特殊なもの。

  • \pdfprimitiveは「直後の制御綴を、それが現在保持している値とは無関係に、同名のpdfTeXのプリミティブを保持するものと見なす」という、やや特殊な働きを持つ。\pdfprimitive\制御綴…が展開可能であるかは、「\制御綴と同名のプリミティブ」が展開可能であるかに依存する。
    • プリミティブが展開可能ならば、\pdfprimitive\制御綴…全体が展開可能であり、その展開結果は「プリミティブの\制御綴…の展開結果」となる。
    • プリミティブが展開不能ならば、\pdfprimitive\制御綴…全体も展開可能である。
    • 何れにしても、「プリミティブを保持する特殊なトークンに展開される」という仕様ではないことに注意。

(続く)

TeXのプリミティブで展開可能なやつ(2)

前回の続き。今回はpTeX系について。

pTeX系関連の注意事項

※一般の注意事項については初回の記事を参照。

  • upTeXで「和文文字を含む\the-文字列」が生成される場合、和文文字トークンの和文カテゴリコードは、その時点における当該の和文文字に対する和文カテゴリコード(\kcatcodeの値)になる。もし和文カテゴリコードが15だったら、アレなこと*1になる。
  • “フォント”の引数には、\jfont\tfontも使える。

pTeXのやつ

  • pTeXの追加のif-トークン ☆:

    • \ifdbox‹整数:ボックス番号›
    • \ifddir
    • \ifjfont‹フォント›
    • \ifmbox‹整数:ボックス番号›
    • \ifmdir
    • \iftbox‹整数:ボックス番号›
    • \iftdir
    • \iftfont‹フォント›
    • \ifybox‹整数:ボックス番号›
    • \ifydir
  • “漢字コード変換子”、すなわち\euc‹整数›\jis‹整数›\kuten‹整数›\sjis‹整数›:「当該の漢字コードでの符号値が引数の整数に等しい和文文字の、内部漢字コードでの符号値」の十進表記文字列。

  • \ptexrevisionpTeXのリビジョン番号の文字列。

    • なお\ptexversion\ptexminorversionは読取専用整数パラメタである。
  • \kansuji‹整数›:その整数の(一〇方式の)漢数字表記の文字列。負数の場合は空になる。

    • \kansujicharで漢数字として使用する文字を変更できる。

upTeXのやつ

  • upTeXの追加の“漢字コード変換子”:
    • \ucs‹整数›
      ※将来にはpTeXでもサポートされる予定。

e-pTeXのやつ

e-pTeX独自(つまり、“非eのpTeX系”にも“非pTeX系”にもない)のプリミティブは存在する*2のだが、その中には展開可能のものはなさそう。

\Uchar\UcharcatについてはXeTeXの記事を参照。

(続く)

*1:「欧文扱い」が適用されるので、UTF-8のバイト列を表す欧文文字トークン列(カテゴリコード12)に変換される。

*2:例えば\epTeXinputencodingなど。なお「e-upTeX独自」、つまり「e-upTeXにあるがupTeXにもe-pTeXにもない」プリミティブは存在しない。