xparse - xparse 语句中的三向可选参数

xparse - xparse 语句中的三向可选参数

我正在尝试在 x parse 中编写一个命令,该命令有一个可选参数,但在以下情况下可以以三种方式运行:a) 未指定参数,b) 可选参数指定特定值 (p),c) 可选参数指定不同的值 (q)。

命令如下:

\命令

\命令[p]

\命令[q]

并给出结果

命令

命令前言

命令 q

我试图使用星号和标记参数来代替标准可选参数,但该包的文档非常稀疏,即使通过查看本网站上的示例,我也无法弄清楚如何实现上述目标。

我的尝试如下:

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand \command { tp } {%
    \IfNoValueTF{#1}{%
    command}%
    {{\IfBooleanTF{#1}%
    {command preface}%
    {command #1}%
    }}}

\begin{document}

\command
\command[p]
\command[10]

\end{document}

答案1

在这种情况下,您不需要xparse。您可以使用xstring包裹:

\documentclass{article}

\usepackage{xstring}

% with xstring
\newcommand{\mycmd}[1][-no-value-]{%
   command does
   \IfStrEqCase{#1}{%
      {-no-value-}{no value}%
      {p}{preface}%
   }[#1 value]
   stuff
}

% a more clever version (see comments) with xparse
\usepackage{xparse}
\NewDocumentCommand{\myothercmd}{ o }{%
   command does
   \IfNoValueTF{#1}{no value}{%
      \IfStrEq{#1}{p}{preface}{#1}%
   }
   stuff
}

\begin{document}
\mycmd

\mycmd[p]

\mycmd[q]

\mycmd[-no-value-] is a 'wrong' argument and confuses the code.
So it should be something where you are sure that it won't be the
argument of \verb+\mycmd+

\bigskip
\myothercmd

\myothercmd[p]

\myothercmd[q]

\mycmd[-NoValue-] \texttt{xparse} know how to handle this.
\end{document}

尝试纠正你的尝试

\NewDocumentCommand \yourcmd { t{+} o } {%
   \IfBooleanTF{#1}{command preface}{%
      \IfNoValueTF{#2}{%
         command%
      }{%
         command #2%
      }%
   }%
}

正如你所见,该p参数接受一个参数,指定<token>应该测试的这个toke不能是一个字母,例如p,因为\yourcmdp在TeX眼中这将是另一个命令,并且不是 \yourcmd后面跟着 token p。更正后的版本可以用作

\yourcmd
\yourcmd+
\yourcmd[q]
\yourcmd+[q]

给予

命令
命令前言
命令 q
命令前言

答案2

xparse没有为这种情况提供帮助程序,因此有必要更深入地比较字符串。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\command}{o}
 {
  \IfNoValueTF{#1}
   {
    <No optional value code>
   }
   {
    \rowthorn_check_argument:n { #1 }
   }
 }

\cs_new:Npn \rowthorn_check_argument:n #1
 {
  \str_case:nnF { #1 }
   {
    {p}{ \rowthorn_command:n { Preface } }
   }
   { \rowthorn_command:n { #1 } }
 }

\cs_new_protected:Npn \rowthorn_command:n #1
 {
  <do something with #1>
 }
\ExplSyntaxOff

\begin{document}

\command

\command[p]

\command[Introduction]

\end{document}

但我不认为这是一个好的界面。

相关内容