编辑:
我的目标是对一组通过名称/代码指定的输出字符串进行排序。
- 实际上有 3 个组成部分,即“可记忆代码”(名字,如 Xenia、Alex 等)、“排序键”(数字,如 1、2 等)和“匿名代码”(Interview1、Interview2 等)。我的示例(如下)将排序键和匿名代码合并,并尝试根据匿名代码进行排序。
- 匿名代码和排序密钥在论文的不同草稿之间可能会发生变化。因此,它们应该在一个地方定义,而不要直接在文本的任何地方使用。
- 可记忆代码是作者希望在输出中写入匿名代码时在正文中使用的代码。无论匿名代码要输出到何处,都应按其排序键排序后按顺序输出。
我正在使用 Steven 的第二种解决方案。我所寻求的输出是通过以下方式捕获的:
Sorted anonymous (input by interviewees): \sortinterviewees{John, Julia, Xenia, Lucy}\par
原来的(标题为:对包含字母数字下标的宏进行排序)
我正在尝试生成排序输出并使用 David 修改后的排序发布在这里。我想知道如何调整它以适应包含下标字符的混合字母数字文本。
最小示例:
\documentclass{article}
\usepackage{xspace}
%%% -- Copied sort -- %%%
\newcommand\alphabubblesort[1]{\def\sortedlist{}\expandafter\sortlist#1,\cr,\relax}
\def\sortlist#1,#2,#3\relax{%
\let\next\relax
\ifx\cr#2\relax%
\edef\sortedlist{\sortedlist#1}%
\else
\picknext#1!,#2!\relax%
\if F\flipflop%
\edef\sortedlist{\sortedlist#1,}%
\def\next{\sortlist#2,#3\relax}%
\else%
\let\tmp\sortedlist%
\def\sortedlist{}%
\def\next{\expandafter\sortlist\tmp#2,#1,#3\relax}%
\fi%
\fi%
\next
}
\def\picknext#1#2,#3#4\relax{%
\ifnum\the\lccode`#1<\the\lccode`#3\relax
\xdef\flipflop{F}%
\else%
\ifnum\the\lccode`#1>\the\lccode`#3\relax%
\xdef\flipflop{T}%
\else%
\ZZfifi{\picknext#2!,#4!\relax}%
\fi%
\fi%
}
%%% ----------------- %%%
\newcommand\interview[1]{Interview$_{#1}$\xspace}
%% Edit: added in some additional interviews.
\newcommand\Julia{\interview{1}}
\newcommand\Lucy{\interview{2}}
\newcommand\Alex{\interview{3}}
\newcommand\Xenia{\interview{4}}
\newcommand\John{\interview{5}}
\newcommand\Jane{\interview{6}}
\begin{document}
How it should look:
\Julia, \Alex, \Xenia.
But I'd like to be able to type:
\Alex, \Julia, \Xenia
This sort works on words only:
\alphabubblesort{Alex, Xenia, Julia}\sortedlist
\end{document}
示例输出:
在这个例子中,请假设将来格式和编号都可能会发生变化(这当然也是为什么首先需要动态编号的原因),例如,一种可能的变化是:
\newcommand\interview[1]{\textit{I$_{#1}$\xspace}}
\newcommand\Julia{\interview{3}}
\newcommand\Alex{\interview{2}}
\newcommand\Xenia{\interview{1}}
答案1
您无法对扩展为\textit
和之类的格式化命令进行排序\xspace
。相反,您必须创建一个系统,通过该系统您可以按字母或数字键进行排序,并使用该键生成格式化的输出。
修订方法
我认为 OP 最终同意排序键可以是数字。在这种情况下,排序器不必是字母排序,而可以是简单的数字冒泡排序,如以下答案所示:使用 LaTeX 压缩数字列表
\documentclass{article}
\usepackage{listofitems}
\def\listterminator{-1}% SET TO *ANY* VALUE KNOWN NOT TO BE IN LIST (POSITIVE OR NEGATIVE)
\newcommand\bubblesort[1]{\def\sortedlist{}\sortlist#1,\listterminator,\relax}
\def\sortlist#1,#2,#3\relax{%
\ifnum#2=\listterminator\relax%
\edef\sortedlist{\sortedlist#1}%
\else
\ifnum#1<#2\relax%
\edef\sortedlist{\sortedlist#1,}%
\sortlist#2,#3\relax%
\else%
\let\tmp\sortedlist%
\def\sortedlist{}%
\expandafter\sortlist\tmp#2,#1,#3\relax%
\fi%
\fi%
}
\newcommand\interviewlist[2][a]{%
\setsepchar{,}%
\readlist*\mykeys{#2}%
\foreachitem\x\in\mykeys[]{\ifnum\xcnt=1\else, \fi\interview{\x}%
\ifx a#1\relax\else\ (\csname interview\x\endcsname)\fi}%
}
\newcommand\interview[1]{\textit{Interview$_{#1}$}}
\newcommand\setinterview[2]{\expandafter\def\csname interview#1\endcsname{#2}}
\newcommand\sortinterviews[2][a]{\bubblesort{#2}\interviewlist[#1]{\sortedlist}}
\begin{document}
\setinterview{1}{Julia}
\setinterview{2}{Lucy}
\setinterview{3}{Alex}
\setinterview{4}{Xenia}
\setinterview{5}{John}
\setinterview{6}{Jane}
Bubble Sort Demonstration: \bubblesort{3,2,5}\sortedlist\par
Sorted anonymous: \sortinterviews{3 , 2 ,5}\par
Sorted revealed: \sortinterviews[]{3 , 2 ,5}
\end{document}
但这里有一个更复杂的版本,允许通过数字(如上面的 MWE 所示)或交替通过名称指定访谈。这里的方法是在进行排序之前将名称转换为访谈编号,以便可以维护数字冒泡排序方法。
有几点需要注意。当访谈被指定为
\setinterview{1}{Julia}
\setinterview{2}{Lucy}
\setinterview{3}{Alex}
\setinterview{4}{Xenia}
\setinterview{5}{John}
\setinterview{6}{Jane}
每一个都有相应的宏设置,例如\csname interview1\endcsname
设置为{Julia}
,\intervieweeJulia
设置为{1}
。这将允许从名称中提取数字,反之亦然。
\documentclass{article}
\usepackage{listofitems}
\def\listterminator{-1}% SET TO *ANY* VALUE KNOWN NOT TO BE IN LIST (POSITIVE OR NEGATIVE)
\newcommand\bubblesort[1]{\def\sortedlist{}\sortlist#1,\listterminator,\relax}
\def\sortlist#1,#2,#3\relax{%
\ifnum#2=\listterminator\relax%
\edef\sortedlist{\sortedlist#1}%
\else
\ifnum#1<#2\relax%
\edef\sortedlist{\sortedlist#1,}%
\sortlist#2,#3\relax%
\else%
\let\tmp\sortedlist%
\def\sortedlist{}%
\expandafter\sortlist\tmp#2,#1,#3\relax%
\fi%
\fi%
}
\newcommand\interviewlist[2][a]{%
\setsepchar{,}%
\readlist*\mykeys{#2}%
\foreachitem\x\in\mykeys[]{\ifnum\xcnt=1\else, \fi\interview{\x}%
\ifx a#1\relax\else\ (\csname interview\x\endcsname)\fi}%
}
\newcommand\interview[1]{\textit{Interview$_{#1}$}}
\newcommand\setinterview[2]{%
\expandafter\def\csname interview#1\endcsname{#2}%
\expandafter\def\csname interviewee#2\endcsname{#1}%
}
\newcommand\sortinterviews[2][a]{\bubblesort{#2}\interviewlist[#1]{\sortedlist}}
\newcommand\sortinterviewees[2][a]{%
\setsepchar{,}%
\readlist*\mynames{#2}%
\def\tmp{}%
\foreachitem\x\in\mynames[]{%
\ifnum\xcnt=1\relax\else\edef\tmp{\tmp,}\fi%
\edef\tmp{\tmp\csname interviewee\x\endcsname}%
}%
\expandafter\bubblesort\expandafter{\tmp}\interviewlist[#1]{\sortedlist}%
}
\begin{document}
\setinterview{1}{Julia}
\setinterview{2}{Lucy}
\setinterview{3}{Alex}
\setinterview{4}{Xenia}
\setinterview{5}{John}
\setinterview{6}{Jane}
Input by interview numbers: 3, 2, 5\par
Sorted anonymous: \sortinterviews{3 , 2 ,5}\par
Sorted revealed: \sortinterviews[]{3 , 2 ,5}\par\medskip
Input by interviewees: John, Julia, Xenia\par
Sorted anonymous: \sortinterviewees{John, Julia, Xenia}\par
Sorted revealed: \sortinterviewees[]{John, Julia, Xenia}\par
\end{document}