斜体文本中的数学字母间距错误

斜体文本中的数学字母间距错误

我使用标准的 AMS 定理样式,这意味着我的定理以斜体显示。与数学变量结合使用时,这有时会产生可怕的间距:输入If $U$ or $V$ \dots会产生

我在这里看到两个间距问题:“If”和“U”之间的间距太小,而“U”和“or”之间的间距太大。因此,如果将“U”向右移动一点,输出看起来会好得多。一个非解决方案是删除美元符号:If U or V \dots收益

这里的间距好多了,但现在的问题是“U”和“V”使用了不同的字体(即斜体),它们很相似但不完全相同。另一个非解决方案是\/在“If”之后使用斜体校正:这只会校正第一个空格(如果必须一直记住输入的话,那就不好了\/)。

我目前的“解决方案”是在我认为合适的地方进行手动更正,这当然很麻烦。有人有更好的解决方案吗?XeTeX 或 LuaTeX 有什么用吗?

(我想我确实明白是什么导致了这个问题。我们的想法是在两个例子中显示相关字符的边界框:

       

您会看到,两种情况下边界框的间距都很好。但斜体字母往往会从框的右侧伸出,而对于“U”(右图)和“o”,您会看到它们在框的左侧有一些空白。然而,数学“U”(左图)在左侧没有这个空白,也没有向右伸出。因此,数学“U”位于左侧太远。)

编辑:

Khaled 说得对,数学“U”和“or”之间的空间很大,因为数学“U”包含斜体校正。这在 TeXbook 臭名昭著的附录 G,规则 17 中有明确描述。因此,数学“U”不会超出其框,因为框包含斜体校正,如果数学嵌入罗马文本中,这是完全没问题的。我只是不知道如果数学已经存在于某些斜体文本中,如何摆脱斜体校正!

答案1

好吧,我自己想出了一个绝对疯狂的“解决方案”。这主要是为了更清楚地说明问题所在;我不建议使用下面的(非常长的)代码。这个“解决方案”只为单个字母AtoZato提供斜体校正z,并且通过$激活来工作。(我也可以使用\(\),但我不喜欢它们。)此外,所有内容都是针对 10pt CM 字体“手动”调整的,因此它不适用于其他字体(但应该大致适用于其他字体大小)。以下是输出:

在第一行中,您可以看到未经任何校正的结果If $U$ or $V$ ...;在第二行中,我应用了校正,在第三行中$省略了 s,即使用了通常的斜体字体。我并不是说第二行在所有方面都很好,例如“f”和“from”之间的间距相当小。我想要实现的是间距与“正常”斜体字体一样,也就是说,在第二行和第三行中,间距(几乎)相同。(第二行稍长一些,因为数学字母更宽。)

特别要注意的是,第二行标点符号前的间距与第一行不同。(我不确定哪个版本更好。)显然,第一行中“U”、“V”和“Y”的位置不好(我想说很糟糕);第二行中的位置要好得多。

当然,你可以更改我代码中的所有这些数字,以尝试进一步改善间距。但我只想指出另一点:如果你看看这些数字,就会发现在不更改字体度量的情况下“自动”进行这种更正确实非常困难。

\documentclass{article}

