在 Tex Live 2021 上使用 pdfx 时出错

在 Tex Live 2021 上使用 pdfx 时出错

从 Tex Live 2019 切换到 2021 后,pdfx似乎无法正常工作。MWE 在 2019 上有效,但在 2021 上无效:

\begin{filecontents*}{\jobname.xmpdata}
    \Title{Some document}
    \Author{Some author}
\end{filecontents*}
\documentclass{article}
\usepackage[a-1b]{pdfx}

\begin{document}
This document won't compile on \TeX{} Live 2021.
\end{document}

Tex Live 2021 的 pdflatex 多次重复显示以下错误:

! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.2855  \includexmp{\xmp@template}
                                  %
? 

此外,一些 XMP 树作为文档文本包含在内(与预期的元数据相反)。

在我看来,Tex Live 2021 似乎存在退化(lualatex 和 xelatex 似乎以类似的方式失败)。Tex Live 2021 已于今日安装,因此已完全更新。也许我在这里遗漏了什么?任何帮助都值得感激。

答案1

更新

使用 xmpincl 2021/08/31 v2.3 后,不再需要此补丁


你可以尝试这个补丁

\begin{filecontents*}{\jobname.xmpdata}
    \Title{Some document}
    \Author{Some author}
\end{filecontents*}
\documentclass{article}

\usepackage{etoolbox}
\makeatletter
\@ifl@t@r\fmtversion{2021-06-01}%
 {\AddToHook{package/after/xmpincl}
   {\patchcmd\mcs@xmpincl@patchFile{\if\par}{\ifx\par}{}{\fail}}}{}
\makeatother

\usepackage[a-1b]{pdfx}

\begin{document}
This document won't compile on \TeX{} Live 2021.
\end{document}

答案2

由于我不知道如何修复pdfx,因此我构建了一个临时的解决方法包fixpdfx.sty

\ProvidesPackage{fixpdfx}[2021-07-22 A package that fixes pdfx errors on TeX Live 2021 in a quick and dirty way]

% temporarily reverts https://github.com/latex3/latex2e/commit/5fb2860f2fedc87b213730f06ec1d77bcab4814a
% resp. https://github.com/latex3/latex2e/commit/dd2ec509ec98e9c359a41e35aea6aade86485ca2
% as it breaks pdfx (see https://tex.stackexchange.com/questions/605854/error-using-pdfx-on-tex-live-2021)
% published on https://tex.stackexchange.com/questions/605854/error-using-pdfx-on-tex-live-2021/610445#610445 

\@ifpackageloaded{pdfx}{
    \PackageError{fixpdfx}{pdfx is loaded}{This package must be loaded before pdfx}
}{}

\ExplSyntaxOn

% this is the old implementation from base/ltpara.dtx, version 1.0g
\cs_new_protected:Npn \__old_para_end: {
  % ltpara v1.0h as well as firstaid/latex2e-first-aid-for-external-files.dtx v1.0o inserted
  % \scan_stop: here, which breaks pdfx
  \mode_if_horizontal:TF {
    \mode_if_inner:F {
         \tex_unskip:D
         \hook_use:n{para/end}
         \@kernel@after@para@end
         \mode_if_horizontal:TF {
           \if_int_compare:w 0 < \tex_lastnodetype:D
             \tex_kern:D \c_zero_dim
           \fi:
           \tex_par:D
           \hook_use:n{para/after}
           \@kernel@after@para@after
         }
         { \msg_error:nnnn { hooks }{ para-mode }{end}{horizontal} }
    }
  }
  \tex_par:D
}

\PackageWarning{fixpdfx}{Patching~\para_end:~implementation~to~fix~pdfx}
\cs_set_eq:NN \par     \__old_para_end:
% these two aren't actually required to fix pdfx, so we'll skip them...
%\cs_set_eq:NN \@@par   \__old_para_end:
%\cs_set_eq:NN \endgraf \__old_para_end:

\AtBeginDocument{
    \@ifpackageloaded{pdfx}{}{
        \PackageError{fixpdfx}{pdfx~is~not~loaded}{You~did~not~load~pdfx~and~thus~do~not~need~this~package}
    }
    % pdfx v1.6.3 from 2019-02-27 is bad, so anything later is hopefully fixed...
    \@ifpackagelater{pdfx}{2019/02/28}{
        \PackageError{fixpdfx}{Please~check~whether~you~really~need~this~package.}{Your~pdfx~package~is~more~recent~than~2019-02-27~and~thus~might~not~require~this~package's~fix.}
    }{}

    \PackageWarning{fixpdf}{Restoring~old~\para_end:~implementation}
    
    % restore additional definitions
    \cs_set_eq:NN \par     \para_end:
    % see above: as we didn't replace them, no need to restore them.
    %\cs_set_eq:NN \@@par   \para_end:
    %\cs_set_eq:NN \endgraf \para_end:
}

\ExplSyntaxOff

fixpdfx必须加载 pdfx并恢复修复问题 605。然而,在文档开始时,pdfx已将 XMP 元数据包含在输出文档中,并且所有内容都已恢复。这样,其他包应该不会中断(尤其是因为pdfx加载hyperref,因此无论如何都应该很晚才加载)。

至少这是我将使用的修复方法,直到pdfx希望有一天能够修复...(或者有人提出更好的修复方法)

答案3

正如 Ulrike Fischer 在上面她的回答中所建议的那样,所讨论的错误源自 pdfx 调用的 xmpincl 包。罪魁祸首是 xmpincl.sty 版本 2.2 中的以下行:

\if\par\xmpinclReadln\else%

在 2.3 版中,此行被替换为

\ifx\par\xmpinclReadln\else%

这可以消除错误,但事实证明,它并没有按预期工作。此行的目的是从输入.xmp文件中过滤掉空行,否则它们将作为\par命令输出。不幸的是,条件\ifx\par\xmpinclReadln永远不会成立,这将导致一些\par命令传递到生成的 pdf 文件中。这反过来会导致 PDF/A 验证错误。

在将 2.3 版上传到 CTAN 之前,我应该对其进行更彻底的测试;对此我深表歉意。为了纠正我的错误,我现在提交了 xmpincl 的新版本 2.4,其中上述行被替换为

\if\endline\xmpinclReadln\else%

在我的测试中,这似乎没有任何问题。

正如 David Carlisle 在他的评论中指出的那样,所讨论的错误根本不会发生pdflatex-dev。所以这可能只是一个暂时的问题,在下一个 LaTeX 版本发布后就会消失。

相关内容