LuaLatex 字体差异和使用 fontspec 的编译速度

LuaLatex 字体差异和使用 fontspec 的编译速度

从 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传递此选项:libertinedefaultfeatures

\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 行似乎避免了这个问题。

相关内容