目前,我正在尝试创建一个包含多个不同\item
类似命令的环境。我希望不同命令的参数按其类型排序。
基本上使用
\begin{ordered}
\fruit{Apple}
\vegetable{Salad}
\vegetable{Bell Pepper}
\fruit{Strawberry}
\end{ordered}
应该导致
Apple
Strawberry
Salad
Bell Pepper
使用以下代码可以在基本层面上完成此操作
\newenvironment{ordered}{
\newcommand{\fruits}{}
\newcommand{\fruit}[1]{
\begingroup\def\temp{\renewcommand{\fruits}}
\expandafter\expandafter\expandafter\endgroup
\expandafter\temp\expandafter{\fruits{##1\\}}}
\newcommand{\vegetables}{}
\newcommand{\vegetable}[1]{
\begingroup\def\temp{\renewcommand{\vegetables}}
\expandafter\expandafter\expandafter\endgroup
\expandafter\temp\expandafter{\vegetables{##1\\}}}
}{
\fruits
\vegetables
}
但是,如果我想让我的有序环境打开一个包含水果和蔬菜的表格,我会遇到问题:
\newenvironment{ordered}{
...
\begin{tabular}{l}
}{
\fruits
\vegetables
\end{tabular}
}
结果是! Missing } inserted. <inserted text> } l.31 \end{ordered}
有没有办法在表格内的有序环境中使用\fruits
和?\vegetables
答案1
您在添加\fruits
和时包括了组\vegetables
。相反,\g@addto@macro<cs>{<stuff>}
宏可以帮助添加<stuff>
(<cs>
它需要\makeatletter
...\makeatother
一对):
\documentclass{article}
\makeatletter
\newcommand{\fruits}{}
\newcommand{\fruit}[1]{\g@addto@macro\fruits{#1\\}}
\newcommand{\vegetables}{}
\newcommand{\vegetable}[1]{\g@addto@macro\vegetables{#1\\}}
\makeatother
\newenvironment{ordered}{%
\renewcommand{\fruits}{\relax}\renewcommand{\vegetables}{\relax}% Clear fruits/vegetables
\tabular{l}
}{%
\expandafter\ifx\fruits\relax\else\fruits\hline\fi% Print fruits
\vegetables% Prints vegetables
\endtabular
}
\begin{document}
\begin{ordered}
\fruit{Apple}%
\vegetable{Salad}%
\vegetable{Bell Pepper}%
\fruit{Strawberry}%
\end{ordered}
\begin{ordered}
\vegetable{Salad}%
\vegetable{Bell Pepper}%
\end{ordered}
\end{document}
我还删除了一些由换行符引入的虚假空格。有关更多信息,请参阅%
行末百分号 ( ) 有什么用?