\DeclarePairedDelimiterXPP 的新宏

\DeclarePairedDelimiterXPP 的新宏
\documentclass[11pt]{article}
\usepackage{amsmath, amssymb}
\usepackage{mathtools}

\def\pr{\mathbb{P}}

\makeatletter
\let\Pr\undefined
\DeclarePairedDelimiterXPP\@Pr[1]{\pr}[]{}{#1}
\DeclarePairedDelimiterXPP\@@Pr[2]{\pr_{#1}}[]{}{#2}
\DeclarePairedDelimiterXPP\@@@Pr[3]{\pr_{#1}^{#2}}[]{}{#3}
\def\@@@@Pr#1{\@ifnextchar^{\expandafter\@@@Pr\@gobble}\@@Pr#1}
\def\Pr{\@ifnextchar_{\expandafter\@@@@Pr\@gobble}\@Pr}
\makeatother

\begin{document}
    $\Pr_{1}^{2}{A}$
\end{document}

我正在为上述概率环境定义一个宏,并且我希望文档中的方程等同于

$\mathbb{P}_1^2[A]$

我不明白为什么上面的代码不起作用。\@ifnextchar^上面的代码似乎是错误的。

答案1

xparse对于部分\Pr\DeclarePairedDelimier括号来说,使用起来要容易得多:

e抓取的类型_非常有用^

\documentclass[11pt]{article}
\usepackage{amsmath, amssymb}
\usepackage{mathtools}
% load this if you use an old latex, new latex has xparse in the kernel
%\usepackage{xparse}

\DeclarePairedDelimiter\Brackets[]
\RenewDocumentCommand\Pr{ e{_^} }{
  \mathbb{P}
  \IfNoValueF{#1}{\sb{#1}}% do if not empty
  \IfNoValueF{#2}{\sp{#2}}% do if not empty
  \Brackets
}
\begin{document}

\begin{gather*}
  \Pr_{1}^{2}*{\frac12}
  \\
  \Pr{A}
  \\
  \Pr_2{Y}
  \\
  \Pr^3_2{Y}
\end{gather*}
\end{document}

相关内容