我读到过关于预编译序言的内容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-math
polyglossia
babel
以下是我找到的关于为什么这是不可能的解释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 秒。