以下代码返回的-NoValue-
是3
看来我错了,我认为 xparser 只接受一个参数并对其进行解析,而不是解析宏的所有参数。
\documentclass[11pt]{book} % use larger type; default would be 10pt
\usepackage{pgffor}
\usepackage{xparse}
\begin{document}
\DeclareDocumentCommand{\Dotparse}{o m} { #1 }
% Passes each value in the array to an xparse command.
\def\Dots#1
{
\foreach \n in {#1}{
\Dotparse{\n}
}}
\Dots{[3]f4s3,f12s5,s2f14,[5]e,f,g,1,2,3,4,5,6,7}
\end{document}
答案1
首先这不是错误。您定义了一个\Dotparse
带有一个强制参数和一个可选参数的命令。
强制参数用花括号括起来{....}
,可选参数用方括号括起来[...]
。
如果您输入\Dotparse{[3]f4s3}
LaTeX,则只会读取一个强制参数,因为外括号是{...}
。因此,正确的形式是\Dotparse[3]{f4s3}
设置可选参数和强制参数。
输出-NoValue
是 提供的特殊键xparse
。xparse
提供了几种可选的参数类型,其o
含义如下:
- 如果没有给出不带方括号的可选参数,则该参数设置为
\NoValue
。 - 如果给出方括号,则参数设置为该值。
注意:空的可选参数不会设置\NoValue
。
根据此信息,您可以使用条件\IfNoValueTF
来测试是否给出了可选参数。
编辑 我不明白你的问题。但你的例子对我来说看起来很奇怪。你应该告诉我们你的意图是什么。
您可以执行以下操作:
- 每个宏和函数的定义都应该在标题中完成。
\n
函数\Dotparse
运行前必须先扩展变量- 您不需要在变量周围使用额外的括号
n
。 u
使用具有以下语法的参数类型u<token>
此参数类型读取所有内容,直到找到给定的标记,而给定的标记不是参数的一部分。我使用了 token
\nil
。
整个例子:
\documentclass[11pt]{book} % use larger type; default would be 10pt
\usepackage{pgffor}
\usepackage{xparse}
\DeclareDocumentCommand{\Dotparse}{o u \nil } {#1\textbullet }
\def\Dots#1
{
\foreach \n in {#1}{
\n\qquad \expandafter\Dotparse\n\nil \par
}}
\begin{document}
\Dots{[3]f4s3,f12s5,s2f14,[5]e,f,g,1,2,3,4,5,6,7}
\end{document}
编辑2:
@BrunoLeFloch 建议使用\clist_map_inline:Nn
。这样,您就不需要包pgffor
,也不需要进行任何扩展。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\Dotparse}{o u \nil }
{
\IfNoValueTF { #1 }
{no~optional~Argument~given}
{The~optional~argument~is~#1}
\par
}
\clist_new:N \l_dot_store_clist
\NewDocumentCommand{\Dots}{ m }
{
\clist_set:Nn \l_dot_store_clist { #1 }
\clist_map_inline:Nn \l_dot_store_clist
{
\Dotparse ##1 \nil
}
}
\ExplSyntaxOff
\begin{document}
\Dots{[3]f4s3,f12s5,s2f14,[5]e,f,g,1,2,3,4,5,6,7}
\end{document}