当我尝试编译 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}
中写入的信息太少,无法用重新定义的命令来抓取它。.aux
hyperref
\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
常规命令,用于存储第一页的章节编号,而第二个标签定义通过 进行扩展,以包含\label
latex.ltx
1
hyperref
- 章节编号
2
- 页码
1
- 章节标题
Foo again
,使用\nameref
或提取\nameref*
- ('unique') 超级锚点名称
section.2
- ‘未使用’(空)