无衬线字体中连字符周围的间距不均匀?

无衬线字体中连字符周围的间距不均匀?

我习惯用无衬线字体书写类别名称。因此,对于 R 模块类别,我一直使用

$R\textrm{-}\textsf{Mod}$

但是,这样产生的字距/间距从来都不令人满意(点击查看大图):

玩了一会儿,我觉得我可能没疯,但也许无衬线字体中连字符的间距确实有问题。例如,以下代码

\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsfonts,graphicx}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}
M-M \vspace{-0.45cm}
\rotatebox{180}{M-M}
\end{document}

制作(点击查看大图):

我不确定如何计算 LaTeX 中的长度,但只要在屏幕上放一把尺子,我就能确定这是不均匀的。

现在,我不会期望它在通常的衬线字体中是均匀的,因为它M不是一个完全对称的字母,但在无衬线字体中,在我看来它M是完全对称的并且应该像这样间隔开。

所以,我想我有三个问题:

  1. 这是预期的效果吗,还是我做错了什么?
  2. 虽然在我看来这似乎是一个错误,但是是否有理由故意这样设计呢?
  3. 如何让无衬线字体中连字符两边的间距相等,特别我最初的目标是编写 R 模块类别吗?

答案1

Mico 展示了使用其中一种 unicode TeX 引擎的可能性,但为了回答您的明确问题,并使用 pdftex,您没有做错任何事,并且 TeX 也没有在任何地方添加空格(正如您从下面的代码生成的日志输出中看到的那样。M 上的侧边距相等,但不居中-。TeX 对此一无所知,对于 TeX 来说,每个字符都是由字体度量给出的矩形框,它没有关于该矩形哪部分是白色的信息。

您的示例的修改版本显示了原始连字符,然后移动一个连字符(通过眼睛)以使其居中,最后如果与大写字母一起使用则稍微升高。

在此处输入图片描述

\documentclass[11pt]{article}
\usepackage{amsmath,amssymb,amsfonts,graphicx}
\renewcommand{\familydefault}{\sfdefault}
\large
\begin{document}
\showoutput

M-M

\fbox{M}\fbox{-}\fbox{M}

\vspace{-1.5em}

\rotatebox{180}{\fbox{M}}%
\rotatebox{180}{\fbox{-}}%
\rotatebox{180}{\fbox{M}}


\newdimen\fudgehy
\fudgehy=.02em
\fbox{M}\fbox{\kern\fudgehy-\kern-\fudgehy}\fbox{M}

\vspace{-1.5em}

\rotatebox{180}{\fbox{M}}%
\rotatebox{180}{\fbox{\kern\fudgehy-\kern-\fudgehy}}%
\rotatebox{180}{\fbox{M}}

M\kern\fudgehy-\kern-\fudgehy M


M\raisebox{.1ex}{\kern\fudgehy-\kern-\fudgehy}M

\end{document}

答案2

我认为你的“R-Mod”看起来如此不平衡的原因主要不是因为连字符没有居中。而是因为大写字母高度衬线/斜体-R 和无衬线/直立-M 字母明显不同。

考虑以下替代 MWE,它使用该fontspec包来均衡文档中使用的衬线字体和无衬线字体的大写字母高度。我想说的是,结果是,“R-Mod”字符串看起来更加平衡连字符位置的不对称性似乎也不再那么明显。(请注意,MWE 需要 XeLaTeX 或 LuaLaTeX 才能编译。)

我的看法是:如果希望在近距离混合使用衬线字母和无衬线字母,则必须适当匹配它们的大小。

在此处输入图片描述

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\setsansfont[Scale=MatchUppercase]{Latin Modern Sans}
\usepackage{amsmath}
\newcommand*{\Rmod}{\text{\textit{R}-\textsf{Mod}}}
\begin{document}
\Rmod
\end{document}

相关内容