This answer may be more generic than specifically relating to TikZ/PGF.
(La)TeX is a macro-based language, so it does not work as expected compared to other languages when dealing with "arrays". For example, while \names[2]
should yield Laura
where
\def\names{Katie, Frank, Laura, Joe}
(indexing from 0), (La)TeX considers [2]
to have no connection to \names
. As such, you're more likely to obtain the output Katie, Frank, Laura, Joe[2]
- a concatenation of \names
(as it is defined) and [2]
.
In order to allow for indexing like one typically would using arrays, you would need some other functionality. Here's an example of a list parser that works like you would expect arrays do:

\documentclass{article}
\usepackage{xparse}% http://ctan.org/pkg/xparse
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcounter{listtotal}\newcounter{listcntr}%
\NewDocumentCommand{\names}{o}{%
\setcounter{listtotal}{0}\setcounter{listcntr}{-1}%
\renewcommand*{\do}[1]{\stepcounter{listtotal}}%
\expandafter\docsvlist\expandafter{\namesarray}%
\IfNoValueTF{#1}
{\namesarray}% \names
{% \names[<index>]
\renewcommand*{\do}[1]{\stepcounter{listcntr}\ifnum\value{listcntr}=#1\relax##1\fi}%
\expandafter\docsvlist\expandafter{\namesarray}}%
}
\begin{document}
\newcommand{\namesarray}{Katie, Frank, Laura, Joe}%
\verb|\names:|\ \names \par
\verb|\names[2]:|\ \names[2] \par
\verb|\names[0]:|\ \names[0] \par
\verb|\names[5]:|\ \names[5]
\end{document}
The idea here is to store the names in an array \namesarray
and then define a macro (or "function") that takes an optional argument. If no argument is supplied (i.e., you just use \names
), then you print the entire \namesarray
. If an argument is supplied (of the form \names[<index>]
), parse the list sequentially to find that item that matches <index>
and print it.
The list parser relies on etoolbox
's \docsvlist
and enumerator \do
.
I'm not aware of any array length counter in TikZ (it might have been introduced in the CVS version). So getting some help from the xstring
package, we count the commas and add one to it.
\documentclass{article}
\usepackage{tikz,xstring}
\usetikzlibrary{calc}
\def\mar{1,2,4,5,7}
\StrCount{\mar}{,}[\arrlength]
\begin{document}
\begin{tikzpicture}
\node[draw,minimum width=2cm,minimum height=5cm] (rec) at (2cm,1cm) {rec};
\path let \p1=($(rec.west)-(rec.east)$),
\p2=($(rec.north)-(rec.south)$),
\n{arrlen}={\arrlength+1},
\n1 = {veclen(\p1)*0.16}, %width
\n2 = {veclen(\p2)/\n{arrlen}} %height
in node[draw,
minimum width=\n1
,minimum height=\n2
,anchor=north west
] at (rec.north west) {foobar
};
\end{tikzpicture}
I have found \arrlength\space commas in the array.
\end{document}

Best Answer
In the cvs version of pgf/tikz or in the version available for texlive at tlcontrib there is an experimental undocumented
dim
function inpgfmath
defined asThis can however be very slow for large arrays (any suggestions are welcome!).
You can use it this way