hyperref 错误:\Hy@setref@link 的参数有一个额外的 }

hyperref 错误:\Hy@setref@link 的参数有一个额外的 }

当我尝试编译 pdf 时,hyperref 包返回以下错误:

Argument of \Hy@setref@link has an extra }.
<inserted text> 
                \par
l.45

第 45 行只是我段落之间的一个空行,没有\ref\label命令。如果我注释该\usepackage{hyperref}语句,文档将成功编译。我使用的是 overleaf 中的模板,可以在这里。我尝试了几种解决类似错误的方案,但都不起作用。找不到打开{}或其他不一致之处。删除.aux文件、在 overleaf 上在线编译或通过 texstudio 和 teXshop 在本地编译也不起作用,并返回相同的错误消息。

我的文档结构如下:

\documentclass{comnet}  % class from journal of complex networks
\bibpunct{[}{]}{,}{n}{,}{;}     
\usepackage[utf8]{inputenc}     
\usepackage{microtype}          
\usepackage{graphicx}           
\usepackage{algorithmicx}       
\usepackage{hyperref}           


\begin{document}

\title{Complicated title}
\shorttitle{Complicated title}
\shortauthorlist{author 1, author 2}

\author{
\name{author 1}
\address{springfield}
\name{author 2}
\address{springfield}}

\maketitle

\begin{abstract}
    {abstract text}
    {key words}
\end{abstract}


\section{Introduction}
\section{section 1}   
\subsection{section 1.1}   
\section{section 2}    
\section{Conclusion}    

\bibliographystyle{comnet}
\bibliography{mybib}

\end{document}

我还注意到,如果我注释该maketitle命令,文档就可以编译。有人能告诉我该怎么做才能解决这个问题吗?

答案1

错误并非直接来自\maketitle其本身,而是来自\thispagestyle{plain}中的宏使用\maketitle

页面plain样式定义comnet.cls

\def\ps@plain{%
  \def\@oddfoot{\gridpl\hfill\fontsize{6.8}{9}\selectfont  $\copyright$
    The author \number\year. Published by Oxford University Press on behalf of
    the Institute of Mathematics and its Applications. All rights reserved.}
  % \let\@evenfoot\@empty
  \def\@evnhead{\CROPMARKSA}%
  \def\@oddhead{\CROPMARKSA\begin{tabular}{@{}l}\\[-1pt]\textit{IMA Journal of Complex Networks} (\number\year) Page \fpage\ of\hspace*{2pt} \lpage\\doi:10.1093/comnet/\@kxi\end{tabular}
  }%
  \let\@mkboth\markboth
}

现在,\fpage\lpage(用于\@oddhead)是

\AtBeginDocument{\label{FirstPage}}
\def\lpage{\pageref{LastPage}}
\def\fpage{\pageref{FirstPage}}

真正的错误就在这里:\label{FirstPage}由于钩子的作用,它在文档开始时被写入\AtBeginDocument,但hyperref稍后被加载,\label使用标签上的附加信息重新定义等宏,这意味着向文件\label{FirstPage}中写入的信息太少,无法用重新定义的命令来抓取它。.auxhyperref\pageref

第一次编译运行文档后查看.aux文件显示(这里没有提供不必要的信息)——第一次运行“正常”,第二次编译则显示错误!

\newlabel{FirstPage}{{}{1}}
...
\newlabel{LastPage}{{}{2}{}{page.2}{}}

很明显,LastPage具有更多的信息“插槽”(尤其是page.2锚点),预计会hyperref被读取,但这对于 不起作用Firstpage

解决方案是更改\fpage\def\fpage{\pageref{CorrectFirstPageLabel}}并添加CorrectFirstPageLabel 正在加载hyperref

\documentclass{comnet}  % class from journal of complex networks
\bibpunct{[}{]}{,}{n}{,}{;}     
\usepackage[utf8]{inputenc}     
\usepackage{microtype}          
\usepackage{graphicx}           
\usepackage{algorithmicx}       
\usepackage{hyperref}           

\usepackage{blindtext}



\AtBeginDocument{
  \label{CorrectFirstPageLabel}
  \def\fpage{\pageref{CorrectFirstPageLabel}}
}

\begin{document}

\title{Complicated title}
\shorttitle{Complicated title}
\shortauthorlist{author 1, author 2}

\author{%
  \name{author 1}
  \address{springfield}
  \name{author 2}
  \address{springfield}
}

\maketitle

\begin{abstract}
    {abstract text}
    {key words}
\end{abstract}


\section{Introduction}
\section{section 1}   
\subsection{section 1.1}   
\section{section 2}    
\section{Conclusion}    

\blindtext[5]

\bibliographystyle{comnet}
%\bibliography{mybib}

\end{document}

另一个解决方案是重新定义\ps@plain以删除\fpage宏并将其替换为,但我不推荐这样做,因为其他作者也可以在文档中除标题页之外的其他位置1使用样式。plain

在此处输入图片描述

当然,如果hyperref根本没有加载,错误就会消失,无论复杂网络杂志hyperref我不知道允许ed 文件提交。如有疑问,请hyperref省略。

更新

这是一个最小的非工作版本,通过强制标签并随后\AtBeginDocument加载包会出现同样的问题:hyperref

\documentclass{article}

\AtBeginDocument{%
  \section{Foo}\label{foolabel}
}

\usepackage{hyperref}

\begin{document}


\ref{foolabel}

\section{Foo again}\label{fooagainlabel}

\ref{fooagainlabel}

\end{document}

.aux文件包含

\newlabel{foolabel}{{1}{1}}

\newlabel{fooagainlabel}{{2}{1}{Foo again}{section.2}{}}

来自中定义的foolabel常规命令,用于存储第一页的章节编号,而第二个标签定义通过 进行扩展,以包含\labellatex.ltx1hyperref

  1. 章节编号2
  2. 页码1
  3. 章节标题Foo again,使用\nameref或提取\nameref*
  4. ('unique') 超级锚点名称section.2
  5. ‘未使用’(空)

相关内容