将决策结构插入或应用于序列或列表

将决策结构插入或应用于序列或列表

我想让\findLargest下面的 MWE 中的函数调用更加动态和紧凑。

如下例所示,我可以存储词汇表值并将其包含在比较中。

然而,我想改变它以便调用: \findLargest{0.001,value}可以测试列表的元素是否是数字或者是 gls 标签。

为此,我认为下面的代码需要在最大数字搜索调用之前执行一个命令或步骤,该命令或步骤将应用执行if is numeric类型逻辑的 if 语句。(如果这样的事情是可能的)。如果为 false(不是数字),我希望列表的索引元素被替换为\glsentryname{i}

这对我来说很难想象,因为我习惯使用具有手动定义循环的语言进行编程,因此我很容易在循环中插入决策结构和新变量。

\documentclass{article}
\usepackage{xparse}
\usepackage{glossaries}
\usepackage{siunitx}

\newglossaryentry{value}{name={0.022}, first={0.022}, description={0.022} }

\ExplSyntaxOn

\NewDocumentCommand{\findLargest}{ om }
 {
  \IfNoValueTF{#1}
   {% separator is a comma, directly use \fp_eval:n { max ( #2 ) }
    \engbird_compute_max:n { #2 }
   }
   {% we need to pass the separator
    \engbird_find_largest:nn { #1 } { #2 }
   }
 }

\seq_new:N \l_engbird_largest_seq
\tl_new:N \l_engbird_largest_tl

\cs_new_protected:Npn \engbird_find_largest:nn #1 #2
 {
  % split the input at the stated separator
  \seq_set_split:Nnn \l_engbird_largest_seq { #1 } { #2 }
  % build a comma separated list
  \tl_set:Nx \l_engbird_largest_tl { \seq_use:Nn \l_engbird_largest_seq {,} }
  % compute the max
  \engbird_compute_max:V \l_engbird_largest_tl
 }
% syntactic sugar
\cs_new:Npn \engbird_compute_max:n #1
 {
  \fp_eval:n { max (#1) }
 }
\cs_generate_variant:Nn \engbird_compute_max:n { V }

\ExplSyntaxOff

\begin{document}
\noindent
\findLargest{1, 2 ,3, 6, 3,1} \\
\findLargest[;]{ 1.5 ; sqrt(2) ; pi/2 } \\
\findLargest{0.00001,\glsentryname{value}} \\

\end{document}

相关内容