在 elsarticle 模板中链接电子邮件地址时出错

在 elsarticle 模板中链接电子邮件地址时出错

我对这个错误感到困惑:

 Use of \@uad doesn't match its definition.
\kernel@ifnextchar ...rved@d =#1\def \reserved@a {
                                                  #2}\def \reserved@b {#3}\f...
l.11 ...iversity.edu}{mailto:[email protected]}}

使用标准 elsarticle 类产生以下最小 tex 文件:

\documentclass{elsarticle}
\usepackage{hyperref}
\begin{document}
\begin{frontmatter}
\title{Remarks on something interesting}

\author[myu]{Author 1}
\ead{[email protected]}

\author[myu]{Author 2 \corref{cor1}}
\ead{\href{mailto:[email protected]}{mailto:[email protected]}}

\address[myu]{My Department, My Building, My University in My City}

\cortext[cor1]{Corresponding author}
\end{frontmatter}

\maketitle

A \href{http://google.com}{link to google.com}

\end{document}

看起来好像类文件不支持\href参数,但我不明白为什么会这样。所以,我有几个问题:

  1. 这个错误是什么意思?

  2. 我该如何修改.tex.cls文件以便上述内容能够成功编译?

我查看了\ead类字段中定义的位置,但缺少 tex-foo 来弄清楚发生了什么。我相信相关的行是:

\def\ead{\@ifnextchar[{\@uad}{\@ead}}
\gdef\@ead#1{\bgroup\def\_{\string\_}\def\{{\string\{}%
   \def\}{\string\}}%
   \edef\tmp{\the\@eadauthor}
   \immediate\write\@auxout{\string\emailauthor
     {#1}{\expandafter\strip@prefix\meaning\tmp}}%
  \egroup
}

该错误似乎可能与 tex 如何以及在何处定义宏有关,但这有点超出我的理解范围。

背景:与这个问题没有直接关系,但有时上下文很有用。我在尝试使用 RStudio 的 rmarkdown 中的 elsarticle 模板时遇到了这个问题,该模板使用 pandoc 的选项,但autolink_bare_uris显然无法关闭。这会迫使 pandoc 将裸电子邮件转换为href'd 电子邮件,这相当烦人地破坏了这个模板。

答案1

\ead中的命令将命令elsarticle写入文件,并使用传递的电子邮件地址和相关作者作为参数。在后续运行中,将读取文件并执行命令。您尝试添加的问题是,在将内容写入文件之前尝试对其进行扩展,从而导致错误。由于我们希望将其写入文件,因此您可以通过在前面加上或来执行所需的操作。例如:\emailauthorauxaux\emailauthor\href\immediate\write\@auxoutaux\hrefaux\href\string\noexpand

\ead{\string\href{mailto:[email protected]}{[email protected]}}

您可以检查该aux文件以查看以下行(如预期的那样):

\emailauthor{\href{mailto:[email protected]}{[email protected]}}{Author 2 \corref {cor1}}

\@ead此外,您可以通过分别修改和来自动为所有作者电子邮件和网址建立超链接\@uad,如下所示:

\usepackage{etoolbox}
\makeatletter%placed AFTER \usepackage{hyperref}, if to be used
    \newif\ifhyperrefloaded\hyperrefloadedfalse
    \@ifpackageloaded{hyperref}{\hyperrefloadedtrue}{\hyperrefloadedfalse}%check if hyperref is loaded
    \ifhyperrefloaded%
        \patchcmd{\@ead}{#1}{\string\href{mailto:#1}{#1}}{}{}
        \patchcmd{\@uad}{#2}{\string\url{#2}}{}{}\fi
\makeatother

用于\ifhyperrefloaded使\patchcmd调用处于全局范围内,并且仅在hyperref包加载时使用。

最后,我擅自mailto:从显示的部分中删除了,\href\maketitle从 MWE 中删除了不必要的部分。

结果:

\documentclass{elsarticle}
\usepackage{hyperref}
\usepackage{etoolbox}

\makeatletter%placed AFTER \usepackage{hyperref}, if to be used
    \newif\ifhyperrefloaded\hyperrefloadedfalse
    \@ifpackageloaded{hyperref}{\hyperrefloadedtrue}{\hyperrefloadedfalse}%check if hyperref is loaded
    \ifhyperrefloaded%
        \patchcmd{\@ead}{#1}{\string\href{mailto:#1}{#1}}{}{}
        \patchcmd{\@uad}{#2}{\string\url{#2}}{}{}\fi
\makeatother
\begin{document}
\begin{frontmatter}
\title{Remarks on something interesting}

\author[myu]{Author 1}
\ead{[email protected]}

\author[myu]{Author 2 \corref{cor1}}
\ead{[email protected]}
\ead[url]{www.google.com}

\address[myu]{My Department, My Building, My University in My City}

\cortext[cor1]{Corresponding author}
\end{frontmatter}

A \href{http://google.com}{link to google.com}

\end{document}

链接的电子邮件和网址

答案2

这似乎不适用于 elsarticle.cls 3.3 版。不过,我可以通过重新定义 \emailauthor 和 \urlauthor 来产生预期的行为:

\makeatletter
% ead[url] with a hyperlink
\gdef\urlauthor#1#2{\g@addto@macro\@elsuads{\let\corref\@gobble%
     \def\@@tmp{#1}\raggedright\eadsep
     {\ttfamily\url{\expandafter\strip@prefix\meaning\@@tmp}}\space(#2)%
     \def\eadsep{\unskip,\space}}%
}
% ead with a mailto:
\gdef\emailauthor#1#2{\stepcounter{ead}%
     \g@addto@macro\@elseads{\raggedright%
      \let\corref\@gobble\def\@@tmp{#1}%
      \eadsep{\ttfamily\href{mailto:\expandafter\strip@prefix\meaning\@@tmp}{\expandafter\strip@prefix\meaning\@@tmp}}
      (#2)\def\eadsep{\unskip,\space}}%
}
\makeatother

相关内容