3

When typesetting inline equations, I used to force display style to get limits below, because I deemed the inline style with sub/superscript limits to be absolutely appalling, which I still do, and because I was totally unaware of the \limits command. Right now, I still do that because it enlarges symbols like \sum, making them look better. However, it has been pointed out to me that this distorts line spacing, and I've come to agree the effect is almost as bad-looking as the inline style. An example I'm dealing with right now is the following, with a \bigoplus:

enter image description here

So my idea has been to use \underset, reduce the size of the limits by \scriptscriptstyle and then raise it, so as to cramp it up with the \oplus as much as I can without getting too much "side effect" from the cramping. With the code:

Va bene. Per quanto riguarda il viceversa, è chiaro\vsp{-8.5pt} che se
$M\simeq\!\!\!\raisebox{3pt}{$\underset{\raisebox{6pt}{\scb{0.9}[0.9]{$\ssst t\text{ volte}$}}}{\raisebox{-2pt}{$\bigoplus$}}$}\!\!_RR=(_RR)^t$,
poi scriveremo anche $R^t$, la somma diretta di $t$ copie di $_RR$ è libera sulla base
$\br{e_i:i\leq t}$, perché? Ad esempio

where \scb is \scalebox, \vsp is \vspace, \ssst is \scriptscriptstyle and \br{…} is \left\lbrace…\right\rbrace, I get the following:

enter image description here

I'm sure you'll agree it's already much better, but I want to make it even better. Trouble is:

  1. Raising the limit actually lowers the line below;

  2. Trying to lower the plus and then raise the whole increases the space between the "Va bene" line and what is above.

The code above does that, only because I tried that, and raising the whole by 3pt and lowering the \bigoplus by 2 gets the \bigoplus a little higher which I like, and removing the raising of the limit would require fixing the \vspace, so I'm giving the code typesetting exactly to the picture. So naturally the question is: why do the things in points 1) and 2) happen and how can I get the limit actually closer to the \bigoplus?

PS I'm fully aware that having an ascender below the limit messes the whole thing up, but that's something I'll get to later.

  • The only thing that makes sense here is to put “t volte” to the side of the \bigoplus symbol. Trust me: $M\simeq\bigoplus_{\text{$t$ volte}}{}_RR=({}_RR)^t$. Don't forget the empty group before the “prescript”. – egreg Apr 4 '14 at 17:37
  • "I'm sure who will agree it's much better"? As Heiko's answer shows, the default layout is the the only acceptable version of the possibilities shown here. – David Carlisle Apr 5 '14 at 10:57
3

Of course, the subscript can be moved to the symbol, but it still affects the line spacing, because the depth remains too large. The following example compares three variants:

  • with \limits, subscript below,
  • subscript below without space inbetween,
  • default with subscript to the right.
\documentclass{article}
\usepackage{amsmath}
\newcommand*{\lipsum}{ %
  \noindent
  Lorem ipsum dolor sit amet, consectetuer
  adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
  adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu
  libero, nonummy eget, consectetuer id, vulputate a, magna. %
}
\newcommand*{\formula}[1]{$M\simeq #1 {}_RR=({}_RR)^t$}

\newcommand*{\scriptbelow}[3][0pt]{%
  \begingroup
    \renewcommand*{\arraystretch}{0}%
    \begin{array}[t]{@{}c@{}}%
      #2\\[{#1}]%
      \scriptstyle #3%
    \end{array}%
  \endgroup
}

\begin{document}
  \lipsum\formula{\bigoplus\limits_{\text{$t$ volte}}}\lipsum

  \bigskip
  \lipsum\formula{\scriptbelow{\bigoplus}{\text{$t$ volte}}}\lipsum

  \bigskip
  \lipsum\formula{\bigoplus_{\text{$t$ volte}}}\lipsum
\end{document}

Result

Remarks:

  • \arraystretch is a factor for a vertical strut inserted in tabular and array environments. It is used to simulate a uniform line spacing. But in macro \scriptbelow the additional contributions to the height and depths of the two lines are undesirable and defeats the purpose having no space between the operator and its subscript.

    Because the change of \arraystretch should be kept local, the code is put into a group with \begingroup and \endgroup.

    The difference \renewcommand*{\arraystretch} and \renewcommand{\arraystretch} does not matter here, because the definition does not have an argument. Without star, the argument can include \par (empty lines) tokens. Internally \renewcommand* is mapped to \def and \renewcommand without start to \long\def. It is more a matter of taste, which form is used.

  • Optional option t for environment array takes the baseline of the first line as reference line for the whole array. That keeps \bigoplus in the first line at the same vertical position as without array.

| improve this answer | |
  • There should be no doubt which one is the best. – egreg Apr 4 '14 at 18:14
  • Thanks @Heiko. Just four questions. What is \arraystretch? What does the [t] after \begin{array} do? Is the group you opened in \scriptbelow just a trick to make the \renewcommand*{\arraystretch}{0} local or is there something more behind it? And what is the difference between \(re)newcommand and \(re)newcommand*? – MickG Apr 4 '14 at 18:21

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.