不用 \include 编译,你可以在 log 最后几行看到这样的内容:
(\end occurred when \ifx on line 42 was incomplete)
Output written on main.pdf (1 page).用了 \include 只是将这个问题过早地暴露出来而已。
实际是 ntheorem 的 hyperref,thref 这两个选项导致的问题。ntheorem 并不会自动加载 hyperref(即使启用 hyperref 选项也是如此)。需要自己在 ntheorem 之后加载 hyperref。
\usepackage[amsmath,thmmarks,amsthm,hyperref,thref]{ntheorem}
\usepackage{hyperref}这样应该就能正常编译了。
ntheorem 最近更新已经是15年前。这期间 LaTeX 里涉及到引用的相关代码已经发生了很大改变,主要是 LaTeX 内核里 \newlabel 内部的参数由原来的 2 个变成了 5 个,保证了与 hyperref 一致。ntheorem 却没有,如果只使用 hyperref 选项而不加载 hyperref 宏包,它写入的 label 是用的 2 个参数,但却是按 5 个参数来用的,参数不足,TeX 只能吞掉后面的 tokens 了。
现在如果硬要用 ntheorem,还要正确的交叉引用,最好是不用它自己的实现,而用 zref-clever 宏包:
\usepackage[amsmath,thmmarks,amsthm]{ntheorem}
\usepackage{hyperref}
\usepackage{biblatex}
\addbibresource{thesis.bib}
\newtheorem{theorem}{定理}[section]
\usepackage{zref-clever}
\let\thref\zcref
\zcsetup{noname}
\zcRefTypeSetup{theorem}{refbounds={,定理,,}}编译结果应该是一致的。这在 TeXLive 2023 以及之后应该都是能正确编译的。更早一点的版本,就要使用 cleveref 宏包,不过,它最近更新也是 8 年前了,与现在的 LaTeX 内核也有不兼容的地方。











问 关于`\include`与`biblatex`以及`\usepackage[thref]{ntheorem}`同时使用时触发报错的原因和最佳实践?