按字母顺序对扩展(newcommand/def)列表元素和条件格式进行迭代排序

按字母顺序对扩展(newcommand/def)列表元素和条件格式进行迭代排序

我正在尝试按字母顺序对需要扩展的元素数组进行排序。我使用了以下排序代码的修改版本这个答案,但我看到的是未排序的列表“Doga, Kittya1, Doga1”,而我期望的是已排序的扩展元素:“Doga, Doga1, Kittya1,”。显然我做错了,因为它甚至没有根据变量名称进行排序。此外,我想识别最后一次迭代,而不是在这种情况下打印逗号。我无法找到合适的数据工具变量。

\documentclass{article}
\usepackage{datatool}

\newcommand{\cat}[2][]{Kitty%
\ifthenelse{\equal{#1}{}}{}{%
  \ifthenelse{\equal{#2}{}}{$_{\small{#1}}$}
                           {$_{\small{#1#2}}$}}%
}
\newcommand{\dog}[2][]{Dog%
\ifthenelse{\equal{#1}{}}{}{%
  \ifthenelse{\equal{#2}{}}{$_{\small{#1}}$}
                           {$_{\small{#1#2}}$}}%
}

\def\CA{\cat[a]{1}}
\def\CB{\cat[b]{1}}
\def\DA{\dog[a]}
\def\DB{\dog[a]{1}}

\newcommand{\sortitem}[1]{%
  \DTLnewrow{list}% Create a new entry
  \DTLnewdbentry{list}{description}{#1}% Add entry as description
}
\newenvironment{sortedlist}{%
  \DTLifdbexists{list}{\DTLcleardb{list}}{\DTLnewdb{list}}% Create new/discard old list
}{%
  \DTLsort{description}{list}% Sort list
    \DTLforeach*{list}{\theDesc=description}{%
      \theDesc
, }% Print each item
}

\begin{document}
\begin{sortedlist}\sortitem{\DB}\sortitem{\CA}\sortitem{\DA}\end{sortedlist}
\end{document}

答案1

Ifthenelse 在环境中不起作用\DTLnewdbentry,我使用 更改了您的代码\ifx。我还必须\dtlexpandnewvalue在数据库条目之前添加:让命令和定义在存储之前展开。此外,在 dogA 中,您给出了可选参数而不是强制参数,这个错误使其定义要求下一个参数并在,扩展后采用。A 给出了一个空的强制参数……但我想我可以用 替换[]{}最后,\small在数学模式中不起作用。(搜索“latex 更改数学参数”的方法。)。

代码在这里:

\documentclass{article}
\usepackage{datatool}
\usepackage{tikz}
\usepackage{ifthen}
\newcommand{\cat}[2][]{Kitty%
\ifx#1\empty\relax\else
\ifx#2\empty\small{$_{#1}$}\else\small{$_{#1#2}$}\fi\fi%
}
\newcommand{\dog}[2][]{Dog%
\ifx#1\empty\relax\else
\ifx#2\empty\small{$_{#1}$}\else\small{$_{#1#2}$}\fi\fi%
}

\def\CA{\cat[a]{1}}
\def\CB{\cat[b]{1}}
\def\DA{\dog[a]{}}
\def\DB{\dog[a]{1}}

\newcommand{\sortitem}[1]{%
   \DTLnewrow{list}%
   \dtlexpandnewvalue
   \DTLnewdbentry{list}{description}{#1}%
}

\newenvironment{sortedlist}{%
  \DTLifdbexists{list}{\DTLcleardb{list}}{\DTLnewdb{list}}% Create new/discard old list
}{%
    \DTLsort*{description}{list}% Sort list
     \DTLforeach*{list}{\theDesc=description}{%%
      \theDesc 
, }% Print each item
}

\begin{document}



Unsorted:

\DB,\CA,\DA,\CB

Sorted:


\begin{sortedlist}
\foreach \i in {\DB,\CA,\DA,\CB}{\sortitem{\i}}
\end{sortedlist}
\end{document}

结果如下:

在此处输入图片描述

我已经链接:根据参数对数据工具中的数据进行排序 这里还有一个类似的问题,我在上面解释了这个问题,\ifthenelse但它可能被删除了。所以这两个问题给出了一个完整的答案。(可能它在某种程度上是重复的,但它与已删除的重复,因为链接\random也失败了)。

相关内容