![如何避免 itemize/enumerate 中出现“可能缺少 \item。”消息](https://linux22.com/image/245655/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%20itemize%2Fenumerate%20%E4%B8%AD%E5%87%BA%E7%8E%B0%E2%80%9C%E5%8F%AF%E8%83%BD%E7%BC%BA%E5%B0%91%20%5Citem%E3%80%82%E2%80%9D%E6%B6%88%E6%81%AF.png)
如果有一个 itemize 环境,但其中没有项目:
\begin{itemize}
\end{itemize}
编译会抱怨“可能缺少 \item”。我想修改环境 itemize(或 enumerate),这样,如果没有\item
,编译不会失败,只是不显示任何内容。
编辑 我认为,通过尝试从实际问题中提取 MWE,我错过了重点。因此,我重新表述了这个问题这里。
答案1
您可以按如下方式停用它,尽管我不太清楚为什么有人会想这样做!
\documentclass{article}
\makeatletter
\let\@noitemerr\relax
\makeatother
\begin{document}
Some text.
\begin{itemize}
\end{itemize}
More text.
\end{document}
如果稍后需要重新激活它,则需要保存原始定义。
\documentclass{article}
\makeatletter
\let\@oldnoitemerr\@noitemerr %Save the command definition
\newcommand\noitemerroroff{\let\@noitemerr\relax}
\newcommand\noitemerroron{\let\@noitemerr\@oldnoitemerr}
\makeatother
\begin{document}
Some text.
\noitemerroroff
\begin{itemize}
\end{itemize}
More text.
%
\noitemerroron
\begin{itemize}
\end{itemize}
\end{document}
答案2
你到底想要发生什么?
鉴于
xxx
aaa\begin{itemize}\end{itemize}bbb
yyy
那么您是否想获得中间段落,aaabbb
就好像没有空环境一样?您是否想要(仅)一个段落分隔符,您是否想要一个段落分隔符和 itemize 环境通常会在上方和下方出现的显示间距?或者您是否想要(明显奇怪的)实际从 LaTeX 获得的输出,但没有错误消息?
所有这些事情(可能)都是可能的,但有些比其他的更容易。
答案3
这些环境是 LaTeX 内核的一部分,因此如果不深入研究实现,就无法轻易更改或调整。(参见 Ian 的回答。)一种解决方案是定义您自己的命令并使用包ifthen
:
\usepackage{ifthen}
\newcommand{\safeitemizecmd}[1]{%
\ifthenelse{\equal{#1}{}}{}{\begin{itemize}#1\end{itemize}}}%
}
请注意,此解决方案将参数扩展#1
两次,只是为了检查它是否为空。您可以通过使用包\expandonce
中的方法来避免这种情况etoolbox
:
\usepackage{ifthen}
\usepackage{etoolbox}
\newcommand{\safeitemizecmd}[1]{%
\ifthenelse{\equal{\expandonce{#1}}{}}{}{\begin{itemize}#1\end{itemize}}}%
}
然后,\safeitemizecmd{\item ...}
将排版一个项目化环境,并且\safeitemizecmd{}
不会排版任何内容。
如果要使用环境,请使用上面创建的命令:
\newenvironment{safeitemize}{\safeitemizecmd\bgroup}{\egroup}
和\bgroup
命令\egroup
本质上相当于括号。