Fontspec:分别缩放大写和小写,因此“tt”具有与主字体相同的大写字母与 x 高度比

Fontspec:分别缩放大写和小写,因此“tt”具有与主字体相同的大写字母与 x 高度比

TL/DR

我知道这是一个不合逻辑的问题,但是,在 fontspec/XeLaTeX|LuaLaTeX 中,是否可以分别缩放等宽打字机字体的大写字母和小写字母,以实现以下效果:

  • 小写字母缩放至“MatchLowercase”,并且
  • 大写字母设置为“MatchUppercase”,

以使大写字母与 x 高度之比与主字体相匹配。

我知道这会破坏普通字体的字距计算,但对于等宽字体,水平堆叠不重叠的框似乎相当简单。(尽管我怀疑这可能会给首字母大写的单词造成视觉不适,因为简单的堆叠会在大写首字母和小写尾字母之间产生额外的空间:W·ord。)

建议使用与 EB Garamond 相协调的等宽打字机字体可获得奖励。

长表

我目前使用的是 XeLaTeX,但我有很多分支,因此文档也可以用 LuaLaTeX 编译。我使用的是 fontspec。

我正在编写一个包含大量代码的文档,并使用 EB Garamond 作为正文(和Garamond-Math.otf数学)。我花了很长时间才找到一种适合 Garamond 的等宽/打字机字体。

我已选择 IBM Plex Mono:

\setmonofont{IBMPlexMono}%
  [
  , Path = {…}
  , UprightFont = *-Regular.otf
  , ItalicFont = *-Italic.otf
  , BoldFont = *-Bold.otf
  , BoldItalicFont = *-BoldItalic.otf
  , Scale=MatchLowercase
  ]

不过我欢迎提出建议,特别是那些在评论中对 UTF 有相当广泛的 Unicode 支持的建议。

鉴于 IBM Plex Mono 的固定选择,我的问题是 EB Garamond 和 Plex 之间的大写字母与 x 高度之比差异很大,以至于当我通过 MatchLowercase 缩放时,内联代码看起来有点奇怪。

答案1

恐怕这确实是一个不合常理的问题。

字体设计师决定了大写字母和小写字母之间的比例,而你却试图破坏他们的艺术作品。

无论如何,可以使用内核命令来完成此操作。

\documentclass{article}
\usepackage{fontspec}

\setmainfont{TeX Gyre Pagella}

\setmonofont{IBMPlexMono}[
  Extension=.otf,
  UprightFont = *-Regular,
  ItalicFont = *-Italic,
  BoldFont = *-Bold,
  BoldItalicFont = *-BoldItalic,
  Scale=MatchLowercase,
]
\newfontfamily{\UCMONO}{IBMPlexMono}[
  Extension=.otf,
  UprightFont = *-Regular,
  ItalicFont = *-Italic,
  BoldFont = *-Bold,
  BoldItalicFont = *-BoldItalic,
  Scale=MatchUppercase,
]

\ExplSyntaxOn
\NewDocumentCommand{\atexttt}{m}
 {
  \texttt { \text_map_function:nN { #1 } \__timtro_uclc:n }
 }

\cs_new_protected:Nn \__timtro_uclc:n
 {
  \str_if_eq:eeTF { #1 } { \text_lowercase:n { #1 } }
   { #1 } { {\UCMONO#1} }
 }
\ExplSyntaxOff

\begin{document}

Sm \atexttt{Sm} \texttt{Sm}

\end{document}

在此处输入图片描述

评论:这张图片清楚地显示了你的想法有多糟糕。

答案2

我写一些与此类似的代码早在 2018 年,它就分别缩放大写字母和小写字母来伪造小型大写字母。

为此,您可以大大简化它。您不想将缩放后的小写字母变为大写,并且您可能也不想像我一样水平缩放它们。自动确定 x 高度的代码将更改为使用主字体的 x 高度。

但是,您应该首先寻找具有更相似 x 高度的无衬线等宽字体。

答案3

也许这样的东西可能会有一些有限的用处?

改编自我的回答使用 XeTeX/fontspec 伪造小型大写字母?,我用 和\fauxtt控制中大写和小写字母的垂直比例。如果需要,可以通过 调整 tt 字母的水平比例。\Cscale\Vscale\Hscale

在 MWE 中,第一行输出是未调整的 tt。第二行输出是\fauxtt

\documentclass{article}
\usepackage{fontspec,graphicx,xcolor}
\usepackage{graphicx}
\makeatletter
\makeatother
\newcommand\fauxtt[1]{\fauxtthelper#1 \relax\relax}
\def\fauxtthelper#1 #2\relax{%
  \fauxtthelphelp#1\relax\relax%
  \if\relax#2\relax\else\ \fauxtthelper#2\relax\fi%
}
\def\fauxtthelphelp#1#2\relax{%
  \ifnum`#1=\lccode`#1\relax\scalebox{\Hscale}[\Vscale]{\ttfamily#1}\else%
    \scalebox{\Hscale}[\Cscale]{\ttfamily#1}\fi%
  \ifx\relax#2\relax\else\fauxtthelphelp#2\relax\fi}
\begin{document}
\fontspec{Palatino Linotype}
\def\Hscale{1.00}\def\Vscale{1.05}\def\Cscale{1.13}%

\noindent\rlap{\color{red}\rule[4.5pt]{2in}{.1pt}}%
\rlap{\color{red}\rule{2in}{.1pt}}%
\rlap{\color{red}\rule[7pt]{2in}{.1pt}}%
Sm
\texttt{Sm}

\noindent\rlap{\color{red}\rule[4.5pt]{2in}{.1pt}}%
\rlap{\color{red}\rule{2in}{.1pt}}%
\rlap{\color{red}\rule[7pt]{2in}{.1pt}}%
Sm
\fauxtt{Sm}
\end{document}

在此处输入图片描述

相关内容