我习惯用无衬线字体书写类别名称。因此,对于 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
是完全对称的并且应该像这样间隔开。
所以,我想我有三个问题:
- 这是预期的效果吗,还是我做错了什么?
- 虽然在我看来这似乎是一个错误,但是是否有理由故意这样设计呢?
- 如何让无衬线字体中连字符两边的间距相等,特别我最初的目标是编写 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}