内部寸法/接着剤/マググルーとは何ですか?

内部寸法/接着剤/マググルーとは何ですか?

l3skipのドキュメントでは\dim_eval:n警告されている

これは[...] TeXスタイルの代入で使用する場合は適切な終了が必要です。なぜなら、これは⟨内部寸法⟩.

\skip_eval:n同様の警告は、およびの説明にも記載されています\muskip_eval:n内部接着剤⟩ そして ⟨内部マグルー⟩ 代わりに ⟨内部寸法⟩.

私はTeXでスキップや次元を扱うことにかなり精通していますが、次のような表現は初めてです。内部寸法TeXbook では、第 24 章のかなり技術的な文法表記以外ではこのフレーズの説明を見つけることができませんでした。この第 24 章には必要な情報がすべて含まれているはずですが、私にとってはあまり役に立ちませんでした。

では、内部寸法他の種類のディメンションとは何ですか? (外部ディメンション?) 2 つの動作が異なる例は何ですか (上記の警告で示唆されているものなど)?

答え1

まず、一般的な TeX の概念について説明し、次にそれがこれらのexpl3関数のドキュメント化においてなぜ重要であるかについて説明します。

内部次元(または内部カウントなど)は、TeXによって解析され、正しい形式で保存されているものです。したがって、TeXは内部次元が有効な寸法であり、それ以上の材料を「探す」必要はありません。対照的に、外部寸法()は個別のトークンで構成されており、使用するにはTeXで再解析する必要があります。書く 12.0pt、私たちは外部の表現(TeXはそれが有効な次元であるかどうかを知るためにそれを解析する必要がある)だが、

\newdimen\mydimen
\mydimen=12pt %

\mydimen私はTeXを使用できるない何かを解析する必要がある:\mydimen内部ディメンションを保持します。

なぜこれが重要なのか?それはTeXの構文解析ルールに関するもので、特にTeXでは次元、整数、そしてさらに重要なのは、外部表現の場合、TeXは「適合しない」何かを見つけるまで解析を止めないことです。例えば

\def\foo{123}
\newcount\fooint
\fooint=123 %
\newcount\testint
%%%
\testint=\foo 456 %
\showthe\testint
\testint=\fooint 456 %
\showthe\testint

最初のケースでは間違った結果が返されることがわかります。マクロは単に に展開され123、TeX はオプションのスペースに達するまで整数を探し続けます。対照的に、内部カウント表現では、解析の問題はありません。\fooint 123

重要な点は、内部表現の方が「安全」に使用できる(さらに高速)ということです。どこで終了するかという疑問が生じることはありません。


これは とどう関係するのでしょうかexpl3? のような式は、式を次元に変換するために使用されます。しかし、それを単にタイプセットして、マクロ ( )\dim_eval:nに展開して保存できるようにしておくと便利であることがわかります。tlそのためには、評価結果が外部の表現ではなく、内部つまり、これらの関数は値をマクロとして保存するのと同じように動作し、終了に注意する必要があります。

'純粋な'expl3使用法では、適切な場所で正しい終了処理が行われるため、これは問題ではありません。しかし、これらの関数をより古典的なTeXプログラミングと組み合わせて使用​​する場合は、それらがどのように動作するかを知っておく必要があります。egregによる回答これをうまく示しています。


TeXの詳細を知りたい人のために、\dim_eval:n基本的な用語で説明すると

\the\dimexpr #1\relax

一方、内部表現にしたい場合は、

\dimexpr #1\relax

ただし、これはタイプセッティングや (正常に) 型展開内では使用できないためx、必要な定義には適していません。

答え2

次の例を考えてみましょう

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\cs_set_eq:NN \dimeval \dim_eval:n
\ExplSyntaxOff

\newlength{\mylen}

\begin{document}

Do an assignment \mylen=\dimeval{3pt+1cm} plus something else.

\end{document}

エラーが発生する

! Missing number, treated as zero.
<to be read again> 
                   s
l.12 ...assignment \mylen=\dimeval{3pt+1cm} plus s
                                                  omething else.

これはまさに で言及されているものですinterface3

は、 などの (固定の) 長さを格納する任意のレジスタまたは任意の内部レジスタ<internal dimension>です。e-TeX 拡張機能を使用すると、 ものインスタンスになります。\dimen\parindent\dimexpr<internal dimension>

もう 1 つの重要な事実は、 はレジスタ\newlengthを割り当てるため、TeX はまたは の指定\skipを期待するということです。が使用される場合、マクロが適切な終了を提供するため、これは発生しません。plusminus\setlength\relax

関連情報