为什么我可以使用 pdftex 以自定义乳胶格式包含 tikz,而不能使用 luatex 来包含?

为什么我可以使用 pdftex 以自定义乳胶格式包含 tikz,而不能使用 luatex 来包含?

考虑以下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 一起编译得很好,并且可以在 Adob​​e 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 移动到那里)。

相关内容