如何理解xparse包文档中描述的“v-type”参数错误?

如何理解xparse包文档中描述的“v-type”参数错误?

我正在熟悉使用该xparse包编写自定义命令的 LaTeX3 新方法。

但是,我不太明白这句话的意思文档

v Reads an argument “verbatim”, between the following character and its next occurrence,
in a way similar to the argument of the LATEX 2ε command \verb. Thus
a v-type argument is read between two identical characters, which cannot be any
of %, \, #, {, } or ␣. The verbatim argument can also be enclosed between braces,
{ and }. A command with a verbatim argument will produce an error when it
appears within an argument of another function.

我认为“另一个函数中的参数”的情况如下所示:

\SomeCommand{\CustomizedCommand+parameter+}

但是当我尝试这个例子(MWE,使用XeLaTeX):

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\Test}{mv}{
    (#1)(#2)
}
\NewDocumentCommand{\TestA}{v}{
    <#1>
}
\begin{document}
\TestA+\Test{first}|second|+ \par
\TestA{\Test{first}|second|}
\end{document}

它输出:

<\Test{first}|second|>
<\Test{first}|second|>

看起来它只是没有执行内部命令。并且没有抛出任何错误,这与预期一致。

所以我想我的理解一定有问题,我把它放在这里只是希望与你进行愉快的讨论。谢谢!


除了,我尝试使用pdfLaTeX编译器而不是XeLaTeX。但输出是(同一来源):

¡“Test–first ̋—second—¿
¡“Test–first ̋—second—¿

对此,我也不清楚。

答案1

v类型“逐字”读取参数,大致意思是“一切都是普通字符”,因此\TestA+\Test{first}|second|+将两者之间的所有内容读取+为字符(a分隔两个标记):

\•T•e•s•t•{•f•i•r•s•t•}•|•s•e•c•o•n•d•|

而不是通常的:

\Test•{•f•i•r•s•t•}•|•s•e•c•o•n•d•|

这意味着\Test不再有命令,而只有 5 个字符。

正如文档中所承诺的,你可以获得或多或少相同的效果\verb

\verb+\Test{first}|second|+

另请注意,该参数xparse的文档v警告您:

当带有逐字参数的命令出现在另一个函数的参数中时,它将产生错误。

v因此不支持在任何其他命令的参数中使用带有参数的命令。


至于输出,pdfLaTeX 默认使用旧版 OT1 编码,该编码的字符数有限(128),因此 OT1 Computer Modern 字体没有\其他字体。如果您使用 T1 编码或打字机(\ttfamily)字体,它将正确显示:

在此处输入图片描述

\documentclass{article}
\usepackage[T1]{fontenc}% for pdfTeX only
\usepackage{xparse}
\newcommand\cmd[1]{#1}
\NewDocumentCommand{\TestA}{v}{
    <#1>
}
\begin{document}
\ttfamily
\TestA+\Test{first}|second|+ \par
\TestA{\Test{first}|second|}
\cmd{\TestA{\Test{first}|second|}} % ERROR: \TestA inside \cmd
\end{document}

相关内容