我最近从使用 texlive2022 切换到 texlive2023,在此过程中,hyperxmp 中的某些功能似乎出现了问题。特别是,如果我使用以下
\documentclass{article}
\usepackage{hyperxmp}
\usepackage{hyperref}
\title{Baking through the ages}
\author{Larry Fine, Moe Howard}
\hypersetup{pdftitle={Baking through the ages},
pdfauthor={A. Baker, C. Kneader},
pdflang={en},
pdfkeywords={cookies, muffins, cakes},
pdfpublisher={Baking International}
}
\begin{document}
\maketitle
This is the document.
\end{document}
在带有 hyperxmp v5.9 的 texlive2022 下,这将生成可从 pdfauthor 中识别作者的 XMP:
<dc:creator>
<rdf:Seq>
<rdf:li>A. Baker</rdf:li>
<rdf:li>C. Kneader</rdf:li>
</rdf:Seq>
</dc:creator>
(我特意创建了一个具有不同值的示例,以\author
查看 hyperxmp 从哪里获取它)。在带有 hyperxmp v5.11 的 texlive2023 下,它完全省略了此部分<dc:creator
,并且作者信息也不存在于其他地方。hyperxmp 5.11 和 hyperxmp 5.9 之间肯定存在差异,但我找不到与 pdfauthor 处理方式直接相关的东西。此时我不知道如何解决问题。有人可以在这里提出问题的根源吗?有人可以在 texlive2023 下尝试该文档,然后检查 pdf 文件以查看该dc:creator
字段是否存在吗?您不需要 pdf 工具即可查看它,因为 XMP 包只是 PDF 内的文本。
答案1
hyperxmp
尝试改变处理选项的方式hyperref
(在包选项和中\hypersetup
),因为它想要捕获选项的内容,比如pdfauthor
XMP 元数据。
它通过重新定义\ProcessKeyvalOptions
注入代码来实现这一点。这不是一个好主意,因为\ProcessKeyvalOptions
其他软件包也使用了这种方法,并且在 2022 年发现它可能导致循环:https://tex.stackexchange.com/a/648036/2388。
在 5.11 版本中,hyperxmp 尝试修复此问题,并\ProcessKeyvalOptions
在第一次使用后重置为原来的含义:
\let\hyxmp@ProcessKeyvalOptions=\ProcessKeyvalOptions
\renewcommand*{\ProcessKeyvalOptions}{%
\global\let\ProcessKeyvalOptions=\hyxmp@ProcessKeyvalOptions
\hyxmp@redefine@Hyp
\hyxmp@ProcessKeyvalOptions
}
但是这个“修复”使得补丁实际上毫无用处,因为hyperref
在开始时加载了一个使用太多的包\ProcessKeyvalOptions
,因此hyperxmp
重新定义丢失了。
您应该报告此错误。作为一种解决方法,只要您在稍后设置所有相关选项,hyperxmp
之后加载应该或多或少可以工作。hyperref
\hypersetup
另外,您可以通过从\DocumentMetadata
pdfmanagement-testphase 代码加载 PDF 管理来设置 XMP 元数据。请参阅l3pdfmeta
文档或 https://tug.org/TUGboat/tb43-3/tb135fischer-xmp.pdf关于如何处理 XMP:
\DocumentMetadata{}
\documentclass{article}
\usepackage{hyperref}
\title{Baking through the ages}
\author{Larry Fine, Moe Howard}
\hypersetup{pdftitle={Baking through the ages},
pdfauthor={A. Baker, C. Kneader},
pdflang={en},
pdfkeywords={cookies, muffins, cakes},
pdfpublisher={Baking International}
}
\begin{document}
\maketitle
This is the document.
\end{document}