A continuación se muestra un fragmento de código tomado de multido.tex
. Noté que las tareas no terminan con %
.
Ver
\dimen@=#1\advance\dimen@#2
en\def\multido@step@d#1#2{% \dimen@=#1\advance\dimen@#2 \edef#1{\number\dimen@ sp}}%
ver de nuevo
\count@=#1\advance\count@ by #2
en\def\multido@step@i#1#2{% \count@=#1\advance\count@ by #2 \edef#1{\the\count@}}
Ver de nuevo
\dimen@=#1pt
,\dimen@=#2pt
y\dimen@=#1pt\advance\dimen@#2
en\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}
¿Las asignaciones producen espacios en blanco al final que deben terminar con %
?
Respuesta1
Ejemplo 1
\def\multido@step@d#1#2{%
\dimen@=#1\advance\dimen@#2
\edef#1{\number\dimen@ sp}}%
Después #2
debería haber \relax
. De hecho, si #2
es un registro o un parámetro como \z@
o \lineskip
, el espacio proporcionado al final de la línea seríanoser ignorado. En este caso también %
podría usarse, porque el siguiente token no se puede expandir ( \edef
). La lista de tokens obtenida \multido@step@d{\x}{2pt}
sería (denoto el token de espacio con •)
\dimen@=\x\advance\dimen@2pt•\edef\x{\number\dimen@ sp}
y el espacio anterior \edef
sería ignorado. Pero con `\multido@step@d{\x}{\parindent} uno tendría
\dimen@=\x\advance\dimen@\parindent•\edef\x{\number\dimen@ sp}
y la ficha de espacio seríanoser ignorado. El hecho de que siga a una palabra de control es irrelevante: la fase de tokenización ya ha tenido lugar. Con \relax
después #2
estaría \relax
en lugar de la ficha de espacio.
Ejemplo 2
Es lo mismo. debería haber \relax
después#2
Ejemplo 3
Numeraré las líneas para mayor claridad.
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}
No es necesario terminar las líneas 2 y 4 con %
; en realidad, un %
al final de la línea 4 sería incorrecto, porque TeX comenzaría a expandirse \ifnum
antes de haber realizado la asignación \dimen@
(probablemente inofensivo, en este caso particular).
El mismo problema que antes está en la línea 3: %
aquí es bueno, porque el siguiente token \dimen@
no se puede expandir; \relax
hubiera sido mejor.
La línea 8 debería tener \relax
al final, por las mismas razones que antes; no a %
, porque un argumento #2
como 2pt
desencadenaría la expansión de \multido@dimtonum
antes de que se haya realizado la asignación.
Respuesta2
Cuando TeX busca la dimensión, a menos que la cantidad que se almacena se presente en forma de registro, continuará buscando el número y la unidad (expandiéndose en el camino) hasta llegar a un espacio o carácter inapropiado. Se elimina el espacio; por lo tanto, las tareas escritas a medida que las muestra tienen funcionalmente el mismo comportamiento que las palabras de control al eliminar el siguiente espacio en blanco. Y por supuesto, si la dimensiónesun registro, entonces el nombre del registro será una palabra de control en sí misma (tragándose así el espacio) o será un número que TeX buscará...
Dicho eso,algunode las tareas que muestra utilizan un argumento (como #2
) para la dimensión. Alguien astuto o demasiado inteligente podría usar un registro para eso, y entonces el espacio no se consumiría porque se escribiría en la definición de macro antes de que se lea la palabra de control. En la práctica, cuando dichos datos no están bajo el control del programador, es mejor simplemente eliminar el espacio con un archivo \relax
.