按字母顺序对索引词列表进行排序

按字母顺序对索引词列表进行排序

我正在为我的学生准备完形填空 (“填空”) 工作表。它们包含带有空白的文本,必须使用文本下方列表中的单词(有或没有重复)来填充这些空白。出于显而易见的原因,列表不应按文本中出现的顺序排列,因此我希望按字母顺序排列。

我复制粘贴了(并稍作修改)了论坛上找到的一些代码。我真的是一个很基础的 LaTeX 用户,根本不理解这些代码,但它似乎对我来说运行得很好……除了顺序,它是按时间顺序而不是按字母顺序排列的。在使用基于/addmark和的这个代码之前/printmarks,我曾尝试使用indexglossary,但没能让它们按我想要的方式工作。

我不知道这是否会产生任何影响,但我使用 XeLaTeX 和日语字符。

\documentclass{article}
\usepackage{xcolor}
\usepackage{framed}
\usepackage[parfill]{parskip}
\usepackage{xeCJK}
\usepackage{expl3}
\usepackage{xparse}

\definecolor{shadecolor}{RGB}{210,210,210}

\ExplSyntaxOn
\seq_new:N \g_khaurum_wordlist_seq

\NewDocumentCommand{ \addmark }{ m }{
   \seq_gput_right:Nn \g_khaurum_wordlist_seq { #1 }
   #1
}

\NewDocumentCommand{ \printmarks }{s}{
%    \seq_gremove_duplicates:N \g_khaurum_wordlist_seq          % removes duplicates
    \seq_use:Nnnn \g_khaurum_wordlist_seq { ~  --  ~ } { ~  --  ~ } { ~  --  ~ }
    \IfBooleanT { #1 } {
        \seq_gclear:N \g_khaurum_wordlist_seq
    }
}

\ExplSyntaxOff

%\newcommand\gap[1]{{\colorbox{white}{\textcolor{white}{#1}}}}      %this makes a gap
\newcommand\gap[1]{{\colorbox{white}{\textcolor{red}{#1}}}}         %this makes red letters

\begin{document}

\begin{snugshade*}
\begin{framed}
\begingroup\ttfamily

The marked \gap{\addmark{words}} should appear in \gap{\addmark{alphabetical}} order, not in the order they occur in.

\endgroup
\end{framed} 
\end{snugshade*}

\printmarks

\end{document}

答案1

您可以使用\__str_if_eq:nn对序列进行排序以获得:

在此处输入图片描述

这只需要对您的代码进行少量修改:

\documentclass{article}
\usepackage{xcolor}
\usepackage{framed}
\usepackage[parfill]{parskip}
\usepackage{xeCJK}
\usepackage{expl3}
\usepackage{xparse}

\definecolor{shadecolor}{RGB}{210,210,210}

\ExplSyntaxOn
\seq_new:N \g_khaurum_wordlist_seq

\NewDocumentCommand{ \addmark }{ m }{
   \seq_gput_right:Nn \g_khaurum_wordlist_seq { #1 }
   #1
}

\NewDocumentCommand{ \printmarks }{s}{
%    \seq_gremove_duplicates:N \g_khaurum_wordlist_seq          % removes duplicates
   \seq_gsort:Nn \g_khaurum_wordlist_seq {
      \int_compare:nTF { \__str_if_eq:nn { ##1 } { ##2 } < 0 }
                     {\sort_return_same:}
                     {\sort_return_swapped:}
   }
     \seq_use:Nnnn \g_khaurum_wordlist_seq { ~  --  ~ } { ~  --  ~ } { ~  --  ~ }
    \IfBooleanT { #1 } {
        \seq_gclear:N \g_khaurum_wordlist_seq
    }
}

\ExplSyntaxOff

%\newcommand\gap[1]{{\colorbox{white}{\textcolor{white}{#1}}}}      %this makes a gap
\newcommand\gap[1]{{\colorbox{white}{\textcolor{red}{#1}}}}         %this makes red letters

\begin{document}

\begin{snugshade*}
\begin{framed}
\begingroup\ttfamily

The marked \gap{\addmark{words}} should appear in \gap{\addmark{alphabetical}} order, not in the order they occur in.

\endgroup
\end{framed}
\end{snugshade*}

\printmarks

\end{document}

相关内容