So greifen Sie in pgffor auf die Länge der inneren Liste zu

So greifen Sie in pgffor auf die Länge der inneren Liste zu

Ich habe eine Liste von Listen und verwende verschachtelte \foreachSchleifen, um sie zu durchlaufen. Durch die Verwendung von [count=\var]kann ich \varauf die Länge der äußeren Schleife zugreifen (nachdem ich sie durchlaufen habe). Allerdings kann ich diese Methode nicht verwenden, um auf die Länge der inneren Schleifen zuzugreifen. In meinem Fall sollten alle inneren Schleifen dieselbe Länge haben, aber technisch gesehen wollte ich auf die Länge der letzten der inneren Schleifen zugreifen. Hier ist, was ich bisher habe:

\documentclass{article}
\usepackage{tikz}
\begin{document}

% The first two work:

\begin{tikzpicture}
  \foreach \from [count=\to] in {2,3,1} {
    \draw (\from,1) -- (\to,2);
  }
  \draw[gray] (0.5,0.5) rectangle (\to+0.5,2.5);
\end{tikzpicture}

\begin{tikzpicture}
  \foreach \from [count=\to] in {1,3,2} {
    \draw (\from,1) -- (\to,2);
  }
  \draw[gray] (0.5,0.5) rectangle (\to+0.5,2.5);
\end{tikzpicture}

% This one does not work:

\begin{tikzpicture}
  \foreach \list [count=\row] in {{2,3,1},{1,3,2}} {
    \foreach \from [count=\to] in \list {
      \draw (\from,\row) -- (\to,\row+1);
    }
  }
  \draw[gray] (0.5,0.5) rectangle (\to+0.5,\row+1.5);
\end{tikzpicture}

\end{document}

Das hier ist mein Endergebnis:

erwünschtes Ergebnis

Antwort1

Dabei werden LaTeX-Zähler in Kombination mit TikZ-Makros verwendet. Alle Zähleroperationen sind global.

\documentclass{article}
\usepackage{tikz}

\newcounter{to}
\newcounter{row}

\begin{document}


\begin{tikzpicture}
  \setcounter{to}{0}
  \foreach \from in {2,3,1} {
    \stepcounter{to}
    \draw (\from,1) -- ({\theto},2);
  }
  \draw[gray] (0.5,0.5) rectangle (\theto+0.5,2.5);
\end{tikzpicture}

\begin{tikzpicture}
  \setcounter{to}{0}
  \foreach \from in {1,3,2} {
    \stepcounter{to}
    \draw (\from,1) -- (\theto,2);
  }
  \draw[gray] (0.5,0.5) rectangle (\theto+0.5,2.5);
\end{tikzpicture}


\begin{tikzpicture}
  \setcounter{row}{0}
  \foreach \list in {{2,3,1},{1,3,2}} {
    \stepcounter{row}
    \setcounter{to}{0}
    \foreach \from in \list {
      \stepcounter{to}
      \draw (\from,\therow) -- (\theto,\therow+1);
    }
  }
  \draw[gray] (0.5,0.5) rectangle (\theto+0.5,\therow+1.5);
\end{tikzpicture}

\end{document}

Demo

Antwort2

Diese Lösung hat den Nachteil, dass die Liste mehrere Male durchlaufen werden muss, vermeidet jedoch das Festlegen einer globalen Variable.

\documentclass{article}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
  \foreach \list [count=\row] in {{2,3,1},{1,3,2}} {
    \foreach \from [count=\to] in \list {
      \draw (\from,\row) -- (\to,\row+1);
    }
  }
  \foreach \list [count=\count] in {{2,3,1},{1,3,2}} {
    \ifx \count \row
      \foreach \from [count=\to] in \list {
      }
      \draw[gray] (0.5,0.5) rectangle (\to+0.5,\row+1.5);
    \fi
  }
\end{tikzpicture}

\end{document}

Das Problem mit meiner ersten Version ist, dass sie \toaußerhalb des Gültigkeitsbereichs lag, als ich sie verwenden wollte. Diese Version verwendet sie, wenn sie noch innerhalb des Gültigkeitsbereichs liegt.

verwandte Informationen