我想定义一个新命令,这样当给出第一个也是唯一的参数时,它会执行一件事,而当给出第二个参数时,它会扩展第一个参数。这个想法是复制概率函数。一个参数用于概率分布,两个参数用于条件概率分布。我真的不知道怎么做。
以下代码(已完成)
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amssymb}
\newcommand{\PP}[2]{???}
\begin{document}
$\PP{X}$
$\PP{X}{Y}$
\end{document}
应该打印
\mathbb{P}{\left({X}\right)}
\mathbb{P}{\left({X}\middle|{Y}\right)}
我不希望有可选参数,因为它会影响代码的顺序和可读性。我的意思是,我更喜欢 \PP{X}{Y} 而不是 \PP[Y][X]。
请你帮助我好吗?
谢谢
答案1
您可以使用更简单的用户语法做得更好。
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\PP}{ s O{} >{\SplitArgument{1}{|}}m }
{
\mathbb{P}
\IfBooleanTF{#1}
{ \PPauto #3 }
{ \PPfixed {#2} #3 }
}
\NewDocumentCommand{\PPauto}{mm}
{
\left(
\IfNoValueTF{#2} { #1 } { #1 \;\middle|\; #2 }
\right)
}
\NewDocumentCommand{\PPfixed}{mmm}
{
\mathopen{#1(}
\IfNoValueTF{#3} { #2 } { #2 \mathrel{#1|} #3 }
\mathclose{#1)}
}
\ExplSyntaxOff
\begin{document}
\[
\PP{X} \quad \PP[\big]{X} \quad \PP*{\frac{X}{2}}
\]
\[
\PP{X|Y} \quad \PP[\big]{X | Y} \quad \PP*{\frac{X}{2} | Y}
\]
\end{document}
该命令\PP
有一个可选的尺寸参数(永远不要单独依赖\left
)\right
或*
自动调整尺寸的变体(仅在真正必要时使用它)。
如果强制参数存在,则在 处拆分|
。这样输入代码就更容易阅读了。周围的空格|
无关紧要。
答案2
我建议使用一种只使用单个参数的语法。已编辑以包含 Mico 的间距建议。
\documentclass{article}
\usepackage{listofitems,amssymb}
\newcommand\PP[1]{%
\readlist\arglist{#1}
\ifnum1=\arglistlen\relax
\mathbb{P}{\left(#1\right)}
\else
\mathbb{P}{\left(\arglist[1]\;\middle|\;\arglist[2]\right)}
\fi
}
\begin{document}
$\PP{X}$
$\PP{X,Y}$
\end{document}
答案3
灵感来自沃纳的答案与上述 Segletes 的回答类似:
\documentclass{article}
\usepackage{amssymb}
\newcommand{\pp}[1]{\ppaux#1\relax}
\def\ppaux#1#2\relax{%
\ifnum\pdfstrcmp{#2}{}=0
\mathbb{P}{\left(#1\right)}
\else
\mathbb{P}{\left(#1 \;\middle|\; #2\right)}
\fi
}
\begin{document}
$\pp{X}$
$\pp{XY}$
$\pp{{XY}}$
\end{document}