我花了一些时间尝试编写'辅助'宏来测试新值的参数,否则使用现有值 - 所有参数位置都存在默认值。
我希望能够写下:
\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名字中没有数字(是的,我知道。)
答案 0 :(得分: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。不要在宏中使用数字。