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