表格内的排序输出

表格内的排序输出

目前,我正在尝试创建一个包含多个不同\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}

我还删除了一些由换行符引入的虚假空格。有关更多信息,请参阅%行末百分号 ( ) 有什么用?

相关内容