以下代码在使用 pdflscape 时会触发错误。
\documentclass{letter}
\usepackage[a-1b]{pdfx}
%\usepackage{pdflscape} % breaks things
\begin{document}
Hello World
\begin{landscape}Hello from down under\end{landscape}
\end{document}
错误是:
150: Package pdflscape Error: Neither pdfTeX, PostScript, nor dvipdfm driver found.
See the pdflscape package documentation for explanation.
Type H <return> for immediate help.
...
l.150 }\@ehc
319 words of node memory still in use:
这与 lualatex/texlive 2017 一致。
编辑
下面的测试显示了完全相同的问题,但提出的解决方案并不适用。
\documentclass{letter}
\usepackage[a-1b]{pdfx}
\usepackage[final]{pdfpages}
\begin{document}
Hello World
\end{document}
在这种情况下,pdfpages 会触发 pdflscape 错误。问题出在 pdfpages 源代码中,其中加载了 pdflscape.sty。这是一个错误。
答案1
这是pdfx.sty
代码中的一个错误
%%----------------------------------------------------------------------
\ifxetex
% override the \ifpdf check
\pdftrue
\else\ifluatex
\pdftrue
\fi\fi
\RequirePackage{xmpincl}
\ifxetex
% revert \ifpdf
\pdffalse
\else\ifluatex
\pdffalse
\fi\fi
对于 luatex设置\ifpdf
为 false,这是错误的并且会破坏任何后续测试 pdf 输出的包。
%%----------------------------------------------------------------------
\ifxetex
% override the \ifpdf check
\pdftrue
\else\ifluatex
\pdftrue
\fi\fi
\RequirePackage{xmpincl}
\ifxetex
% revert \ifpdf
\pdffalse
\else\ifluatex
%\pdffalse
\pdftrue
\fi\fi
是一个简单的修复,虽然强制使用它\pdftrue
也是不正确的,如果你想支持dvilualatex
正确的值是由ifpdf
包设置的,但不清楚这段代码的目的是什么,所以在这里我只建议将 luatex 的值设置为 true 的简单修复。
答案2
pdflscape
如果之前加载pdfx
没有错误。
另一方面,文档pdfx
建议先加载它;在这种情况下
\usepackage[luatex]{pdflscape}
显然,当使用 LuaLaTeX 时pdfx
,设置了一些东西使得无法pdflscape
正确猜测所使用的引擎。
答案3
由于基元已更改,LuaLaTeX 和 可能仍存在问题pdfx.sty
。例如,XMP 元数据可能未解压缩。也有一个简单的解决方法。
在 pdfx.sty
很早的时候就使用了以下代码:
\let\real@lua@pdfobj\pdfobj \def\pdfobj{\immediate\real@lua@pdfobj uncompressed }%
然后 \let\pdfobj\real@lua@pdfobj
在写入 XMP 数据包之后。您可以使用这些行(在\makeatletter ... \makeatother
前导码内,围绕 )\usepackage{pdfx}
。