2009-12-08 8 views
4

J'ai passé du temps à essayer d'écrire une macro 'helper' pour tester un paramètre pour une nouvelle valeur, sinon utilisez la valeur existante - des valeurs par défaut existent pour toutes les positions de paramètres.TeX edef macro blues

Je voulais pouvoir écrire:

\foo{left}{nil}{}{20pt} 

de sorte que le second paramètre serait utilisé sa valeur actuelle, mais la troisième valeur serait la valeur chaîne vide. Je voulais utiliser la notation:

\edef\pA{\isnil{#1}{\pA){#1}} % one for each parameter 

Je définis \ isnil comme ceci:

\def\nil{nil} 
\def\isnil#1#2#3{% 
    \edef\nilTest{#1}% 
    \ifx\nilTest\nil#2\else#3\fi 
} 

mais quand j'ai essayé de l'exécuter, TeX se plaint que \ nilTest est une séquence de contrôle non définie. C'est vrai bien sûr, mais je veux que \ pA contienne une valeur, pas une recette pour une valeur, donc ça doit être un \ edef ce qui signifie que tout le test de macros sera étendu mais que \ edef ne protégera pas le \ nilTest - est-ce un endroit à utiliser \ noexpand - qui ne semble pas fonctionner pour moi.

EDIT: aucun chiffre dans les noms \ cs (oui, je le savais.)

Répondre

3

Pourquoi ne pas travailler votre solution? \edef\pA{\isnil{#1}{\pA){#1}} étend \isnil et obtient \edef\nilTest{.... Maintenant \edef n'est pas extensible et tombe dans une séquence de \ pA comme premier élément. Une tentative d'extension de la macro suivante \nilTest échoue.

Utilisez \setpar à partir du code suivant pour modifier votre paramètre.

\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. N'utilisez pas de chiffres dans votre macro.