Como usar operação matemática em um índice de array criado pelo pacote arrayjob

Como usar operação matemática em um índice de array criado pelo pacote arrayjob

Quero colocar cada número do array em uma grade usando tikz.

\documentclass[tikz]{standalone}
\usepackage{pgffor}
\usepackage{multido}
\usetikzlibrary{calc}
\usepackage{arrayjob}
\newarray\Values
\readarray{Values}{I&F&I&G&L&O&C&K&E&D&A&W&A&Y&.}
\begin{document}
\begin{tikzpicture}
    \draw (0,0) grid(5,3);
  %     \foreach \x in {1,2,3,4,5}
  %         \foreach \y in {1,2,3}
  %         {
  %             \node at (\x-0.5,\y-0.5) {\Values(\x+\y*5)};
  %         }
    \multido{\dx=0cm+1cm,\iColumn=1+1}{5}{%
        \multido{\dy=0cm+1cm,\iRow=1+2}{3}{%
        \node at (\dx+0.5cm,\dy+0.5cm) {\Values(\iColumn+\iRow*5)};}}
\end{tikzpicture}
\end{document}

Mas eu tenho algo assim. O resultado é semelhante se eu substituir \multidopor \foreach. A operação matemática parece não ser suportada no índice da matriz. Como posso consertar isso, por favor?

insira a descrição da imagem aqui

Responder1

Você deveria usar arrayjobx, mas ele não suporta aritmética em seus argumentos.

\documentclass[tikz]{standalone}
\usepackage{pgffor}
\usepackage{multido}
\usetikzlibrary{calc}
\usepackage{arrayjobx}
\newarray\Values
\readarray{Values}{I&F&I&G&L&O&C&K&E&D&A&W&A&Y&.}

\begin{document}
\begin{tikzpicture}
    \draw (0,0) grid(5,3);
      \foreach \x in {1,2,3,4,5}
        {
          \foreach \y in {1,2,3}
            {
              \node at (\x-0.5,\y-0.5) {\expandafter\Values\expandafter(\the\numexpr\x+\y*5)};
            }
        }
\end{tikzpicture}
\end{document}

Mais facilmente, defina um comando que faça o trabalho:

\documentclass[tikz]{standalone}
\usepackage{pgffor}
\usepackage{multido}
\usetikzlibrary{calc}
\usepackage{arrayjobx}
\newarray\Values
\readarray{Values}{I&F&I&G&L&O&C&K&E&D&A&W&A&Y&.}

\newcommand{\Get}[2]{%
  \expandafter#1\expandafter(\the\numexpr#2\relax)%
}

\begin{document}
\begin{tikzpicture}
    \draw (0,0) grid(5,3);
      \foreach \x in {1,2,3,4,5}
        {
          \foreach \y in {1,2,3}
            {
              \node at (\x-0.5,\y-0.5) {\Get\Values{\x+\y*5}};
            }
        }
\end{tikzpicture}
\end{document}

Com ferramentas mais modernas:

\documentclass[tikz]{standalone}
\usepackage{pgffor}
\usetikzlibrary{calc}

\ExplSyntaxOn
\NewDocumentCommand{\definearray}{mm}
 {
  \seq_clear_new:c { l_jasmine_array_#1_seq }
  \seq_set_split:cnn { l_jasmine_array_#1_seq } { & } { #2 }
 }
\cs_generate_variant:Nn \seq_set_split:Nnn { c }

\NewExpandableDocumentCommand{\getarrayitem}{mm}
 {
  \seq_item:cn { l_jasmine_array_#1_seq } { #2 }
 }
\ExplSyntaxOff

\definearray{Values}{I&F&I&G&L&O&C&K&E&D&A&W&A&Y&.}

\begin{document}
\begin{tikzpicture}
    \draw (0,0) grid(5,3);
      \foreach \x in {1,2,3,4,5}
        {
          \foreach \y in {1,2,3}
            {
              \node at (\x-0.5,\y-0.5) {\getarrayitem{Values}{\x+\y*5}};
            }
        }
\end{tikzpicture}
\end{document}

Todos os três trechos de código produzem o mesmo resultado.

insira a descrição da imagem aqui

Responder2

Código

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs}
\begin{document}
\tikz
  \graph[
    grid placement, wrap after=5, branch up,
    fresh nodes, nodes={
      draw, minimum size=+1cm, text height=+\ht\strutbox, text depth=+0pt},
  ]{I, F, I, G, L, O, C, K, E, D, A, W, A, Y, .};

\tikz
  \draw (0,0) grid (5,3) [shift={(.5,.5)}]
    graph[
      grid placement, wrap after=5, branch up,
      fresh nodes, nodes={text height=+\ht\strutbox, text depth=+0pt},
    ]{I, F, I, G, L, O, C, K, E, D, A, W, A, Y, .};

\tikz
  \node foreach[count=\i from 0] \t in {I, F, I, G, L, O, C, K, E, D, A, W, A, Y, .}
    [draw, minimum size=+1cm, text height=+\ht\strutbox, text depth=+0pt]
      at ({mod(\i,5)},{int(\i/5)}) {\t};
\end{document}

Saída

insira a descrição da imagem aqui

informação relacionada