2009-12-08 49 views
4

我花了一些時間試圖編寫一個'助手'宏來測試新值的參數,否則使用現有值 - 所有參數位置都存在默認值。TeX edef宏藍調

我希望能夠寫:

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

,這樣第二個參數將利用其目前的價值,但第三個值將是值空字符串。我想用符號:

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

我定義\ isnil像這樣:

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

但是當我試圖運行它,TeX的抱怨\ nilTest是一個未定義的控制序列。 當然,但我希望\ pA保存一個值,而不是一個值的配方,所以它必須是\ edef,這意味着所有的宏測試都會被擴展,但\ edef不會保護\ nilTest - 這是一個使用\ noexpand的地方 - 這對我來說似乎不起作用。

編輯:\ CS的名稱沒有數字(是的,我知道。)

回答

3

爲什麼沒有你的解決方案的工作? \edef\pA{\isnil{#1}{\pA){#1}}擴大\isnil並得到\edef\nilTest{...。現在\edef不可擴展,並且作爲第一個元素落入\ pA序列中。嘗試展開下一個宏\nilTest失敗。

使用以下代碼中的\setpar來更改參數。

\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.不要在宏中使用數字。