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