在宏中存储枚举会破坏 \endenumerate

在宏中存储枚举会破坏 \endenumerate

我需要改变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}

相关内容