在“iftoggle”中,代码​​似乎无效

在“iftoggle”中,代码​​似乎无效

回答 有人建议我修补 的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}

相关内容