在所讨论的参数可能为空或在扩展的某个阶段扩展所讨论的参数可能产生空值的情况下,将 f 类型扩展、o 类型扩展或 e 类型扩展应用于宏参数是否安全?
我问这个问题是因为 expl3.pdf 似乎没有解决这些情况。
在 expl3.pdf 中解释了以下内容F类型扩展:
F在括号标记列表中递归扩展第一个标记。
几乎与X类型除外,标记列表会完全展开,直到找到第一个不可展开的标记,其余部分保持不变。请注意,如果此函数在参数开头找到空格,它会吞噬它并且不会展开下一个标记。
(似乎是\romannumeral`\^^@
在删除可能尾随字母常量的可选空格的过程中,事物被扩展了。)
此解释基于以下前提条件:参数中存在第一个标记,并且某个阶段的扩展会产生一个不可扩展的标记。如果参数为空或在某个阶段递归扩展第一个标记会产生空值,则不满足此前提条件。此解释不讨论不满足此前提条件的情况。
在 expl3.pdf 中解释了以下内容o类型扩展:
o一级扩展标记或带括号的标记列表。
这意味着参数被扩展一级,如\expandafter
,并且扩展作为带括号的标记列表传递给函数。请注意,如果原始参数是带括号的标记列表,则仅扩展该列表中的第一个标记。
一般而言,对于简单的变量检索,V
应该优先使用 using 而不是 using 。o
本解释基于参数具有第一个标记的前提条件。如果参数为空,则不满足此前提条件。本解释不讨论不满足此前提条件的情况。
在 expl3.pdf 中解释了以下内容埃类型扩展:
埃完全展开的标记或括号标记列表,不需要双倍
#
标记。此扩展非常类似于X-类型但可以嵌套并且不需要#
标记加倍。
这里根本不假设参数包含标记。因此参数为空不应该成为问题。但为了安全起见,我还是在我的问题中包含了这种情况。
下面的测试似乎完美无缺,但我在 interface3.pdf/expl3.pdf/etc 中没有找到明确的说明。可能是我忽略了它。
\documentclass{article}
\newcommand\test[1]{\par\noindent The argument is between parentheses: (\detokenize{#1})}
\begin{document}
\ExplSyntaxOn
\exp_args:Nf\test{}
\exp_args:Nf\test{\empty}
\exp_args:Nf\test{\csname empty\endcsname}
\exp_args:Ne\test{}
\exp_args:Ne\test{\empty}
\exp_args:Ne\test{\csname empty\endcsname}
\exp_args:No\test{}
\ExplSyntaxOff
\end{document}
答案1
所有这些参数说明符(e
、o
、f
、x
)都可以与空括号组一起正常工作。即使对于f
-type 扩展也是如此,因为可以抓取参数,因此在所有情况下都有一个右括号。我们记录了o
能可以应用于单个无括号的标记,但其他参数类型不具备这种(记录的)能力。