mathclose 弄乱了 subsript 的放置

mathclose 弄乱了 subsript 的放置

我在数学模式下为括号定义了自己的命令,\prt该命令具有自动缩放功能和可选的中间值\vert(用于条件概率)。\mathopenand\mathclose确保类似的东西P\prt{A}{B}不会在P括号的开头和中间显示空格。然而,这会弄乱上标的放置方式 - 放在右边而不是正确的右上角。

在此处输入图片描述

由以下 MWE 制作:

\documentclass{article}

\RequirePackage{amsmath}
\RequirePackage{amssymb}
\RequirePackage{xparse}

\NewDocumentCommand\prt{m o}{
    \IfNoValueTF {#2}
        {\mathopen{}\left( #1 \right)\mathclose{}}
        {\mathopen{}\left( #1 \middle| #2 \right)\mathclose{}}
}
\begin{document}

\[
\frac{1}{2} \prt{\sum_{i=1}^N \alpha_i y_i x_i}^2 + \frac{1}{2} \left(\sum_{i=1}^N \alpha_i y_i x_i\right)^2
\]

\end{document}

答案1

上标为\mathclose{}

您可能用它mleftright来避免多余的空格,但我相信有更好的方法来解决这个问题。

您似乎期望代码为\prt{x}\prt{x}[y],对于后一种情况的条件概率。我相信诸如

\prt{x}   \prt{x | y}

会更好。另外,我认为自动调整大小不是最好的方法:您可以清楚地看到图像中的上标太高了。

\documentclass{article}
\usepackage{amsmath,mleftright}

\NewDocumentCommand{\prt}{s o >{\SplitArgument{1}{|}}m}{%
  \operatorname{P}%
  \IfBooleanTF{#1}{% * means automatic sizing
    \mleft(\makeprt{\;\middle|\;}#3\mright)%
  }{% no automatic sizing
    \IfNoValueTF{#2}{% no optional argument
      (\makeprt{\mid}#3)%
    }{%
      \mathopen{#2(}\makeprt{\mathrel{#2|}}#3\mathclose{#2)}%
    }%
  }%
}
\NewDocumentCommand{\makeprt}{mmm}{%
  #2\IfValueT{#3}{#1#3}%
}

\begin{document}

\begin{gather}
\prt{A}+\prt{A|B}+\prt{A}^2 \\
\prt[\big]{A}+\prt[\big]{A|B}+\prt[\big]{A}^2 \\
\prt[\bigg]{\frac{A}{2}}+\prt[\bigg]{\frac{A}{2}|B}+\prt[\bigg]{\frac{A}{2}}^2 \\
\frac{1}{2} \prt[\bigg]{\,\sum_{i=1}^N \alpha_i y_i x_i}^2 \\
\frac{1}{2} \prt*{\sum_{i=1}^N \alpha_i y_i x_i}^{\!2}
+\frac{1}{2} \prt*{\sum_{i=1}^N \alpha_i y_i x_i|B}^{\!2}
\end{gather}

\end{document}

这边走决定是否需要自动调整大小(通常不需要)。在某些情况下,需要进行小的间距调整,请查看代码。

在此处输入图片描述

相关内容