Müssen Zuweisungen mit einem %-Zeichen versehen werden, um die nachstehenden Leerzeichen zu entfernen?

Müssen Zuweisungen mit einem %-Zeichen versehen werden, um die nachstehenden Leerzeichen zu entfernen?

Nachfolgend sehen Sie einen Codeausschnitt aus multido.tex. Mir ist aufgefallen, dass Zuweisungen nicht mit enden %.

  • Sehen \dimen@=#1\advance\dimen@#2in

    \def\multido@step@d#1#2{%
      \dimen@=#1\advance\dimen@#2
      \edef#1{\number\dimen@ sp}}%
    
  • Siehe \count@=#1\advance\count@ by #2auch

    \def\multido@step@i#1#2{%
      \count@=#1\advance\count@ by #2
      \edef#1{\the\count@}}
    
  • Sehen Sie wieder \dimen@=#1pt, \dimen@=#2ptund \dimen@=#1pt\advance\dimen@#2in

    \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 #2sollte folgen \relax. Wenn es sich tatsächlich #2um 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 \edefwü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 \relaxdanach #2stünde \relaxan Stelle des Leerzeichens ein Token.

Beispiel 2

Es ist genau das gleiche. Es sollte \relaxdanach 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, \ifnumbevor 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; \relaxwäre besser gewesen.

Aus den gleichen Gründen wie zuvor sollte Zeile 8 \relaxam Ende stehen; kein %, da ein Argument #2wie 2ptdie Erweiterung von auslösen würde, \multido@dimtonumbevor 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.

verwandte Informationen