使用收据如何处理以逗号分隔的列表?,我针对自己的需求阐述了如下代码:
\ExplSyntaxOn
%\seq_new:N \l_input_seq % declare a list (seq) variable
\cs_if_exist:NTF \l_input_seq { } { \seq_new:N \l_input_seq }
%\tl_new:N \l_last_word_tl % declare a "token list" variable
\cs_if_exist:NTF \l_last_word_tl { } { \tl_new:N \l_last_word_tl }
\NewDocumentCommand { \PrintAnswer } { m }
{
\file_if_exist:nTF {#1}
{
\iow_term:n {****~Printing~#1}
\file_input:n {#1}
\refstepcounter {subsection}
}
{
\iow_term:n {****~#1~not~found~****}
%\iow_term:n {****~splitting~#1~about~/~****}
% Split the argument into words about / sign.
\seq_set_split:Nnn \l_input_seq { / } {#1}
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%% Remove the last word from the seq.
%\seq_pop_right:NN \l_input_seq \l_last_word_tl
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% Stores the right-most item from a <sequence> in the <token list
% variable> without removing it from the <sequence>. The <token list
% variable> is assigned locally. If <sequence> is empty the <token
% list variable> will contain the special marker \q_no_value
\seq_get_right:NN \l_input_seq \l_last_word_tl
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\file_if_exist:nTF {\l_last_word_tl}
{
\iow_term:x {****~Printing~\l_last_word_tl~****}
\file_input:n { \l_last_word_tl }
\refstepcounter {subsection}
}
{
%\iow_term:n {****~\l_last_word_tl~not~found~****}
%\iow_term:x {****~\l_last_word_tl~not~found~****}
\iow_term:x {****~\l_last_word_tl\space not~found~****}
}
}
}
\cs_generate_variant:Nn \clist_map_inline:nn {o}
\NewDocumentCommand { \PrintAnswerList } { m }
{ \clist_map_inline:on {#1} { \PrintAnswer {##1.ans} } }
\ExplSyntaxOff
它用于对教科书进行条件编译,其中每一章(例如 101.tex、102.tex)将问题的答案写入以章节源文件的名称命名的文件中(例如 101.ans、102.ans 等)。在书的末尾,这些文件由宏读取,\PrintAnswer
如下所示:
\PrintAnswerList{\inputfiles}
其中,\inputfiles
宏在编译开始时使用以下技巧定义,以保持所需章节的列表以逗号分隔:
\typein[\inputfiles]{^^JEnter filename(s) for \protect\includeonly:}
一切正常。但现在我想扩展此代码的功能以允许对列表进行排序。假设我输入105,106,104
(文件顺序错误),则现有代码会按该顺序打印答案,而104,105,106
需要(文件顺序正确)。不幸的是,我自己对 latex3 编码的了解不足以解决这个问题。有人可以指导我找到解决方案吗?