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@#2
em\def\multido@step@d#1#2{% \dimen@=#1\advance\dimen@#2 \edef#1{\number\dimen@ sp}}%
Veja novamente
\count@=#1\advance\count@ by #2
em\def\multido@step@i#1#2{% \count@=#1\advance\count@ by #2 \edef#1{\the\count@}}
Veja novamente
\dimen@=#1pt
,\dimen@=#2pt
e\dimen@=#1pt\advance\dimen@#2
em\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 #2
deveria haver \relax
. Na verdade, se #2
for 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 \edef
seria 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 \relax
after #2
haveria \relax
no lugar do token de espaço.
Exemplo 2
É a mesma coisa. Deveria haver \relax
depois#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 \ifnum
antes 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; \relax
teria sido melhor.
A linha 8 deveria ter \relax
no final, pelos mesmos motivos de antes; não a %
, porque um argumento #2
como esse 2pt
desencadearia a expansão de \multido@dimtonum
antes 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
.