我正在尝试使用一个小型教育示例pgfmath
。我想计算数字列表中的最小值。
更准确地说,我有一个(数字,字符串)对的列表,我想要所有数字中的最小值。
我的\calculateMin
命令(见下文)首先使用\foreach
循环构建一个仅包含前几个组件的临时列表。然后使用pgfmath
内置min
函数取其中的最小值。
代码
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand*\calculateMin[1]{%
\def\mylist{}%
\foreach \i/\j in {#1} {%
\edef\mylist{\mylist,\i}%
}%
\pgfmathparse{min(\mylist)}\pgfmathresult%
}
Minimum of (8/ignore,7/this,2/second,5/component)
is \calculateMin{8/ignore,7/this,2/second,5/component}.
\end{document}
结果
(8/ignore,7/this,2/second,5/component) 的最小值为 16383.0。
结果应该是“2”。这是怎么回事?
答案1
发生这种情况是因为您调用了min
一个不适合的参数:列表的第一个元素为空,\pgfmathresult
由于算法的实现方式,它被设置为最大允许数字。
为了获得正确的行为,您应该确保第一个组件不为空(但最后一个组件可能是空的)。此外,\foreach
引入了组,因此如果您仅使用,则宏实际上不会更新\edef
。请改用\xdef
(的别名\global\edef
):
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand*\calculateMin[1]{%
\def\mylist{}%
\foreach \i/\j in {#1} {%
\xdef\mylist{\i,\mylist}%
}%
\pgfmathparse{min(\mylist)}\pgfmathresult%
}
Minimum of (8/ignore,7/this,2/second,5/component)
is \calculateMin{8/ignore,7/this,2/second,5/component}.
\end{document}