El código parece no tener ningún efecto dentro de "iftoggle"

El código parece no tener ningún efecto dentro de "iftoggle"

Enesterespuesta Me han sugerido parchear hyperrefel mecanismo automático de manejo de metadatos de pdfauthor de la siguiente manera. El objetivo es que los metadatos PDF funcionen con authblkvarios 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 iftogglecosa, 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 hrauthorno hubieran sido ejecutados. Pero la parte sobre \AtEndDocumentse ejecuta. De acuerdo aestecomentario, reemplazándolo iftogglecon 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 \iftoggleper 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 \@firstoftwoo \@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 6y se necesita algo de cuidado al parchear comandos con #. \xpretocmdintenta 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 \iftoggley reemplazando la \xpatchcmdlínea con \fixauthor.

Respuesta2

No es necesario definirlo \addrauthoren 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 \addhrauthormacro 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}

información relacionada