TransWikia.com

Why `bm` uparrow gives extra white space while `bm` downarrow does not?

TeX - LaTeX Asked by Yuki.F on March 27, 2021

As topic. I am using pdfLaTeX compiler on Overleaf.

I’ve figured out a remedy (?) as topic by not bolding the arrow: bm{a_{xxx}}{}_{uparrow}. However, I want to know the reason that bm{a_{xxxuparrow}} gives an extra white space after the uparrow symbol that bm{a_{xxxdownarrow}} would not do so.

documentclass[a4paper,12pt]{article}
usepackage{amsmath,latexsym,amssymb,enumerate,amsthm}
usepackage{setspace,color,graphicx,mathtools,yhmath}
usepackage[hang]{caption}
usepackage{dsfont}
usepackage[dvipsnames]{xcolor}
usepackage{subcaption,cancel}
usepackage{bm}

begin{document}

begin{equation}
    bm{a_{xxxuparrow}}(i), bm{a_{xxxdownarrow}}(i).
end{equation}

end{document}

The result using the built-in PDF compiler is uparrow vs downarrow

2 Answers

A bug in cmbsy7.tfm: the characters used are octal 42 (up arrow) and octal 43 (down arrow) and we see in the tfm file (converted to human readable form)

(FAMILY CMBSY V2.2)
(FACE O 360)
(CODINGSCHEME TEX MATH SYMBOLS)
(DESIGNSIZE R 7.0)
(COMMENT DESIGNSIZE IS IN POINTS)
[...]
(CHARACTER O 42
   (CHARWD R 0.65516)
   (CHARHT R 0.694445)
   (CHARDP R 0.194445)
   (CHARIC R 0.714683)
   )
(CHARACTER O 43
   (CHARWD R 0.65516)
   (CHARHT R 0.694445)
   (CHARDP R 0.194445)
   )
[...]

and the italic correction makes all the difference, because by rule TeX adds the italic correction when a symbol ends a math list. The italic correction ends up as 0.714683 times 7 points, a whopping 5pt!

Indeed, if I try $x_{bm{uparrow}}x_{bm{downarrow}}$ I get

....OML/cmm/m/it/10 x
....hbox(4.8611+1.3611)x10.08888, shifted 1.49998
.....hbox(4.8611+1.3611)x9.58888
......mathon
......OMS/cmsy/b/n/7 "
......kern5.00278
......mathoff
....OML/cmm/m/it/10 x
....hbox(4.8611+1.3611)x5.0861, shifted 1.49998
.....hbox(4.8611+1.3611)x4.5861
......mathon
......OMS/cmsy/b/n/7 #
......mathoff

and you see the added kern.

documentclass{article}
usepackage{amsmath}
usepackage{bm}

newcommandfixup{kern-fontcharicscriptfont2`"}

begin{document}

$x_{bm{uparrowfixup}x_{bm{downarrow}}x$

end{document}

enter image description here

Another fix could be

newcommand{fixup}{_{kern-scriptspace}}

The first suggested hack doesn't work with superscripts to the arrow, the second one would; however in case you have a subscript to the arrow, it will remove the wrong italic correction by itself.

The problem starts with the METAFONT source code by Knuth himself. We see in sym.mf

iff known down_arrow: cmchar "Downward arrow";
beginchar(down_arrow,9u#,asc_height#,asc_depth#);
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,0); pos2(rule_thickness,0);
pos3(rule_thickness,90); pos4(rule_thickness,90);
lft x1l=hround(.5w-.5rule_thickness); y1+.5rule_thickness=h;
x0=x1=x2; bot y0=-d; x0-x3=x4-x0=if monospace:3u else:4u fi+eps;
y3=y4=y0+if monospace:.24 else:.36 fi asc_height+eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4r{z9-z4}..z6r;
t=xpart(p intersectiontimes((x2r,-d)--(x2r,h))); y2=ypart point t of p;
filldraw z0..{z4-z9}z4l--subpath (0,t) of(z4r{z9-z4}..z6r)
 ---z1r..z1l---subpath (t,0) of(z3r{z9-z3}..z5r)
 --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
penlabels(0,1,2,3,4,5,6,9); endchar;

iff known up_arrow: cmchar "Upward arrow";
beginchar(up_arrow,9u#,asc_height#,asc_depth#);
italcorr .76asc_height#*slant+.5crisp#-u#;
adjust_fit(0,0); pickup crisp.nib;
pos1(rule_thickness,0); pos2(rule_thickness,0);
pos3(rule_thickness,90); pos4(rule_thickness,90);
lft x1l=hround(.5w-.5rule_thickness); y1-.5rule_thickness=-d;
x0=x1=x2; top y0=h; x0-x3=x4-x0=if monospace:3u else:4u fi+eps;
y3=y4=y0-if monospace:.24 else:.36 fi asc_height-eps;
pos5(rule_thickness,angle(z4-z0)); z5l=z0;
pos6(rule_thickness,angle(z3-z0)); z6l=z0;
z9=.2[.5[z3,z4],z0];
numeric t; path p; p=z4l{z9-z4}..z6r;
t=xpart(p intersectiontimes((x2r,-d)--(x2r,h))); y2=ypart point t of p;
filldraw z0..{z4-z9}z4r--subpath (0,t) of(z4l{z9-z4}..z6r)
 ---z1r..z1l---subpath (t,0) of(z3l{z9-z3}..z5r)
 --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
penlabels(0,1,2,3,4,5,6,9); endchar;

and there should be a reason for the italic correction in “up arrow” that isn't in “down arrow”. Anyway, this italic correction turns out to be negative, and so it is discarded, in cmsy5 to cmsy10.

The real bug is in cmbsy7.mf (in cmextra, provided by the AMS) which has

crisp#:=11pt#;    % diameter of serif corners

Similarly, cmbsy5.mf has 9pt, whereas cmsy7.mf has

crisp#:=7/36pt#;    % diameter of serif corners

That's the issue. Indeed, cmbsy10.mf has

crisp#:=13/36pt#;    % diameter of serif corners

Similar bugs affect cmbsy5.mf, cmbsy6.mf and cmbsy8.mf, but not cmbsy9.mf and cmbsy10.mf.

Correct answer by egreg on March 27, 2021

enter image description here

This appears to be a bug in the bold cm font at script size, the example can be reduced to

documentclass[a4paper]{article}

begin{document}

$scriptstyle xuparrow y downarrow z$

boldmath
$scriptstyle xuparrow ydownarrow z$

end{document}

Answered by David Carlisle on March 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP