¿Es necesario agregar % a las asignaciones para eliminar los espacios en blanco finales?

¿Es necesario agregar % a las asignaciones para eliminar los espacios en blanco finales?

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@#2en

    \def\multido@step@d#1#2{%
      \dimen@=#1\advance\dimen@#2
      \edef#1{\number\dimen@ sp}}%
    
  • ver de nuevo \count@=#1\advance\count@ by #2en

    \def\multido@step@i#1#2{%
      \count@=#1\advance\count@ by #2
      \edef#1{\the\count@}}
    
  • Ver de nuevo \dimen@=#1pt, \dimen@=#2pty \dimen@=#1pt\advance\dimen@#2en

    \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 #2debería haber \relax. De hecho, si #2es 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 \edefserí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 \relaxdespués #2estaría \relaxen lugar de la ficha de espacio.

Ejemplo 2

Es lo mismo. debería haber \relaxdespué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 \ifnumantes 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; \relaxhubiera sido mejor.

La línea 8 debería tener \relaxal final, por las mismas razones que antes; no a %, porque un argumento #2como 2ptdesencadenaría la expansión de \multido@dimtonumantes 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.

información relacionada