InDasAntwort: Mir wurde vorgeschlagen, hyperref
den automatischen PDFAuthor-Metadaten-Handhabungsmechanismus wie folgt zu patchen. Das Ziel besteht darin, PDF-Metadaten mit authblk
mehreren 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 iftoggle
Ding 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, hrauthor
nicht ausgeführt worden wären. Aber der Teil über \AtEndDocument
wird ausgeführt. LautDasKommentar, das Ersetzen iftoggle
durch die Legacy- if
Konstruktion funktioniert.
Wie kann ich diesen Patch bedingt zum Laufen bringen, indem ich iftoggle
denbevorzugtMechanismus zum bedingten Umschalten?
Antwort1
Dies hat nichts mit \iftoggle
per 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 \@firstoftwo
oder 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 6
und beim Patchen von Befehlen mit ist etwas Vorsicht geboten #
. \xpretocmd
versucht, 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“ \iftoggle
und ersetzen Sie die \xpatchcmd
Zeile durch \fixauthor
.
Antwort2
\addrauthor
Sie 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 \addhrauthor
Makros 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}