xparse 可选参数中存在错误(根本不起作用)?

xparse 可选参数中存在错误(根本不起作用)?

以下代码返回的-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是 提供的特殊键xparsexparse提供了几种可选的参数类型,其o含义如下:

  • 如果没有给出不带方括号的可选参数,则该参数设置为\NoValue
  • 如果给出方括号,则参数设置为该值。

注意:空的可选参数不会设置\NoValue

根据此信息,您可以使用条件\IfNoValueTF来测试是否给出了可选参数。

编辑 我不明白你的问题。但你的例子对我来说看起来很奇怪。你应该告诉我们你的意图是什么。

您可以执行以下操作:

  1. 每个宏和函数的定义都应该在标题中完成。
  2. \n函数\Dotparse运行前必须先扩展变量
  3. 您不需要在变量周围使用额外的括号n
  4. 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}

相关内容