Ist es möglich, die „Quantisierung“ der zulässigen Sprunglängen anzupassen?

Ist es möglich, die „Quantisierung“ der zulässigen Sprunglängen anzupassen?

In Plain TeX und abgeleiteten Formaten ist das Konzept der dehnbaren/schrumpfbaren Länge, auch bekannt alsKleberoder einüberspringenoder einGummilängeexistiert, im Allgemeinen definiert als

<dimen> plus <stretch-dimen> minus <shrink-dimen>

wobei <dimen>die Basisdimension ist und <stretch-dimen>und <shrink-dimen>die maximalen Dehnungs- bzw. Schrumpfwerte sind. Die Sprunglänge wird innerhalb dieser Grenzen angepasst, um in den Container zu passen.

Da die kleinste Einheit der TeX-Berechnung der skalierte Punkt ist, 1spgehe ich davon aus, dass alle Dehnungs-/Schrumpfungsberechnungen auf dieser Ebene quantisiert werden.

Ist es möglich, die „Quantisierungseinheit“ für Sprunglängen zu ändern? Ich denke, das ist nicht möglich, da diese tief unten im Primitiv liegt. Aber ich bin kein TeXpert, und wenn es möglich wäre, könnte es meiner Meinung nach für rasterartige Satzaufgaben nützlich sein.

Hier ist ein stark vereinfachtes MWE, das die Grundidee mit einfachem TeX-Code darstellt:

\def\z{\hbox to 0pt{\hss\strut\vrule\hss}}
\def\zz{\z\hskip4pt}
\def\zzz{\zz\zz\zz\zz\zz}
x\z\hskip12pt plus 12pt minus 0pt %step 4pt
\z

x\z\hskip16pt plus 12pt minus 0pt %step 4pt
\z

x\hbox to 23pt{\z\hfill\hskip16pt plus 12pt minus 0pt %step 4pt
\z\hfill}

x\zzz\zzz\zzz\zzz
\bye

was ergibt:

Bildbeschreibung hier eingeben

In den ersten beiden Zeilen wird die Basisdimension verwendet, sodass die Regeln mit dem „Raster“ (der letzten Zeile) übereinstimmen. In der vorletzten Zeile wird jedoch eine Streckungskomponente verwendet, die kein Vielfaches des Rasterabstands ist, sodass die Regel nicht ausgerichtet ist.

Gibt es eine Möglichkeit, die „Quantisierung“ so anzupassen, dass die Dehnungskomponente auf das nächste Vielfache des Rasterabstands (hier 4pt) einrastet?

Antwort1

Die Berechnung der „Plus- und Minus“-Ergebnisse erfolgt in TeX mithilfe einer computerabhängigen Implementierung von Zahlen. Daher entschied Knuth, dass es keine Möglichkeit geben sollte, auf diese Ergebnisse durch Makroprogrammierer zuzugreifen, um die Erstellung computerabhängiger Ergebnisse im Dokument durch die Makrosprache zu verhindern.

Ich empfehle das Makro \roundto{dimen}. Dieses Makro berechnet die Breite der vorherigen Box auf das Vielfache von "dimen". Die Verwendung in unserem Beispiel wäre:

x\hbox to 23pt{\z\hfill\hskip16pt plus 12pt minus 0pt \z\hfill}

x\hbox{\z\hskip16pt}\hbox to\dimexpr(23pt-16pt)/2{\hfil}\roundto{4pt}\z

x\zzz\zzz\zzz\zzz

Ihr Beispiel (erste Zeile) enthält ein festes \hskip16ptPluszeichen 2*\hfillin 23pt. Jedes \hfillnimmt also (23pt-16pt)/2Platz ein. Das \zsteht nach dem ersten \hfill, also hat das zweite Feld in meinem Beispiel diese Dimension. Und das \roundtoMakro rundet die Breite dieses Felds auf ein Vielfaches von 4pt. Das \zwird nach der Rundung gedruckt.

Das \roundboxMakro kann wie folgt implementiert werden:

\newcount\tmpnum
\def\roundto#1{\setbox0=\lastbox \tmpnum=\wd0 \dimen0=#1\relax
   % \advance\tmpnum by\dimexpr \dimen0/2\relax
   % uncomment this ^ ^, if you need "central" roundning
   % \advance\tmpnum by\dimen0 \advance\tmpnum by-1
   % uncomment this ^ ^, if you need "upper" roundning
   \divide\tmpnum by\dimen0 \multiply\tmpnum by\dimen0
   \wd0=\the\tmpnum sp
   \box0
}

Sinnvoller Einsatz von \roundtoMakros:

x\hbox{\z various text\quad}\roundto{4pt}\z next text is aligned.

x\zzz\zzz\zzz\zzz

verwandte Informationen