当使用带有包选项“inline”的 enumitem 包时,使用 pgfkeys 在“enumerate”和“enumerate*”之间切换

当使用带有包选项“inline”的 enumitem 包时,使用 pgfkeys 在“enumerate”和“enumerate*”之间切换

不管我做什么,似乎都是错的。

我希望能够设置一个键来确定我的列表是如何排列的。

\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}

相关内容