根据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
跟着一个活动的空格字符(不会被忽略)。然而,这会带来一些后果:
输入中的连续空格将被尊重,因此
a b
会导致“a”和“b”之间出现双字间空格;行首的空格不会被忽略(不允许代码缩进)。
我想你会同意,这实际上不是一个可行的选择。
你可以区分
\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
,因为这会在没有警告的情况下覆盖现有命令。