5

I know this request sounds totally ridiculous at first, but I need it for technical reasons. I would like a custom scaling command like \big, \Big, \bigg, \Bigg, but one that corresponds to “normal size”. We could call it \normalscaling or something like that. Importantly, it should exhibit the same behaviour as the other scaling commands, so e.g. \normalscaling. should yield nothing, while \normalscaling< should yield \langle. I know the general definition of hte \big-style commands, but I am not entirely sure how to modify it to get “no scaling”, i.e. what number to plug in instead of \@ne.

(But why on earth? It is because I am creating a macro system that inserts scaled parentheses, and I want “normal” scaling to behave like other scaling in the above terms. And I want it to expand and behave exactly the same way as the above commands.)

  • How about \let\normalscaling\relax? – Steven B. Segletes May 27 at 15:15
  • 1
    @StevenB.Segletes This does not yield the desired behaviour for . and < etc. – Gaussler May 27 at 15:16
  • 1
    Good point. Can you elaborate on the "etc"? – Steven B. Segletes May 27 at 15:17
  • I have also been wondering about \def\normalscaling#1{\left.\middle#1\right.}, but this does not look to me like the “right” way to do it. – Gaussler May 27 at 15:17
  • Well, everything you can do with \big etc., I also want to be able to do with \normalscaling. So \normalscaling. should yield nothing, and \normalscaling< should yield \langle. I forgot the other things you can do with \big, but I think \big| and \big/ also replace | and / with “real” delimiters. – Gaussler May 27 at 15:20
5

You can use amsmath's way of creating \big commands:

Sample output

\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}

However, you might want to choose a shorter command name...

Why the argument 0.8 to \bBigg@? This factor is multiplied on to \big@size which is 1.2 times the height of a mathstrut. 1/1.2 = 0.83333... but I just used 0.8.

Edit: if you need to preserve the placement of subscripts etc. then you can instead use the following definition

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

\bBigg@ produces a group that ends with a \right. and this results in lower than standard placement of the subscript. Adding a following \mathord fixes that. I am not 100% sure it won't have undesired side effects, but placed inside a \mathopen, \mathclose or \mathrel in l, r or m variants, it should work fine:

Second sample

\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}
| improve this answer | |
  • I'd simply use 0 instead of 0.8 – egreg May 27 at 16:49
  • Thanks, @AndrewSwann and @egreg. As I said above, I knew about the amsmath definitions, but was unsure about which numbers to insert instead of \@ne, 1.5, etc. You and egreg cleared it up together. Thanks again! – Gaussler May 27 at 18:11
  • @egreg Testing shows that the position of indices is changed when applying this method. Compare (a)_{b} to \normascalingl( a \normalscaling)_{b} to see what I mean. Can this be fixed somehow? – Gaussler May 27 at 18:25
5

Here, i just intercept the special arguments, such as ., <, >, and |, and substitute the appropriate non-scaled command. Otherwise, I just pass through the argument.

As you can see from the last two lines, the \normalscalingl and \normalscalingr implementation works as desired, even though \normalscaling itself has to work through an \ifx chain (for example, compare last line to output of $\normalscaling)x\normalscaling( \rightarrow y$, where \mathopen and \mathclose are not invoked... spacing around \rightarrow becomes incorrect).

\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}

enter image description here

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.