hyperref 的 pdfusetitle 选项因 authblk 而失败

hyperref 的 pdfusetitle 选项因 authblk 而失败

我想使用包提供的功能authblk并自动获取 PDF 中的正确作者元数据。通常,pdfusetitle选项会hyperref设置正确的标题和作者元数据。authblk但是,使用时,这适用于标题,但不适用于作者。我想这是因为authblk更改了“作者”机制。

authblk我可以轻松修补此问题吗?或者是否有与此功能兼容的类似软件包hyperref

如果补丁在有多个作者时也能起作用就更好了,在这种情况下,pdf 元数据应该显示用逗号分隔的作者姓名。

下面是一个说明不兼容性的简单示例。如果authblk在 之前加载hyperref,并且使用pdfusetitle,则使用 加载hyperref会失败Illegal parameter number in definition of \Hy@author。如果authblk在 之后加载hyperref(如此处所示),文档会得到编译,但不包含作者元数据。取消注释该hypersetup块时,作者元数据显示为:immediate LaTeX Warning: No given.

\documentclass{scrartcl}
\usepackage[pdfusetitle]{hyperref}
\usepackage{authblk}

%\makeatletter
%\hypersetup{pdfauthor={\@author}}
%\makeatother

\begin{document}
\title{The title}
\author{Myself}

Content.

\end{document}

这是我当前使用的示例。我想删除多余的\hypersetup部分。

\title{The title}
\author{Firstname Lastname}
\author{Second author}
\affil{First affiliation\\
    \href{mailto:firstname.fastname@affiliation}{firstname.fastname@affiliation}
}
\author{Name3}
\affil{Second affiliation}
\makeatletter
    \hypersetup{
        pdfauthor={Firstname Lastname, Second author, Name3}
    }
\makeatother
\maketitle

答案1

以下是xpatch解决方案。作者列表存储在单独的宏中,可供 使用。此列表是通过在 的命令\hypersetup开头添加对辅助宏的调用来构建的。这使用参数,因为用于可选的脚注标记。\authorauthblk#2#1

使用条件来检查当前作者是否是列表中的第一个(然后将列表定义为当前名称)或者是进一步的条目(将逗号和当前条目添加到列表中)。

如果你把 放在\hypersetup序言中,那么列表尚未构建,pdf 作者元数据将为空。但是,以下https://tex.stackexchange.com/a/254516/您可以使用 延迟命令的执行\hypersetup,直到文档结束\AtEndDocument

梅威瑟:

\documentclass{article}
\usepackage[pdfusetitle]{hyperref}
\usepackage{authblk}
\usepackage{xpatch}
% add a macro call to the start of \author
\xpretocmd{\author}{\addhrauthor{#2}}{}{}
% define boolean for list construction and set to true
\newif\iffirstauthor
\firstauthortrue
\newcommand{\addhrauthor}[1]{%
% first entry: author list is defined as the current author, set boolean to false
\iffirstauthor%
\newcommand{\hrauthor}{#1}\firstauthorfalse%
% further entries: add to list
\else%
\xapptocmd{\hrauthor}{, #1}{}{}%
\fi
}
\AtEndDocument{ % delayed call for \hypersetup in preamble
\hypersetup{pdfauthor={\hrauthor}}
}
\begin{document}
\title{The title}
\author{Firstname 1 Lastname 1}
\author{Second author}
\affil{First affiliation\\
   \href{mailto:firstname.fastname@affiliation}{firstname.fastname@affiliation}
}
\author{Name3}
\affil{Second affiliation}

%\hypersetup{pdfauthor={\hrauthor}} % direct call after setting the author names

\maketitle
Content.

\end{document}

结果: 在此处输入图片描述

相关内容