我有一个输入文件,其中包含很多项目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}