从 LaTeX 中的变量列表中选择最大值

从 LaTeX 中的变量列表中选择最大值

我正在尝试改编这个例子如何迭代以逗号分隔的列表?作为我的基础。除了显示所有值之外,我实际上想遍历所有值并仅返回/显示最大的值。

我实际上想要传递给自定义函数的数字列表实际上是glossaries标签。我已经测试过了,我可以插入\gls{label}到类似这样的命令中 \clist_map_inline:nn { #1 } {\glsentryname{##1} },这样就可以立即显示我的扩展值列表(实际上是数字),所以我不担心这部分。

我还没能弄清楚:

  1. 我怎样才能阻止该函数排版文本,而是允许我遍历列表更新仅显示最终值的变量?

    • 例如,在循环开始时,我会设置一个虚拟值,如 -100000
    • 并且比较将##1与虚拟变量进行迭代比较。
    • 通过函数调用(例如下面包含的对我的宏的调用),\pickGE如果列表中的值大于虚拟值,我将返回并更新该值。
  2. 哪种方法适合设置可在此上下文中更新的虚拟变量

  3. 我最终该如何报告这个最终选定的值。
    • 我想在\num[scientific-notation = fixed, fixed-exponent = 0, group-digits=false]{}调用中包装这个最终值。

我想要插入的完整 MWE

\documentclass{article}
\usepackage{fp}
\usepackage{siunitx}
\usepackage{xparse}
\ExplSyntaxOn

\NewDocumentCommand{\findLargest}{ m }
 {
  \begin{enumerate}
  \clist_map_inline:nn { #1 } { \item \fbox{##1} }
  \end{enumerate}
 }

\ExplSyntaxOff

\newcommand{\pickGE}[2]{%
    \ifboolexpr{test {\ifdimgreater{{#1} pt}{{#2} pt}}}%
    {%
        \FPeval{result}{{#1}}%
    }% true
    {%
        \FPeval{result}{{#2}}%
    }% false
}


\begin{document}

\findLargest{1, 2 ,3 6, 3,1}

\end{document}

限制

  • 我承诺使用XeLaTeX
  • 我可能记错了,但我也依稀记得siunitx有某件事与此直接相关……
  • 我很乐意使用任何其他包或方法,就像这里采用的一样(我无法使用我的词汇表标签迭代逗号分隔的参数
  • 我并不局限于只使用逗号分隔的列表,但根据问题的数量,这看起来是一个不错的方法。

答案1

使用模块中max提供的函数:expl3fp

\documentclass{article}
\usepackage{xparse}
\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}

\findLargest{1, 2 ,3, 6, 3,1}

\findLargest[;]{ 1.5 ; sqrt(2) ; pi/2 }

\end{document}

在此处输入图片描述

如果您想使用\num并且不需要不同的分隔符,这里有一种方法,它还允许覆盖默认传递的选项\num

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

\NewDocumentCommand{\findLargest}{ O{}m }
 {
  \num[
    scientific-notation = fixed,
    fixed-exponent = 0,
    group-digits=false,
    #1
  ] { \engbird_compute_max:n { #2 } }
 }

\cs_new:Npn \engbird_find_largest:nn #1 #2
 {
  \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}

\findLargest{1, 2 ,3, 6, 3,1}

\findLargest[group-digits=true]{10000,20000}

\findLargest[round-mode=places]{ 1.5, sqrt(2), pi/2 }

\end{document}

在此处输入图片描述

相关内容