改变寻求论据的行为?观察空间

改变寻求论据的行为?观察空间

根据xparse文档的第 0.2 项:“TEX 将找到函数名称后的第一个参数,而不考虑中间是否有空格。” 提供了示例,我理解。

我正在尝试创建一个简单的宏,它没有强制参数,但有一个可选参数。可选参数中的文本将被忽略。这是给我自己的一份非打印备忘录。像这样:

\DeclareDocumentCommand \printfive {O{}} {5}

然后,在文档主体中:

Two plus three make \printfive.
Two plus three make \printfive[last time I counted fingers].
Two plus three make \printfive [last time I counted fingers].

我想要的是:第一个和第二个应该打印“二加三等于 5”。第三个应该打印“二加三等于 5 [上次我数手指的时候]”。换句话说,我希望宏能够注意到它后面是否紧跟着[(没有空格),并且表现不同。

这可能吗?我试过,但没成功\@ifnextchar

我使用 LuaLaTeX。

可能相关:xparse 和“token”类型参数的行为我不太明白。

答案1

TeX 从文本文件读取输入的规则导致空间

\foo [x]

输入的长度为 7 个字符,但就 TeX 而言,长度为 4代币

\foo•[•x•]

(此处用于将 token 彼此分开,用于说明目的,而不是 TeX“看到”的一部分)。在将文本输入转换为 token 的阶段,空格已被忽略并丢弃,并且无法区分输入

\foo[x]
\foo [x]

从所有目的来看,它们都是完全等价的。好吧,除了下面评论中描述的狡猾技巧外,但这对你的情况没有多大帮助。

你可以通过说出 来诱使 TeX “看到” 空格\obeyspaces,然后检查 后面是否\foo跟着一个活动的空格字符(不会被忽略)。然而,这会带来一些后果:

  1. 输入中的连续空格将被尊重,因此a b会导致“a”和“b”之间出现双字间空格;

  2. 行首的空格不会被忽略(不允许代码缩进)。

我想你会同意,这实际上不是一个可行的选择。

你可以区分

\printfive[last time I counted fingers]

\printfive-[last time I counted fingers]

通过做

\NewDocumentCommand{\printfive}{t-}{%
  \IfBooleanTF{#1}
    {Whatever you want to do if - follows}
    {\printfivewithoption}%
}
\NewDocumentCommand{\printfivewithoption}{O{default}}{%
  <whatever you want to do with #1>%
}

我不建议使用\DeclareDocumentCommand,因为这会在没有警告的情况下覆盖现有命令。

相关内容