\protect-ratlosigkeit

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


flying sheep
Forum-Anfänger
Forum-Anfänger
Beiträge: 40
Registriert: So 27. Jul 2008, 14:34
Wohnort: München, By
Kontaktdaten:

\protect-ratlosigkeit

Beitrag von flying sheep »

hier mein minimalbeispiel.
minimaler gehts nicht, da ich keine ahnung habe, was hier fragil ist und was robust.
\usetikzlibrary{shapes.multipart}
\begin{tikzpicture}
	\newcommand{\ntimes}[2]{
		\newcounter{i}
		\setcounter{i}{0}
		\whiledo{\value{i}<#1}{\stepcounter{i}#2}
	}
	\newcommand{\toword}[1]{
		\ifcase#1 \relax
		\or       one
		\or       two
		\or       three
		\or       four
		\or       five
		\or       six
		\or       seven
		\or       eight
		\or       nine
		\else     \relax
		\fi
	}
	\pgfmathtruncatemacro{\maxcount}{3*2+1}
	\node (test) [
		rectangle split,
		rectangle split horizontal,
		rectangle split parts=\protect\maxcount,
		rectangle split part fill={orange\ntimes{3}{,white,orange}},
		draw
	] at (0,0) {
		\foreach \x in {1,...,3}
			\pgftruncatemacro{\twox}{2*\x}
			\nodepart{\toword{\twox}}
			\toword{\x}
	};
\end{tikzpicture}
im anhang meine vorlage für ktikz, für nicht-ktikz-benutzer einfach „<>“ durch obigen code ersetzen.

ziel: ich möchte einen multipart-node erstellen, bei dem jeder ungerade part orange und schmal ist, jeder gerade weiß und mit kₐ beschriftet, wobei a eine fortlaufende nummer ist. sinn ist es, einen b-baum darzustellen, die orangen nodes sind pointer, die weißen werte.
im beispielcode hab ich, anstatt ein neues kommando zu erstellen, konstanten eingesetzt (variablen werden im fertigen code alle vorkommen von „3“ sein, die koordinate des knoten (0,0) und sein name (test))

problem: latex macht mir einen strich durch die rechnung und motzt mit
Argument of \pgffor@next has an extra }
, was (wie ich mir schon angelesen habe) bedeutet, dass eben ein fragiles kommando in einem beweglichen argument ist. kann mir jemand die fragilen kommandos erjagen und zur strecke bringen?
Dateianhänge
sansserif.tex
(446 Bytes) 727-mal heruntergeladen

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

Bei solchen Anwendungen muss das Argument in der Regel expandierbar sein. Hier ist eine expandierbare (aber nicht endrekursive) Variante von \ntimes:
\newcommand*{\ntimes}[2]{%
  \ifnum\numexpr#1>0
    #2%
    \expandafter\ntimes\expandafter{\number\numexpr#1-1}{#2}%
  \fi
}

Antworten