4

我花了一些时间尝试编写一个“帮助”宏来测试一个新值的参数,否则使用现有值——所有参数位置都存在默认值。

我希望能够写:

\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 名称中没有数字(是的,我知道。)

4

1 回答 1

3

为什么您的解决方案不起作用?\edef\pA{\isnil{#1}{\pA){#1}}展开\isnil并得到\edef\nilTest{.... Now\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''

PS 不要在宏中使用数字。

于 2009-12-08T16:27:30.527 回答