Seite 1 von 1
"Undefined control sequence" in Verbindung mit TikZ-matrix
Verfasst: Do 21. Jul 2016, 11:28
von MoonKid
Sorry, für den schlechten Titel. Weiß halt nicht an welcher Komponente es wirklich liegt.
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{ifthen}
\newcommand{\robGbase}[2]{%
\node [fill=#1,circle,inner sep=0em,radius=0.5em] {#2};
}
\newcommand{\robG}[1]{%
\ifthenelse{ \equal{#1}{+} }
{\robGbase{green}{+}}
{%
\ifthenelse{ \equal{#1}{-} }
{\robGbase{red}{-}}
{% else
}
}
}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes]
{
A & \robGbase{green}{+} \\
B & \robG{+} \\
};
\end{tikzpicture}
\end{document}
Der Fehler lautet
(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty) (./mn.aux)
ABD: EveryShipout initializing macros
! Undefined control sequence.
\robGbase #1#2->\node
[fill=#1,circle,inner sep=0em,radius=0.5em] {#2};
l.26 B & \robG{+}
\\
Ich habe etwas mit Codereduzierung usw experimentiert.
Der Fehler ist für mich nur reproduzierbar, wenn ich die Matrix in Verbindung mit dem eigenen Makro \robG verwende.
Aber wahrscheinlich handelt es sich hier doch um ein elementareres Problem?
Verfasst: Do 21. Jul 2016, 12:01
von esdd
Wenn Du eine matrix of nodes verwendest, dann werden die einzelnen Zellen als Nodetext betrachtet und in diesem ist der Befehl \node nicht definiert. Der Befehl \robGbase funktioniert, weil (Zitat aus der Doku)
If your cell starts with a \path command or any command that expands to \path, which includes \draw, \node, \fill and others, the \node{ startup code and the }; code are suppressed. This means that for this particular cell you can provide totally different contents.
Fügst Du am Anfang von \robG ein \path; ein, dann funktioniert es auch dafür.
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{ifthen}
\newcommand{\robGbase}[2]{%
\node [fill=#1,circle,inner sep=0em,radius=0.5em] {#2};
}
\newcommand{\robG}[1]{%
\path;% <- eingefügt
\ifthenelse{ \equal{#1}{+} }
{\robGbase{green}{+}}
{%
\ifthenelse{ \equal{#1}{-} }
{\robGbase{red}{-}}
{% else
}
}
}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes]
{
A & \robGbase{green}{+} \\
B & \robG{+} \\
};
\end{tikzpicture}
\end{document}
Verfasst: Do 21. Jul 2016, 14:29
von Bartman
@MoonKid
Deine Fallunterscheidungen lassen sich ohne das Laden eines weiteren Pakets verwirklichen.
\documentclass[tikz]{standalone}
\usetikzlibrary{matrix}
\newcommand{\robGbase}[2]{%
\node[
fill=#1,
circle,
inner sep=0em,
radius=0.5em
]{$#2$}; % <- geändert
}
\newcommand{\robG}[1]{%
\path;
\ifnum\pdfstrcmp{#1}{+}=0
\robGbase{green}{+}
\else
\ifnum\pdfstrcmp{#1}{-}=0
\robGbase{red}{-}
\fi
\fi
}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes]
{
A & \robG{+} \\
B & \robG{-} \\
};
\end{tikzpicture}
\end{document}
Außer
ifthen gibt es da noch
etoolbox, welches den Befehl \ifstrequal zur Verfügung stellt.
Quelle:
Are there any “if” commands like “\ifnum” in LaTeX?
Verfasst: Do 21. Jul 2016, 15:25
von Johannes_B
Mir erscheint die Fallunterscheidung hier vollkommen überflüssig. Ich würde mir einfach zwei verschiedene Makros schreiben und nutzen. \robGp and \robGm für Plus und Minus. Ist auch weniger Schreibarbeit.
Verfasst: Fr 22. Jul 2016, 09:39
von MoonKid
Johannes_B hat geschrieben:Mir erscheint die Fallunterscheidung hier vollkommen überflüssig.
Auf mein Minimalbeispiel bezogen, hast du recht. Der Orignal-Code unterscheidet aber 4 Fälle.
esdd hat geschrieben:Wenn Du eine matrix of nodes verwendest, dann werden die einzelnen Zellen als Nodetext betrachtet
Mal gucken, ob ich es wirklich verstanden habe.

In meinem ursprünglichen Code wird also der Inhalt des Makrso \robG wie Text in einem \node interpretiert?
Als würde ich schreiben
\node {
\ifthenelse{ \equal{#1}{+} }
{\robGbase{green}{+}}
{%
\ifthenelse{ \equal{#1}{-} }
{\robGbase{red}{-}}
{% else
}
}
}
Verfasst: Fr 22. Jul 2016, 09:53
von MoonKid
Bartman hat geschrieben: \ifnum\pdfstrcmp{#1}{+}=0
Funktioniert nicht mit meiner Engine (XeLaTeX).
Das Equivalent wäre \strcmp.
Warum?
Verfasst: Fr 22. Jul 2016, 09:58
von DADABBI
Je mehr Fälle, desto effektiver ist eigentlich die Verwendung von Makros an Stelle einer ausufernden Fallunterscheidung. Im gezeigten Fall genügt es aber auch, entsprechende Farben zu definieren:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\colorlet{node+}{green}
\colorlet{node-}{red}
\newcommand{\robGbase}[1]{%
\node [fill=node#1,circle,inner sep=0em,radius=0.5em] {#1};
}
\newcommand{\robG}[1]{%
\path;% <- eingefügt
\robGbase{#1}%
}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes]
{
A & \robGbase{+} \\
B & \robG{+} \\
};
\end{tikzpicture}
\end{document}
Natürlich kann man dann \robG und \robGbase auch gleich zu einer Anweisung zusammenfassen.
Verfasst: Fr 22. Jul 2016, 10:57
von MoonKid
Sehr geil!

Ich denke halt zu prozuderal.
Verfasst: Fr 22. Jul 2016, 11:37
von esdd
MoonKid hat geschrieben:
Mal gucken, ob ich es wirklich verstanden habe. :)
In meinem ursprünglichen Code wird also der Inhalt des Makrso \robG wie Text in einem \node interpretiert?
Genau. Und, abgesehen davon, dass man den Befehl \gobG mit dem Vorschlag von DADABBI ja gar nicht mehr brauchen würde, kann man in
DADABBI hat geschrieben:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\colorlet{node+}{green}
\colorlet{node-}{red}
\newcommand{\robGbase}[1]{%
\node [fill=node#1,circle,inner sep=0em,radius=0.5em] {#1};
}
\newcommand{\robG}[1]{%
\path;% <- eingefügt
\robGbase{#1}%
}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes]
{
A & \robGbase{+} \\
B & \robG{+} \\
};
\end{tikzpicture}
\end{document}
\path; in der Definition \robG weglassen, weil \robGbase zu etwas expandiert, an dessen Anfang ein \node Befehl steht.
Verfasst: Fr 22. Jul 2016, 14:12
von Bartman
MoonKid hat geschrieben:
Warum?
Mit mathematischem Modus:
Ohne mathematischen Modus:
