Enesterespuesta Me han sugerido parchear hyperref
el mecanismo automático de manejo de metadatos de pdfauthor de la siguiente manera. El objetivo es que los metadatos PDF funcionen con authblk
varios autores.
\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}
Agregué la iftoggle
cosa, no estaba en la respuesta original. Cuando no se usa iftoggle
, funciona. Pero, al usar iftoggle
(descomenta las tres líneas relacionadas para probarlo), falla al llegar al final del documento con Undefined control sequence. <argument> \hrauthor
. Como si los comandos que definen hrauthor
no hubieran sido ejecutados. Pero la parte sobre \AtEndDocument
se ejecuta. De acuerdo aestecomentario, reemplazándolo iftoggle
con obras de construcción heredadas if
.
¿Cómo puedo hacer que este parche funcione condicionalmente, usando iftoggle
, elprivilegiado¿Mecanismo de conmutación condicional?
Respuesta1
Esto no tiene nada que ver \iftoggle
per se sino con códigos de categoría (catcodes). Cuando TeX escanea un token por primera vez, su código de categoría se "congela", es decir, TeX recuerda qué era cuando se leyó por primera vez. En tu caso, el #
es el culpable.
\iftoggle{patchhref}
se expande a algo equivalente a \@firstoftwo
o \@secondoftwo
:
\newcommand\@firstoftwo[2]{#1}
\newcommand\@secondoftwo[2]{#2}
Esto escanea los dos grupos siguientes y elimina el segundo. Todos los catcodes del primer grupo se congelan en el proceso. #
Generalmente tiene un código de categoría 6
y se necesita algo de cuidado al parchear comandos con #
. \xpretocmd
intenta encargarse de esto, pero si #
ya se ha escaneado, esto falla.
Puede solucionar este problema definiendo
{\catcode`#=11\relax
\gdef\fixauthor{\xpretocmd{\author}{\addhrauthor{#2}}{}{}}%
}
antes de tu \iftoggle
y reemplazando la \xpatchcmd
línea con \fixauthor
.
Respuesta2
No es necesario definirlo \addrauthor
en la parte de alternancia: debe escribir el código de todos modos.
El problema de aplicar el parche en el argumento de un comando se puede solucionar de varias formas, la más sencilla es utilizar condicionales estándar.
Aquí sugiero una versión más sencilla de la \addhrauthor
macro con 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}