
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
。