我有一个代码,它显示了字体的样子。仅使用 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}