pgfmath 的简单示例

pgfmath 的简单示例

我正在尝试使用一个小型教育示例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}

相关内容