不管我做什么,似乎都是错的。
我希望能够设置一个键来确定我的列表是如何排列的。
\documentclass{article}
\usepackage[inline]{enumitem}
\usepackage{xparse}
\usepackage{pgfkeys}
\usepackage{pgffor}
\pgfkeys{/ae/testing/.cd,
list collection/.store in=\mylistcollection,
arrange horizontally/.code={\def\myenumitem{enumerate*}},
}
\def\myenumitem{enumerate}
\def\aeset#1{\pgfkeys{/ae/testing/.cd,#1}}
\def\aeget#1{\pgfkeysvalueof{/ae/testing/#1}}
\NewDocumentCommand{\mylist}{ m }
{\bgroup
\aeset{#1}
\expandafter\begin\expandafter{\myenumitem}[label=(\alph*)]
\foreach \x in \mylistcollection {\item \x}
\expandafter\end\expandafter{\myenumitem}
\egroup
}
\pagestyle{empty}
\begin{document}
\mylist{list collection={a,b,c,d}}
\mylist{list collection={a,b,c,d},arrange horizontally}
\end{document}
最初,我想将密钥arrange horizontally
定义为
arrange horizontally/.is if=ArrangeHorizontally,
然后定义
\newif\ifArrangeHorizontally
\ArrangeHorizontallyfalse
但这也给我带来了问题(事实上,我从来没有能够.is if
按照我期望的方式去工作)。
尽管如此,我上面写的代码还是会导致错误:
! Extra }, or forgotten \endgroup.
\item ...ctor \relax \fi }\color@endgroup \egroup
\enit@outeritem
l.32 ...collection={a,b,c,d},arrange horizontally}
?
我不明白发生了什么。我认为一切都应该如预期的那样发展。
我也尝试\expandafter\begin\expandafter{....
通过直接调用\enit@enumerate*
或来解决这个问题enit@enumerate
。但这也导致了错误。
更新
这是我尝试的.is if
方法
\documentclass{article}
\usepackage[inline]{enumitem}
\usepackage{xparse}
\usepackage{pgfkeys}
\usepackage{pgffor}
\pgfkeys{/ae/testing/.cd,
list collection/.store in=\mylistcollection,
arrange horizontally/.is if=ArrangeHorizontally,
}
\newif\ifArrangeHorizontally
\ArrangeHorizontallyfalse
\def\myenumitem{enumerate}
\def\aeset#1{\pgfkeys{/ae/testing/.cd,#1}}
\def\aeget#1{\pgfkeysvalueof{/ae/testing/#1}}
\makeatletter
\NewDocumentCommand{\mylist}{ m }
{\bgroup
\aeset{#1}
\ifArrangeHorizontally\@nameuse{enumerate*}\else\expandafter\@nameuse{enumerate}\fi
[label=(\alph*)]
\foreach \x in \mylistcollection {\item \x}
\ifArrangeHorizontally\@nameuse{endenumerate*}\else\expandafter\@nameuse{endenumerate}\fi
\egroup
}
\makeatother
\pagestyle{empty}
\begin{document}
\mylist{list collection={a,b,c,d}}
\mylist{list collection={a,b,c,d},arrange horizontally=true}
\end{document}
答案1
以下是我的做法。代码使用了\etoolbox
的列表处理工具,尤其是\forlistloop{<handler>}{<list macro>}
(可扩展)。由于它已经加载,因此它还使用了\etoolbox
的布尔测试及其\ifdefempty
和\csuse
。
我添加了一条警告消息,以防出现空列表或没有列表的情况。
\documentclass{article}
\usepackage[inline]{enumitem}
\usepackage{pgfkeys,etoolbox}
\makeatletter
\newbool{ae@enumerate@inline}
\def\ae@list@collection{}
\pgfkeys{
ae/.cd ,
list collection/.code =
\forcsvlist{\listadd\ae@list@collection}{#1} ,
arrange horizontally/.is if = ae@enumerate@inline
}
\newrobustcmd\aeset[1]{\pgfkeys{ae/.cd,#1}}
\newrobustcmd\aelist[1]{%
\begingroup
\aeset{#1}%
\ifdefempty\ae@list@collection{%
\@latex@warning@no@line{%
\string\aelist: Empty List! I'll do nothing\on@line
}%
}
{%
\ifbool{ae@enumerate@inline}
{\csuse{enumerate*}}
{\enumerate}[label=(\alph*)]
\forlistloop{\item}\ae@list@collection
\ifbool{ae@enumerate@inline}
{\csuse{endenumerate*}}
{\endenumerate}%
}%
\endgroup
}
\begin{document}
\aelist{list collection={one,two}}
\aelist{list collection={one,two},arrange horizontally}
\aelist{list collection={one,two}}
\aeset{arrange horizontally=true}
\aelist{list collection={one,two}}
\end{document}