Environ 的主体不允许制作 \item

Environ 的主体不允许制作 \item

作为文档流程/工作流的一部分,使用环境更容易。但是,在某些情况下,环境内容需要特定的格式。因此,使用environ包裹捕捉环境\BODY,然后根据需要使用它。

但是下面的基本实现却不起作用:

\documentclass{article}

\usepackage{environ}
\NewEnviron{HEADING}{%
  \item[\BODY]
}

\begin{document}

\begin{description}
  \begin{HEADING}
  Heading
  \end{HEADING}
\end{description}

\end{document}

我怎样才能以预期的方式将其作为参数进行处理environHEADING\BODY

答案1

你必须\item[...]在环境之外执行,因为它必须位于列表的外层。原因是\item\@item设置\everypar;将其放在组中会导致各种问题。

\documentclass{article}

\usepackage{environ}
\NewEnviron{HEADING}{%
  \expandafter\gdef\expandafter\THISHEADING\expandafter{%
    \expandafter\item\expandafter[\BODY]%
  }%
  \aftergroup\THISHEADING
}

\begin{document}

\begin{description}
  \begin{HEADING}
  Heading
  \end{HEADING}
  Something to follow
\end{description}

\end{document}

答案2

我在常规环境中尝试了此操作,但出现了相同的错误,所以这不是什么错误。解决这个问题似乎需要欺骗 LaTeX,所以请谨慎对待以下内容。说实话,如果不查看源代码,我不确定为什么需要environ额外的操作。\mbox{}

\documentclass{article}

\usepackage{environ}
\NewEnviron{HEADING}{%
  \item[\BODY]%
  \mbox{}% <-- this is important
}

\begin{document}

\section{testing}
some test before
\begin{description}
  \begin{HEADING}
  Heading
  \end{HEADING}
  text
\end{description}
some text after

\section{normal}
some test before
\begin{description}
  \item[Heading]
  text
\end{description}
some text after

\end{document}

相关内容