![是否可以在反向列表中中断并恢复(如 etemune)?](https://linux22.com/image/315463/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%9C%A8%E5%8F%8D%E5%90%91%E5%88%97%E8%A1%A8%E4%B8%AD%E4%B8%AD%E6%96%AD%E5%B9%B6%E6%81%A2%E5%A4%8D%EF%BC%88%E5%A6%82%20etemune%EF%BC%89%EF%BC%9F.png)
我正在尝试找到一种使用反向列表来中断和恢复的方法。
看起来环境etaremune
和选项resume
不兼容。
我能做些什么吗?
谢谢。
答案1
据我所知,你不能立即做到这一点,但稍加调整就可以实现。
resume
下面是一个环境密钥的实现etaremune
,它模仿了包中相同密钥的行为enumitem
。修改enumitem
为倒数计数也应该是可能的,但可能需要付出更多努力。
\documentclass{article}
\usepackage{etaremune}
\usepackage{etoolbox} %% For \AtEndEnvironment
\makeatletter %% <- change @ so that it can be used in macro names
%% Define the resume key for etaremune:
\define@boolkey[EM]{etaremune}{resume}[true]{}
\presetkeys[EM]{etaremune}{resume=false}{} %% <- false by default
%% Increase starting value of previous etaremune environment if resuming
\AtEndEnvironment{etaremune}{%
\ifEM@etaremune@resume
\EM@resumewrite{\csname EM@prevlist@\@roman{\@enumdepth}\endcsname}{\EM@currlist}%
\fi
\expandafter\xdef\csname EM@prevlist@\@roman{\@enumdepth}\endcsname{\EM@currlist}%
}
\newcommand*\EM@resumewrite[2]{% %% Expand arguments and then call EM@resume@write@
\begingroup
\edef\temp{\noexpand\EM@resumewrite@
{\expandafter\string\csname etaremune@#1\endcsname}%
{\expandafter\string\csname etaremune@#2\endcsname}}%
\temp
\endgroup
}
\newcommand*\EM@resumewrite@[2]{% %% Write to aux file
\immediate\write\@auxout{\xdef#1{\string\noexpand\string\the\numexpr#1+\string\noexpand#2 }}%
}
\makeatother %% <- change @ back
\begin{document}
\begin{etaremune}
\item Some words \item More words
\end{etaremune}
Interruption
\begin{etaremune}[resume]
\item
Some words
\item
More words
\begin{etaremune}
\item Some words \item More words
\end{etaremune}
Interruption
\begin{etaremune}[resume]
\item Some words \item More words
\end{etaremune}
\end{etaremune}
Interruption
\begin{etaremune}[resume]
\item Some words \item More words \item Final words
\end{etaremune}
\end{document}
工作原理:
该etaremune
包将每个环境的起始值写入etaremune
辅助文件。<n>
第个环境的值存储在宏中\etaremune@<n>
(<n>
格式为罗马数字)。在每个环境开始时etaremune
,枚举计数器都会设置为此值(加一,因为它将减少)。
因此,我们唯一要做的就是,\etaremune@<m>
每当下一个etaremune
处于相同深度的环境有键时,修改的值resume
。不过,当有多个中断时,让它工作(分两次运行)有点棘手。我所做的就是写
\xdef \etaremune@<m>{\noexpand\the\numexpr \etaremune@<m>+\noexpand\etaremune@<n> }
<n>
每当-thetaremune
环境恢复 -th时,都会添加到辅助文件中<m>
。这将设置\etaremune@<m>
为其原始值与 的值之和\etaremune@<n>
。之所以有 s,是因为如果稍后更改(由于其下方存在另一个),\noexpand
的值\etaremune@f<m>
将受到影响。\etaremune@<n>
resume