\makeatletter
\let\mydollar=$
\catcode`\$=\active
\def\my@testtoken{\my@testtoken}
\def$#1${\ifx\my@testtoken#1\my@testtoken
           \mydollar\mydollar
         \else
           \test@single@character#1\my@testtoken
         \fi
        }
\def\test@single@character#1#2\my@testtoken{%
         \def\math@format##1{\mydollar##1\mydollar}%
         \ifx\mytesttoken#2\mytesttoken
           \ifcat#1a%
             \ifdim\fontdimen\@ne\font>\z@
               \def\math@format##1{\mydollar\xdef\currentfont{\the\textfont1}\mydollar
                                   {\corrected{##1}}%\currentfont##1}%
                                  }%
             \fi
           \fi
         \fi
         \math@format{#1#2}%
        }
\def\corrected#1{\csname @correct@#1\endcsname}
\def\correct#1#2,#3,{\expandafter\def\csname @correct@#1\endcsname{\mydollar\mskip#2mu#1\mskip-#3mu\mydollar}}
\makeatother

\correct A0.15,0,    %1st number is the correction before the letter,
\correct B0.3,1.5,   %2nd number is (minus) the correction after it.
\correct C1.75,2.2,
\correct D0.25,1.4,
\correct E0.3,1.7,
\correct F0.3,1.95,
\correct G1.8,1.15,
\correct H0.25,2.6,
\correct I0.3,2.6,
\correct J0.1,2.2,
\correct K0.3,2.4,
\correct L0.25,0.6,
\correct M0.3,2.6,
\correct N0.3,2.6,
\correct O1.75,1.3,
\correct P0.2,1.5,
\correct Q1.75,1.3,
\correct R0.2,0.2,
\correct S0.4,1.8,
\correct T2.7,1.9,
\correct U2.4,2.6,
\correct V2.4,2.95,
\correct W2.4,2.9,
\correct X0.4,2.5,
\correct Y2.6,3.1,
\correct Z0.4,2.2,
\correct a1.2,1,
\correct b1.2,0.3,
\correct c1.2,0.2,
\correct d1.2,0.8,
\correct e1.2,0.85,
\correct f-1.5,3.5,
\correct g0.7,1.2,
\correct h0.4,1,
\correct i1,1.4,
\correct j-0.5,2.2,
\correct k0.4,1.5,
\correct l0.9,1.8,
\correct m1,0.95,
\correct n1,0.95,
\correct o1.2,0.3,
\correct p1,0.3,
\correct q1.2,1.2,
\correct r1,2,
\correct s0.5,1,
\correct t1,1.25,
\correct u1,0.95,
\correct v1,1.55,
\correct w1,1.5,
\correct x0.4,1.75,
\correct y1,1.2,
\correct z0.4,1.75,

\newcommand\test[1]{%
    {\let$\mydollar #1} \par
    #1 \par
    \let$\relax #1
    }

\begin{document}
\it
\test{If $U$ or $V$ and $X$, and $f$ from $j$.  Let $T$ be $S$ if $Y$.}
\end{document}

- - 编辑 - -

这是上述校正表的一个版本,可用于 newtxtext 和 newtxmath。

\correct A-1.3,-0.2,
\correct B-0.6,0.3,
\correct C0.2,0.9,
\correct D-0.6,0.4,
\correct E-0.55,1.4,
\correct F-2.6,1.1,
\correct G0.0,0.5,
\correct H-0.4,1.0,
\correct I-0.75,1.3,
\correct J-1.0,1.15,
\correct K-0.25,1.3,
\correct L-0.9,0.95,
\correct M-1.0,1.35,
\correct N-2.55,1.55,
\correct O0.25,0.5,
\correct P-0.65,0.45,
\correct Q0.2,0.5,
\correct R-0.8,0.2,
\correct S-0.4,0.6,
\correct T0.7,1.85,
\correct U0.5,1.05,
\correct V0.5,1.65,
\correct W0.5,1.5,
\correct X-1.0,1.45,
\correct Y1.0,1.95,
\correct Z-1.0,1.45,
\correct a-0.3,0.25,
\correct b-0.5,-0.3,
\correct c-0.3,0.35,
\correct d-0.5,0.9,
\correct e-0.25,0.35,
\correct f-3.15,3.15,
\correct g-0.05,0.55,
\correct h-0.6,0.35,
\correct i0.35,0.7,
\correct j-2.0,1.3,
\correct k-0.65,1.3,
\correct l-0.1,1.1,
\correct m-0.2,0.15,
\correct n-0.2,0.0,
\correct o-0.25,0.05,
\correct p-0.75,0.0,
\correct q-0.2,0.4,
\correct r0.2,1.3,
\correct s-0.55,0.45,
\correct t0.15,1.2,
\correct u0.1,0.25,
\correct v-0.1,0.75,
\correct w-0.25,0.6,
\correct x-0.95,0.85,
\correct y-1.0,0.7,
\correct z-0.5,0.55,

答案2

此问题已在包中部分修复mathtools(请参阅包文档的第 4.1 节)。

以下是示例。请注意,必须使用\(和 来输入数学运算\)

\documentclass{article}  
\usepackage{amsmath,mathtools}  
\begin{document}  
Bad:  
\mathtoolsset{mathic=false}   
\textit{If \(U\) or \(V\) \dots.}  
\par Good:  
\mathtoolsset{mathic=true}  
\textit{If \(U\) or \(V\) \dots.}  
\end{document}

在此处输入图片描述

答案3

更新:这个先前对另一个相关问题的回答已经提到了\noic这里讨论的宏。

以下是如何在输入完一个字母后退出数学运算时抑制斜体校正的方法。

\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[vscale=0.82]{geometry}
\begin{document}

\ttfamily

\def\noic{\sb{}\kern-\scriptspace }
\def\mathfont{\usefont{OML}{cmm}{m}{it}}

\mathsurround0pt % is default anyhow

\newbox\letterbox
\newcount\letter
%\the\scriptspace

\begin{verbatim}
\def\noic{\sb{}\kern-\scriptspace }
    $<letter>\noic$ gives the same as \usefont{OML}{cmm}{m}{it}<letter> 
©jfbu, 2013. 
          <letter>     <letter>\/    $<letter>$  $<letter>_{}$  $<letter>\noic$ 
\end{verbatim}

\letter`a
\noindent\loop
\makebox[.05\linewidth]{$\char\letter$}%
\setbox\letterbox=\hbox{\mathfont\char\letter}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}%
\setbox\letterbox=\hbox{\mathfont\char\letter\/}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}%
\setbox\letterbox=\hbox{$\char\letter$}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}%
\setbox\letterbox=\hbox{$\char\letter_{}$}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}%
\setbox\letterbox=\hbox{$\char\letter\noic$}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}\\
\ifnum\letter<`z
\advance\letter by 1 
\repeat

%\clearpage

\letter`A

