在分配标签类型之前预先确定嵌套层数

在分配标签类型之前预先确定嵌套层数

我使用该enumitem包来设置计数器类型,例如大多数时候我不需要超过 3 个级别,这是我的首选设置:

\setlist[enumerate,1]{label={\arabic*)},ref={\arabic*)}}
\setlist[enumerate,2]{label={\roman*)},ref={\roman*)}}
\setlist[enumerate,3]{label={\alph*)},ref={\alph*)}}

为了以防万一我需要第四级,我已经设置了

\setlist[enumerate,4]{label={\Alph*)},ref={\Alph*)}}

但当然,以需要四个级别为条件,使用类似的东西会更令人愉快

\setlist[enumerate,1]{label={\arabic*)},ref={\arabic*)}}
\setlist[enumerate,2]{label={\Roman*)},ref={\Roman*)}}
\setlist[enumerate,3]{label={\roman*)},ref={\roman*)}}
\setlist[enumerate,4]{label={\alph*)},ref={\alph*)}}

所以我想要做的是在第一次运行 pdflatex 后找到最大级别数,然后根据该数字设置标签类型。有什么办法吗?

这是 MWE。在这个例子中,我有四个级别,并希望以这么多活动级别的存在为条件,然后在级别 2 中切换到 \Roman,在级别 3 中切换到 \roman。

\documentclass{amsart}
\usepackage{enumitem}
\setlist[enumerate,1]{label={\arabic*).},ref={\arabic*)}}
\setlist[enumerate,2]{label={\roman*)},ref={\roman*)}}
\setlist[enumerate,3]{label={\alph*)},ref={\alph*)}}
\setlist[enumerate,4]{label={\Roman*)},ref={\Roman*)}}
\begin{document}
\begin{enumerate}
    \item level 1
    \begin{enumerate}
        \item  level 2
        \begin{enumerate}
            \item level 3   
            \begin{enumerate}
                \item level 4
            \end{enumerate} 
        \end{enumerate} 
    \end{enumerate}
\end{enumerate}
\end{document}

谢谢您的任何建议。

答案1

当然,只需使用该.aux文件,例如像这样。

\documentclass{article}

\usepackage{enumitem}

\makeatletter
  \newif\if@enumerate@leveliv@used
  \AtBeginDocument{%
    \if@enumerate@leveliv@used
      \setlist[enumerate,1]{label={\arabic*)}}
      \setlist[enumerate,2]{label={\Roman*)}}
      \setlist[enumerate,3]{label={\roman*)}}
      \setlist[enumerate,4]{label={\alph*)}, before*={\global\@enumerate@leveliv@usedtrue}}
    \else
      \setlist[enumerate,1]{label={\arabic*)}}
      \setlist[enumerate,2]{label={\roman*)}}
      \setlist[enumerate,3]{label={\alph*)}}
      \setlist[enumerate,4]{label={\Alph*)}, before*={\global\@enumerate@leveliv@usedtrue}}
    \fi
    \@enumerate@leveliv@usedfalse
  }
  \AtEndDocument{%
    \protected@write\@auxout{}{%
      \global
      \if@enumerate@leveliv@used
        \protect\@enumerate@leveliv@usedtrue
      \else
        \protect\@enumerate@leveliv@usedfalse
      \fi
    }%
  }
\makeatother

\begin{document}

\begin{enumerate}
  \item level 1
  \begin{enumerate}
    \item  level 2
    \begin{enumerate}
      \item level 3
      \begin{enumerate}
        \item level 4
      \end{enumerate} 
    \end{enumerate} 
  \end{enumerate}
\end{enumerate}

\end{document}

  • 与文件一样.aux,您必须运行两次 LaTeX 才能使更改生效。
  • 如果您希望ref拥有与 相同的值label,则不必明确设置它。

相关内容