Der Code scheint innerhalb von „iftoggle“ keine Wirkung zu haben.

Der Code scheint innerhalb von „iftoggle“ keine Wirkung zu haben.

InDasAntwort: Mir wurde vorgeschlagen, hyperrefden automatischen PDFAuthor-Metadaten-Handhabungsmechanismus wie folgt zu patchen. Das Ziel besteht darin, PDF-Metadaten mit authblkmehreren Autoren arbeiten zu lassen.

\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}

Ich habe das iftoggleDing hinzugefügt, es war nicht in der ursprünglichen Antwort. Wenn Sie nicht verwenden iftoggle, funktioniert es. Aber wenn Sie verwenden iftoggle(entkommentieren Sie die drei zugehörigen Zeilen, um es auszuprobieren), schlägt es fehl, wenn Sie das Ende des Dokuments mit erreichen Undefined control sequence. <argument> \hrauthor. Als ob die Befehle, die definieren, hrauthornicht ausgeführt worden wären. Aber der Teil über \AtEndDocumentwird ausgeführt. LautDasKommentar, das Ersetzen iftoggledurch die Legacy- ifKonstruktion funktioniert.

Wie kann ich diesen Patch bedingt zum Laufen bringen, indem ich iftoggledenbevorzugtMechanismus zum bedingten Umschalten?

Antwort1

Dies hat nichts mit \iftoggleper se zu tun, sondern mit Kategoriecodes (Catcodes). Wenn TeX ein Token zum ersten Mal scannt, wird sein Kategoriecode „eingefroren“, d. h. TeX merkt sich, was er beim ersten Lesen war. In Ihrem Fall #ist das der Übeltäter.

\iftoggle{patchhref}wird zu etwas Gleichwertigem wie \@firstoftwooder erweitert \@secondoftwo:

\newcommand\@firstoftwo[2]{#1}
\newcommand\@secondoftwo[2]{#2}

Dadurch werden die nächsten beiden Gruppen gescannt und die zweite entfernt. Dabei werden alle Catcodes der ersten Gruppe eingefroren. #hat normalerweise den Kategoriecode 6und beim Patchen von Befehlen mit ist etwas Vorsicht geboten #. \xpretocmdversucht, dies zu berücksichtigen, aber wenn #bereits gescannt wurde, schlägt dies fehl.

Sie können dieses Problem umgehen, indem Sie

{\catcode`#=11\relax
    \gdef\fixauthor{\xpretocmd{\author}{\addhrauthor{#2}}{}{}}%
}

vor „Ihr“ \iftoggleund ersetzen Sie die \xpatchcmdZeile durch \fixauthor.

Antwort2

\addrauthorSie müssen das im Umschaltteil nicht definieren : Sie müssen den Code sowieso schreiben.

Das Problem beim Ausführen des Patches im Argument eines Befehls kann auf verschiedene Weise gelöst werden. Die einfachste besteht darin, Standardbedingungen zu verwenden.

Hier schlage ich eine einfachere Version des \addhrauthorMakros mit vor 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}

verwandte Informationen