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}