是否可以编写一个宏来检测|
其参数中是否有字符,并将其扩展为其他内容?
具体来说,我希望能够同时使用以下定义:
\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|\,