假设我有一个xparse
类似
\NewDocumentCommand \prob { m o }
{\mathbb{P}\!\left(#1\IfValueT{#2}{\;\middle\vert\;#2}\right)}
我想要制作第二个版本的函数\probsplit
,如下所示
\NewDocumentCommand \probsplit { >{\SplitArgument{1}{|}}m }
{\prob #1}
就其本身而言,这似乎不起作用(因为它会\prob
采用两个强制参数)。\probsplit{x|y}
例如,输入会产生类似 $P(x)y$ 的内容,而输入\probsplit{x}
会产生类似 $P(x)-NoValue-$ 的内容。
解决此难题的一个方法是创建如下辅助函数(并从中调用它\probsplit
:
\NewDocumentCommand \probsplithelper { m m }
{\prob{#1}[#2]}
但是,似乎一定有更好的方法。我有两个问题:
为什么原来的版本
\probsplit
不能按预期工作/为什么它会以非预期的方式运行?将输出传递
\SplitArgument
给具有可选参数的函数的更直接的方法是什么?
答案1
不要尝试匹配可选参数宏的语法,而是使用统一的内部宏(该宏接受两个普通参数)和前端宏来解析用户输入并将其转发到内部。这将提供干净的语法(尽管不能以编程方式扩展到具有任意语法的任意数量的参数)。
\documentclass[]{article}
\usepackage[]{amssymb}
\newcommand\probinternal[2]
{\mathbb{P}\!\left(#1\IfValueT{#2}{\;\middle\vert\;#2}\right)}
\NewDocumentCommand \prob { m o }{\probinternal{#1}{#2}}
\NewDocumentCommand \probsplit { >{\SplitArgument{1}{|}}m }{\probinternal#1}
\begin{document}
$\prob{A}$\par
$\prob{A}[B]$\par
$\probsplit{A}$\par
$\probsplit{A|B}$
\end{document}