% !TeX spellcheck = en_US
% !TeX root = tikz-ext-manual.tex
% Copyright 2022 by Qrrbrbirlbel
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Free Documentation License.
%
\section{Repeating Things and Other Things}
\label{pkg:pgffor-ext}
\begin{texpackage}{pgffor-ext}
  This package adds small niceties to the \referencePackageandIndexO{pgffor} package.
  Most of these additions are also available
  with the \referenceLibraryandIndex{ext.misc} library.

  \textbf{Warning:} Consider this package experimental.
  At the very least, it will break the |...| notation and possibly gobbles spaces after the body.
  
  \inspiration{ForeachUse-Q, ForeachNoSep-Q, ForeachXparse-Q}{ForeachUse-A, ForeachNoSep-A, ForeachXparse-A}
\end{texpackage}

Instead of |\foreach \var in {start, start + delta, ..., end}| one can use
|\foreach \var[use int=start to end step delta]|.

\begin{key}{/\pgfforeachext/use int=\meta{start}|to|\meta{end}\opt{|step|\meta{delta}}}\keycompat{pgf/foreach}
The values \meta{start}, \meta{end} and \meta{delta} are evaluates by \pgfname math at initialization.
The part |step |\meta{delta} is optional (\meta{delta} = 1).
\end{key}

\begin{key}{/\pgfforeachext/use float=\meta{start}|to|\meta{end}\opt{|step|\meta{delta}}}\keycompat{pgf/foreach}
Same as above, however the results are not truncated.
\end{key}

\begin{key}{/\pgfforeachext/no separator}\keycompat{pgf/foreach}
This key disables any separator between elements of the list.
Every token is its own element. This also means that Unicode characters
need to be grouped between |{| and |}| if Lua\TeX\space isn't used.
Spaces will be ignored.

\begin{codeexample}[preamble=\usetikzlibrary{ext.misc}]
\newcommand*{\board}[3][]{%
  \begin{tikzpicture}[#1]
    \foreach[
      count=\i from 0,
      ext/no separator,
      evaluate=\i as \colX using {mod(\i,#2)},
      evaluate=\i as \rowY using {int(\i/#2)}
    ] \elem in {#3} {
        \draw[black, board/\elem/.try, ext/rectangle timer/.try=line]
          (\colX,\rowY) rectangle node {\elem} ++(1, 1);}
  \end{tikzpicture}}
\board[
  board/W/.style={fill=red},
  board/X/.style={fill=blue!50},
  board/B/.style={fill=green},
  board/-/.style={fill=gray},
]{3}{WXX---BXX}
\end{codeexample}
\end{key}

\begin{key}{/\pgfforeachext/normal list}\keycompat{pgf/foreach}
This key simply disables all other special parsers and returns to the original list parser.
\end{key}

The following keys only work with \LaTeX\ and cannot be used when only the \referenceLibraryandIndex{ext.misc}
library or the plain\TeX\space |pgffor-ext.tex| are loaded.
For this, you will need to use |\usepackage{pgffor-ext}|.
\begin{key}{/\pgfforeachext/xparser=\marg{argument specification}\marg{foreach value}}\keycompat{pgf/foreach}
This key can be used to specify a \referencePackageandIndeXExt{xparse}
specification for each element in the list.

For this to work somewhat seamless, the following needs to observed:
\begin{itemize}
  \item Every \marg{argument specification} get appended |u,|.
        This means there's always one additional mandatory argument at the end of every element.
  \item The \marg{foreach value} needs to correspond to the
        \referenceKeyandIndexO[/pgf/foreach/]{var}
        value.
\end{itemize}
\end{key}

\begin{key}{/\pgfforeachext/xparser Om=\opt{default} (default \{\})}\keycompat{pgf/foreach}
Sets up a list whose elements may contain an optional argument inside |[]| which correspond to
two |\foreach| variables, say |\Options/\Text|.
The \opt{default} value is the default value if the optional argument is missing.
\end{key}

\begin{ext_handler}{{list xparse}|=|\marg{argument specification}\marg{comma-separated list of values}}%
\handlercompat{.list xparse}
  This handler causes the key to be used repeatedly, namely
  once for every element of the list of values.
  The \meta{comma-separated list of values} is processed using |\foreach|
  and the given |xparse| \meta{argument specification} with the aforementioned |xparser| key.
\end{ext_handler}
