新 LaTeX 补丁级别 1 中的字体规范问题

新 LaTeX  补丁级别 1 中的字体规范问题

让我们用 LuaLaTeX(或 XeLaTeX)编译这个文件:

\documentclass{article}
\usepackage{fontspec}
%\setmainfont{Latin Modern Roman} % (or any other font)

\newfontfamily\myfont{texgyreheros}[
   Extension =      .otf,
   UprightFont =    *-regular,
   BoldFont =       *-bold,
   ItalicFont =     *-italic,
   BoldItalicFont = *-bolditalic,
   Ligatures=TeX
  ]

\begin{document}
\showoutput

\section{\myfont Bold and \textit{italic} \bfdefault}
AAA
\end{document}

.log 文件显示:

LaTeX Font Warning: Font shape `TU/texgyreheros(0)/bx/n' undefined
(Font)              using `TU/texgyreheros(0)/m/n' instead on input line 17.


 LaTeX Font Warning: Font shape `TU/texgyreheros(0)/bx/it' undefined
 (Font)              using `TU/texgyreheros(0)/bx/n' instead on input line 17.

并且 PDF 输出不正确(没有粗体,没有粗体斜体):

在此处输入图片描述

两个问题:

  1. LaTeX 抱怨TU/texgyreheros(0)/bx/n缺少字体,但是\bfdefault,在章节标题中b却没有,为什么?bx

    请注意,相同的文档可以按预期使用 LaTeX 进行编译<2019-10-01> patch level 3\bfdefault并扩展为bx

  2. 取消注释该行(使用任何字体)时\setmainfont{...},输出正确,\bfdefault再次扩展为,文件b中没有出现警告.log。节标题按预期打印在中\TU/texgyreheros(0)/b/n/14.4

\setmainfont{...}即使要使用默认的 LMR 字体打印输出,是否也需要声明?我发现如果添加了.log显式语句,文件会有所不同: versus 。\setmainfont{LaTin Modern Roman}\TU/lmr/m/n/10 AAA\TU/LatinModernRoman(0)/m/n/10 AAA

答案1

这实际上不是一个错误,而是一种可以以某种方式改进的行为。

重点是,文档具有 LMR,因为它是文档字体,并且以“bx”为粗体\rmfamily。因此\section调用并使系列属性变为“bx”(请记住,此时\bfseries我们仍处于此状态)。\rmfamily

现在\myfont出现了,只改变了姓氏,因此请求了texgyreheros(0)/bx尚未设置的fontspec。因此发生了正常的NFSS替换,你得到了texgyreheros(0)/n

看起来有效的原因\setmainfont是它将文档字体更改为“b”字体(拉丁现代罗马字体实际上是错误的)。

下面是 pdftex 的一个示例,展示了不同的行为和原因:

\documentclass{article}

\DeclareFontFamily{OT1}{ptm}{}
\DeclareFontShape{OT1}{ptm}{m}{n}{<-> ptmr7t}{}
\DeclareFontShape{OT1}{ptm}{m}{sc}{<-> ptmrc7t}{}
\DeclareFontShape{OT1}{ptm}{m}{sl}{<-> ptmro7t}{}
\DeclareFontShape{OT1}{ptm}{m}{it}{<-> ptmri7t}{}
\DeclareFontShape{OT1}{ptm}{b}{n}{<-> ptmb7t}{}
\DeclareFontShape{OT1}{ptm}{b}{sc}{<-> ptmbc7t}{}
\DeclareFontShape{OT1}{ptm}{b}{sl}{<-> ptmbo7t}{}
\DeclareFontShape{OT1}{ptm}{b}{it}{ <-> ptmbi7t}{}

\def\test{0}      % ok
\def\test{1}      % ????
\def\test{2}      % ok - typical pdftex case

\ifcase \test\relax
  \renewcommand\rmdefault{ptm}
\or  % 1
\or  % 2
  \DeclareFontShape{OT1}{ptm}{bx}{n}{<->ssub * ptm/b/n}{}
\fi

\showoutput

\begin{document}

\sffamily     Text ``cmss/m/n''

\bfseries     Text ``cmss/bx/n''

\ifcase \test\relax
  \rmfamily
\else
  \fontfamily{ptm}\selectfont
\fi

Text ``ptm/bx/n'' changed to ``ptm/b/n''?


\bigskip \mdseries

Summary: \LaTeX\ understands about fonts with different ``boldness'' if they
are assigned to the metafamilies ``rm'' ``sf'' or ``tt''.

However, if you change to an arbitrary family then the current
``boldness'' remains (e.g., bx) and it depends on the family setup
having a substitution rule for ``bx'' to ``b'' (which nearly all fonts
for pdfTeX have) to work.

\end{document}

因此,短期内,一个解决方案是 fontspec 添加必要的替换规则,例如在这种情况下

\DeclareFontShape{TU}{texgyreheros(0)}{bx}{n}{<->ssub * texgyreheros(0)/b/n}{}
\DeclareFontShape{TU}{texgyreheros(0)}{bx}{it}{<->ssub * texgyreheros(0)/b/it}{}

期中 NFSS 可能应该更普遍地支持每个家庭不同的“大胆程度”。我已在我们的跟踪器上为此开了一个问题:https://github.com/latex3/latex2e/issues/275

相关内容