让我们用 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 输出不正确(没有粗体,没有粗体斜体):
两个问题:
LaTeX 抱怨
TU/texgyreheros(0)/bx/n
缺少字体,但是\bfdefault
,在章节标题中b
却没有,为什么?bx
请注意,相同的文档可以按预期使用 LaTeX 进行编译
<2019-10-01> patch level 3
,\bfdefault
并扩展为bx
。取消注释该行(使用任何字体)时
\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