
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, 1sp
gehe 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:
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 \hskip16pt
Pluszeichen 2*\hfill
in 23pt. Jedes \hfill
nimmt also (23pt-16pt)/2
Platz ein. Das \z
steht nach dem ersten \hfill
, also hat das zweite Feld in meinem Beispiel diese Dimension. Und das \roundto
Makro rundet die Breite dieses Felds auf ein Vielfaches von 4pt. Das \z
wird nach der Rundung gedruckt.
Das \roundbox
Makro 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 \roundto
Makros:
x\hbox{\z various text\quad}\roundto{4pt}\z next text is aligned.
x\zzz\zzz\zzz\zzz