背景

背景

背景

正如所讨论的这个问题,人们通常喜欢使用小型大写字母来缩写,但是,混合大小写的首字母缩略词(例如 OpenMP)看起来很奇怪(参见下面的示例 2):

渲染示例

问题在于,LaTeX 提供的大多数字体(以及操作系统捆绑的大多数字体)仅提供一种小型大写字母形状,该形状与字体的 x 高度非常接近,以至于高度对比度不足以区分小型大写字母和小写字母。(在此示例中,“O”看起来几乎像小写字母“o”,但在此示例中具有奇怪的粗细。)

排版解决方案是使用字体中部首府(中大写字母)——粗细与小型大写字母相似,但高度略大于字体的 x 高度,但支持此功能的字体相对较少. 许多字体确实提供真正的小型大写字母

问题

我怎么能够伪造的在 LaTeX 中,x 高度为小写字母的字体中的中写字母是什么?

讨论

当然,最好的解决方案是使用设计合理的字体,或者使用类似FontForge将这些添加到字体中(前提是字体许可证允许修改),但这可能需要大量工作,并且在许多情况下不切实际(例如将文章提交给arXiv 上,所以我正在寻找 LaTeX 或 pdfLaTeX 中的程序化解决方案。(优秀的 XeLaTeX 或 LuaLaTeX 解决方案可能普遍令人感兴趣,但不能满足arXiv 需要)以下是几种可能的解决方案:

  1. 一个简单的解决方案是缩小全大写字母。即使对于不提供小写字母的字体,这种方法也有效,但在印刷上是不可接受的。我不认为这是一个潜在的解决方案。

    编辑:正如 Barbara Beeton 指出的那样,Knuth 的原始 Computer Modern 字体有多种设计尺寸,因此,像宏一样按整步长缩放\SMC这些ltugboat.cls字体的效果比人们最初预期的要好得多。如果您的字体有多种设计尺寸(有时称为光学尺寸,或多位大师),那么这种缩放可能是可以接受的。(另请参阅选择光学尺寸

  2. 最简单的可接受的解决方案是放大小写字母。只要比例因子不是太大(小于 105% 左右),那么这是一个合理的解决方案,但不是理想的解决方案。使用缩放软件包如下。此解决方案的问题在于,某些字体需要更多缩放,即使从小写字母开始缩放也会过度增加视觉重量。

  3. 一个更好的解决方案,我目前还不知道如何实现,就是提供不同的水平和垂直缩放因子。例如,使用 107% 的垂直缩放可以更好地保持字体的粗细,但使用 105% 的水平缩放(参见这次讨论)。可以为每个字母使用缩放框来实现这一点,但我怀疑这可能会有空间/性能问题。(也许缩放可以在序言中完成一次,并缓存在预编译序言?)

  4. 最好的自动解决方案可能是在小写字母和全写字母之间进行插值。这应该是一种很好的方法来保持粗细,即使对于较大的缩放因子也是如此。这可以通过编程实现吗?(这就是我开始尝试使用 FontForge 等外部程序设计一组中写字母的方式。)

以下是1到3的实现:

\documentclass{minimal}
\usepackage{relsize}
\usepackage{graphicx}
\renewcommand\RSpercentTolerance{0}
\newcommand{\mcfactor}{1.07}
\usepackage[tracking=smallcaps]{microtype}
\SetTracking{encoding=*, shape=sc}{25}
\usepackage[sc]{mathpazo}

\newcommand\fakesc[1]{{\relscale{0.8}\MakeUppercase{#1}}}
\newcommand\relsc[1]{{\relscale{1.09}\textsc{#1}}}
\newcommand\fullsc[1]{\scalebox{1.06}[1.09]{\textsc{#1}}}

\begin{document}
\begin{enumerate}
\item[0. ] Some text for visual context \textsc{o}pen\textsc{mp} followed by
  some more text.
\item[1. ] Some text for visual context \fakesc{o}pen\fakesc{mp} followed by
  some more text.
\item[2. ] Some text for visual context \relsc{o}pen\relsc{mp} followed by
  some more text.
\item[3. ] Some text for visual context \fullsc{o}pen\fullsc{mp} followed by
  some more text.
\end{enumerate}
\end{document}

方法 1 至 3 的样本

这些可能不是 Palatino 的最佳参数,但可以说明问题。选项 0 是标准小型大写字母选项。大写字母对于所需的对比度来说太小了。选项 1 使用缩放的全大写字母:高度不错,但字母变得太细了。选项 2 使用缩放的 109% 小型大写字母。这仍然不够,但即使在这里,水平重量也变得太重了。选项 3 水平缩放只有 106%,看起来更好。不幸的是,对比度更高会更好,但控制重量会使字母扭曲太多。有人可以实现插值(选项 4)吗?我真的认为那会最好。

答案1

我认为我没有完整的答案,但有一天我发现自己遇到了类似的问题,并使用较小字体的粗体版本解决了它。对于某些字体,它有效,但对于某些字体则无效。这就是你的技能和品味发挥作用的地方。以下是我认为它有效的情况:(\hskips 是因为它是一个缩写)

\documentclass[12pt]{memoir}
\usepackage[osf]{mathpazo}

\begin{document}
    \newcommand{\inchi}{%
                            \mbox{\textsc{i}%
        \hskip 0.1 em {\scriptsize \textbf{n}}%
        \hskip 0.1 em {\normalsize \textsc{c}}%
        \hskip 0.1 em {\scriptsize \textbf{h}}%
        \hskip 0.1 em {\normalsize \textsc{i}}%
        }
    }
    Lorem ipsum \inchi dolor\ldots
\end{document}

上述代码的渲染

相关内容