使用 Babel 时无法重新定义枚举

使用 Babel 时无法重新定义枚举

我希望重新定义enumerate环境,以便通过不同的列表进行连续编号。我设法做到了这一点,但我的解决方案在使用 babel 包时失败了。这是我的 ECM:注释掉 babel 行后就没问题了。

有人能帮我解释一下这个包有什么问题吗?非常感谢。

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}

\def\nbq{0}
\let\oldenumerate\enumerate
\let\oldendenumerate\endenumerate
\renewenvironment{enumerate}{\oldenumerate\setcounter{enumi}{\nbq}}{\xdef\nbq{\theenumi}\oldendenumerate}

\begin{document}

\begin{enumerate}
\item \nbq
\item \nbq
\end{enumerate}

\begin{enumerate}
\item \nbq
\item \nbq
\end{enumerate}

\end{document}

答案1

babel因为法语模块重新定义了列表而造成了阻碍你的重新定义。

在我看来,最好使用基于以下方法的不同方法enumitem

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}

\usepackage{enumitem}
\newlist{contenum}{enumerate}{1}
\setlist[contenum]{label=\arabic*.,resume}

\begin{document}

\begin{contenum}
\item Item
\item Item
\end{contenum}
Break between the lists
\begin{contenum}
\item Item
\item Item
\end{contenum}

\end{document}

在此处输入图片描述

答案2

由于 egreg 已经声明(他只是比我快)babel-frenchlists提供的进行重新定义,因此在开始生效LaTeX后有必要进行自己的重新定义,即,将其添加到文档主体中或使用钩子,该钩子是连续处理的,即,重新定义已经完成,新的定义就可以生效了。babel\AtBeginDocument{...}babel

不过,当然,enumitem使用选项的方式resume更简单。

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}

\def\nbq{0}
\AtBeginDocument{%
  \let\oldenumerate\enumerate
  \let\oldendenumerate\endenumerate
  \renewenvironment{enumerate}{%
    \oldenumerate\setcounter{enumi}{\nbq}
  }{%
    \xdef\nbq{\number\value{enumi}}
    \oldendenumerate
  }
}
\begin{document}

\begin{enumerate}
\item \nbq
\item \nbq
\end{enumerate}

\begin{enumerate}
\item \nbq
\item \nbq
\end{enumerate}

\end{document}

在此处输入图片描述

相关内容