我正在熟悉使用该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}