为什么 xparse 手册会让人们认为对可选参数进行可靠的可扩展检查是可能的?

为什么 xparse 手册会让人们认为对可选参数进行可靠的可扩展检查是可能的?

没有可扩展的方法来可靠地查看输入流的下一个标记。

那么为什么 xparse 手册会让人们认为对可选参数进行可靠的可扩展检查是可能的呢?

下面你会看到 xparser 对可选参数的扫描存在缺陷\NewExpandableDocumentCommand

如果它没有缺陷那么你得到的东西\TestB就会和你得到的东西相同\TestA

我认为这与\NewExpandableDocumentCommand使用基于宏参数的方法查看下一个标记有关,其中花括号被剥离并且因此无法被检测到。

\NewDocumentCommand{\TestA}{O{default}m}{This is optional: (#1). This is not optional (#2).}
\NewExpandableDocumentCommand{\TestB}{O{default}m}{This is optional: (#1). This is not optional (#2).}

\documentclass{article}

\parindent=0ex
\parskip=\baselineskip

\begin{document}

Okay:

\verb|\TestA[optional]{not optional}|:\\
\TestA[optional]{not optional}

Okay:

\verb|\TestB[optional]{not optional}|:\\
\TestB[optional]{not optional}

\noindent\hrule\hfill\\Okay:

\verb|\TestA{[}{!!!Not an argument!!!}]{!!!Not an argument!!!}|:\\
\TestA{[}{!!!Not an argument!!!}]{!!!Not an argument!!!}

Flawed:

\verb|\TestB{[}{!!!Not an argument!!!}]{!!!Not an argument!!!}|:\\
\TestB{[}{!!!Not an argument!!!}]{!!!Not an argument!!!}

With \verb|\TestB| you should get the same as with \verb|\TestA| !!!


\end{document}

在此处输入图片描述

答案1

“3.3 完全可扩展的文档命令”一节当前 xparse 手册明确指出:

例如,无法区分\foo[\foo{[}:在这两种情况下,都[将被解释为可选参数的开始。因此,对可选参数的检查不如标准版本那么可靠

所以我不认为存在某种“通过谈话让人认为...”

答案2

的标准方法\NewDocumentCommand是创建受保护的宏,因此可以使用 TeX 原语\futurelet,从而可以区分\foo[...\foo{[}...。正如文档试图解释的那样,这通常是最好的选择:需要可扩展文档命令的地方数量有限。(最初我们希望它们是极其有限,但事实证明并不完全正确。

可以扩展地查找一系列参数情况,并且有些地方需要这样做。一个标准示例是在表格单元格的开头,通常最终使用原语实现\halign。另一个更棘手的情况是,在需要转换为“字符串”的上下文中使用文档命令:例如,在创建 (PDF) 书签时可以看到这种情况。虽然有许多方法可以解决这些情况,但有一种“回退”到可扩展但不完善的参数测试方法的方法是最明显的方法之一。

正如所指出的另一个答案,文档明确指出可扩展参数测试存在限制。唯一的替代方案(至少在不使用 LuaTeX 的情况下)是省略对可扩展命令的可选参数的任何支持。对于 LaTeX 团队来说,平衡点落在了文档限制的一边。

相关内容