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.)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top