tikz: Weiterrechnen mit einer Arraylänge.

Tabellen und Grafiken erstellen und anordnen


ftic
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Fr 16. Sep 2022, 10:31

tikz: Weiterrechnen mit einer Arraylänge.

Beitrag 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}

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Re: tikz: Weiterrechnen mit einer Arraylänge.

Beitrag 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.

Antworten