pdflscape 与 pdfx 兼容吗?

pdflscape 与 pdfx 兼容吗?

以下代码在使用 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}

相关内容