Wie verwende ich l3skip als Argument für setlength?

Wie verwende ich l3skip als Argument für setlength?

Wie kann ich das Senden von L3skip-Ausdrücken an wiederherstellen setlength? Oder: Wie konvertiere ich length + stretch - shrinkin length plus stretch minus shrink\relax?

\ExplSyntaxOn
\skip_const:Nn \c__par_skip    { 1ex  +0.2ex     -0.1ex   }
\setlength {\c__par_skip}   % NOPE!
\exp_args:Nv \setlength {\skip_use:N \c__par_skip}   % ALSO NO: skip_use:N evaluates

Antwort1

Meine Kommentare in eine Antwort umwandeln:

Ihre Eingabesyntax für \skip_const:Nnist höchstwahrscheinlich nicht die gewünschte. Die Sprünge im Ausdruck werden ausgewertet, sodass Sie einfache Berechnungen verwenden können. Ihr 1ex + 0.2ex - 0.1exwird als eine solche Berechnung ausgewertet und das Ergebnis ist (das von TeX in / 1.1exumgewandelt wird und die zugrunde liegenden Register von TeX verwendet).ptspl3skip

Wenn Sie stattdessen einen Sprung mit Kleber eingeben möchten, sollten Sie trotzdem plusFolgendes eingeben minus:

\skip_const:Nn \c__douglas_par_skip { 1ex plus 0.2ex minus 0.1ex }

Wenn articlegeladen und die Standardschriftgröße eingestellt ist, wird dies dazu führen, dass \c__douglas_par_skipauf eingestellt wird 4.30554pt plus 0.86108pt minus 0.43057pt.

Wenn Sie dies nun einer LaTeX2e-Länge zuweisen möchten, können Sie einfach verwenden, \skip_use:Nwodurch die obige Zeichenfolge eingefügt wird. Das Folgende bewirkt also, was Sie möchten:

\newlength \douglaslength
\setlength \douglaslength { \skip_use:N \c__douglas_par_skip }

Komplettes MWE:

\documentclass{article}

\ExplSyntaxOn
\skip_const:Nn \c__douglas_par_skip {1ex plus 0.2ex minus 0.1ex}
\newlength \douglaslength
\setlength \douglaslength { \skip_use:N \c__douglas_par_skip }
\showthe \douglaslength
\stop

druckt

> 4.30554pt plus 0.86108pt minus 0.43057pt.
l.7 \showthe \douglaslength

zum Terminal.

Antwort2

Ein Skip ist eingeordnetes Wertetripel, herkömmliche Eingabe als

<length1> plus <length2> minus <length2>

Die erste Länge wird mit einer der Standardeinheiten ( pt, mm, cmusw.) angegeben; die anderen beiden können mit einer Standardeinheit oder mit

fil    fill    filll

entsprechend der „Reihenfolge des unendlichen Klebers“. Beim Summieren von Sprüngen erfolgt die Addition komponentenweise, wobei unendliche Kleber gegenüber endlichen Klebern siegen und der mit mehr l's gegenüber dem mit weniger l's siegt. Wenn eines plusoder minusfehlt (oder beides), ist der zugewiesene Wert im Tripel implizit 0pt. Die Längen müssen in der genauen Reihenfolge angegeben werden.

Die Schlüsselwörter plusund minusähneln lediglich den Standardnamen für Addition und Subtraktion, bezeichnen aber in keiner Weise eine Addition oder Subtraktion.

Es ist also falsch, einen Sprung einzugeben, wie Sie denken: 1ex +0.2ex -0.1exwäre fehl am Platz in einer Sprungspezifikation mit der primitiven Zuweisung

\skip0=1ex +0.2ex -0.1ex

denn sobald TeX plusdas Folgende nicht sieht <length1>, bricht es die Zuweisung ab.

Mit der expl3Aufgabe

\skip_const:Nn \c__par_skip { 1ex +0.2ex -0.1ex}

wird ein anderer Ansatz verwendet, da expl3Zuweisungen „Ausdrücke“ zulassen. Aber Sprünge müssen trotzdem auf die übliche konventionelle Weise eingegeben werden. Mit diesem Ausdruck erhalten Sie einfach das Äquivalent von

\skip0=1.1ex

Wie funktioniert das Überspringen von Ausdrücken? Angenommen, Sie haben

\skip_new:N \l_dmt_a_skip
\skip_new:N \l_dmt_b_skip
\skip_new:N \l_dmt_c_skip

\skip_set:Nn \l_dmt_a_skip { 12pt plus 6pt minus 3pt }
\skip_set:Nn \l_dmt_b_skip { 24pt plus 1fil }
\skip_set:Nn \l_dmt_c_skip { \l_dmt_a_skip + \l_dmt_b_skip }

\skip_show:N \l_dmt_c_skip

dann bekommst du

\l_dmt_c_skip=36.0pt plus 1.0fil minus 3.0pt

wegen der Funktionsweise der komponentenweisen AdditionUndnach den Regeln für unendlichen Kleber.

verwandte Informationen