我有时会错误地输入\item
outsideitemize
或enumerate
。如果 LaTeX 能帮我发现这样的错误就好了。有时它会正确地这样做并发出错误
Lonely \item--perhaps a missing list environment
但是,有时它无法捕获此错误,并且似乎默默地忽略了\item
。例如,当我处于定理环境中时,就会发生这种情况。请参阅以下 MWE:
\documentclass{article}
\newtheorem{thm}{Theorem}
\begin{document}
\begin{thm}
\item
\end{thm}
\end{document}
编译将会悄无声息地成功,这是不是可取的。
答案1
经典上,定理、逐字、中心等都被定义为单项列表,因此正如您所注意到的,\item
不会出现错误。
这将是可修复的,但如果您使用新的(实验性的)代码进行 pdf 标记,则此类环境不会建立在列表代码上(因此它们不会在可访问性 pdf 结构中被标记为列表)。
\DocumentMetadata{
testphase={phase-III},
}
\documentclass{article}
\newtheorem{thm}{Theorem}
\begin{document}
\begin{thm}
\item
\end{thm}
\end{document}
\item
会出现不在列表中的错误。
目前实际的错误消息已损坏,因此您首先会收到内部命令未定义错误,但该错误将得到修复:
! Undefined control sequence.
<argument> \__block_item_instance:n
l.9 \end
{thm}
?
! LaTeX Error: Unknown message 'item-in-nonlist' for module '__block'.
For immediate help type H <return>.
...
l.9 \end
{thm}
?
此处报告损坏的错误消息
https://github.com/latex3/tagging-project/issues/35
我猜 Ulrike 也计划对此做出类似的回答 :-)
答案2
由于定理类环境是建立在低级list
和trivlist
环境之上的,并且list
和trivlist
环境在 LaTeX 内核代码中出现了很多地方,因此\item
如果在enumerate
和itemize
环境之外遇到它们,则完全禁用它们需要对 LaTeX 内核进行大量重写。我断言,这几乎是应该不惜一切代价避免的事情——至少对于任何不属于 LaTeX3 开发团队的人来说都是如此。
该怎么办?如果您可以使用 LuaLaTeX 来编译文档,则可以添加一些类似预处理器的代码(在序言中)来“动态”检查输入流是否包含实例\item
,如果是,则发出适当的警告消息。
enumerate
下面提出的代码被设计来处理和itemize
环境可以嵌套的情况。
建议的代码还假设每行输入中最多只有一个\begin{enumerate}
、\end{enumerate}
、\begin{itemize}
、\end{itemize}
或的实例\item
。我相信这不是什么大问题。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode,xcolor}
%% Lua-side code
\begin{luacode}
inItemizeOrEnumerate = 0 -- initialize with value '0' ("false")
function FlagLonelyItems ( s )
if s:find ( '\\begin%s-{itemize}' ) or
s:find ( '\\begin%s-{enumerate}' ) then
inItemizeOrEnumerate = inItemizeOrEnumerate + 1 -- increment the counter
elseif s:find ( '\\end%s-{itemize}' ) or
s:find ( '\\end%s-{enumerate}' ) then
inItemizeOrEnumerate = inItemizeOrEnumerate - 1 -- decrement the counter
elseif s:find ( '\\item' ) then
if inItemizeOrEnumerate==0 then -- check if inside 'enumerate' or 'itemize' env.
return ( '\\ \\begin{center}' ..
'\\color{red} \\upshape Found a lonely item.' ..
'\\end{center}' ..
s )
end
end
end
\end{luacode}
%% LaTeX-side code: utility macros to activate/deactivate the Lua function
\newcommand\FlagLonelyItemsOn{
\directlua{luatexbase.add_to_callback (
"process_input_buffer" , FlagLonelyItems , "FlagLonelyItems" )}}
\newcommand\FlagLonelyItemsOff{
\directlua{luatexbase.remove_from_callback (
"process_input_buffer" , "FlagLonelyItems" )}}
\usepackage{amsthm}
\newtheorem{thm}{Theorem}
\begin{document}
\FlagLonelyItemsOn % Activate the Lua function
\begin {enumerate}
\item x
\begin{itemize}
\item y
\end {itemize}
\end{enumerate}
\begin{thm}
\item z
\end{thm}
\end{document}