ConTeXt 是否有与“Scale=MatchLowercase”或类似的东西等效的东西?

ConTeXt 是否有与“Scale=MatchLowercase”或类似的东西等效的东西?

在 (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}}

给出

在此处输入图片描述

但这只是一个开始。要获得视觉上和谐的效果,您必须在真实文档上对这些值进行一些试验。

相关内容