Was ist eine interne Dimension/ein interner Kleber/ein interner Mugglue?

Was ist eine interne Dimension/ein interner Kleber/ein interner Mugglue?

In der Dokumentation von l3skipwird \dim_eval:ngewarnt

Dies [...] erfordert eine geeignete Terminierung, wenn es in einer TeX-artigen Zuweisung verwendet wird, da es kein ⟨ istInnenmaß⟩.

Analoge Warnungen finden sich in den Beschreibungen für \skip_eval:nund \muskip_eval:nmit ⟨Innenkleber⟩ Und ⟨innerer Muggel⟩ anstelle von ⟨Innenmaß⟩.

Ich bin ziemlich vertraut mit der Handhabung von Sprüngen und Dimensionen in TeX, aber ich bin noch nie auf den Ausdruck gestoßenInnenmaß. Im TeXbook konnte ich außer der eher technischen Grammatiknotation in Kapitel 24, die zwar alle nötigen Informationen enthält, mir aber nicht wirklich weiterhilft, keine Erklärung für die Phrase finden.

Was genau ist also einInnenmaß? Welche anderen Arten von Dimensionen gibt es? (Externe Dimensionen?) Was sind Beispiele für unterschiedliches Verhalten der beiden (wie das, auf das in der Warnung oben angespielt wird)?

Antwort1

Ich werde mich zunächst mit dem allgemeinen TeX-Konzept befassen und dann darauf eingehen, warum es für die Dokumentation dieser expl3Funktionen wichtig ist.

Eine interne Dimension (oder interner Zähler oder was auch immer) ist etwas, das von TeX analysiert wurde und nun in der richtigen Form gespeichert wird. TeX „weiß“ also, dass eine interne DimensionIsteine gültige Dimension und muss nicht nach weiterem Material „suchen“. Im Gegensatz dazu ist eine externe Dimension (usw.) ist etwas, das aus diskreten Token besteht und von TeX neu analysiert werden müsste, um verwendet werden zu können. Wenn wir alsoschreiben 12.0ptgeben wir eineexternDarstellung (TeX müsste es analysieren, um zu wissen, dass es eine gültige Dimension ist), aber nach

\newdimen\mydimen
\mydimen=12pt %

Ich kann verwenden \mydimenund TeX tutnichtmuss etwas analysieren: \mydimenenthält eine interne Dimension.

Warum ist das wichtig? Es geht um die Parsing-Regeln von TeX, insbesondere darum, dass TeX ein optionales Leerzeichen am Ende von Dimensionen, Ganzzahlen,usw., und was noch wichtiger ist, dass TeX bei einer externen Darstellung nicht mit dem Parsen aufhört, bis es etwas findet, das nicht „passt“. Zum Beispiel

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

Sie werden sehen, dass der erste Fall das falsche Ergebnis liefert: Wir haben ein Makro, das einfach zu erweitert wird 123, und TeX sucht weiter nach einer Ganzzahl, bis wir auf das optionale Leerzeichen stoßen. Im Gegensatz dazu gibt es bei einer internen Zähldarstellung keine Frage der Analyse:\fooint Ist 123.

Der entscheidende Punkt ist, dass eine interne Darstellung sicherer (und schneller) zu verwenden ist: Es stellt sich nie die Frage, wo sie endet.


Wie verhält sich das zu expl3? Etwas wie \dim_eval:nwird verwendet, um einen Ausdruck zu nehmen und in eine Dimension umzuwandeln. Es erweist sich jedoch als praktisch, dies auch einfach zu setzen und durch Erweiterung in einem Makro ( tl) zu speichern.usw.Dazu müssen wir dafür sorgen, dass die Auswertung zu einemexternRepräsentation, nicht eineintern1. Das heißt, diese Funktionen verhalten sich wie das Speichern eines Wertes als Makro: Sie müssen auf die Terminierung achten.

Bei der reinen expl3Verwendung ist das kein Problem, da wir die korrekte Terminierung an den richtigen Stellen haben. Wenn Sie diese Funktionen jedoch mit klassischerer TeX-Programmierung kombinieren, müssen Sie wissen, wie sie sich verhalten. DieAntwort von egregzeigt dies sehr schön.


Für diejenigen, die die TeX-Details wollen, \dim_eval:nist in primitiven Begriffen

\the\dimexpr #1\relax

Wenn wir eine interne Darstellung haben wollen, brauchen wir nur

\dimexpr #1\relax

Dies kann jedoch nicht im Schriftsatz oder (erfolgreich) innerhalb einer x-Typerweiterung verwendet werden und ist daher für die gewünschte Definition nicht geeignet.

Antwort2

Betrachten Sie das folgende Beispiel

\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}

was einen Fehler auslöst

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

Dies ist genau das, worauf in Bezug genommen wird interface3.

Ein <internal dimension>ist jedes \dimenRegister oder jedes interne Register, das eine (starre) Länge speichert, wie z. B. \parindent; bei e-TeX-Erweiterungen \dimexprist es auch eine Instanz von <internal dimension>.

Eine weitere wichtige Tatsache ist, dass \newlengthein Register zugewiesen wird , sodass TeX nach oder Spezifikationen \skipsucht . Dies tritt nicht auf, wenn verwendet wird, da das Makro die geeignete Beendigung bereitstellt.plusminus\setlength\relax

verwandte Informationen