Pregunta
He pasado algún tiempo tratando de escribir una macro 'ayudante' para probar un parámetro para un nuevo valor, de lo contrario utilizar el valor existente -. Existen valores predeterminados para todas las posiciones de los parámetros
Yo quería ser capaz de escribir:
\foo{left}{nil}{}{20pt}
de manera que la segunda sería parámetro utilizado su valor actual, pero el tercer valor sería la cadena de valor vacío. Quería utilizar la notación:
\edef\pA{\isnil{#1}{\pA){#1}} % one for each parameter
he definido \ isNil este modo:
\def\nil{nil}
\def\isnil#1#2#3{%
\edef\nilTest{#1}%
\ifx\nilTest\nil#2\else#3\fi
}
pero cuando traté de ejecutarlo, se quejó de que TeX \ nilTest es una secuencia de control no definido. Esto es cierto, por supuesto, pero quiero \ pA para mantener un valor, no una receta para un valor, por lo que debe haber un \ EDEF que significa que toda la prueba macro se expandirá pero mientras se la \ EDEF no proteger el \ nilTest - es este un lugar de usar \ NOEXPAND -. eso no parece funcionar para mí
EDIT: no hay dígitos en \ cs (nombres. Sí, sabía que)
Solución
¿Por qué no funciona su solución? \edef\pA{\isnil{#1}{\pA){#1}}
expande \isnil
y obtiene \edef\nilTest{...
. Ahora \edef
no es expandible y cae en una secuencia de \ pA como el primer elemento. Un intento de expandir la siguiente \nilTest
macro falla.
El uso de \setpar
el código siguiente para cambiar el 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''
P.S. No utilice dígitos en su macro.