如何找到 PGF 数组的长度?

如何找到 PGF 数组的长度?

我的一些宏目前要求用户传递数组的长度以及数组本身。如果可以为它们计算长度就好了,因为相关用户(我自己)似乎无法始终如一地计数超过 3。

我查看了 pgfmanual 的第 56 章(for 循环,其中大部分都用到了)和第 63 章(定义数组的数学函数)。从某种意义上说,这只是计算逗号(我不知道该怎么做),但 PGF 在数组中有一些例外,其中 () 和 {} 允许条目中包含逗号。

有人可以编写一个合理的 pgf 数学函数,该函数以数组作为其唯一参数并返回该数组的长度作为其结果吗?

答案1

在里面pgf/tikz 的 cvs 版本适用于 texlive 的版本可在 tlcontrib 上找到有一个实验性的未记录dim函数pgfmath定义为

\makeatletter
% dim function: return dimension of an array
% dim({1,2,3}) return 3
% dim({{1,2,3},{4,5,6}}) return 2
\pgfmathdeclarefunction{dim}{1}{%
  \begingroup
    \pgfmath@count=0\relax
    \expandafter\pgfmath@dim@i\pgfutil@firstofone#1\pgfmath@token@stop
    \edef\pgfmathresult{\the\pgfmath@count}%
    \pgfmath@smuggleone\pgfmathresult%
  \endgroup}

\def\pgfmath@dim@i#1{%
    \ifx\pgfmath@token@stop#1%
    \else
      \advance\pgfmath@count by 1\relax
      \expandafter\pgfmath@dim@i
    \fi}

\makeatother

然而,对于大型数组来说,这可能会非常慢(欢迎任何建议!)。

你可以这样使用

\documentclass{standalone}
\usepackage{pgfmath}
\begin{document}
  The dimension of $\{1,2,3\}$ is
  \pgfmathparse{dim({1,2,3})}\pgfmathresult.

  The dimension of $\{1,2,\{3,4\},5\}$ is
  \pgfmathparse{dim({1,2,{3,4},5})}\pgfmathresult. 
\end{document}

数组的 dim

答案2

仅使用 TikZ 来解决也相对容易:

\documentclass{article}
\usepackage{tikz}
\newcounter{arraycard}
\def\arrayLength#1{%
  \setcounter{arraycard}{0}%
  \foreach \x in #1{%
    \stepcounter{arraycard}%
  }%
  \the\value{arraycard}%
}  
\begin{document}
  \noindent
  The length of $\{1,2,3\}$ is \arrayLength{{1,2,3}}.\\
  And the length of $\{1,2,\{3,4\},5\}$ \arrayLength{{1,2,{3,4},5}}.
\end{document}

这只是用于foreach迭代列表并增加看到的每个元素的计数。

答案3

这是在 Bruno Le Floch、Joseph Wright、egreg 以及 texsx 聊天室的其他一些人的大力协助下编写的(社区维基)答案。

\usepackage{expl3} 
\ExplSyntaxOn 
\cs_new:Npn \Counter #1 \Stopper { \tl_length:n {#1} } 
\ExplSyntaxOff
\pgfmathdeclarefunction{countarray}{1}{\edef\pgfmathresult{\Counter#1\Stopper}}

其用法如下:

\pgfmathtruncatemacro{\Length}{countarray({1,2,3,4})}

设置\Length为 4。

相关内容