\noindent\loop
\makebox[.05\linewidth]{$\char\letter$}%
\setbox\letterbox=\hbox{\mathfont\char\letter}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}%
\setbox\letterbox=\hbox{\mathfont\char\letter\/}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}%
\setbox\letterbox=\hbox{$\char\letter$}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}%
\setbox\letterbox=\hbox{$\char\letter_{}$}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}%
\setbox\letterbox=\hbox{$\char\letter\noic$}%
\makebox[.18\linewidth][r]{\the\wd\letterbox}\\
\ifnum\letter<`Z
\advance\letter by 1 
\repeat

\end{document}

所有 OML 字母表(带斜体更正和不带斜体更正)

应广大群众的要求,

\clearpage
\newgeometry{hscale=0.9}
\thispagestyle{empty}

\def\original{If $U$ or $V$ and $X$, and $f$ from $j$.  Let $T$ be $S$ if $Y$.}

\def\improved{If\/ $U\noic$ or\/ $V\noic$ and\/ $X\noic$, and\/ $f$ from\/ $j\noic$. Let\/ $T\noic$ be\/ $S\noic$ if\/ $Y\noic$.}

\normalfont\itshape


\small
\original

\improved

\medskip

\normalsize
\original

\improved

\medskip

\large
\original

\improved

\medskip

\huge
\original

\improved

\medskip

\bigskip

\bfseries\boldmath


\small
\original

\improved

\medskip

\normalsize
\original

\improved

\medskip

\large
\original

\improved

\medskip

\huge
\original

\improved

例子

相关内容