Nachfolgend sehen Sie einen Codeausschnitt aus multido.tex
. Mir ist aufgefallen, dass Zuweisungen nicht mit enden %
.
Sehen
\dimen@=#1\advance\dimen@#2
in\def\multido@step@d#1#2{% \dimen@=#1\advance\dimen@#2 \edef#1{\number\dimen@ sp}}%
Siehe
\count@=#1\advance\count@ by #2
auch\def\multido@step@i#1#2{% \count@=#1\advance\count@ by #2 \edef#1{\the\count@}}
Sehen Sie wieder
\dimen@=#1pt
,\dimen@=#2pt
und\dimen@=#1pt\advance\dimen@#2
in\def\multido@init@r#1#2#3{% \dimen@=#1pt \multido@dimtonum\dimen@#3% \dimen@=#2pt \ifnum\multido@count<\z@\dimen@=-\dimen@\fi \multido@addtostep{\do\multido@step@r{\do#3}{\number\dimen@ sp}}} \def\multido@step@r#1#2{% \dimen@=#1pt\advance\dimen@#2 \multido@dimtonum\dimen@#1}
Erzeugen Zuweisungen nachstehende Leerzeichen, die mit beendet werden müssen %
?
Antwort1
Beispiel 1
\def\multido@step@d#1#2{%
\dimen@=#1\advance\dimen@#2
\edef#1{\number\dimen@ sp}}%
Danach #2
sollte folgen \relax
. Wenn es sich tatsächlich #2
um ein Register oder einen Parameter wie \z@
oder handelt \lineskip
, würde der durch das Zeilenende bereitgestellte Platznichtignoriert werden. In diesem Fall %
könnte auch verwendet werden, da das folgende Token nicht erweiterbar ist ( \edef
). Die Tokenliste, die wir erhalten, \multido@step@d{\x}{2pt}
wäre (ich kennzeichne das Leerzeichen-Token mit •)
\dimen@=\x\advance\dimen@2pt•\edef\x{\number\dimen@ sp}
und das Leerzeichen davor \edef
würde ignoriert. Aber mit `\multido@step@d{\x}{\parindent} hätte man
\dimen@=\x\advance\dimen@\parindent•\edef\x{\number\dimen@ sp}
und das Leerzeichen würdenichtignoriert werden. Dass danach ein Steuerwort folgt, ist irrelevant: Die Tokenisierungsphase hat bereits stattgefunden. Mit \relax
danach #2
stünde \relax
an Stelle des Leerzeichens ein Token.
Beispiel 2
Es ist genau das gleiche. Es sollte \relax
danach geben#2
Beispiel 3
Der Übersichtlichkeit halber werde ich die Zeilen nummerieren.
1 \def\multido@init@r#1#2#3{%
2 \dimen@=#1pt
3 \multido@dimtonum\dimen@#3%
4 \dimen@=#2pt
5 \ifnum\multido@count<\z@\dimen@=-\dimen@\fi
6 \multido@addtostep{\do\multido@step@r{\do#3}{\number\dimen@ sp}}}
7 \def\multido@step@r#1#2{%
8 \dimen@=#1pt\advance\dimen@#2
9 \multido@dimtonum\dimen@#1}
Es besteht keine Notwendigkeit, die Zeilen 2 und 4 mit abzuschließen %
. Tatsächlich wäre ein %
am Ende der vierten Zeile falsch, da TeX mit der Expansion beginnen würde, \ifnum
bevor die Zuweisung an durchgeführt worden wäre \dimen@
(was in diesem speziellen Fall wahrscheinlich harmlos wäre).
In Zeile 3 besteht das gleiche Problem wie zuvor: Das %
ist hier gut, da das folgende Token \dimen@
nicht erweiterbar ist; \relax
wäre besser gewesen.
Aus den gleichen Gründen wie zuvor sollte Zeile 8 \relax
am Ende stehen; kein %
, da ein Argument #2
wie 2pt
die Erweiterung von auslösen würde, \multido@dimtonum
bevor die Zuweisung ausgeführt wurde.
Antwort2
Wenn TeX nach der Dimension sucht, wird es, sofern die zu speichernde Menge nicht in Form eines Registers vorliegt, weiter nach der Zahl und der Einheit suchen (und dabei erweitern), bis es auf ein Leerzeichen oder ein unpassendes Zeichen stößt. Das Leerzeichen wird entfernt; daher haben Zuweisungen, die so geschrieben werden, wie Sie sie zeigen, funktionell dasselbe Verhalten wie Kontrollwörter beim Entfernen des folgenden Leerzeichens. Und natürlich, wenn die DimensionIstein Register, dann ist der Registername entweder selbst ein Steuerwort (und verschlingt somit den Platz) oder eine Zahl, nach der TeX sucht ...
Das gesagt,mancheder von Ihnen gezeigten Zuweisungen verwenden ein Argument (wie #2
) für die Dimension. Jemand, der hinterhältig oder zu schlau ist, könnte dafür ein Register verwenden, und dann würde der Speicherplatz nicht verbraucht, weil er in die Makrodefinition geschrieben würde, bevor das Steuerwort gelesen wird. In der Praxis ist es besser, den Speicherplatz einfach mit einem zu löschen, wenn solche Daten nicht unter der Kontrolle des Programmierers stehen \relax
.