如何将 \SplitArgument 的输出传递给具有可选参数的函数?

如何将 \SplitArgument 的输出传递给具有可选参数的函数?

假设我有一个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]}

但是,似乎一定有更好的方法。我有两个问题:

  1. 为什么原来的版本\probsplit不能按预期工作/为什么它会以非预期的方式运行?

  2. 将输出传递\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}

相关内容