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)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top