情况
在标准 Computer Modern(以及 Latin Modern)中,数学模式减号和加号在某些字体大小下宽度不同。这会导致公式略有错位。我想重新定义数学模式,-
使其在任何字体大小下都具有与 相同的宽度+
。
这个例子
\documentclass[12pt]{standalone}%
%
\begin{document}%
\newlength{\test}%
\begin{tabular}{rll}%
textstyle & \fbox{$-$} & \settowidth{\test}{$-$}\the\test\\
textstyle & \fbox{$+$} & \settowidth{\test}{$+$}\the\test\\
scriptstyle & \fbox{$\scriptstyle-$} & \settowidth{\test}{$\scriptstyle-$}\the\test\\
scriptstyle & \fbox{$\scriptstyle+$} & \settowidth{\test}{$\scriptstyle+$}\the\test\\
scriptscriptstyle & \fbox{$\scriptscriptstyle-$} & \settowidth{\test}{$\scriptscriptstyle-$}\the\test\\
scriptscriptstyle & \fbox{$\scriptscriptstyle+$} & \settowidth{\test}{$\scriptscriptstyle+$}\the\test\\
\end{tabular}%
\end{document}%
这表明,在 12pt 和 6pt 数学字体中,减号比加号宽,但在 8pt 中宽度相同。
解决方案?
我会在下面发布一个,但我并不满意。
答案1
笔记:在以下讨论和解决方案中,我对原始问题的看法截然不同。而且,不,我不喜欢仅仅为了对齐目的而在数学模式下进行+
和/或 激活的想法 。-
这一问题不仅存在于 Computer Modern/Latin Modern 中,也不仅存在于 +
和 -
对中
对于默认的 Computer Modern 系列(或 Latin Modern 系列),宽度差异问题几乎不明显。但是,对于其他数学字体(例如newtxmath
、newpxmath
和 mtpro2
),这个问题更加明显,并且超出了 +
和 -
对的范围。以下 MWE 说明了这一点:
\documentclass{article}
\usepackage{mathtools}
% Latin Modern
%\usepackage{lmodern}
% newtxmath
\usepackage{newtxtext}
\usepackage{newtxmath}
% mtpro2
%\usepackage{newtxtext}
%\usepackage[lite]{mtpro2}
\begin{document}
Cases: $f(x) = \begin{cases}
+1 & x>0 \\
-1 & x=0 \\
-1 & x\le0
\end{cases}$
Stacked subscripts: $\displaystyle \sum_{\substack{i=0 \\ i>0}}$
\end{document}
我们现在可以得出结论,宽度差异是通过设计。更重要的是,这种行为不可预料的跨不同的数学字体和跨不同的设计/光学尺寸。显然,任何涉及主动+
、-
等的解决方案=
都是无效的,危险的。
我们如何才能获得等宽符号?
为了避免让角色变得活跃(并且可能会破坏其他东西),我提出了两个专门设计的命令:
\tabularrel{<arg>}
和
\tabularbin{<arg>}
这些名字的灵感来自于“比例数字与表格数字”。这两个命令本质上都是根据某个“标准符号”制作一个固定宽度的框,然后将实际符号水平居中。请注意,\mathpalette
需要获得正确的数学样式。当然,这种对齐表格式数学的方法可以应用于任何数学字体。
以下是 MWE:
\documentclass{article}
\usepackage{mathtools}
% Latin Modern
%\usepackage{lmodern}
% newtxmath
\usepackage{newtxtext}
\usepackage{newtxmath}
% mtpro2
%\usepackage{newtxtext}
%\usepackage[lite]{mtpro2}
% Standard relation and binary symbols
\newcommand*\standardrel{<}% Change this to `=' for mtpro2
\newcommand*\standardbin{+}
% Tabular relation and binary symbols
\makeatletter
\newcommand*\tabularrel[1]{%
\mathrel{\mathpalette{\@tabularsym\standardrel}{#1}}%
}
\newcommand*\tabularbin[1]{%
\mathbin{\mathpalette{\@tabularsym\standardbin}{#1}}%
}
\newcommand*\@tabularsym[3]{%
% #1: standard symbol
% #2: math style
% #3: user symbol
\setbox\z@\hbox{$#2#1\m@th$}%
\hbox to\wd\z@{\hss$#2#3\m@th$\hss}%
}
\makeatother
\begin{document}
Cases: $f(x) = \begin{cases}
\tabularbin+1 & x\tabularrel>0 \\
\tabularbin-1 & x\tabularrel=0 \\
\tabularbin-1 & x\tabularrel\le0
\end{cases}$
Stacked subscripts: $\displaystyle \sum_{\substack{i\tabularrel=0 \\ i\tabularrel>0}}$
\end{document}
瞧!!!
对于大多数“单行”方程式,不需要等宽符号。然而,在里面输入时表格状环境例如表格、数组、案例、矩阵等,水平对齐可能至关重要。
答案2
我尝试解决
\newlength{\widthplus}%
\newcommand{\minuspalette}[2]{\settowidth{\widthplus}{$#1+$}\mathbin{\makebox[\widthplus]{$#1#2$}}}%
\newcommand{\goodminus}{\mathpalette{\minuspalette}{\mathchar"2200}}% use \mathchar"2200 instead of - to avoid infinite recursion
{\catcode`-13\gdef-{\goodminus}}% make - active temporarily, so that it can be redefined
\mathcode`-"8000% make - active in math mode
我只是定义了一个与加号宽度相同的框,但将用减号字形填充。我不会缩小符号,只会使其边界框变小。通过\mathpalette
定义,所有数学尺寸都会自动正确。然后我将其-
激活(但只是暂时的),以便可以重新定义。最后,我-
仅在数学模式下永久激活(不要弄乱文本模式连字符),以便在那里使用新的定义。
我不喜欢它的地方
正是因为减号现在在数学模式中处于活动状态,所以我不能再将其用作单个上标或下标,例如$e^-$
。现在只有在将额外的括号放在 周围时才能使用它-
。这很不方便,并且破坏了我现有项目中的许多东西。有人能想到一种解决方案,可以达到与我相同的效果,但没有这个缺点吗?