有条件地添加多列来枚举环境

有条件地添加多列来枚举环境

我希望有一个环境可以被调用,\begin{myenv}当被调用时,它会有条件地添加多列\begin{myenv}{<number of columns>}

这是我尝试过的:

\documentclass{article}
   \usepackage{enumitem}
   \usepackage{multicol}

\makeatletter
\newenvironment{myenv}[1]{
    \def\@tempa{#1}%
   \ifx\@tempa\@empty
        \expandafter\@firstoftwo
   \else
        \expandafter\@secondoftwo
    \fi
        {%
        \begin{enumerate}[label=\Alph*),itemsep=0pt,#1]
        }
        {%
        \setlength{\multicolsep}{5pt}
        \begin{multicols}{#1}
            \begin{enumerate}[label=\Alph*),itemsep=0pt]
        }
    }
    {\ifx\@firstoftwo
        \end{enumerate}
    \else
        \end{enumerate}\end{multicols}
    \fi
    }
\makeatother
\begin{document}

\begin{myenv}{5}
   \item dog
   \item cat
   \item duck
   \item fly
\item spider
\end{myenv}
\end{document}

不幸的是,只有当指定了列数时它才有效,如果我调用 just\begin{myenv}并且触发错误并且 latex 告诉我 0 列不是一个好主意。

有没有办法来解决这个问题?

答案1

在我看来,这个论点应该\myenv是可选的,所以如果没有表达,它就会被视为一个。

但是,错误出现在 部分\end,其中\ifx\@firstoftwo是错误的。使用 也是\@tempa错误的,因为事实证明它被 所使用,因此它在评估multicol该部分之前就改变了值。\end

\documentclass{article}

\usepackage{enumitem}
\usepackage{multicol}

\makeatletter
\newenvironment{myenv}[1][]% one optional argument
  {\def\myenv@tempa{#1}%
   \ifx\myenv@tempa\@empty
     \expandafter\@firstoftwo
   \else
     \expandafter\@secondoftwo
   \fi
   {%
    \begin{enumerate}[label=\Alph*),itemsep=0pt,#1]%
   }%
   {%
    \setlength{\multicolsep}{5pt}
    \begin{multicols}{#1}
    \begin{enumerate}[label=\Alph*),itemsep=0pt]
   }%
  }
  {\ifx\myenv@tempa\@empty
     \expandafter\@firstoftwo
   \else
     \expandafter\@secondoftwo
   \fi
   {\end{enumerate}}%
   {\end{enumerate}\end{multicols}}
  }
\makeatother
\begin{document}

\begin{myenv}[5]% <--- number of columns in square brackets!
  \item dog
  \item cat
  \item duck
  \item fly
  \item spider
\end{myenv}
\end{document}

这是一个不同的实现xparse,它允许在\end部分中携带参数说明符。

\documentclass{article}

\usepackage{enumitem}
\usepackage{multicol}
\usepackage{xparse}

\NewDocumentEnvironment{myenv}{o}
 {%
  \IfValueT{#1}
   {%
    \setlength{\multicolsep}{5pt}%
    \begin{multicols}{#1}%
   }%
  \begin{enumerate}[label=\Alph*),itemsep=0pt]%
 }
 {%
  \end{enumerate}
  \IfValueT{#1}
   {%
    \end{multicols}%
   }%
 }

\begin{document}

\begin{myenv}[5]
  \item dog
  \item cat
  \item duck
  \item fly
  \item spider
\end{myenv}
\end{document}

在此处输入图片描述

相关内容