在 (Lua-)LaTeX 中fontspec
有一个名为的选项Scale=MatchLowercase
(以及一些类似的选项Scale=MatchUppercase
),它会尝试自动检测与字体匹配的比例。
LaTeX 示例:
\documentclass{article}
\usepackage{fontspec}
\setmainfont{EB Garamond}
\setmonofont{Fira Mono}
\begin{document}
Test {\ttfamily Test}
\setmonofont{Fira Mono}[Scale=MatchUppercase]
Test {\ttfamily Test}
\end{document}
正如我们所见,与第一行相比,第二行确实看起来缩放得很好(我承认,对于这种字体选择,“缩放得很好”是一个非常委婉的说法)。
因此在 ConTeXt MkIV 中我将进行以下设置:
\definefontfamily [testdoc] [rm] [EB Garamond]
\definefontfamily [testdoc] [tt] [Fira Mono]
\setupbodyfont [testdoc]
\starttext
Test {\tt Test}
\stoptext
不幸的是,我只知道这个rscale
选项。是否有类似的启发式方法可以自动确定比例?
(不必在文档中间进行更改,只要能工作就\definefontfamily
足够了。另外,我并不受简单字体的约束。)
答案1
简短回答:否
在 MkII 中,你可以传递选项rscale=auto
来\definetypeface
获得自动缩放。此功能尚未移植到 MkIV。
在 MkIV 中,有一个实验性的功能支持字体的自动缩放,但该功能已被禁用。以下示例取自字体配置文件
\enableexperiments[fonts.autorscale]
\starttypescript[mscore]
\definetypeface [mscore] [rm] [serif] [mscoretimes] [default]
\definetypeface [mscore] [ss] [sans] [mscorearial] [default] [rscale=auto] % 0.860]
\definetypeface [mscore] [tt] [mono] [mscorecourier] [default] [rscale=auto] % 1.065]
\definetypeface [mscore] [mm] [math] [times] [default] [rscale=auto] % 1.020]
\stoptypescript
\starttext
\setupbodyfont[mscore,12pt]
\startTEXpage
test \ss test \tt test
\stopTEXpage
\stoptext
但它不起作用,因为相关代码被注释掉了字体-ctx.lua
-- if enable_auto_r_scale and relativeid then -- for the moment this is rather context specific (we need to hash rscale then)
-- local relativedata = fontdata[relativeid]
-- local rfmdata = relativedata and relativedata.unscaled and relativedata.unscaled -- just use metadata instead
-- local id_x_height = rfmdata and rfmdata.parameters and rfmdata.parameters.x_height
-- local tf_x_height = tfmdata and tfmdata.parameters and tfmdata.parameters.x_height
-- if id_x_height and tf_x_height then
-- local rscale = id_x_height/tf_x_height
-- delta = rscale * delta
-- scaledpoints = rscale * scaledpoints
-- end
-- end
本文讨论了自动字体缩放的一些优缺点(主要是缺点)。2006 线程在 ntg-context 邮件列表上。我将总结以下几点:
-
嗯,这并不难,但问题是:参考字体是什么;另外,我的经验是,在大多数情况下,自动缩放看起来和不缩放一样丑陋;这是一个视觉问题;xheight 是一个因素,但“粗体”也是一个因素
-
但这样做有用吗?Unicode 字体(据我所知,XeTeX 无法处理任何其他字体)的 x 高度是多少,其中包含拉丁字母和希腊字母?您必须依赖字体设计师为所有字符实现相同的 x 高度这一事实 - 在我看来,大多数字体都不是这种情况。所以我不确定这是否是必要或有用的。说到底,除了查看打印页面并自行决定两种字体之间的关系是否“正确”之外,我仍然看不到其他可能性。顺便说一句,大多数出版商似乎不再费心了,只是将字体设置为其设计大小。例如,OUP 使用 Porson,它比大多数罗马字体小很多,但它们不会缩放。我觉得这很糟糕,但我想说的是:似乎没有可以自动化的既定印刷实践。
-
嗯。只需排版字体条,在屏幕上放大/缩小文档并找到最佳视觉匹配。对于给定的字体组合,您只需执行一次此操作。
让我解释一下如何使用 Hans 在评论中提到的字体条。我将使用一个文档,其中 TeX Gyre Termes 为衬线字体,TeX Gyre Heros 为无衬线字体,Dejavu Sans Mono 为打字机字体:
\usetypescriptfile[dejavu]
\starttypescript[typeone]
\definetypeface [typeone][rm][serif][termes] [default]
\definetypeface [typeone][ss][sans] [heros] [default]
\definetypeface [typeone][tt][mono] [dejavu] [default]
\definetypeface [typeone][mm][math] [modern] [default]
\stoptypescript
\setupbodyfont[typeone]
\starttext
\showfontstrip
\stoptext
这使
根据衬线字体、无衬线字体和打字机字体的 x 高度,可以计算出“正确”的值rscale
:
\starttypescript[typetwo]
\definetypeface [typetwo][rm][serif][termes] [default]
\definetypeface [typetwo][ss][sans] [heros] [default] [rscale=0.858]
\definetypeface [typetwo][tt][mono] [dejavu] [default] [rscale=0.822]
\definetypeface [typetwo][mm][math] [modern] [default]
\stoptypescript
这使
请注意,x 高度非常匹配(数学除外,我没有对其进行缩放)。然而,这并不一定意味着组合看起来不错。
\ruledhbox{Test \sans{Test} \mono{Test}}
给出
但这只是一个开始。要获得视觉上和谐的效果,您必须在真实文档上对这些值进行一些试验。