На днях я печатал доказательство, содержащее список, и случайно написал \item
внутри proof
среды (из amsthm
пакета), но вне среды списка. К моему удивлению, LaTeX набрал файл без жалоб! Но как только я вышел \item
за пределы proof
среды, LaTeX пожаловался на "одинокий \item
''.
Итак, этот код выдает ошибку
\documentclass{article}
\usepackage{amsthm}
\begin{document}
\begin{proof}
Some text
\end{proof}
\item
\end{document}
в то время как этот код не
\documentclass{article}
\usepackage{amsthm}
\begin{document}
\begin{proof}
\item
Some text
\end{proof}
\end{document}
Что тут происходит?
решение1
Все среды, подобные теоремам, а также center
, flushleft
, flushright
, quote
, quotation
(и некоторые другие) реализованы в виде списков. Например, center
определяется как
% latex.ltx, line 3965:
\def\center{\trivlist \centering\item\relax}
\def\endcenter{\endtrivlist}
и
\begin{center}
something
\item
\end{center}
не вызовет ошибку, поскольку \item
разрешено в trivlist
(что является базовой средой, на которой основаны общие списки), но результат будет забавным.
Это делается для того, чтобы гарантировать, что списки внутри этих сред работают правильно. Также proof
определяется с помощью trivlist
.
Этомощьможно запретить \item
в таких средах, сделав trivlist
восстановление правильного значения для \item
. Что-то вроде
\def\center{\trivlist \centering\item\relax\let\item\@itemerr}
\def\endcenter{\endtrivlist}
и добавление к коду trivlist
такого кода, как
\let\item\@defaultitem
где команды \@itemerr
и \@defaultitem
являются гипотетическими. В настоящее время ядро этого не делает (и не будет делать, так как это может нарушить существующие документы).