我想使用包提供的功能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
开头添加对辅助宏的调用来构建的。这使用参数,因为用于可选的脚注标记。\author
authblk
#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}