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.
TeX ist eine Makrosprache. Das heißt, [tt]\z[/tt] expandiert zu dem Code aus seiner Definition, wobei Argumente natürlich eingesetzt werden. Du willst aber einen Wert. Das ginge mit [tt]\edef[/tt] statt [tt]\def[/tt]. Allerdings ist [tt]\arrayLength[/tt] nicht voll expandierbar, weil beispielsweise [tt]\foreach[/tt] nicht voll expandierbar ist. Deshalb muss man das etwas anders regeln: [code]
\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}
[/code]
Die Zeilen, die ich als gefährlich eingestuft habe, sind deshalb gefährlich, weil man mit [tt]\def[/tt] und [tt]\edef[/tt] immer Gefahr läuft vorhandene, wichtige Makros umzudefinieren. Auf LaTeX-Ebene sollte man das daher nicht ohne Sicherheitsmaßnahmen verwenden.