我如何将减号重新定义为与加号相同的宽度?

我如何将减号重新定义为与加号相同的宽度?

情况

在标准 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 系列),宽度差异问题几乎不明显。但是,对于其他数学字体(例如newtxmathnewpxmath和 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^-$。现在只有在将额外的括号放在 周围时才能使用它-。这很不方便,并且破坏了我现有项目中的许多东西。有人能想到一种解决方案,可以达到与我相同的效果,但没有这个缺点吗?

相关内容