代码之家  ›  专栏  ›  技术社区  ›  Don

Tex Edef宏蓝色

  •  4
  • Don  · 技术社区  · 15 年前

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

    我想写:

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

    所以第二个参数将使用它的当前值,但第三个值将是值空字符串。我想用这个符号:

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

    我是这样定义的:

    \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的地方吗--对我来说似乎不起作用。

    编辑:名称中没有数字(是的,我知道。)

    1 回复  |  直到 15 年前
        1
  •  3
  •   Alexey Malistov    15 年前

    你的解决方案为什么不起作用? \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''
    

    请不要在宏中使用数字。