在这回答 有人建议我修补 的hyperref
自动 pdfauthor 元数据处理机制,如下所示。目标是让 PDF 元数据与authblk
多位作者一起工作。
\documentclass{article}
\usepackage[pdfusetitle]{hyperref}
\usepackage{authblk}
\usepackage{xpatch}
\newtoggle{patchhref}
\toggletrue{patchhref}
%\iftoggle{patchhref}{
\xpretocmd{\author}{\addhrauthor{#2}}{}{}
\newif\iffirstauthor
\firstauthortrue
\newcommand{\addhrauthor}[1]{%
\iffirstauthor%
\newcommand{\hrauthor}{#1}\firstauthorfalse%
\else%
\xapptocmd{\hrauthor}{, #1}{}{}%
\fi
}
\AtEndDocument{
\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}
\maketitle
Content.
\end{document}
我添加了这个iftoggle
东西,它不在原始答案中。当不使用时iftoggle
,它可以工作。但是,当使用iftoggle
(取消注释三行相关行以尝试它)时,当使用到达文档末尾时它会失败Undefined control sequence. <argument> \hrauthor
。好像定义的命令hrauthor
没有被执行。但关于的部分\AtEndDocument
确实被执行了。根据这评论,iftoggle
用遗留的if
构造工程替换。
我怎样才能使这个补丁有条件地工作,iftoggle
使用首选条件切换机制?
答案1
这与本身无关,\iftoggle
但与类别代码 (catcodes) 有关。当 TeX 第一次扫描标记时,其类别代码是“冻结的”,即 TeX 会记住第一次读取时的内容。对于您来说,#
罪魁祸首是 。
\iftoggle{patchhref}
扩展为等同于\@firstoftwo
或 的内容\@secondoftwo
:
\newcommand\@firstoftwo[2]{#1}
\newcommand\@secondoftwo[2]{#2}
这将扫描接下来的两个组并删除第二个组。在此过程中,第一个组中的所有类别代码都将被冻结。#
通常具有类别代码6
,在使用 修补命令时需要小心#
。\xpretocmd
尝试处理此问题,但如果#
已被扫描,则此操作会失败。
您可以通过定义来解决此问题
{\catcode`#=11\relax
\gdef\fixauthor{\xpretocmd{\author}{\addhrauthor{#2}}{}{}}%
}
在您的之前\iftoggle
并用 替换该\xpatchcmd
行\fixauthor
。
答案2
您不需要\addrauthor
在切换部分定义:无论如何您都必须编写代码。
在命令参数中执行修补的问题可以通过多种方式解决,最简单的方法是使用标准条件。
在这里我建议\addhrauthor
使用更简单版本的宏expl3
。
\documentclass{article}
\usepackage{xpatch,xparse}
\usepackage[pdfusetitle]{hyperref}
\usepackage{authblk}
\ExplSyntaxOn
\seq_new:N \g_oc_hrauthor_seq
\NewDocumentCommand{\addhrauthor}{m}
{
\seq_gput_right:Nn \g_oc_hrauthor_seq { #1 }
}
\NewExpandableDocumentCommand{\hrauthor}{}
{
\seq_use:Nn \g_oc_hrauthor_seq {,~}
}
\ExplSyntaxOff
\newif\ifpatchhref
%\patchhreftrue
\ifpatchhref
\xpretocmd{\author}{\addhrauthor{#2}}{}{}
\AtEndDocument{\hypersetup{pdfauthor={\hrauthor}}}
\fi
\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}
\maketitle
Content.
\end{document}