我有一个宏test
,它接受两个参数并在以下情况下翻译一个单词:
- 这个词是“减号”(第一个参数)
- 第二个参数是“翻译”
我需要将逗号分隔的列表传递给此宏。当只有一个参数时,\docsvlist
来自包的参数etoolbox
工作得很好。如果有多个参数,则无法编译。有人可以向我解释如何传递参数列表\docsvlist
吗?
平均能量损失
应该给出“moins, non traduit, plus, plus”作为输出。
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\newcommand{\test}[2]{%
\ifstrequal{#1}{minus}{%
\ifstrequal{#2}{traduire}{moins}{non traduit}
}{#1}%
}
\newcommand{\testList}[2]{%
\def\nextitem{\def\nextitem{, }}%
\renewcommand*{\do}[2]{\nextitem\test{##1}{##2}}%
\docsvlist{#1}%
}
\testorderList{minus, minus, plus, plus}{traduire, non défini, traduire, non défini}
The function above should print the same results as:
\testorder{minus}{traduire}
\testorder{minus}{non défini}
\testorder{plus}{traduire}
\testorder{plus}{non défini}
\end{document}
答案1
你可以这样做expl3
:
\documentclass{article}
%\usepackage{xparse} % not needed with LaTeX 2020-10-01 or later
\ExplSyntaxOn
\NewExpandableDocumentCommand{\testorder}{mm}
{
\alma_testorder:nn { #1 } { #2 }
}
\NewDocumentCommand{\testorderList}{mm +O{~}}
{
\alma_testorder_list:nnn { #1 } { #2 } { #3 }
}
\seq_new:N \l__alma_testorder_list_a_seq
\seq_new:N \l__alma_testorder_list_b_seq
\seq_new:N \l__alma_testorder_list_seq
\cs_new:Nn \alma_testorder:nn
{
\str_if_eq:nnTF { #1 } { minus }
{
\str_if_eq:nnTF { #2 } { traduire } { moins } { non~traduit }
}
{ #1 }
}
\cs_new_protected:Nn \alma_testorder_list:nnn
{
\seq_set_from_clist:Nn \l__alma_testorder_list_a_seq { #1 }
\seq_set_from_clist:Nn \l__alma_testorder_list_b_seq { #2 }
\seq_clear:N \l__alma_testorder_list_seq
\seq_mapthread_function:NNN \l__alma_testorder_list_a_seq \l__alma_testorder_list_b_seq \__alma_testorder_add:nn
\seq_use:Nn \l__alma_testorder_list_seq { #3 }
}
\cs_new_protected:Nn \__alma_testorder_add:nn
{
\seq_put_right:Nn \l__alma_testorder_list_seq { \alma_testorder:nn { #1 } { #2 } }
}
\ExplSyntaxOff
\begin{document}
\testorderList{minus, minus, plus, plus}{traduire, non défini, traduire, non défini}[\par]
The function above should print the same results as:
\testorder{minus}{traduire}
\testorder{minus}{non défini}
\testorder{plus}{traduire}
\testorder{plus}{non défini}
\end{document}
有\testorderList
一个尾随可选参数来指定项目之间的分隔符(默认为空格)。
简单命令\testorder
使用 进行像您这样的字符串比较\str_if_eq:nnTF
,它是 的精确模拟\ifstrequal
。
对于复杂命令,我们将两个列表保存到可以映射在一起的序列中:我们构建一个然后可以“使用”的新序列。
答案2
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\newcommand{\testorder}[2]{
\str_if_eq:nnTF {#1} {minus} {
\str_if_eq:nnTF {#2} {traduire} {moins} {non~traduit}
} {
#1
}
}
\tl_new:N \l_doc_tmpa_tl
\tl_new:N \l_doc_tmpb_tl
\clist_new:N \l_doc_tmpa_clist
\clist_new:N \l_doc_tmpb_clist
\seq_new:N \l_doc_tmpa_seq
\newcommand{\testorderList}[2]{
\clist_set:Nn \l_doc_tmpa_clist {#1}
\clist_set:Nn \l_doc_tmpb_clist {#2}
\seq_clear:N \l_doc_tmpa_seq
\bool_do_until:nn {\clist_if_empty_p:N \l_doc_tmpa_clist} {
\clist_pop:NN \l_doc_tmpa_clist \l_doc_tmpa_tl
\clist_pop:NN \l_doc_tmpb_clist \l_doc_tmpb_tl
\seq_put_right:Nx \l_doc_tmpa_seq {
\exp_args:NVV \testorder \l_doc_tmpa_tl \l_doc_tmpb_tl
}
}
\seq_use:Nn \l_doc_tmpa_seq {,\space}
}
\ExplSyntaxOff
\testorderList{minus, minus, plus, plus}{traduire, non défini, traduire, non défini}
The function above should print the same results as:
\testorder{minus}{traduire}
\testorder{minus}{non défini}
\testorder{plus}{traduire}
\testorder{plus}{non défini}
\end{document}