当使用空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
。