换句话说,如果 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 时才使用此功能。 未来版本将有更好的修复(请参阅我的其他答案)。
如果您想使用该补丁,请执行以下操作:
停用 pdf 压缩(见下文)。
加载 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
由于和中的错误,所以是必要的luatex
:pdftex
如果压缩也处于活动状态,它们不接受自定义数据流过滤器(我已经报告了该错误)。
重复:对于较新版本来说,此补丁是不必要的。