我希望有一个环境可以被调用,\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}