There's a bump in the implies glyph
The problem is this: \Longrigtharrow
(over which \implies
is defined) is built with two characters that come from different fonts.
The equals sign for lengthening the arrow is taken from \textfont0
(the normal text font), while the arrow (\Rightarrow
) is taken from \textfont2
(the math symbol font).
When a current font size is 10pt, lmodern
defines \textfont0
as rm-lmr10
(the prefix rm
means OT1 encoding) and \textfont2
as lmsy10
and all is good. If the current font size is 11pt, the fonts are rm-lmr10 at 10.95pt
and lmsy10 at 10.95pt
, which again agree with each other.
The problem is at 12pt: in this case \textfont0
is rm-lmr12
, while \textfont2
is lmsy10 at 12pt
. Here is where the problem arises: the thickness of the strokes is scaled for \Rightarrow
but not with =
and the difference is noticeable, particularly at low resolution.
The following image is taken at 4x magnification (\mag=4000
) by compiling with pdftex
the input
\mag=4000
\font\xy=lmsy10 at 12pt
\font\xz=rm-lmr12
\textfont2=\xy \textfont0=\xz
$\Longrightarrow$
\bye
and the difference cannot be attributed to pixel adjustments of the onscreen previewer.
A possible workaround is to redefine the font used for \textfont0
to use scaled rm-lmr10
when the current font size is above 10pt and using T1 as the default encoding for text fonts.
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\makeatletter
% Load the OT1 definitions for lmodern
\input{ot1lmr.fd}
% Change the definition for \OT1/lmr/m/n/<size>
\DeclareFontShape{OT1}{lmr}{m}{n}%
{<-5.5> rm-lmr5 <5.5-6.5> rm-lmr6
<6.5-7.5> rm-lmr7 <7.5-8.5> rm-lmr8
<8.5-9.5> rm-lmr9 <9.5-> rm-lmr10
}{}
\makeatother
\begin{document}
\noindent
$\Longrightarrow$\\
The text font\\
is \expandafter\texttt\expandafter{\fontname\font}
\end{document}
Package amsmath
uses \Longrightarrow
to get the \Implies
symbol. \Longrightarrow
and \Longleftarrow
are composed symbols with the standard fonts (unless a math font is used, which contain ready glyphs for the symbol). The arrow is taken from \Rightarrow
and \Leftarrow
, the equals sign =
is used as prolongation, see macro \Relbar
. At larger font sizes, the lines do not match too well, as can be observed in the image of the question.
A minimal example:
\documentclass{article}
\begin{document}
\Huge$\Longrightarrow$
\end{document}
The following reimplementation of \Longrightarrow
and \Longleftarrow
uses a different method to get the prolongation. Instead of using the equals sign, the left part of \Rightarrow
is used for the left part of the new macro \NewRelbar
and the right part of \Leftarrow
is used for the right part of \Leftbar
. The width of the equal sign is too large to be able to take the prolongation in one piece. Also the side bearings are preserved and the new symbol can be used both for \Longrightarrow
and \Longleftarrow
.
Example with implementation and test:
\documentclass{article}
% Save original macros
% --------------------
\usepackage{letltxmacro}
\LetLtxMacro\OriginalLongrightarrow\Longrightarrow
\LetLtxMacro\OriginalLongleftarrow\Longleftarrow
% Implement new macros
% --------------------
\usepackage{trimclip}
\DeclareRobustCommand\Longrightarrow{\NewRelbar\joinrel\Rightarrow}
\DeclareRobustCommand\Longleftarrow{\Leftarrow\joinrel\NewRelbar}
\makeatletter
\DeclareRobustCommand\NewRelbar{%
\mathrel{%
\mathpalette\@NewRelbar{}%
}%
}
\newcommand*\@NewRelbar[2]{%
% #1: math style
% #2: unused
\sbox0{$#1=$}%
\sbox2{$#1\Rightarrow\m@th$}%
\sbox4{$#1\Leftarrow\m@th$}%
\clipbox{0pt 0pt \dimexpr(\wd2-.6\wd0) 0pt}{\copy2}%
\kern-.2\wd0 %
\clipbox{\dimexpr(\wd4-.6\wd0) 0pt 0pt 0pt}{\copy4}%
}
\makeatother
% Testing
% -------
\usepackage{booktabs}
\usepackage{color}
\begin{document}
\Huge
\newcommand*{\Test}[1]{%
\color{red}%
$#1\OriginalLongrightarrow\OriginalLongleftarrow$&%
\color{blue}%
$#1\Longrightarrow\Longleftarrow$%
}
\begin{tabular}{cc}
\toprule
Original & New \\
\midrule
\Test{}\\
\Test\scriptstyle\\
\Test\scriptscriptstyle\\
\bottomrule
\end{tabular}
\end{document}