Pergunta
Passei algum tempo tentando escrever uma macro 'ajudante' para testar um parâmetro para um novo valor, caso contrário, use o valor existente - os valores padrão existem para todas as posições de parâmetros.
Eu queria ser capaz de escrever:
\foo{left}{nil}{}{20pt}
para que o segundo parâmetro usasse seu valor atual, mas o terceiro valor seria a sequência vazia do valor. Eu queria usar a notação:
\edef\pA{\isnil{#1}{\pA){#1}} % one for each parameter
Eu defini Isnil Like:
\def\nil{nil}
\def\isnil#1#2#3{%
\edef\nilTest{#1}%
\ifx\nilTest\nil#2\else#3\fi
}
Mas quando eu tentei executá -lo, Tex reclamou que o mais é uma sequência de controle indefinida. Isso é verdade, é claro, mas eu quero que pa para manter um valor, não uma receita para um valor, por isso deve ser um edef, o que significa que todo o teste macro será expandido, mas embora o edef não protegerá o NILTEST - Este é um lugar para usar Noexpand - que não parecia funcionar para mim.
EDIT: Não há dígitos em nomes cs (sim, eu sabia disso.)
Solução
Por que sua solução não funciona? \edef\pA{\isnil{#1}{\pA){#1}}
expande \isnil
e recebe \edef\nilTest{...
. Agora \edef
não é expansível e cai em uma sequência de pa como o primeiro elemento. Uma tentativa de expandir a próxima macro \nilTest
falha.
Usar \setpar
do código a seguir para alterar seu parâmetro.
\def\nil{nil}
\def\setpar#1#2{%
\edef\nilTest{#2}%
\ifx\nilTest\nil\else\let#1\nilTest\fi}
\def\first{old first}
\def\second{old second}
\setpar \first{nil}
\setpar \second{new}
first = ``\first'', second = ``\second''
PS não use dígitos em sua macro.