使用 easylist 语法的默认枚举环境

使用 easylist 语法的默认枚举环境

随附包装easylist,我们可以轻松创建嵌套列表:

\documentclass{article}
\usepackage[at]{easylist}
\begin{document}
\begin{easylist}
    @ First     % -> 1. First
    @@ Second   % -> 1.1. Second
    @@ Third    % -> 1.2. Third
    @ Fourth    % -> 2. Fourth
\end{easylist}
\end{document}

enumerate它还支持类似于的样式\begin{easylist}[enumerate]。但是,它内部不使用enumerate环境;例如,样式会随着包而改变enumitem没有效果。

所以有没有办法easylist使用enumerate环境语法编写嵌套列表?

此主题是相关的,我正在寻找一种混合解决方案第一个答案(内部使用itemize,但语法不同)和第二个答案(具有类似的语法,但不使用enumerate),而是+用 代替@

答案1

easylist它有自己的列表环境,独立于 LaTeX 的列表环境,因此如果不重写整个列表环境,您无法真正将它们集成在一起。下面是另一种实现,它只完成了一半的工作easylist:制作@平均值\item和多个@平均值嵌套列表——这是您想要的一半。这里的新命令\easyitem,根本不进行格式化,因此另一半,即布局,留给周围的列表环境,因此您可以使用enumerate包或enumitem或您喜欢的任何其他包进行格式化。

\easyitem[<char>]使<char>(应该是一个字符,默认为@) 成为执行列表簿记的活动标记。 \easyitem更改 catcode <char>(本地),因此列表自然不会在另一个命令的参数中起作用 (很像逐字命令)。该\easyitem命令应该在列表环境中使用,并且它将在更深的级别中使用相同的列表环境。所以

\begin{enumerate}
  \easyitem[@]
  @ one
  @@ two
\end{enumerate}

相当于

\begin{enumerate}
  \item one
  \begin{enumerate}
    \item two
  \end{enumerate}
\end{enumerate}

如果你使用过itemizedescription或任何其他,它会对这些环境执行相同的操作。

以下是环境中的代码filecontents和示例:

\begin{filecontents}{easyitem.sty}
\ifdefined\AtEndEnvironment
\else\RequirePackage{etoolbox}\fi
\newcount\easyitem@level
\newcount\easyitem@currlevel
  \easyitem@currlevel=1
\newif\if@ineasyitem
\newif\if@ineasyitemend
\newif\if@easyitembalancing
\newcommand\easyitem[1][@]{%
  \edef\easyitem@char{\unexpanded{#1}}%
  \@ineasyitemtrue
  \global\@easyitembalancingfalse
  \AtEndEnvironment{\@currenvir}{\easyitem@final@balance}
  \expandafter\easyitem@active\expandafter{\easyitem@char}%
  \ignorespaces}
\def\easyitem@active#1{%
  \begingroup
    \lccode`\~=`#1
    \lowercase{\endgroup
  \let~\easyitem@activeitem}%
  \catcode`#1=\active}
\def\easyitem@activeitem{%
  \global\easyitem@level=0
  \easyitem@item}
\def\easyitem@item{%
  \global\advance\easyitem@level by 1
  \futurelet\easy@let\easyitem@count}
\def\easyitem@count{%
  \ifx\easy@let\easyitem@activeitem
    \expandafter\expandafter
    \expandafter\easyitem@item
    \expandafter\@gobble
  \else
    \expandafter\easyitem@do
  \fi}
\def\easyitem@do{%
  \ifcase
       \ifnum\easyitem@currlevel=\easyitem@level 0\fi
       \ifnum\easyitem@currlevel>\easyitem@level 1\fi
       \ifnum\easyitem@currlevel<\easyitem@level 2\fi
       \relax
     \expandafter\item
  \or\expandafter\easyitem@decr
  \or\expandafter\easyitem@incr
  \fi}
\def\easyitem@decr{%
  \expandafter\easyitem@repeat\the\numexpr
    \easyitem@currlevel-\easyitem@level;\easyitem@decr\end}
\def\easyitem@incr{%
  \expandafter\easyitem@repeat\the\numexpr
    \easyitem@level-\easyitem@currlevel;\easyitem@incr\begin}
\def\easyitem@final@balance{%
  \if@ineasyitem \if@ineasyitemend \else
    \global\easyitem@level=1
    \global\@easyitembalancingtrue
    \easyitem@decr
  \fi\fi}
\def\easyitem@repeat#1;#2#3{%
  \ifnum#1=0
    \if@easyitembalancing \expandafter\@gobbletwo \fi
    \expandafter\item
  \else
    \ifx#3\end \@ineasyitemendtrue \fi
    \expandafter#3\expandafter{\@currenvir}%
    \ifx#3\begin
      \advance\easyitem@currlevel by 1
      \ifnum#1>1 \item\relax \fi
    \fi
    \expandafter#2%
  \fi}
\end{filecontents}
\documentclass{article}
\usepackage{easyitem}
\usepackage{enumitem}
\usepackage{color}
\begin{document}

\begin{enumerate}[label={\color{red}\Roman*}]
  \easyitem[@]
  @ First     % -> 1. First
  @@ Second   % -> 1.1. First
  @@ Third    % -> 1.2. Third
  @ Fourth    % -> 2. Fourth
\end{enumerate}

\end{document}

上面的例子使得:

在此处输入图片描述

答案2

这种方法用于tokcycle检查环境中的标记,但不执行它们,而是将它们添加到标记列表中。如果遇到@标记,它会计算连续标记的数量@,并将该数字与列表级别进行比较。如果更大,它会将新的级别插入enumerate到标记列表中,如果更小,它会enumerate在标记列表中结束一个级别。在任何标记序列之后@\item都会将 添加到标记列表中。

检查结束时,构建的令牌列表将插入到环境中。并\end{enumerate}提供结算。

\documentclass{article}
\usepackage{environ,tokcycle}
\newcounter{listlevel}
\newcounter{atcnt}
\Characterdirective{%
 \ifx @#1
  \stepcounter{atcnt}\gdef\atcounting{T}
 \else
  \if T\atcounting
    \ifnum\value{atcnt}>\value{listlevel}\relax
      \stepcounter{listlevel}%
      \addcytoks{\begin{enumerate}}%
    \else
      \ifnum\value{atcnt}<\value{listlevel}\relax
        \addtocounter{listlevel}{-1}%
        \addcytoks{\end{enumerate}}%
      \fi
    \fi
    \setcounter{atcnt}{0}%
    \gdef\atcounting{F}%
    \addcytoks{\item #1}%
  \else
    \addcytoks{#1}%
  \fi
 \fi
}
\NewEnviron{easylist}{%
  \setcounter{listlevel}{0}%
  \expandafter\tokcyclexpress\expandafter{\BODY}%
  \the\cytoks\end{enumerate}
}
\begin{document}
\begin{easylist}
    @ First     % -> 1. First
    @@ Second   % -> 1.1. Second
    @@@ next level a   % -> 1.1. Second
    @@@ next level b   % -> 1.1. Second
    @@ Third    % -> 1.2. Third
    @ Fourth    % -> 2. Fourth
\end{easylist}
\end{document}

在此处输入图片描述

相关内容