![在宏中存储枚举会破坏 \endenumerate](https://linux22.com/image/318679/%E5%9C%A8%E5%AE%8F%E4%B8%AD%E5%AD%98%E5%82%A8%E6%9E%9A%E4%B8%BE%E4%BC%9A%E7%A0%B4%E5%9D%8F%20%5Cendenumerate.png)
我需要改变enumerate
环境,以便我可以存储一些我想稍后打印的数据enumerate
(在相应的级别)。但是,当我这样做时,\end{enumerate}
似乎被破坏了,级别只会增加。
梅威瑟:
\documentclass{article}
\makeatletter
\def\SavedEnum{}
\let\BeginEnumerate\enumerate
\def\enumerate{%
\g@addto@macro\SavedEnum{\BeginEnumerate}%
\BeginEnumerate}
\let\EndEnumerate\endenumerate
\def\endenumerate{%
\g@addto@macro\SavedEnum{\EndEnumerate}%
\EndEnumerate%
}
\let\OldItem\item
\def\item<#1>{%
\g@addto@macro\SavedEnum{\OldItem#1}%
\OldItem%
}
\makeatother
\begin{document}
\begin{enumerate}
\item<1st level> level 1
\item<> \begin{enumerate}
\item<2nd level> level 2
\end{enumerate}
\item<> \begin{enumerate}
\item<2nd level> level 2
\end{enumerate}
\end{enumerate}
---
\SavedEnum
\end{document}
答案1
除非进行分组,否则此过程会使枚举的深度变得混乱:
\documentclass{article}
\usepackage{letltxmacro}
\makeatletter
\def\SavedEnum{}
\let\BeginEnumerate\enumerate
\def\enumerate{%
\g@addto@macro\SavedEnum{\begingroup\BeginEnumerate}%
\BeginEnumerate }
\let\EndEnumerate\endenumerate
\def\endenumerate{%
\g@addto@macro\SavedEnum{\EndEnumerate\endgroup}%
\EndEnumerate%
}
\LetLtxMacro\OldItem\item
\def\item<#1>{%
\g@addto@macro\SavedEnum{\OldItem#1}%
\OldItem%
}
\makeatother
\begin{document}
\begin{enumerate}
\item<1st level repeat> level 1 1st orig
\item<>
\begin{enumerate}
\item<2nd level repeat> level 2 2nd orig
\end{enumerate}
\item<>
\begin{enumerate}
\item<2nd level repeat> level 2 -- 3rd orig
\item<another level repeat> another level
\begin{enumerate}
\item<3rd level repeated> level 3
\end{enumerate}
\end{enumerate}
\end{enumerate}
---
\SavedEnum
\end{document}
答案2
你的 \SavedEnum
相当于
\documentclass{article}
\begin{document}
\enumerate
\item 1st level
\item
\enumerate \item 2nd level\endenumerate
\item
\enumerate \item 2nd level\endenumerate
\endenumerate
\end{document}
当首先使用命令时\endenumerate
将首先结束\enumerate
。
更新现在尝试一下
\documentclass{article}
\begin{document}
\begin{enumerate}
\item level 1
\item \begin{enumerate}
\item level 2
\end{enumerate}
\item\begin{enumerate}
\item level 2
\end{enumerate}
\end{enumerate}
\begingroup\enumerate
\item 1st level
\item
\begingroup\enumerate \item 2nd level\endenumerate\endgroup
\item
\begingroup\enumerate \item 2nd level\endenumerate\endgroup
\endenumerate\endgroup
\end{document}
为什么在保存的部分内需要分组,而在直接部分却不需要?
在直接部分分组中,添加\begin{...}
和\end{...}
事实上\begin{...}
相当于\begingroup \...
类似于\end{...}
\end...\endgroup
这里
\begin{enumerate}=\begingroup\enumerate=\begingroup addtomacro...\BeginEnumerate=\begingroup addtomacro...\enumerate
和
\end{enumerate}=\endenumerate\endgroup=\addtomacro...\EndEnumerate\endgroup=\addtomacro...\endenumerate\endgroup
解决方案
\documentclass{article}
\makeatletter
\def\SavedEnum{}
\let\BeginEnumerate\enumerate
\let\EndEnumerate\endenumerate
\newenvironment{Enumerate}{\BeginEnumerate}{\EndEnumerate}
\def\enumerate{%
\g@addto@macro\SavedEnum{\begin{Enumerate}}%
\BeginEnumerate}
\def\endenumerate{%
\g@addto@macro\SavedEnum{\end{Enumerate}}%
\EndEnumerate%
}
\let\OldItem\item
\def\item<#1>{%
\g@addto@macro\SavedEnum{\OldItem#1}%
\OldItem%
}
\makeatother
\begin{document}
\begin{enumerate}
\item<1st level> level 1
\item<> \begin{enumerate}
\item<2nd level> level 2
\end{enumerate}
\item<> \begin{enumerate}
\item<2nd level> level 2
\end{enumerate}
\end{enumerate}
---
\SavedEnum
\end{document}