![迭代 seq 并使用 \str_case 和 seq 的内容不起作用](https://linux22.com/image/471668/%E8%BF%AD%E4%BB%A3%20seq%20%E5%B9%B6%E4%BD%BF%E7%94%A8%20%5Cstr_case%20%E5%92%8C%20seq%20%E7%9A%84%E5%86%85%E5%AE%B9%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我尝试使用逗号分隔列表 ( ) 为函数提供多个参数clist
。这似乎有效,我也可以使用 迭代元素seq
。但是,将 的元素用作seq
另一个函数的参数,然后使用\str_case
似乎不起作用。
为什么?
\documentclass{article}
\ExplSyntaxOn
\newcommand{\HPsatz}[1]{
#1:~
\str_case:nn { #1 } {
{ H123 }{ First~sentence. }
{ H124 }{ Second~sentence. }
{ H125 }{ Third~sentence. }
}
}
\int_new:N \l__ghs_test_int
\int_new:N \l__ghs_tmpa_int
\seq_new:N \l__ghs_seq_numbers
\newcommand {\GHStext}[1]
{
% generate seq from clist argument 1
\seq_set_from_clist:Nn \l__ghs_seq_numbers { #1 }
% set number of elements in seq
\int_set:Nn \l__ghs_test_int { \seq_count:N \l__ghs_seq_numbers }
% reset loop counter to 1
\int_set:Nn \l__ghs_tmpa_int { 1 }
% int_do_while of seq for each element
\int_do_while:nn { \l__ghs_tmpa_int <= \l__ghs_test_int }
{
% print sentence from \HPsatz
\HPsatz{\seq_item:Nn \l__ghs_seq_numbers { \l__ghs_tmpa_int }}
% \seq_item:Nn \l__ghs_seq_numbers { \l__ghs_tmpa_int }
% increment loop counter
\int_incr:N \l__ghs_tmpa_int
}
}
\ExplSyntaxOff
\begin{document}
Sentences (clist):
\GHStext{H123, H125}
Sentences (manual):
\HPsatz{H123}
\HPsatz{H125}
\end{document}
答案1
你可以使用
\exp_args:Ne \str_case:nn { #1 } {
或者声明一个\str_case:en
变体(它会做同样的事情),以便#1
在字符串比较之前进行扩展。
但更简单的方法是直接映射到 clist 上,避免所有的计数。
\documentclass{article}
\ExplSyntaxOn
\newcommand{\HPsatz}[1]{
#1:~
\exp_args:Ne \str_case:nn { #1 } {
{ H123 }{ First~sentence. }
{ H124 }{ Second~sentence. }
{ H125 }{ Third~sentence. }
}
}
\seq_new:N \l__ghs_seq_numbers
\newcommand {\GHStext}[1]
{
\clist_map_function:nN {#1} \HPsatz
}
\ExplSyntaxOff
\begin{document}
Sentences (clist):
\GHStext{H123, H125}
Sentences (manual):
\HPsatz{H123}
\HPsatz{H125}
\end{document}
答案2
你甚至可以让一切变得完全可扩展。
指南建议将用户界面与内部实现分开。
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\HPsatz}{m}
{
\ghs_satz:n { #1 }
}
\NewExpandableDocumentCommand{\GHStext}{m}
{
\ghs_text:n { #1 }
}
\cs_new:Nn \ghs_satz:n
{
#1:~
\str_case_e:nn { #1 } {
{ H123 }{ First~sentence. }
{ H124 }{ Second~sentence. }
{ H125 }{ Third~sentence. }
}
}
\cs_new:Nn \ghs_text:n
{
\clist_map_function:nN { #1 } \__ghs_text:n
}
\cs_new:Nn \__ghs_text:n
{
\ghs_satz:n { #1 }~
}
\ExplSyntaxOff
\begin{document}
Sentences (clist):
\GHStext{H123, H125}
Sentences (manual):
\HPsatz{H123}
\HPsatz{H125}
\end{document}
仅供参考:使用两个计数器定义的循环可以更简单地用\seq_map_inline:Nn
或来完成\seq_map_function:NN
。