考虑以下class.cls
:
\LoadClass{article}
\RequirePackage{tikz}
以及以下内容test.tex
:
\documentclass{class}
\begin{document}
Test
\end{document}
使用pdftex
(TeXLive 2016),我可以:
pdftex -ini -jobname="test-fmt-pdftex" "&pdflatex" mylatexformat.ltx """test.tex"""
pdftex -fmt=test-fmt-pdftex.fmt test.tex
它可以毫无问题地运行。
使用luatex
(TeXLive 2016),我可以:
luatex -ini -jobname="test-fmt-luatex" "&lualatex" mylatexformat.ltx """test.tex"""
luatex -fmt=test-fmt-luatex.fmt test.tex
第二行最终出现错误:
! error: (pdf backend): referenced object has wrong type others; should be obj ! ==> Fatal error occurred, no output PDF file produced!
我知道我无法转储luatex
格式lua
代码或 opentype 字体但我认为这tikz
不会起到作用。一定还有其他原因。你有什么想法吗?
我调查了一下。
据我所知,已经有一个更新版本来遵守与原语相关的pgfsys-luatex.def
更改。这是我能想到的一个提示。luatex
\pdf...
手册里还有这样一段话luatex
:
一个变化涉及所谓的 xforms 和 ximages。在 pdfTEX 中,它们被实现为所谓的 whatsits。但与其他 whatsits 相反,它们具有尺寸,在计算最佳换行符等时需要考虑这些尺寸。在 LuaTEX 中,它们现在被提升为普通节点,这简化了需要这些尺寸的代码。
但我必须承认我并不真正理解这一切。
答案1
pgfsys-luatex.def
最后调用两个命令
\pgfutil@setuppdfresources
和\pgfutil@addpdfresource@colorspaces
。
如果您删除这些调用,您的示例将正常运行。因此,问题的根源就在这里。命令调用中的代码,\pgf@sys@setuppdfresources@plain
并设置 pdf 对象:禁用中的 obj\pgfutil@everyby
也可以避免错误。
将所有内容浓缩一下,可以创建以下(毫无意义的!!)最小文档:
\documentclass{book}
\usepackage{ifluatex}
\ifluatex
\pdfextension obj reserveobjnum \edef\myobjnum{\the\numexpr\pdffeedback lastobj\relax}
\else
\pdfobj reserveobjnum \edef\myobjnum{\the\pdflastobj}
\fi
%\makeatother
\begin{document}
\ifluatex
\immediate \pdfextension obj useobjnum \myobjnum {<</pgfprgb [/Pattern /DeviceRGB]>>}
\else
\immediate \pdfobj useobjnum \myobjnum {<</pgfprgb [/Pattern /DeviceRGB]>>}
\fi
blub
\end{document}
它与 pdflatex 和 lualatex 一起编译得很好,并且可以在 Adobe Reader 中打开 PDF(这意味着它没有完全损坏)。使用 pdflatex,您可以使用编译步骤将序言置于自定义格式中。但编译结果luatex -fmt=myfmt.fmt test-utf8
以
! error: (pdf backend): cannot find referenced object
! ==> Fatal error occurred, no output PDF file produced!
看起来 luatex 不喜欢有人尝试以这种格式保留对象。我无法告诉你这是有意为之,还是某种副作用,甚至是错误:你必须在 luatex 列表中询问。
即使它可以与 pdftex 一起使用:我也会避免将对象放入格式中(因此不会将 tikz 移动到那里)。