自动检测宏中的条件概率

自动检测宏中的条件概率

是否可以编写一个宏来检测|其参数中是否有字符,并将其扩展为其他内容?

具体来说,我希望能够同时使用以下定义:

\def\P(#1){\Pr\left( #1 \right)}
\def\P(#1|#2){\Pr\left( #1 \mid #2 \right)}

每当我在文中写一个概率时$\P(X)$,都应该使用第一个定义,反之则$\P(X|Y)$应该使用第二个定义。

如果可能的话,最好使用简单的 TeX/LaTeX 解决方案,因为许多期刊对可用的包进行了限制。

我知道这只需使用两个不同的宏即可实现。提出这个问题的原因是,论文摘要通常以纯文本形式打印(想想 arXiv 电子邮件),我希望它尽可能易于阅读。

答案1

这可以按照您的要求区分论点。

\documentclass{article}
\def\P(#1){\Phelper#1|\relax\Pchoice(#1)}
\def\Phelper#1|#2\relax{\ifx\relax#2\relax\def\Pchoice{\Pone}\else\def\Pchoice{\Ptwo}\fi}
\def\Pone(#1){\Pr\left( #1 \right)}
\def\Ptwo(#1|#2){\Pr\left( #1 \mid #2 \right)}
\def\Pr{\mathbf{Pr}}
\begin{document}
$\P(A)$ or $\P(A|B)$
\end{document}

在此处输入图片描述

如果您的参数总是很短,那么更简单的\def\P(#1){\Pr(#1)}可能就足以满足您的需求。但是由于您使用的是\left(...\right),因此您可能需要处理较长的参数。在这种情况下,我会替换\mid为,\,\middle|\,以便您可以实现以下内容,该功能在文本样式和显示样式中均有效:

\documentclass{article}
\def\P(#1){\Phelper#1|\relax\Pchoice(#1)}
\def\Phelper#1|#2\relax{\ifx\relax#2\relax\def\Pchoice{\Pone}\else\def\Pchoice{\Ptwo}\fi}
\def\Pone(#1){\Pr\left( #1 \right)}
\def\Ptwo(#1|#2){\Pr\left( #1 \,\middle|\, #2 \right)}
\def\Pr{\mathbf{Pr}}
\begin{document}
\centering$\P(A)$ or $\P(A|B)$

\[\P(\displaystyle\frac{x}{2}>1 | x>0) = 0.5\]
\end{document}

在此处输入图片描述

答案2

\P(A|B)我认为在源代码中使用 而不是 不会给你带来太多好处\P{A|B}。另外,重新定义\P也不是一个好主意。

无论如何,这里是对的重新定义\Pr,它利用mathtools它来接收可选的大小参数或*表示自动调整大小的。

\documentclass{article}
\usepackage{mathtools,xparse}

\RenewDocumentCommand\Pr{sO{}r()}{%
  \operatorname{Pr}%
  \begingroup
  \IfBooleanTF{#1}
    {\PrInn*{#3}}
    {\PrInn[#2]{#3}}%
  \endgroup
}

\DeclarePairedDelimiterX\PrInn[1](){%
  \activatebar
  #1%
}

\newcommand{\activatebar}{%
  \begingroup\lccode`~=`|
  \lowercase{\endgroup\def~}{\;\delimsize\vert\;}%
  \mathcode`|=\string"8000
}

\begin{document}
\[
\Pr(a)\quad
\Pr(x|y)\quad
\Pr[\big](x|y)\quad
\Pr*(\frac{X}{2}|\frac{Y}{2})
\]
\end{document}

在此处输入图片描述

答案3

这是我的看法

\usepackage{mathtools}
\providecommand\given{} % so it exists
\DeclarePairedDelimiterX\PH[1](){
   \renewcommand\given{\nonscript\:\delimsize\vert\nonscript\:}
   #1
}
\newcommand\Prop{\operatorname{Pr}\PH}

然后使用

\[
    \Prop{ A } \qquad \text{or}\qquad \Prop{ A \given B}
\]

这包括自动缩放()\vert如果你使用\Prop*。最近的mathtools有一个宏可以\Prop一次性制作。

注意,我没有将 设为()语法的一部分,并且我更喜欢在 周围留出空格|

答案4

如果你的主要兴趣是代替 |如果\mid存在,你可以通过以下方式执行搜索和替换etoolbox\patchcmd

在此处输入图片描述

\documentclass{article}
\usepackage{mleftright,etoolbox,xparse}

\makeatletter
\DeclareDocumentCommand{\Pr}{R(){}}{%
  % \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
  \def\pr@arg{#1}\patchcmd{\pr@arg}{|}{\mid}{}{}%
  \mathbf{Pr}\mleft(\pr@arg\mright)%
}
\makeatother

\begin{document}

$\Pr(A)$ or $\Pr(A|B)$ or $\Pr(\frac{1}{2}|\frac{2}{3})$

\end{document}

请注意通常会导致(或)\displaystyle的垂直尺寸出现问题。或许也可以用 代替。|\mid\,\middle|\,

相关内容