使用 lualatex 编译 \setmathfont 命令只需几分钟

使用 lualatex 编译 \setmathfont 命令只需几分钟

我有一个代码,它显示了字体的样子。仅使用 Latin Modern 示例,该代码可在 10 秒内编译完成。但如果我添加 Termes、Pagella、XCharter 和其他字体的数学字体示例,则需要几分钟才能完成编译(我为该代码停了 2 分 10 秒)。

为什么要花这么长时间?我该如何避免?使用 lualatex 时,由于编译时间过长,此代码几乎不可用。

该示例并不简单但足以重现该问题。

% !TeX encoding=utf8
% !TeX program = lualatex

\documentclass{article}
\usepackage{fontspec}
\usepackage{amsmath}
\usepackage{unicode-math}
\usepackage{tabularray}
\usepackage{xcolor}

\begin{document}
\newcommand{\fontstring}{Sphinx of black quartz, judge my vow.}
\newcommand{\mathstring}{$f(u,v) = \iiint \left[u\nabla^{2}v+\left(\nabla  u,\nabla  v\right)\right]\mathrm{d}^{3}V$}

\colorlet{tablerowcolor}{gray!10}
\colorlet{tablesubheadcolor}{azure3!30}


{ % start a group 
    \small\renewcommand{\arraystretch}{1.4}\sffamily
    % the table
    \begin{longtblr}[
        caption = {Font examples},
        label = {tab:doc:Font:Gallery}]
        {
            colspec = {X[1,l]>{\ttfamily}X[2,l]},
            width = 1.0\textwidth,
            row{odd} = {bg=tablerowcolor},
            row{1}   = {bg=azure3, fg=white, font=\sffamily\upshape},
            rowhead = 1,
            rowfoot = 0,
        }       
        \hline % Table Header
        Font & Example \\ 
        \hline %        
        %
        \SetCell[c=2]{l,bg=tablesubheadcolor} Latin Modern Family \\
        Latin Modern Roman   & \setmainfont{Latin Modern Roman} \rmfamily \fontstring \\
        Latin Modern Sans    & \setsansfont{Latin Modern Sans}  \sffamily\fontstring \\
        Latin Modern Mono    & \setmonofont{Latin Modern Mono}  \ttfamily \fontstring \\
        %
        \SetCell[c=2]{l,bg=tablesubheadcolor} Math Fonts \\
        %
        Latin Modern Math       & \setmathfont{Latin Modern Math}       \rmfamily \mathstring \\
%       TeX Gyre Termes Math    & \setmathfont{TeX Gyre Termes Math}    \rmfamily \mathstring \\
%       TeX Gyre Pagella Math   & \setmathfont{TeX Gyre Pagella Math}   \rmfamily \mathstring \\
%       Charter - math version  & \setmathfont{XCharter-Math.otf}   \rmfamily \mathstring \\
%       Garamond math version   & \setmathfont{Garamond-Math}       \rmfamily \mathstring \\
%       Cambria Math            & \setmathfont{Cambria Math}        \rmfamily \mathstring \\
        %       %
        \hline
        %
    \end{longtblr}  
} % close the group
\end{document}

答案1

为何要花这么长时间?我该如何避免?

用户指南第 4.3 节“数学‘版本’”unicode 数学包注意到,在文档中途使用多个\setmathfont指令很快就会变得效率极低——就像上面显示的测试文档中的情况一样。

相反,建议在序言中设置“数学版本”,提供以下说明

\setmathfont{Latin Modern Math}[version=LM]
\setmathfont{TeX Gyre Termes Math}[version=Termes]
\setmathfont{TeX Gyre Pagella Math}[version=Pagella]
\setmathfont{XCharter-Math.otf}[version=XCharter]
\setmathfont{Garamond-Math}[version=Garamond]
\setmathfont{Cambria Math}[version=Cambria]

\mathversion{LM} ... \mathversion{Termes} ...并在文档主体中运行等指令在数学版本之间切换。

在我的 M2 芯片 MacBook Air 上,编译以下测试程序只需不到 8 秒,该 MacBook Air 运行 MacOS 13.1“Ventura”和 MacTeX2022,并应用了所有更新。相比之下,\setmathfont在我的笔记本电脑上编译 OP 的测试代码(启用了多个中游指令)需要 1'33''。我认为称这种效率提升令人印象深刻是公平的。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}

\usepackage{amsmath}
\usepackage{tabularray}
\usepackage[x11names]{xcolor}
\colorlet{tablerowcolor}{gray!10}
\colorlet{tablesubheadcolor}{Azure4!30}

% set text and math fonts
\usepackage{unicode-math}
\setmainfont{Latin Modern Roman}
\setsansfont{Latin Modern Sans}  
\setmonofont{Latin Modern Mono}  

\setmathfont{Latin Modern Math}[version=LM]
\setmathfont{TeX Gyre Termes Math}[version=Termes]
\setmathfont{TeX Gyre Pagella Math}[version=Pagella]
\setmathfont{XCharter-Math.otf}[version=XCharter]
\setmathfont{Garamond-Math}[version=Garamond]
\setmathfont{Cambria Math}[version=Cambria]

% 2 test strings
\newcommand{\textstring}{Sphinx of black quartz, judge my vow.}
\newcommand{\mathstring}{$f(u,v) = 
     \iiint [u\nabla^2 v+(\nabla u,\nabla v)]\,\symup{d}^3 V$}

\begin{document}

\begingroup % limit scope of instructions on next line
\small\renewcommand{\arraystretch}{1.4}\sffamily
% the table
    \begin{longtblr}[
            caption = {Font examples},
            label   = {tab:doc:Font:Gallery}]
        {
            colspec = {X[1,l] X[2,l]},
            width = 1.0\textwidth,
            row{odd} = {bg=tablerowcolor},
            row{1}   = {bg=azure3, fg=white, font=\sffamily\upshape\bfseries},
            rowhead = 1,
            rowfoot = 0,
        }       
        \hline % Table Header
        Font & Example \\ 
        \hline %        
        %
        \SetCell[c=2]{l,bg=tablesubheadcolor} Text Fonts \\
        Latin Modern Roman   & \rmfamily \textstring \\
        Latin Modern Sans    & \sffamily \textstring \\
        Latin Modern Mono    & \ttfamily \textstring \\
        %
        \SetCell[c=2]{l,bg=tablesubheadcolor} Math Fonts \\
        %
        Latin Modern Math     & \mathversion{LM}        \mathstring \\
        TeX Gyre Termes Math  & \mathversion{Termes}    \mathstring \\
        TeX Gyre Pagella Math & \mathversion{Pagella}   \mathstring \\
        Charter Math          & \mathversion{XCharter}  \mathstring \\
        Garamond Math         & \mathversion{Garamond}  \mathstring \\
        Cambria Math          & \mathversion{Cambria}   \mathstring \\
        % 
        \hline
        %
    \end{longtblr}  
\par\endgroup

\end{document}

相关内容