问题

问题

我有一个输入文件,其中包含很多项目enumerate。由于未知原因,我必须在每个项目末尾附加一些内容(通过调用宏)。

我不想像下面的 MWE 中实现的那样,通过用一对花括号括起每个项目的内容来修改现有的输入文件。

\documentclass{article}

\def\message{This is the end of item.}

\let\olditem=\item
\def\item#1{\olditem#1\newline\message}

\begin{document}
\begin{enumerate}
    \item {This is a book.}
\end{enumerate}
\end{document}

问题

如何在每个项目的末尾附加一个宏调用,但不必用一对花括号将每个项目的内容括起来?

答案1

借助的帮助,l3regex我们可以删除\item或前面的空行\end{enumerate}\mymessage在适当的位置添加。

\documentclass{article}
\usepackage{environ,xparse,l3regex}

\let\latexenumerate\enumerate
\let\endlatexenumerate\endenumerate
\newcommand{\mymessage}{\mbox{}\\End of item}

\ExplSyntaxOn
\RenewEnviron{enumerate}{%
  % remove all space tokens and \par preceding \item and prepend \mymessage
  \regex_replace_all:nnN { (\c{par}|\s)* \c{item} } { \c{mymessage} \c{item} } \BODY
  % remove the first \mymessage
  \regex_replace_once:nnN { \c{mymessage} } { } \BODY
  % remove the trailing space tokens and \par and add \mymessage
  \regex_replace_once:nnN { (\c{par}|\s)* \Z } { \c{mymessage} } \BODY
  % do the standard enumerate
  \latexenumerate\BODY\endlatexenumerate
}
\ExplSyntaxOff

\begin{document}
\begin{enumerate}

    \item This is a book.

    \item Other stuff 


    \item Well and here it goes again

\end{enumerate}
\end{document}

在此处输入图片描述

当然结果是一样的

\begin{enumerate}
    \item This is a book.
    \item Other stuff 
    \item Well and here it goes again
\end{enumerate}

我添加空行只是为了举例子。

答案2

这是不使用包的方法。必须小心避免在调用前出现空行\item。MWE 显示了如何将其设置为仅影响enuemerate而不影响相关环境,例如itemize

\documentclass{article}
\def\message{This is the end of item.}
\let\svitem\item
\let\svenumerate\enumerate
\let\svendenumerate\endenumerate%
\renewenvironment{enumerate}{%
  \def\newitem{\message\svitem}\svenumerate%
  \def\item{\let\item\newitem\svitem}%
}{
  \message\svendenumerate%
}
\begin{document}
\begin{enumerate}
\item A
\item B
\item[x] C
\item
\item D
\end{enumerate}

\begin{itemize}
\item x
\item y
\item z
\end{itemize}

\begin{enumerate}
\item P
\item Q
\item[x] R
\item
\item T
\end{enumerate}

\end{document}

在此处输入图片描述

答案3

虽然这不是最好的方法,但是它适用于第一级枚举,但不适用于空\item命令。

\item在前面添加了\newline(这真的有必要吗?)——当然,这对第一个项目不起作用,并且最后一个项目\item也不会得到它,除非\endenumerate在前面添加了。

\documentclass{article}

\def\mymessage{This is the end of item.}

\usepackage{xpatch}

\makeatletter
\xpretocmd{\item}{\ifnum\value{enumi} > 0  \newline\mymessage\fi}{}{}
\xpretocmd{\endenumerate}{\newline\mymessage}{}{}
\makeatother
\begin{document}
\begin{enumerate}
    \item This is a book.
    \item Other stuff 
    \item Well and here it goes again
\end{enumerate}
\end{document}

相关内容