如何使 itemize/enumerate/description 环境对缺失的 \item 元素具有鲁棒性?

如何使 itemize/enumerate/description 环境对缺失的 \item 元素具有鲁棒性?

有什么方法可以让 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时会导致错误。\@newlisttrueitemizeenumerate\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

相关内容