根据 Joseph Wright 的回答xparse 中的可选参数:\IfBooleanTF 与 \IfNoValueTF
-type参数
k
最近已调整:您现在需要e
-type
问题:
新的 -type 参数的功能是什么
e
?它与以前的 -type 参数有何不同k
?2016-11-21 版 xparse 文档
k
根本没有提到 -type 参数。计划是保留早期的功能(但已弃用,因此没有文档)还是最终会将其删除,并应消除对其的任何使用?如果计划将其删除,那么较旧的-type 参数功能将保留k
多长时间。k
xparse
代码:
k
来自的 -type 参数 的示例Xparse t 参数类型(带可选参数的下划线)。了解如何修改它以使用新e
类型参数将会很有用。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}
\NewDocumentCommand\MyMacro{k_}{%
\IfNoValueTF{#1}{%
\mathbf{A}
}{%
A_{\textcolor{red}{#1}}
}%
}
\begin{document}
With a subscript: $\MyMacro_{\pi}$
Without any subscript: $\MyMacro$
\end{document}
答案1
该k
参数类型不再可用。
k
新款和旧款有很大区别e
。
e{ABC}
(这里A
,B
和C
代表任意三个不同的标记)宏将查找形式为的任意标记序列A{x}B{y}C{z}
,但顺序是任意的,因此
A{x}B{y}C{z}
B{y}A{x}C{z}
C{z}B{y}A{x}
将导致在宏替换文本中传递与 相同的标记列表#<n>
。重复其中一个所述标记将导致停止搜索下一个标记,因此
A{x}A{Ouch}B{y}C{z}
A
这与仅传递参数{x}
而其他两个标记不传递任何内容相同。
该参数根据顺序进行规范化,并将#<n>
表示为带有括号的标记列表的序列,其中-NoValue-
为缺失的标记列表。例如
\NewDocumentCommand{\test}{ e{ABC} }{%
\showtokens{#1}%
}
使用输入
\test
\test A{x}
\test A{x}B{y}C{z}
\test B{y}C{z}A{x}
\test B{y}A{x}C{z}
\test A{x}B{y}
\test C{z}
将显示
> {-NoValue-}{-NoValue-}{-NoValue-}.
> {x}{-NoValue-}{-NoValue-}.
> {x}{y}{z}.
> {x}{y}{z}.
> {x}{y}{z}.
> {x}{y}{-NoValue-}.
> {-NoValue-}{-NoValue-}{z}.
结果是你应该传递#1
给其他宏用于后续处理,即使只有一个修饰前缀标记;这样的宏必须具有所需数量的强制参数。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}
\NewDocumentCommand\MyMacro{e_}{%
\MyMacroProcess#1%
}
\NewDocumentCommand\MyMacroProcess{m}{%
\IfNoValueTF{#1}{%
\mathbf{A}
}{%
A_{\textcolor{red}{#1}}
}%
}
\begin{document}
With a subscript: $\MyMacro_{\pi}$
Without any subscript: $\MyMacro$
\end{document}
#1
请注意,的代码中不应有括号\MyMacro
。这是“处理参数”的正常过程。
2017 年 6 月更新
的较新版本xparse
对e
和E
参数类型进行了重大更改。现在e<tokens>
在 中的每个标记的替换文本中返回一个参数<tokens>
,因此这种情况的代码必须变为
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}
\NewDocumentCommand\MyMacro{e_}{%
\IfNoValueTF{#1}{%
\mathbf{A}
}{%
A_{\textcolor{red}{#1}}
}%
}
\begin{document}
With a subscript: $\MyMacro_{\pi}$
Without any subscript: $\MyMacro$
\end{document}
如果未找到相应的标记,则参数将包含-NoValue-
(可用来测试)。\IfNoValueTF
答案2
由于我花了一些时间来应用带有几个参数的 egreg 答案,因此我提供了我使用的另一个 MWE:
\documentclass{article}
\usepackage{xparse}
\usepackage{xstring}
\NewDocumentCommand\Median{O{s} m e{_}}{%
\MyMedian{#1}{#2}#3%
}
\NewDocumentCommand\MyMedian{m m m}{%
\IfNoValueTF{#3}{\gdef\temp{0,5}}{\gdef\temp{0,5;#3}}%
\IfSubStr{s}{#1}{#2_{\temp}}{}%
\IfSubStr{e}{#1}{\uppercase{#2}_{\temp}}{}%
}
\begin{document}
$$\Median{x}$$ % x_{0.5} median of a sample
$$\Median{x}_i$$ % x_{0.5,i} median of subgroup i in a sample
$$\Median[e]{x}$$ % X_{0.5} sample median (random variable)
$$\Median[e]{x}_i$$ % X_{0.5,i} sample median of subgroup i (random variable)
\end{document}