随附包装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}
如果你使用过itemize
或description
或任何其他,它会对这些环境执行相同的操作。
以下是环境中的代码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}