tikz: Weiterrechnen mit einer Arraylänge.

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: tikz: Weiterrechnen mit einer Arraylänge.

Re: tikz: Weiterrechnen mit einer Arraylänge.

von KOMA » Sa 15. Okt 2022, 15:06

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.

tikz: Weiterrechnen mit einer Arraylänge.

von ftic » Sa 15. Okt 2022, 14:28

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}

Nach oben