最初の唯一の引数が与えられたときに 1 つのことを実行し、2 番目の引数が与えられたときに最初の引数を拡張する新しいコマンドを定義したいと思います。アイデアは、確率関数を複製することです。1 つの引数は確率分布用で、2 つの引数は条件付き確率分布用です。やり方がまったくわかりません。
次の(完成した)コード
\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[Y][X] よりも \PP{X}{Y} のほうが好みです。
手伝っていただけませんか?
ありがとう
答え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}