我想按字母顺序对以下 mwe 的上标进行排序。自动排序。
\documentclass{article}
\usepackage[utf8]{inputenc}
\newcommand{\x}[1]{\textsuperscript{#1}}
\newcommand{\red}{R}
\newcommand{\blu}{B}
\newcommand{\gre}{G}
\parindent0pt
\begin{document}
\section{the order I will use}
test 1\x{\red\gre} \\
test 2\x{\blu\red} \\
test 3\x{\gre\blu}
\section{the order I should use/what should be displayed}
test 1\x{\gre\red} \\
test 2\x{\blu\red} \\
test 3\x{\blu\gre}
\end{document}
当然,这很容易做到。但我从未真正开始在 latex 或任何可能被称为的程序中进行“编程”。如果需要任何说明,请询问,我们将不胜感激。
答案1
我把阿尔法气泡排序器简化了尝试消除递归过程中的堆栈溢出这样它就可以处理非逗号分隔的 1 个字符的数据。
限制:这使用每个标记的 ascii 码来对数据进行排序,以便大写字母Z
位于小写字母之前a
。
我在 MWE 的末尾展示了如何通用地使用排序器。
\documentclass{article}
\usepackage[utf8]{inputenc}
\newcommand{\x}[1]{\edef\tmp{#1}\alphabubblesort{\tmp}\textsuperscript{\sortedlist}}
\newcommand{\red}{R}
\newcommand{\blu}{B}
\newcommand{\gre}{G}
\parindent0pt
\newcommand\alphabubblesort[1]{\def\sortedlist{}\expandafter\sortlist#1\relax\relax}
\def\sortlist#1#2#3\relax{%
\let\next\relax
\ifx\relax#2\relax%
\edef\sortedlist{\sortedlist#1}%
\else
\ifnum`#1<`#2\relax%
\edef\sortedlist{\sortedlist#1}%
\def\next{\sortlist#2#3\relax}%
\else%
\ifnum`#1>`#2\relax%
\let\tmp\sortedlist%
\def\sortedlist{}%
\def\next{\expandafter\sortlist\tmp#2#1#3\relax}%
\fi%
\fi%
\fi%
\next
}
\begin{document}
\section{the order I will use}
test 1\x{\red\gre} \\
test 2\x{\blu\red} \\
test 3\x{\gre\blu}
\section{the order I should use/what should be displayed}
test 1\x{\gre\red} \\
test 2\x{\blu\red} \\
test 3\x{\blu\gre}
\textbf{To use just the sorter:}
\def\mydata{vkp!s45J[YO}
ASCII sorted data for \mydata{} is obtained simply with
\alphabubblesort{\mydata}\sortedlist.
\end{document}
答案2
关于 Steven B. Segletes 的回答,我扩展了这个问题,寻找一个嵌套的排序函数。这应该能够对中给出的 X 类型的宏\sortedNormal
以及\sortedSuperscript
在第一个 X 类型的宏中给出的 Y 类型的宏进行排序。
在写这个答案时,我意识到这可能太多了,尤其是当 X 类型的宏应该用逗号分隔时。这意味着我必须写入不同的sortedList
s,因为 Y 类型的宏不应该用逗号分隔。
因此,如果有解决方案,我将非常感激您的帮助,但这可能无法控制。
\documentclass{article}
\usepackage[utf8]{inputenc}
\newcommand{\sortedSuperscript}[1]{\edef\tmp{#1}\alphabubblesort{\tmp}\textsuperscript{\sortedlist}}
\newcommand{\sortedNormal}[1]{\edef\tmp{#1}\alphabubblesort{\tmp}\sortedlist}
\newcommand{\x}[1]{\sortedSuperscript{#1}}
%% macros of type X
\newcommand{\listA}{ColorlistA\x{\red\blu}}
\newcommand{\listB}{ColorlistB\x{\gre\blu}}
\newcommand{\listC}{ColorlistC\x{\red\gre}}
%% macros of type Y
\newcommand{\red}{R}
\newcommand{\blu}{B}
\newcommand{\gre}{G}
\parindent0pt
\newcommand\alphabubblesort[1]{\def\sortedlist{}\expandafter\sortlist#1\relax\relax}
\def\sortlist#1#2#3\relax{%
\let\next\relax
\ifx\relax#2\relax%
\edef\sortedlist{\sortedlist#1}%
\else
\ifnum`#1<`#2\relax%
\edef\sortedlist{\sortedlist#1}%
\def\next{\sortlist#2#3\relax}%
\else%
\ifnum`#1>`#2\relax%
\let\tmp\sortedlist%
\def\sortedlist{}%
\def\next{\expandafter\sortlist\tmp#2#1#3\relax}%
\fi%
\fi%
\fi%
\next
}
\begin{document}
\section{expected result hard coded}
ColorlistA\textsuperscript{BR}, ColorlistB\textsuperscript{BG}, ColorlistC\textsuperscript{RG}
\section{expected result with macros}
\sortedNormal{\listC\listA\listB}
\end{document}