我自己的答案

我自己的答案

我正在尝试想出一些圆括号宏,这些宏在inlinedisplay模式下看起来都很好。限制如下:

  • 宏应该像\left( \right)在显示模式下一样运行
  • 它应该表现得像平常一样()在所有其他情况下
  • 它应该可以很好地与下标配合使用

这是我尝试过的:

\documentclass{scrbook}
\usepackage{amsmath}

% commands for round parentheses
\newcommand{\rParA}[1]{\mathchoice{\left(#1\right)}{(#1)}{(#1)}{(#1)}}
\newcommand{\rParB}[1]{\left(#1\right)}

\begin{document}
  \begin{minipage}[H]{0.5\linewidth}
  Here is some process $\rParA{A^N_{\lfloor t / N \rfloor}}_t$.
  Here is another process $\rParB{B^N_{\lfloor t / N \rfloor}}_t$.
  Here is what they look like in display mode:
  \begin{align*}
    \rParA{A^N_{\lfloor t / N \rfloor}}_t
    \quad
    \rParB{B^N_{\lfloor t / N \rfloor}}_t
  \end{align*}
  \end{minipage}
\end{document}

此代码包含两个宏。第一个宏与 配合使用\mathchoice,第二个宏只是在任何地方插入\left\right。结果如下:

在此处输入图片描述

该版本A在 -模式下表现符合预期inline(括号尽可能短,这是我想要的),但是,它在display-模式下中断(下标漂浮在天空中的某个地方,这很糟糕)。

该版本B在 -mode 中占用了太多空间inline(括号太高,影响行距),但display-mode 中的下标位于正确的位置(这很好)。

A我怎样才能获得一个行为类似于inline-mode 但又类似于B模式的宏display

答案1

我不确定您是否想这样做,或者更好的是,我不鼓励您这样做:自动申请\left并且\right总是错误的。

\documentclass{scrbook}
\usepackage{amsmath}

% commands for round parentheses
\makeatletter
\DeclareRobustCommand{\rPar}[1]{%
  \@ifnextchar_{\rPar@sb{#1}}{\rPar@nosb{#1}}%
}
\newcommand{\rPar@sb}[3]{%
  % #1 is what we already have, #2 is _, #3 is the subscript
  \mathchoice{\left(#1\right)_{#3}}{(#1)_{#3}}{(#1)_{#3}}{(#1)_{#3}}%
}
\newcommand{\rPar@nosb}[1]{%
  \mathchoice{\left(#1\right)}{(#1)}{(#1)}{(#1)}%
}
\makeatother

\begin{document}
  \begin{minipage}{0.5\linewidth}
  Here is some process $\rPar{A^N_{\lfloor t / N \rfloor}}_t$.
  Here is another process $\rPar{B^N_{\lfloor t / N \rfloor}}$.
  Here is what they look like in display mode:
  \begin{equation*}
    \rPar{A^N_{\lfloor t / N \rfloor}}_t
    \quad
    \rPar{B^N_{\lfloor t / N \rfloor}}
  \end{equation*}
  \end{minipage}
\end{document}

在此处输入图片描述

答案2

使用类似:

\documentclass{scrbook}
\usepackage{amsmath}

% commands for round parentheses
\makeatletter
\newcommand\rParA[1]{\ifinalign@\mathchoice{\left(#1\right)}{(#1)}{(#1)}{(#1)}
  \else(#1)\fi}
\newcommand\rParB[1]{\ifinalign@\left(#1\right)\else#1\fi}
\makeatother

\begin{document}
  \begin{minipage}[H]{0.5\linewidth}
  Here is some process $\rParA{A^N_{\lfloor t / N \rfloor}}_t$.
  Here is another process $\rParB{{B^N_{\lfloor t / N \rfloor}}}_t$.
  Here is what they look like in display mode:
  \begin{align*}
    \rParA{A^N_{\lfloor t / N \rfloor}}_t
    \quad
    \rParB{B^N_{\lfloor t / N \rfloor}}_t
  \end{align*}
  \end{minipage}
\end{document}

答案3

我自己的答案

以下是埃格尔提议。它为圆括号提供了合理的默认值(至少在我看来),并且适用于紧跟在圆括号后的下标和上标:

\documentclass{scrbook}
\usepackage{amsmath}

\makeatletter
% Automatically scaled round parentheses with 
% subscripts and superscripts.
%
% Usage: `\rPar{x}_b^t` results either in 
% `(x)_b^t` or `\left(x\right)_b^t`, depending on 
% the math mode.
\newcommand{\rPar}[1]{
  \@ifnextchar_{
    \rPar@sb{#1}
  }{
    \@ifnextchar^{
      \rPar@sp{#1}
    }{
      \rPar@choice{#1}{}{}
    }
  }
}
\newcommand{\rPar@choice}[3]{
  \mathchoice
    {\left(#1\right)_{#2}^{#3}}
    {(#1)_{#2}^{#3}}
    {(#1)_{#2}^{#3}}
    {(#1)_{#2}^{#3}}
}
\newcommand{\rPar@sb}[3]{
  % args: content, _, subscript
  \@ifnextchar^{
    \rPar@sb@sp{#1}{#3}
  }{
    \rPar@choice{#1}{#3}{}
  }
}
\newcommand{\rPar@sp}[3]{
  % args: content, ^, superscript
  \@ifnextchar_{
    \rPar@sp@sb{#1}{#3}
  }{
    \rPar@choice{#1}{}{#3}
  }
}
\newcommand{\rPar@sb@sp}[4]{
  % args: content, subscript, ^, superscript
  \rPar@choice{#1}{#2}{#4}
}
\newcommand{\rPar@sp@sb}[4]{
  % args: content, superscript, _, subscript
  \rPar@choice{#1}{#4}{#2}
}
\makeatother

\begin{document}
  \begin{minipage}[H]{0.5\linewidth}
  Here is some process $\rPar{A^N_{\lfloor t / N \rfloor}}_t$.
  Here is another process $\rPar{{B^N_{\lfloor t / N \rfloor}}}_t^s$.
  Here is what they look like in display mode:
  \begin{align*}
    \rPar{A^N_{\lfloor t / N \rfloor}}_t
    \quad
    \rPar{B^N_{\lfloor t / N \rfloor}}^s_t
  \end{align*}
  \end{minipage}
\end{document}

解释:宏\@ifnextchar<c>{then}{else}扫描紧跟在宏后面的下一个字符,如果与相同c,则将其c与紧跟在后面的标记一起传递给then块,否则将其扩展为else块。引入一些辅助宏\rPar@sb\rPar@sb@sp,并将所有内容链接在一起,涵盖所有可能的组合(无、仅下标、仅上标、子-上、超-子)。

最终的结果是\rPar宏将其参数括在适当缩放的圆括号中,然后在正确的位置添加下标和上标。

相关内容