ntheorem[thref] 真的与 hyperref 不兼容吗?

ntheorem[thref] 真的与 hyperref 不兼容吗?

我正在使用 Ubuntu 仓库中的 texlive 版本,但后来开始需要一些软件包最新版本中的一些功能,因此我用来自的新系统替换了仓库中的 texlivehttps://tug.org/texlive/acquire-netinstall.html

然后,一些编译完美的文档开始给出这个错误信息(我们称之为“错误”):

ERROR: Paragraph ended before \Hy@setref@link was complete.

(在一次轻微的心脏病发作之后)我设法将问题隔离到这个(有点像 MWE):

\documentclass{abntex2}  % subclass of memoir that loads hyperref
% using any other class is not an option

\usepackage[
  backend = biber,
  %style = abnt, % this option doesn't matter for the bug
]{biblatex}

\usepackage[thref]{ntheorem}


\begin{document}
\section{Lorem ipsum}\label{loremipsum}

Reference to section~\ref{loremipsum}.
Some other text.

\end{document}

一些评论:

  • 部分版本 :ntheorem: 1.33 2011/08/15,, abntex2: 1.9.7 2018/11/24hyperref: 7.00 2022/06/20
  • 将类从 更改为abntex2memoir其基类)可以消除该错误;
  • 省略该thref选项可ntheorem消除该bug,但还必须删除编译生成的文件,然后重新编译;
  • 加载amsmath(无论是否选择amsmathntheorem对该错误没有影响;
  • 使用hyperref中的选项ntheorem也无效。

看来我并不真正需要thref包的文档中描述的功能,所以现在我只需将其删除,但如果有更精明的人可以告诉您出了什么问题、是否有办法修复它等,我将不胜感激。

(虽然ntheorem[thref]似乎hyperref不太相处融洽,它们与 Ubuntu 存储库中稍微过时的版本运行良好,与类运行良好memoir,并且ntheorem应该(理论上=根据其文档)与一起工作hyperref,只要您给它正确的加载选项,所以我认为指出这个“错误”是有一定价值的)。

答案1

不变的东西

thref的选择是ntheorem和始终与不一致hyperref

没有hyperref 标签类似 \label{theo}[additional text]会写

\newlabel{theo}{{1}{1}}[additional text]

到 aux 文件,然后\thref可以检索additional text

在此处输入图片描述

如果hyperref加载,则不再起作用。ntheorem这里包含一些修复代码,以检索至少一个“关键字”,但可选参数\label不再可用:

\documentclass{article}
\usepackage[thref,hyperref]{ntheorem}
\usepackage{hyperref}

\begin{document}
\newtheorem{prop}{Proposition}

\begin{prop}[Hallo]\label{theo}[additional text]
abc
\end{prop}

Cite with thref: \thref{theo}
\end{document} 

在此处输入图片描述

有什么新鲜事

从几个月开始,hyperref不再延迟加载到nameref\begin{document}而是直接加载。对于您的示例,这意味着hyperrefnameref都已加载 ntheorem因此不再覆盖其\label定义来至少部分修复该thref选项造成的损害。

因此,要么不要使用此选项,要么强制加载ntheorem之前的内容hyperref

\AddToHook{package/hyperref/before}{\RequirePackage[thref,hyperref]{ntheorem}}
\documentclass ...

2023 年有什么新内容

自 LaTeX 版本 2023-06-01 起,LaTeX 内核本身定义\label为链接所需。hyperref因此以后不再重新定义它。

现在threfntheorem 选项确实有害,因为它\label以 LaTeX 和 无法使用的方式重新定义hyperref。不应再使用该选项!

相关内容