当 item 在 itemize 或 enumerate 之外使用时发出错误

当 item 在 itemize 或 enumerate 之外使用时发出错误

我有时会错误地输入\itemoutsideitemizeenumerate。如果 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

由于定理类环境是建立在低级listtrivlist环境之上的,并且listtrivlist环境在 LaTeX 内核代码中出现了很多地方,因此\item如果在enumerateitemize环境之外遇到它们,则完全禁用它们需要对 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}

相关内容