lualatex 应该是 pdflatex 的超集吗?(关于 PDF 的制作)

lualatex 应该是 pdflatex 的超集吗?(关于 PDF 的制作)

换句话说,如果 lualatex 无法编译 pdflatex 可以编译的文档,那么这是一个 Bug 吗?

根据这个问题的答案

如何扩展 TeX 的“主内存大小”?(pgfplots 内存过载)

我决定尝试使用 lualatex 来解决动态内存分配问题,特别是针对 pgfplots。虽然在极端情况下仍然存在内存问题,但我发现 lualatex 对故障的恢复能力更强,并且一直默认使用它……直到我尝试将它用于 3D pgfplots。我发现它无法为这个 MWE 生成良好的 PDF:

\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3[surf, shader = interp] %shader interp offends lualatex
coordinates {
(-3, -3, 4.07584)(-1, -3, 2.96859)(1, -3, 3.00208)(3, -3, 4.1488)\par
(-3, -1, 3.00208)(-1, -1, 1.10114)(1, -1, 1.18849)(3, -1, 3.1004)\par
(-3, 1, 3.06798)(-1, 1, 1.26984)(1, 1, 1.34629)(3, 1, 3.16425)\par
(-3, 3, 4.22049)(-1, 3, 3.16425)(1, 3, 3.1957)(3, 3, 4.29098)\par
}; 
\end{axis}
\end{tikzpicture}
\end{document}

pdflatex 运行正常,但 lualatex 生成的 PDF 已损坏,evince 显示错误的多边形,Acrobat Reader 给出“发生绘图错误”提示。有问题的功能似乎是 3D 图中“shader = interp”选项。

版本:TeXLive 2012、acroread 9.4.7、evince 3.4.0。

可以接受的答案可以是确认这是 lualatex 中的一个错误。

答案1

我可以确认 LuaLatex 和 pdflatex 之间存在差异:产生的 pgfplots 驱动程序shader=interp不适用于 LuaLateX,直到 pgfplots 1.5.1 为止(该问题与 pgfplots 驱动程序中二进制输出的生成有关)。

这已在开发版本中修复pgfplots;它将成为 pgfplots 的下一个版本的一部分。

不稳定版本的 pgfplots 可在以下网址下载:http://pgfplots.sourceforge.net/(风险自负)。

答案2

我理解您在使用替代解决方案时遇到了问题(shader=flat结合opacity有没有办法可以完全删除 pgfplots 多面三维图中的网格线?)。考虑到 pgfplots 也可以用某些 HEX 编码来编码着色器信息,我想添加以下内容

补丁建议。

记录:仅当您运行 pgfplots 1.5.1 时才使用此功能。 未来版本将有更好的修复(请参阅我的其他答案)。

如果您想使用该补丁,请执行以下操作:

  1. 停用 pdf 压缩(见下文)。

  2. 加载 pgfplots 后,在标题中引入以下几行

\usepackage{pgfplots}
\makeatletter
\def\temp{ (git show 1.5.1-127-g1088bd7 )}%
\ifx\pgfplotsrevision\temp
    \message{PATCHING INTERP SHADER FOR LUATEX}
    \def\pgfplotslibrarysurf@filter@encode{ASCIIHexEncode}%
    \def\pgfplotslibrarysurf@filter@decode{ASCIIHexDecode}%
\fi
\makeatother

你的例子是

\pdfcompresslevel=0

\documentclass{article}

\usepackage{pgfplots}

\makeatletter
\def\temp{ (git show 1.5.1-127-g1088bd7 )}%
\ifx\pgfplotsrevision\temp
    \message{PATCHING INTERP SHADER FOR LUATEX}
    \def\pgfplotslibrarysurf@filter@encode{ASCIIHexEncode}%
    \def\pgfplotslibrarysurf@filter@decode{ASCIIHexDecode}%
\fi
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot3[surf, opacity=0.8, shader=interp] %shader interp offends lualatex
coordinates {
(-3, -3, 3.57005)(-2.8125, -3, 3.50682)(-2.625, -3, 3.4438)\par
(-3, -2.8125, 3.5075)(-2.8125, -2.8125, 3.44005)(-2.625, -2.8125, 3.37252)\par
(-3, -2.625, 3.4453)(-2.8125, -2.625, 3.37336)(-2.625, -2.625, 3.301)\par
(-3, -2.4375, 3.38377)(-2.8125, -2.4375, 3.3071)(-2.625, -2.4375, 3.22959)\par
}; 
\end{axis}
\end{tikzpicture}
\end{document}

背景信息:这会以 Ascii Hex 编码而不是二进制编码对数据流进行编码。这将扩大数据流。\pdfcompresslevel=0由于和中的错误,所以是必要的luatexpdftex如果压缩也处于活动状态,它们不接受自定义数据流过滤器(我已经报告了该错误)。

重复:对于较新版本来说,此补丁是不必要的。

相关内容