从 XeLatex 转换到 LuaLatex 时,我遇到了一些奇怪的字体和加载问题。
我对这个问题的出发点是这个答案https://tex.stackexchange.com/a/234785/15886 由 @ulrike-fischer - 5 年前。5 年后,在 Windows 10 上使用当前版本的 TexLive 和 LuaHBTeX,版本 1.12.0 (TeX Live 2020/W32TeX) (format=lualatex 2020.7.28)
与 XeLatex 相比,我的编译速度相当慢
和 Ulrike 一样,我发现关闭 fontspec 的“功能”来搜索 .fontspec 文件可以将编译速度提高 3 倍(例如,在我当前的文档中,编译速度从 23 秒缩短到 8 秒)
我首先对 Ulrike 的 MWE(如下)进行了扩展,并添加了一些字体测试例程。
根据 Ulricke 的说法,MWE 的第 4-7 行只不过是阻止了对 .fontspec 文件的不必要搜索。这对 MWE 的输出没有任何影响,因为这里使用的 libertine 包中的字体似乎没有 .fontspec 文件。
切换第 4-7 行的开启/关闭确实可以大大加快编译速度(无法通过这个简短的 MWE 演示,因此显然不仅仅与初始字体加载有关)。但是字体实际上已经改变,原因我不明白。
MWE 输出的最后几行例如 - 没有 Ulrike 的魔法线
和 Ulrike 的几行(据说只是关闭了 .fontspec 搜索
我的问题是:
a) 为什么阻止对 .fontspec 进行系统杀伤搜索会改变渲染,特别是当 libertine 无论如何都不使用它时 b) 在之前的问题提出 5 年后,我们应该在 LuaLatex 中做些什么字体加载。例如,如果我想使用 libertine 和 Biolinium,我应该从一个包(据称 LuaLatex“兼容”)加载它们,还是直接使用 fontspec 加载它们(?),我应该如何处理这种速度变慢的问题 - 这显然与字体有关,也许只在 Windows 上?
MWE 关注:
\documentclass{article}
\usepackage{fontspec}
\usepackage{booktabs}
% \ExplSyntaxOn
% \cs_set:Nn \__fontspec_load_external_fontoptions:Nn
% {}
% \ExplSyntaxOff
\usepackage{libertine}
\begin{document}
\newcommand{\FontCmd}[3]{\PBS\verb!\#1{!\textit{text}\verb!}! \> %
\verb!{\#2 !\textit{text}\verb!}! \> %
\#1{#3}}
\begin{tabular}{lll}
\textit{Command} & \textit{Declaration} & \textit{Effect} \\
\verb!\textrm{!\textit{text}\verb!}! & %
\verb!{\rmfamily !\textit{text}\verb!}! & %
\textrm{Roman family} \\
\verb!\textsf{!\textit{text}\verb!}! & %
\verb!{\sffamily !\textit{text}\verb!}! & %
\textsf{Sans serif family} \\
\verb!\texttt{!\textit{text}\verb!}! & %
\verb!{\ttfamily !\textit{text}\verb!}! & %
\texttt{Typewriter family} \\
\verb!\textmd{!\textit{text}\verb!}! & %
\verb!{\mdseries !\textit{text}\verb!}! & %
\textmd{Medium series} \\
\verb!\textbf{!\textit{text}\verb!}! & %
\verb!{\bfseries !\textit{text}\verb!}! & %
\textbf{Bold series} \\
\verb!\textup{!\textit{text}\verb!}! & %
\verb!{\upshape !\textit{text}\verb!}! & %
\textup{Upright shape} \\
\verb!\textit{!\textit{text}\verb!}! & %
\verb!{\itshape !\textit{text}\verb!}! & %
\textit{Italic shape} \\
\verb!\textsl{!\textit{text}\verb!}! & %
\verb!{\slshape !\textit{text}\verb!}! & %
\textsl{Slanted shape} \\
\verb!\textsc{!\textit{text}\verb!}! & %
\verb!{\scshape !\textit{text}\verb!}! & %
\textsc{Small Caps shape} \\
\verb!\emph{!\textit{text}\verb!}! & %
\verb!{\em !\textit{text}\verb!}! & %
\emph{Emphasized} \\
\verb!\textnormal{!\textit{text}\verb!}! & %
\verb!{\normalfont !\textit{text}\verb!}! & %
\textnormal{Document font} \\
\verb!\underline{!\textit{text}\verb!}! & %
& %
\underline{Underline}
\end{tabular}
\begin{tabbing}
\verb!\footnotesizezzz! \= \kill%sets the tab
\verb!\tiny! \> \tiny{tiny} \\
\verb!\scriptsize! \> \scriptsize{scriptsize} \\
\verb!\footnotesize! \> \footnotesize{footnotesize} \\
\verb!\small! \> \small{small} \\
\verb!\normalsize! \> \normalsize{normalsize} \\
\verb!\large! \> \large{large} \\
\verb!\Large! \> \Large{Large} \\
\verb!\LARGE! \> \LARGE{LARGE} \\
\verb!\huge! \> \huge{huge} \\
\verb!\Huge! \> \Huge{Huge}
\end{tabbing}
\begin{tabular}{@{}ll@{}}
\textit{Environment} & \textit{Declaration} \\
\verb!\begin{center}! & \verb!\centering! \\
\verb!\begin{flushleft}! & \verb!\raggedright! \\
\verb!\begin{flushright}! & \verb!\raggedleft! \\
\end{tabular}
\begin{tabular}{@{}llll@{}}
\textit{Name} & \textit{Source} & \textit{Example} & \textit{Usage} \\
hyphen & \verb!-! & X-ray & In words. \\
en-dash & \verb!--! & 1--5 & Between numbers. \\
em-dash & \verb!---! & Yes---or no? & Punctuation.
\end{tabular}
\textasciitilde
\textasciicircum
\textbackslash
\begin{tabular}{ll}\toprule
\textbf{x} & \textbf{y} \\\midrule
\verb|`|&`\\
\verb|'|&'\\
\verb|``|&``\\
\verb|''|&''\\
\verb|"|&"\\
\verb|,,|&,,\\
\verb|<<|&<<\\
\verb|>>|&>>\\
\verb|--|&--\\
\verb|---|&---\\
\bottomrule
\end{tabular}
\verb|{\Huge\libertineGlyph{uni211A}}| \hfill {\Huge\libertineGlyph{uni211A}} \par\medskip
\verb|{\Huge\libertineGlyph{uni211A}}| \hfill {\Huge\libertineGlyph{uni211A}} \par\medskip
\verb|{\Huge\textbf{\libertineGlyph{uni211A}}}| \hfill{\Huge\textbf{\libertineGlyph{uni211A}}} \par\medskip
\verb|{\Huge\textit{\libertineGlyph{uni211A}}}| \hfill {\Huge\textit{\libertineGlyph{uni211A}}} \par\medskip
\begin{tabbing}
\verb!\footnotesizezzz! \= \kill
\verb!\tiny! \> {\tiny tiny} \\
\verb!\scriptsize! \> {\scriptsize scriptsize} \\
\verb!\footnotesize! \> {\footnotesize footnotesize} \\
\verb!\small! \> {\small small} \\
\verb!\normalsize! \> {\normalsize normalsize} \\
\verb!\large! \> {\large large} \\
\verb!\Large! \> {\Large Large} \\
\verb!\LARGE! \> {\LARGE LARGE } \\
\verb!\huge! \> {\huge huge} \\
\verb!\Huge! \> {\Huge Huge}\\
\end{tabbing}
\par{\Huge\textit{textit text test}}
\bigskip
\par{\sffamily\bfseries\Huge Test Text}
\end{document}
答案1
(这更像是一条评论而不是答案,但是它太长了......)
Ulrike 的
\ExplSyntaxOn
\cs_set:Nn \__fontspec_load_external_fontoptions:Nn
{}
\ExplSyntaxOff
不应再用于现代 fontspec 版本,因为 fontspec 为该选项添加了官方接口:选项IgnoreFontspecFile
。基本上,使用此选项加载的任何字体都不会触发对 fontspec 文件的搜索。当使用该包而不直接加载字体时,您可以使用s选项libertine
传递此选项:libertine
defaultfeatures
\usepackage[defaultfeatures=IgnoreFontspecFile]{libertine}
但这仍然表明了您观察到的问题。这是一个fontspec
错误但修复可能很快就会被合并。
我猜这也不能解决您的问题,因为您提到延迟不是在字体加载期间出现的,而是在文档的后面出现的。在这种情况下,它可能根本不是由搜索字体规范文件引起的,而此更改后的加速似乎是由于错误而使用较少字体的副作用。当然,如果没有看到显示速度变慢的示例文件,很难说。
答案2
我不确定为什么在 Ulrike Fischer 报告文件搜索中的错误已修复五年后这个问题会再次出现。这可能是一种倒退。
我注意到(在 TeX Live 2020 中),除非我指定,否则 LuaLaTeX 有时需要花费大量时间和内存来加载大字体Renderer=HarfBuzz
。
理论上,如果您指定了、、、和,则fontspec
不需要搜索那么多文件名,如果您还指定了 ,则根本不需要搜索。UprightFont=
BoldFont=
ItalicFont=
BoldItalicFont=
Extension=
Path=
答案3
我不知道为什么,但移动 \usepackage{libertine} 行前ExplSyntax 行似乎避免了这个问题。