我正在尝试改编这个例子如何迭代以逗号分隔的列表?作为我的基础。除了显示所有值之外,我实际上想遍历所有值并仅返回/显示最大的值。
我实际上想要传递给自定义函数的数字列表实际上是glossaries
标签。我已经测试过了,我可以插入\gls{label}
到类似这样的命令中
\clist_map_inline:nn { #1 } {\glsentryname{##1} }
,这样就可以立即显示我的扩展值列表(实际上是数字),所以我不担心这部分。
我还没能弄清楚:
我怎样才能阻止该函数排版文本,而是允许我遍历列表更新仅显示最终值的变量?
- 例如,在循环开始时,我会设置一个虚拟值,如 -100000
- 并且比较将
##1
与虚拟变量进行迭代比较。 - 通过函数调用(例如下面包含的对我的宏的调用),
\pickGE
如果列表中的值大于虚拟值,我将返回并更新该值。
哪种方法适合设置可在此上下文中更新的虚拟变量
- 我最终该如何报告这个最终选定的值。
- 我想在
\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
提供的函数:expl3
fp
\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}