使用 xelatex 预编译头文件

使用 xelatex 预编译头文件

我读到过关于预编译序言的内容https://tex.stackexchange.com/a/15606/4918并且它运行良好,pdflatex但是我该如何做到这一点xelatex

我试过

xelatex -ini -shell-escape -job-name="header" "&xelatex header.tex\dump"

但它以错误结束:

! Can't \dump a format with native fonts or font-mappings.
<*> &xelatex header.tex\dump

答案1

我自己也遇到过同样的问题。第一个解决方案当然是,从\usepackage{fontspec}序言文档中取出,并将其放在\begin{document}主文档的前面。

但是,正如你和我一样,想要加载fontspec自定义文档类,你可以使用

\RequirePackage{etoolbox}
\AtEndPreamble{
    \usepackage{fontspec}
    \setmainfont[Ligatures=TeX]{STIXGeneral}
}

那里的\AtEndPreamble工作原理类似于标准LaTeX命令\AtBeginDocument,只是里面的代码本身可以\AtBeginDocument像上面那样使用fontspec

不幸的是,这意味着您无法缩短此处的编译时间。例如,和也fontspec存在同样的问题。(而我对没有任何问题。)unicode-mathpolyglossiababel

以下是我找到的关于为什么这是不可能的解释XeTeX邮件列表

Jonathan Kew 写道:


是的;这会带来各种技术挑战,并且如果 .fmt 文件包含对主机系统中删除或修改的字体的引用,可能会让用户感到困惑。

好的。另一方面,我不明白字体预加载对于“传统”TeX 的具体工作原理,但如果字体从 texmf 树(甚至从映射文件)中删除,是否会发生同样的情况?或者 TeX 只需要 tfms,而 XeTeX 使用“更多”字体?

是的,基本就是这种情况。使用“经典”TeX,.fmt
文件包含预加载字体的整个 tfm 数据,因此 TeX 无需参考 tfms 或任何其他文件即可完成工作。(如果您删除 tfms,它甚至不会注意到,因为它已经有了这些数据。如果您删除 pfbs 或 map 文件条目,TeX 不会在意,它仍然可以
排版。但是,您的输出驱动程序可能有问题!)

但对于与 xetex 一起工作的等效物,我们必须将
整个 OpenType 字体的很大一部分“嵌入”到 .fmt 文件中
。这
似乎不是一个好主意。

答案2

您的前言加载了“原生”(即非 TFM)字体,正如消息所述,该字体无法转储到格式中。例如,只需\usepackage{fontspec}在前言中加上,就会加载 Latin Modern OpenType 字体。

答案3

事实上,您可以忽略这些错误,一切都会正常工作。

这是一个示例文件,保存为test.tex

%&test
\documentclass[a4paper]{article}
\usepackage{amsmath,amssymb,amsthm,graphicx,tikz}
\usepackage{fontspec,unicode-math}
\endofdump
\setmainfont{Liberation Serif}
% this is a mistake in the map
%% http://tex.stackexchange.com/questions/55204/remapping-latex-symbol-to-another-unicode-value/55205
\AtBeginDocument{\let\setminus\smallsetminus}
\setmathfont{Latin Modern Math}
\begin{document}
\section{Test}
This is a test
\[ A\setminus B =  ∞ \]
\end{document}

然后有一个 Makefile

test.pdf: test.tex
    time xelatex -interaction=nonstopmode test.tex

test.fmt: test.tex
    time xetex -ini -interaction=nonstopmode -jobname="test" "&xelatex" mylatexformat.ltx test.tex

如果你make test.fmt确实会看到很多错误,但最终格式文件将被写入;然后make test.pdf将编译test.tex而不重新加载所有包。

在我的电脑里,编译test.tex不使用此技巧进行编译大约需要 3.8 秒,而使用此技巧则大约需要 1.4 秒。

相关内容