如何创建“正常”大小的 \big-type 命令

如何创建“正常”大小的 \big-type 命令

我知道这个要求乍一听很荒谬,但出于技术原因我需要它。我想要一个自定义缩放命令,如\big\Big\bigg\Bigg,但该命令对应于“正常大小”。我们可以叫它\normalscaling或类似的名字。重要的是,它应该表现出与其他缩放命令相同的行为,因此 eg\normalscaling.应该不产生任何结果,而\normalscaling<应该产生\langle。我知道 hte 样式命令的一般定义\big,但我不完全确定如何修改它以获得“无缩放”,即插入什么数字而不是\@ne

(但究竟为什么呢?这是因为我正在创建一个插入缩放括号的宏系统,并且我希望“正常”缩放表现得像上述术语中的其他缩放。并且我希望它扩展并以与上述命令完全相同的方式运行。)

答案1

您可以使用amsmath的方式创建\big命令:

示例输出

\documentclass{article}

\usepackage{amsmath}

\makeatletter
\newcommand{\normalscaling}{\bBigg@{0.8}}
\newcommand{\normalscalingl}{\mathopen\normalscaling}
\newcommand{\normalscalingr}{\mathclose\normalscaling}
\newcommand{\normalscalingm}{\mathrel\normalscaling}
\makeatother

\begin{document}

\begin{equation*}
  \Bigl( w + \bigl( x + \normalscalingl( y + z \normalscalingr) \bigr)
  \Bigr)
\end{equation*}

\begin{equation*}
  \bigl\langle \psi \bigm| \bigr.
\end{equation*}

\begin{equation*}
  \normalscalingl\langle \psi \normalscalingm| \normalscalingr.
\end{equation*}

\end{document}

但是,您可能想选择一个更短的命令名称......

为什么0.8要使用\bBigg@?这个因数乘以 ,\big@size1.2乘以 mathstrut 的高度。 1/1.2 = 0.83333...但我只使用了0.8

编辑:如果您需要保留下标等的位置,那么您可以使用以下定义

\def\newnormalscaling#1{\bBigg@{0.8}#1{}}

\bBigg@生成一个以 结尾的组,这会导致下\right.标的位置低于标准位置。添加以下项\mathord可解决此问题。我不能 100% 确定它不会产生不良副作用,但将其放置在、或\mathopen变体中,它应该可以正常工作:\mathclose\mathrellrm

第二个示例

\documentclass{article}

\usepackage{amsmath}

\makeatletter
\newcommand{\normalscaling}{\bBigg@{0.8}}
\newcommand{\normalscalingl}{\mathopen\normalscaling}
\newcommand{\normalscalingr}{\mathclose\normalscaling}
\newcommand{\normalscalingm}{\mathrel\normalscaling}
\def\newnormalscaling#1{\bBigg@{0.8}#1{}}
\newcommand{\newnormalscalingl}{\mathopen\newnormalscaling}
\newcommand{\newnormalscalingr}{\mathclose\newnormalscaling}
\newcommand{\newnormalscalingm}{\mathrel\newnormalscaling}
\makeatother

\begin{document}

\begin{equation*}
  \Bigl( w + \bigl( x + \normalscalingl( y + z \normalscalingr) \bigr)
  \Bigr)
\end{equation*}

\begin{equation*}
  \bigl\langle \psi \bigm| \bigr.
\end{equation*}

\begin{equation*}
  \normalscalingl\langle \psi \normalscalingm| \normalscalingr.
\end{equation*}

\begin{equation*}
  (a)_{b}  \normalscalingl(a\normalscalingr)_{b}
  \left.\right)_{b}
\end{equation*}

\begin{equation*}
  \Bigl( w + \bigl( x + \newnormalscalingl( y + z \newnormalscalingr) \bigr)
  \Bigr)
\end{equation*}

\begin{equation*}
  \bigl\langle \psi \bigm| \bigr.
\end{equation*}

\begin{equation*}
  \newnormalscalingl\langle \psi \newnormalscalingm| \newnormalscalingr.
\end{equation*}

\begin{equation*}
  (a)_{b}  \newnormalscalingl(a\newnormalscalingr)_{b}
  \left.\right)_{b}
\end{equation*}
\end{document}

答案2

这里,我只是截取特殊参数,例如.<>|,并替换适当的非缩放命令。否则,我只是传递参数。

从最后两行可以看出,\normalscalingl和的\normalscalingr实现按预期工作,即使\normalscaling它本身必须通过\ifx链工作(例如,将最后一行与的输出进行比较$\normalscaling)x\normalscaling( \rightarrow y$,其中\mathopen\mathclose未被调用……周围的间距\rightarrow变得不正确)。

\documentclass{article}
\usepackage{newtxmath}
\newcommand\normalscaling[1]{%
  \ifx.#1\else
  \ifx<#1\langle\else
  \ifx>#1\rangle\else
  \ifx|#1\vert\else
  #1
  \fi\fi\fi\fi
}
\newcommand\normalscalingl{\mathopen\normalscaling}
\newcommand\normalscalingr{\mathclose\normalscaling}
\begin{document}
$< \langle \Big< \Big\langle \Big. \Big/ \Big|$

$< \langle \normalscaling< \normalscaling\langle \normalscaling. 
  \normalscaling/ \normalscaling|$

$\normalscalingl(x\normalscalingr) \rightarrow y$

$\normalscalingl)x\normalscalingr( \rightarrow y$
\end{document}

在此处输入图片描述

相关内容