当 thebibliography 为空时,带有 thmmarks 和标准选项的 ntheorem 会失败

当 thebibliography 为空时,带有 thmmarks 和标准选项的 ntheorem 会失败

当使用空thebibliography环境时,LaTeX 通常会发出警告,但会继续排版文档。但是,它会将以下示例视为错误:“!LaTeX 错误:出现问题 - 可能缺少 \item。”

\documentclass{article}
\usepackage[thmmarks, standard]{ntheorem}

\begin{document}
\begin{thebibliography}{0}
\end{thebibliography}

\begin{theorem}
    Blah.
\end{theorem}
\end{document}

这是为什么?我在手册中没有找到任何相关内容ntheorem。我该如何避免这种行为,以便空thebibliography环境不会产生错误?我对警告没有意见,我只是想避免编译失败并出现错误。

(我知道我可以让 LaTeX 忽略所有错误并尝试继续编译,但我不想使用这个选项——如果我的文档中出现错误,我希望编译失败并停止,但我希望空环境thebibliography后跟一个定理不会产生错误。)

答案1

如果我要求 LaTeX 显示\endtrivlist带有ntheorem活动符号的定义,我会得到

> \endtrivlist=macro:
->\@endtrivlist {\PotEndMark {\unskip \nobreak \hfill \nobreak }}.
l.11 \show\endtrivlist

?
> \@endtrivlist=macro:
#1->\if@inlabel \indent \fi \if@newlist \@noitemerr \fi \ifhmode \ifdim \lastsk
ip >\z@ #1\unskip \par \else \unskip \par \fi \fi \if@noparlist \else \ifdim \l
astskip >\z@ \@tempskipa \lastskip \vskip -\lastskip \advance \@tempskipa \pars
kip \advance \@tempskipa -\@outerparskip \vskip \@tempskipa \fi \@endparenv \fi
 .
l.12 \show\@endtrivlist

的原始定义\endtrivlist

> \endtrivlist=macro:
->\if@inlabel \leavevmode \global \@inlabelfalse \fi \if@newlist \@noitemerr \g
lobal \@newlistfalse \fi \ifhmode \unskip \par \else \@inmatherr {\end {\@curre
nvir }}\fi \if@noparlist \else \ifdim \lastskip >\z@ \@tempskipa \lastskip \vsk
ip -\lastskip \advance \@tempskipa \parskip \advance \@tempskipa -\@outerparski
p \vskip \@tempskipa \fi \@endparenv \fi .
l.11 \show\endtrivlist

可以看出, 的定义遗漏了ntheorem的当前定义中的一些内容\endtrivlist,因此陷入非常不稳定的状态。

尤其是,重新定义忽略了关键的

\global \@newlistfalse \fi

这就是为什么\@noitemerr执行时会出现这样的结果\begin{theorem}

猜测其定义\endtrivlist随着时间的推移而发生变化,但至少从 2006 年第一次进入 TeX Live 以来,它一直保持不变,请参阅http://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/base/latex.ltx?revision=694&view=markup

不使用的另一个原因ntheorem

相关内容