As atribuições precisam ser anexadas por% para remover os espaços em branco à direita?

As atribuições precisam ser anexadas por% para remover os espaços em branco à direita?

A seguir mostra um trecho de código retirado de multido.tex. Percebi que as tarefas não terminam com %.

  • Ver \dimen@=#1\advance\dimen@#2em

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

    \def\multido@step@i#1#2{%
      \count@=#1\advance\count@ by #2
      \edef#1{\the\count@}}
    
  • Veja novamente \dimen@=#1pt, \dimen@=#2pte \dimen@=#1pt\advance\dimen@#2em

    \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}
    

As atribuições produzem espaços em branco finais que devem ser finalizados com %?

Responder1

Exemplo 1

\def\multido@step@d#1#2{%
  \dimen@=#1\advance\dimen@#2
  \edef#1{\number\dimen@ sp}}%

Depois #2deveria haver \relax. Na verdade, se #2for um registro ou um parâmetro como \z@ou \lineskip, o espaço fornecido no final da linha serianãoser ignorado. Neste caso também %pode ser usado, porque o token a seguir não é expansível ( \edef). A lista de tokens obtida \multido@step@d{\x}{2pt}seria (denoto o token de espaço com •)

\dimen@=\x\advance\dimen@2pt•\edef\x{\number\dimen@ sp}

e o espaço anterior \edefseria ignorado. Mas com `\multido@step@d{\x}{\parindent} teríamos

\dimen@=\x\advance\dimen@\parindent•\edef\x{\number\dimen@ sp}

e o token de espaço serianãoser ignorado. O facto de seguir uma palavra de controlo é irrelevante: a fase de tokenização já ocorreu. Com \relaxafter #2haveria \relaxno lugar do token de espaço.

Exemplo 2

É a mesma coisa. Deveria haver \relaxdepois#2

Exemplo 3

Vou numerar as linhas para maior clareza.

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}

Não há necessidade de encerrar as linhas 2 e 4 com %; na verdade, um %no final da linha 4 estaria errado, porque o TeX começaria a se expandir \ifnumantes de realizar a atribuição \dimen@(provavelmente inofensivo, neste caso específico).

O mesmo problema de antes está na linha 3: the %é bom aqui, porque o token a seguir é \dimen@que não pode ser expandido; \relaxteria sido melhor.

A linha 8 deveria ter \relaxno final, pelos mesmos motivos de antes; não a %, porque um argumento #2como esse 2ptdesencadearia a expansão de \multido@dimtonumantes que a atribuição fosse executada.

Responder2

Quando o TeX está procurando a dimensão, a menos que a quantidade armazenada seja apresentada na forma de um registro, ele continuará procurando o número e a unidade (expandindo ao longo do caminho) até encontrar um espaço ou caractere inadequado. O espaço é removido; portanto, as atribuições escritas conforme você as mostra funcionalmente têm o mesmo comportamento que as palavras de controle na remoção dos espaços em branco a seguir. E claro, se a dimensãoéum registro, então o nome do registro será uma palavra de controle em si (engolindo assim o espaço) ou será um número que o TeX irá procurar...

Dito isto,algunsdas atribuições mostradas usam um argumento (como #2) para a dimensão. Alguém sorrateiro ou muito inteligente poderia usar um registro para isso, e então o espaço não seria consumido porque seria escrito na definição da macro antes da palavra de controle ser lida. Na prática, quando tais dados não estão sob o controle do programador, é melhor apenas eliminar o espaço com um arquivo \relax.

informação relacionada