6

I am trying to draw a TikZ diagram that I would like to start counting from zero instead of one. I have adapted this answer for my needs.

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[auto matrix/.style={matrix of nodes,
  draw,thick,inner sep=0pt,
  nodes in empty cells,column sep=-0.2pt,row sep=-0.2pt,
  cells={nodes={minimum width=1.9em,minimum height=1.9em,
   draw,very thin,anchor=center,fill=white,
   execute at begin node={%
   $\vphantom{x_|}\ifnum\the\pgfmatrixcurrentrow<4
     \ifnum\the\pgfmatrixcurrentcolumn<4
      {#1}^{\the\pgfmatrixcurrentrow}_{\the\pgfmatrixcurrentcolumn}
     \else 
      \ifnum\the\pgfmatrixcurrentcolumn=5
       {#1}^{\the\pgfmatrixcurrentrow}_{N}
      \fi
     \fi
    \else
     \ifnum\the\pgfmatrixcurrentrow=5
      \ifnum\the\pgfmatrixcurrentcolumn<4
       {#1}^{T}_{\the\pgfmatrixcurrentcolumn}
      \else
       \ifnum\the\pgfmatrixcurrentcolumn=5
        {#1}^{T}_{N}
       \fi 
      \fi
     \fi
    \fi  
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=14
     \cdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=41
     \vdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=44
     \ddots
    \fi$
    }
  }}}]
 \matrix[auto matrix=z,xshift=3em,yshift=3em](matz){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=y,xshift=1.5em,yshift=1.5em](maty){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=x](matx){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \draw[thick,-stealth] ([xshift=1ex]matx.south east) -- ([xshift=1ex]matz.south east)
  node[midway,below] {$D$};
 \draw[thick,-stealth] ([yshift=-1ex]matx.south west) -- 
  ([yshift=-1ex]matx.south east) node[midway,below] {joints};
 \draw[thick,-stealth] ([xshift=-1ex]matx.north west)
   -- ([xshift=-1ex]matx.south west) node[midway,above,rotate=90] {time};
\end{tikzpicture}
\end{document}

This code has the following output.

enter image description here

I would like the index to begin from zero. Something like this.

enter image description here

I tried using the calc package to subtract from the \the\pgfmatrixcurrentrow and the \the\pgfmatrixcurrentcolumn like $\the\pgfmatrixcurrentrow - 1 = \result$ but to no avail. Any help is greatly appreciated.

3
  • 4
    \the\numexpr\pgfmatrixcurrentrow - 1\relax May 2 '21 at 19:24
  • Thank you for the answer. Could you explain the purpose of the \relax?
    – Rashiq
    May 2 '21 at 21:24
  • 3
    The \relax is a signal to TeX to stop scanning for an expression. \the\numexpr 3 + 2 + 1\relax gives 6 whereas \the\numexpr 3 + 2\relax + 1 gives 5 + 1. May 3 '21 at 6:23
5

You can use \pgfmathtruncatemacro to compute your desired numbers just before all the code into the matrix definition, and replace all \the\pgfmatrixcurrentrow and \the\pgfmatrixcurrentcolumn by your computed variables.

multiple matrix planes with pgfmath

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[auto matrix/.style={matrix of nodes,
  draw,thick,inner sep=0pt,
  nodes in empty cells,column sep=-0.2pt,row sep=-0.2pt,
  cells={nodes={minimum width=1.9em,minimum height=1.9em,
   draw,very thin,anchor=center,fill=white,
   execute at begin node={%
   \pgfmathtruncatemacro{\nrow}{\the\pgfmatrixcurrentrow-1}%
   \pgfmathtruncatemacro{\ncol}{\the\pgfmatrixcurrentcolumn-1}%
   $\vphantom{x_|}\ifnum\the\pgfmatrixcurrentrow<4
     \ifnum\the\pgfmatrixcurrentcolumn<4
      {#1}^{\nrow}_{\ncol}     
     \else 
      \ifnum\the\pgfmatrixcurrentcolumn=5
       {#1}^{\nrow}_{N}
      \fi
     \fi
    \else
     \ifnum\the\pgfmatrixcurrentrow=5
      \ifnum\the\pgfmatrixcurrentcolumn<4
       {#1}^{T}_{\ncol}
      \else
       \ifnum\the\pgfmatrixcurrentcolumn=5
        {#1}^{T}_{N}
       \fi 
      \fi
     \fi
    \fi  
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=14
     \cdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=41
     \vdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=44
     \ddots
    \fi$
    }
  }}}]
 \matrix[auto matrix=z,xshift=3em,yshift=3em](matz){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=y,xshift=1.5em,yshift=1.5em](maty){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=x](matx){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \draw[thick,-stealth] ([xshift=1ex]matx.south east) -- ([xshift=1ex]matz.south east)
  node[midway,below] {$D$};
 \draw[thick,-stealth] ([yshift=-1ex]matx.south west) -- 
  ([yshift=-1ex]matx.south east) node[midway,below] {joints};
 \draw[thick,-stealth] ([xshift=-1ex]matx.north west)
   -- ([xshift=-1ex]matx.south west) node[midway,above,rotate=90] {time};
\end{tikzpicture}
\end{document}
4

Since these are integers, use \the\numexpr\pgfmatrixcurrentrow-1

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[auto matrix/.style={matrix of nodes,
  draw,thick,inner sep=0pt,
  nodes in empty cells,column sep=-0.2pt,row sep=-0.2pt,
  cells={nodes={minimum width=1.9em,minimum height=1.9em,
   draw,very thin,anchor=center,fill=white,
   execute at begin node={%
   $\vphantom{x_|}\ifnum\the\pgfmatrixcurrentrow<4
     \ifnum\the\pgfmatrixcurrentcolumn<4
      {#1}^{\the\numexpr\pgfmatrixcurrentrow-1}_{\the\numexpr\pgfmatrixcurrentcolumn-1}
     \else 
      \ifnum\the\pgfmatrixcurrentcolumn=5
       \,{#1}^{\the\numexpr\pgfmatrixcurrentrow-1}_{N}
      \fi
     \fi
    \else
     \ifnum\the\pgfmatrixcurrentrow=5
      \ifnum\the\pgfmatrixcurrentcolumn<4
       {#1}^{T}_{\the\numexpr\pgfmatrixcurrentcolumn-1}
      \else
       \ifnum\the\pgfmatrixcurrentcolumn=5
        \,{#1}^{T}_{N}
       \fi 
      \fi
     \fi
    \fi  
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=14
     \cdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=41
     \vdots
    \fi
    \ifnum\the\pgfmatrixcurrentrow\the\pgfmatrixcurrentcolumn=44
     \ddots
    \fi$
    }
  }}}]
 \matrix[auto matrix=z,xshift=3em,yshift=3em](matz){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=y,xshift=1.5em,yshift=1.5em](maty){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \matrix[auto matrix=x](matx){
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
  & & & & \\
 };
 \draw[thick,-stealth] ([xshift=1ex]matx.south east) -- ([xshift=1ex]matz.south east)
  node[midway,below] {$D$};
 \draw[thick,-stealth] ([yshift=-1ex]matx.south west) -- 
  ([yshift=-1ex]matx.south east) node[midway,below] {joints};
 \draw[thick,-stealth] ([xshift=-1ex]matx.north west)
   -- ([xshift=-1ex]matx.south west) node[midway,above,rotate=90] {time};
\end{tikzpicture}
\end{document}

I also added \, in the last column to avoid too much overlapping.

enter image description here

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.