我想用 \edef 定义列表中的一个元素。我写了下面的 MWE,它显示只有 \def 才能给出结果。但是,由于我以多种复杂的方式使用结果,所以 \def 对我来说不是一个选择。
为什么它不起作用?我该怎么办?感谢您的帮助。
\documentclass{article}
\setlength\parindent{0pt}
\ExplSyntaxOn
\NewDocumentCommand { \defseq } { m m }
{ \seq_gset_from_clist:Nn#1{#2} }
\NewDocumentCommand { \getelement } { m m } { \seq_item:Nn#1{#2} }
\ExplSyntaxOff
\begin{document}
\defseq{\listcomp}{\geq,\leq,>,<}
\edef\choixcomp{\fpeval{ randint(1,4) }}
%\def\comp{ \getelement{\listcomp}{ \choixcomp } } % Works
\edef\comp{ \getelement{\listcomp}{ \choixcomp } } % Bug
$\comp$
\end{document}
答案1
我会避免混合\edef
和expl3
。
另外,最好使用名称而不是序列的命令。
您可以提取指定的物品或随机物品。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\defseq}{ m m }
{
\seq_new:c { g_mathteacher_named_#1_seq }
\seq_gset_from_clist:cn { g_mathteacher_named_#1_seq } { #2 }
}
% extract a specified item
\NewExpandableDocumentCommand{\getseqelement}{ m m }
{
\seq_item:cn { g_mathteacher_named_#1_seq } { #2 }
}
% get the sequence length, just in case
\NewExpandableDocumentCommand{\getseqlength}{m}
{
\seq_count:c { g_mathteacher_named_#1_seq }
}
% extract a random item
%
% \int_rand:n { <integer expression> } returns a random
% integer from 1 to <integer expression>
% so we can use \seq_count:c { <seq name> }
\NewExpandableDocumentCommand{\getseqrandomelement}{m}
{
\seq_item:cn { g_mathteacher_named_#1_seq }
{
\int_rand:n { \seq_count:c { g_mathteacher_named_#1_seq } }
}
}
\ExplSyntaxOff
\begin{document}
\defseq{listcomp}{\geq,\leq,>,<}
$\getseqrandomelement{listcomp}$
$\getseqrandomelement{listcomp}$
$\getseqrandomelement{listcomp}$
$\getseqrandomelement{listcomp}$
\end{document}