Seite 1 von 1

tikz: Weiterrechnen mit einer Arraylänge.

Verfasst: Sa 15. Okt 2022, 14:28
von ftic
Hallo zusammen,

ich habe ein Array (p), das aus strings besteht, und berechne mir die Länge (z) daraus. In der Variablen \z ist dann der Wert 5 gespeichert mit dem ich gerne weiterrechnen möchte. Wenn ich allerdings die Konstante "5" in Zeile 23 mit "\z" tausche bekomme ich eine Fehlermeldung. Warum kann ich mit der berechneten 5 nicht weiterrechnen? Ist die nicht als numerischer Wert sondern als String hinterlegt?

Vielen Dank für eure Hilfe.
\documentclass{article}
\usepackage{tikz}

\newcounter{arraycard}
\def\arrayLength#1{%
  \setcounter{arraycard}{0}%
  \foreach \x in #1{%
    \stepcounter{arraycard}%
  }%
  \the\value{arraycard}%
}  

\begin{document}

\begin{tikzpicture}

\def \n {5}
\def \ra {3cm}
\def \p {s, r, w, t, z}
\def \z {\arrayLength{\p}}

\foreach \x [count=\i] in \p 
    \node[draw, circle] (\x) at ({360/ 5 * (\i - 1)}:\ra) {\x}; 
    
\node[] at (1, 1) {\z};

\draw[->, red] (s) -- (r);
\draw[->, green] (t) -- (z);

\end{tikzpicture}

\end{document}

Re: tikz: Weiterrechnen mit einer Arraylänge.

Verfasst: Sa 15. Okt 2022, 15:06
von KOMA
TeX ist eine Makrosprache. Das heißt, \z expandiert zu dem Code aus seiner Definition, wobei Argumente natürlich eingesetzt werden. Du willst aber einen Wert. Das ginge mit \edef statt \def. Allerdings ist \arrayLength nicht voll expandierbar, weil beispielsweise \foreach nicht voll expandierbar ist. Deshalb muss man das etwas anders regeln:
\documentclass{article}
\usepackage{tikz}

\newcounter{arraycard}
\newcommand\deftoarrayLength[2]{%
  \setcounter{arraycard}{0}%
  \foreach \x in #2{%
    \stepcounter{arraycard}%
  }%
  \edef#1{\the\value{arraycard}}%
}  

\begin{document}

\begin{tikzpicture}

\def \n {5}% gefährlich!
\def \ra {3cm}% gefährlich!
\def \p {s, r, w, t, z}% gefährlich!
\deftoarrayLength\z{\p}% gefährlich!

\foreach \x [count=\i] in \p 
    \node[draw, circle] (\x) at ({360/\z * (\i - 1)}:\ra) {\x}; 
    
\node[] at (1, 1) {\z};

\draw[->, red] (s) -- (r);
\draw[->, green] (t) -- (z);

\end{tikzpicture}

\end{document}
Die Zeilen, die ich als gefährlich eingestuft habe, sind deshalb gefährlich, weil man mit \def und \edef immer Gefahr läuft vorhandene, wichtige Makros umzudefinieren. Auf LaTeX-Ebene sollte man das daher nicht ohne Sicherheitsmaßnahmen verwenden.