e-TeX を使用したマクロ技術

e-TeX を使用したマクロ技術

e-TeX拡張機能はKnuthのオリジナルTeXの欠点のいくつかに対処することを目的としており、LaTeX2eではしばらくの間必須となっているため、ほとんどのパッケージ作者はそれらの存在を信頼することができます。現在、純粋なTeXマクロイディオムを学ぶためのリソースがいくつかありますが、この議論このサイトでも、またe-TeXの利点一般的に、e-TeX 拡張機能によってマクロ作成者の作業がいかに楽になるか、具体的な例をいくつか見たいと思います。

特に、拡張や解析に関連するコマンド、、の使用に関する実用的なアドバイスやコツが\protectedあれ\unexpanded\detokenizeありがたい\scantokensです。これらは便利そうに見えますが、物事を簡素化するために使用できることに気付きませんでした(e-TeX マニュアルそれらについても非常に簡潔です。


質問の範囲はかなり広範囲ですが、私が最も興味を持っているのは、上記の拡張機能です。以下は、私が喜んで議論したい他の拡張機能に関するさらなる考察です。

いくつかの拡張機能については、その有用性がすぐに分かりました。

  • タイプごとに32767スロットに増加したため、新しいレジスタの割り当てを心配する必要がありません。
  • 算術演算を容易にする便利な\numexpr\dimexprコマンド
  • \unless否定された として\if、特に s と組み合わせて、\loop条件が偽である限りループを実行する場合は、新しい条件を定義する必要がある場合
  • 診断に役立つさまざまな新しいトレースコマンドとオプション

しかし、いくつかの機能は、実際にパッケージで使用されているのか、それともより「現代的な」アプローチに置き換えられたのか疑問に思います。

  • など\beginLによる混合方向組版\beginR
  • \currentgrouptype、などのステータスの問い合わせ\currentiftype\lastnodetype
  • ページ上部から破棄されたアイテムを保存する可能性が組み込まれている\pagediscards
  • ライン固有のペナルティ\interlinepenaltiesなど

答え1

e-TeX の「大きな」項目を取り上げます。

  • \protectedまたは同様の 内で展開されないマクロを作成できます\edef

    \protected\def\foo{\let\baz\bong}
    \edef\test{Some text\foo}
    

    通常はエラーになります(\baz/の定義がないと仮定\bong)が、ここでは「安全」です。LaTeX2eのメカニズムを見ると\protect、上記は多く より使いやすく、より信頼できる:\protectedマクロ一度もない型定義内では expand を使用しますxが、LaTeX2e アプローチでは\protected@edefなどが必要になります。

  • \unexpandedトークンを使わずに任意のトークンを拡張から保護することができます

    \edef\test{Some text\unexpanded{lots of \textbf{stuff}}}
    

    これは任意のユーザー入力に非常に便利です。また、次のようなことも可能です。

    \edef\demo{\unexpanded{tokens #}}
    

    つまり、#マクロ内に簡単に保存できます (expl3 tlデータ型を参照)。

  • \detokenizeアクティブな文字がある場合など、物事を「安全」にするのに適しています

    \csname Tokens\detokenize{&_~^\foo}\endcsname
    

    これは、例えばLaTeXでUTF-8入力にアクティブ文字を使用する場合に特に当てはまります。

  • \numexprなど、拡張可能な計算を簡単に行うのに最適です。

答え2

TeX Live でソース ファイルを grep すると、少なくとも私の認識ではそれほど普及していない e-TeX の機能の使用に関する洞察を追加できます。

一部の状況照会プリミティブについては、Heiko Oberdiek のパッケージがその応用例を示しています。このatbegshiパッケージは、引数としてボックスを取るプリミティブを再定義する方法 (\shipoutこの場合は ) の巧妙なトリックを示していますが、引数が および でインターセプトされる場合、代入後に挿入されるトークンは、ボックスが として指定されるか として指定されるかに応じて、ボックス内に配置される場合と配置されない場合があることを\setbox考慮に\afterassignment入れています。これは、おおよそ次のようになります。box0\hbox{...}

\def\shipout{%
  \edef\saved@grouplevel{\number\currentgrouplevel}
  \afterassignment\@test 
  \setbox\mybox=}

\def\@test{%
  \ifnum\saved@grouplevel<\currentgrouplevel
    \expandafter\aftergroup
  \fi
    \output
}

e-TeX を使用して、ボックス内 (グループを開く) に到達した\currentgrouplevelかどうかを判断します。その場合、後続の操作はボックスの後まで延期されます。\@test\output

もう 1 つの便利な事実は、\lastnodetype破棄できないものすべてに対しては 11 未満であり、現在のリストがまだ空の場合は -1 であるということです (setouterhboxこれらの適用例については、例を参照してください)。

egregがコメントで指摘しているように、\currentgrouptype数式モードでは、区切り文字のバリアントを使用するか\middleどうかを決定するためにクエリを実行できます。たとえば、次のよう\currentgrouptypeに開かれたグループ内の16がそうです。\leftここ)。

e-TeXの双方向組版TeX の形式での機能 - XeT は XeTeX によって使用されるもので、このbidiパッケージはこれらの機能へのインターフェイスを提供します。また、一部の標準 LaTeX パッケージでも、babel-hebrewこのような方法が適しているようです。ただし、LuaTeX は\beginL\beginRなどのプリミティブを放棄し、代わりに Omega TeX 拡張機能を統合しています。

とはいえ、いくつかの機能については、実際の用途が見つかりませんでした。これらの機能が登場する唯一の場所は、LaTeX3 カーネル、ConTeXt MkIV、パッケージなど、おそらくすべてのプリミティブが登場する場所とunravel、それらを使用して他のパッケージとの互換性を高めようとした他のいくつかの場所です。これらの機能には、\currentif{type,branch,level}問い合わせ、\pagediscards機能、行固有のが含まれます\{inter,club,widow}linepenalties

関連情報