![我自己的答案](https://linux22.com/image/313598/%E6%88%91%E8%87%AA%E5%B7%B1%E7%9A%84%E7%AD%94%E6%A1%88.png)
我正在尝试想出一些圆括号宏,这些宏在inline
和display
模式下看起来都很好。限制如下:
- 宏应该像
\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
宏将其参数括在适当缩放的圆括号中,然后在正确的位置添加下标和上标。