我正在尝试在 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}
但我不认为这是一个好的界面。