我正在为我的学生准备完形填空 (“填空”) 工作表。它们包含带有空白的文本,必须使用文本下方列表中的单词(有或没有重复)来填充这些空白。出于显而易见的原因,列表不应按文本中出现的顺序排列,因此我希望按字母顺序排列。
我复制粘贴了(并稍作修改)了论坛上找到的一些代码。我真的是一个很基础的 LaTeX 用户,根本不理解这些代码,但它似乎对我来说运行得很好……除了顺序,它是按时间顺序而不是按字母顺序排列的。在使用基于/addmark
和的这个代码之前/printmarks
,我曾尝试使用index
和glossary
,但没能让它们按我想要的方式工作。
我不知道这是否会产生任何影响,但我使用 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}