有什么方法可以让 LaTeX 容忍空的 itemize/enumerate(即没有 \item)?
具体来说,我会欢迎任何包/优雅的黑客,如果没有找到元素,它会优雅地“取消”列表(而不是触发 Latex 错误)。
在跳到显而易见的答案之前(我预计答案应该是“如果你没有要放入的物品,就不要使用 itemize”;)),请考虑我的用例:
我想要格式化远程存储的元素(例如,书目项目),我只能以 XML 文件的形式访问它们。
<elems> <bibelem><title>Cool result 1</title><author>joe</author></bibelem> <bibelem><title>Cool result 2</title><author>jim</author></bibelem> </elems>
我有一个 python 脚本,可以下载/解析 XML 并将其内容
bib.tex
作为 Latex 宏修饰数据列表输出到文件中\BibElem{Cool result 1}{joe} \BibElem{Cool result 2}{jim}
现在,我想授予最终用户对其所生成文档样式的完全控制权,因此 Latex 中的预期用法如下
\documentclass{article} \begin{document} \newcommand{\BibElem}[2]{\item {\em #1} by {#2}} \begin{itemize} \input{bib.tex} \end{itemize} \end{document}
这种设计选择背后的理由是,用户在样式选择方面应尽可能少地受到限制。例如,用户可能希望在列表中显示 bibelem(如示例中所示),或者可能更喜欢格式精美的表格。另一方面,用户应该设计一次 latex 文档,并且无论源生成的数据量有多少,都应该能够运行它。
因此,python 脚本无法对其 latex 产品将包含在哪个上下文中做出任何假设,并且应该由用户来处理空书目,即空列表。怎么可能做到这一点?
更新:Werner 提出了一个很好的解决方案,重新定义列表环境,让 Latex 忘记它当前位于列表中。然而,这似乎只有在空列表是文档中的最后一个列表时才有效,如以下 mwa 所示:
\documentclass{article}
\makeatletter
\newenvironment{myitemize}
{\itemize}
{\@newlistfalse\enditemize}
\makeatother
\begin{document}
% Empty Itemize
\begin{myitemize}
\end{myitemize}
% Next non-nested itemize environment (can be itemize/enumerate/description)
\begin{myitemize}
\item Arghh!
\end{myitemize}
\end{document}
答案1
您应该创建自己的myitemize
环境来允许您执行此操作:
\documentclass{article}
\makeatletter
\newenvironment{myitemize}
{\itemize\@newlistfalse}% \begin{myitemize}
{\enditemize}% \end{myitemize}
\makeatother
\begin{document}
\noindent Here is some text.
\begin{myitemize}% A list with items
\item An item
\item Another item
\end{myitemize}
Here is some more text.
\begin{myitemize}% An empty list
\end{myitemize}
Here is a final piece of text.
\end{document}
环境myitemize
与 完全相同itemize
,只是它(重新)设置了布尔条件。在常规列表( 、 、...)的开头,\@newlistfalse
这被设置为 true ( ),当未使用 s时会导致错误。\@newlisttrue
itemize
enumerate
\item
这可能会导致嵌套列表出现问题,尽管我认为这不适合您的用例。
答案2
我通过将 Werner 的建议与简单地关闭错误消息相结合来解决了我的问题,如如何避免 itemize/enumerate 中出现“可能缺少 \item。”消息最终的 hack 如下所示,并且不修改标准列表环境(可被某些软件包使用):
\makeatletter
\let\@oldnoitemerr\@noitemerr %Save the command definition
\newcommand\noitemerroroff{\let\@noitemerr\relax}
\newcommand\noitemerroron{\let\@noitemerr\@oldnoitemerr}
% Redefine any other environment, as done by Werner
\newenvironment{myitemize}
{\itemize\noitemerroroff}
{\enditemize\noitemerroron}
\makeatother