对命令的数字参数进行排序,同时保留索引

对命令的数字参数进行排序,同时保留索引

我目前正在努力解决一个有点复杂的命令想法(至少就我的技能水平而言),并希望得到社区的一些批评、建议和评论。

我有一个新命令lstin,它采用 4 个数字参数,当前处理这些值并且仅输出非零值以及文本标识符,并在需要时在各个块之间放置逗号。

目前的结构如下

\usepackage{xstring}
\newboolean{commaid}
\setboolean{commaid}{false}

\newcommand\lstin[4]{
\IfStrEq{#1}{0}{}{A~(#1)\setboolean{commaid}{true}}%
\IfStrEq{#2}{0}{}{\ifthenelse{\boolean{commaid}}{, }{}B~(#2)\setboolean{commaid}{true}}%
\IfStrEq{#3}{0}{}{\ifthenelse{\boolean{commaid}}{, }{}C~(#3)\setboolean{commaid}{true}}%
\IfStrEq{#4}{0}{}{\ifthenelse{\boolean{commaid}}{, }{}D~(#4)}%
}

例如,\lstin{0}{8}{12}{0}返回B (8), C (12)。但是,我希望按大小对输出进行排序。假设在刚才提到的例子中,输出应该是C (12), B (8)

我通常的编程方法是使用已排序的数组,然后相应地使用数组中的旧位置和新位置进行输出。但是,我目前的知识水平,加上较长的研究,让我目前看不到解决方案。

因此,我将非常感激任何形式的评论、帮助或改进,特别是对我的总体方法的帮助。

此致!

答案1

这是一个解决方案expl3

我用以下形式的项填充序列

\__lpo_lstin_item:nn {<value>}{<letter}

我可以基于 进行排序<value>(排序代码利用了\use_ii:nnn返回第二部分,因此<value>)。仅当非零时才添加该项目。

最后,序列以项目之间的“逗号和空格”形式传递;命令\__lpo_lstin_item:nn打印括号中的字母、不间断空格和值。

\documentclass{article}

\ExplSyntaxOn

% the user interface
\NewDocumentCommand{\lstin}{mmmm}
 {
  \lpo_lstin:nnnn { #1 } { #2 } { #3 } { #4 }
 }

% variables
\seq_new:N \l_lpo_lstin_items_seq

% the internal function
\cs_new_protected:Nn \lpo_lstin:nnnn
 {
  % populate the sequence
  \seq_clear:N \l_lpo_lstin_items_seq
  \__lpo_lstin_add:nn { #1 } { A }
  \__lpo_lstin_add:nn { #2 } { B }
  \__lpo_lstin_add:nn { #3 } { C }
  \__lpo_lstin_add:nn { #4 } { D }
  % sort the sequence
  \__lpo_lstin_sort:
  % deliver the result
  \seq_use:Nn \l_lpo_lstin_items_seq { ,~ }
 }

% auxiliary functions

% add the item only if nonzero
\cs_new_protected:Nn \__lpo_lstin_add:nn
 {
  \int_compare:nF { #1 == 0 }
   {
    \seq_put_right:Nn \l_lpo_lstin_items_seq { \__lpo_lstin_item:nn {#1}{#2} }
   }
 }
% sort the sequence
\cs_new_protected:Nn \__lpo_lstin_sort:
 {
  \seq_sort:Nn \l_lpo_lstin_items_seq
   {
    \int_compare:nNnTF { \use_ii:nnn ##1 } > { \use_ii:nnn ##2 }
     {
      \sort_return_same:
     }
     {
      \sort_return_swapped:
     }
   }
 }
% print the item
\cs_new:Nn \__lpo_lstin_item:nn { (#2)\nobreakspace #1 }

\ExplSyntaxOff

\begin{document}

\lstin{4}{3}{2}{1}

\lstin{1}{2}{3}{4}

\lstin{0}{8}{12}{0}

\end{document}

在此处输入图片描述

相关内容