"Undefined control sequence" in Verbindung mit TikZ-matrix

Tabellen und Grafiken erstellen und anordnen


MoonKid
Forum-Meister
Forum-Meister
Beiträge: 690
Registriert: Sa 30. Jun 2012, 11:56

"Undefined control sequence" in Verbindung mit TikZ-matrix

Beitrag 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?
XeLaTeX, TeX Live, vim-latexsuite

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

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

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2466
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

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

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag 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.
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

MoonKid
Forum-Meister
Forum-Meister
Beiträge: 690
Registriert: Sa 30. Jun 2012, 11:56

Beitrag 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
        }
    }
}
XeLaTeX, TeX Live, vim-latexsuite

MoonKid
Forum-Meister
Forum-Meister
Beiträge: 690
Registriert: Sa 30. Jun 2012, 11:56

Beitrag von MoonKid »

Bartman hat geschrieben:
	\ifnum\pdfstrcmp{#1}{+}=0
Funktioniert nicht mit meiner Engine (XeLaTeX).

Das Equivalent wäre \strcmp.
Bartman hat geschrieben:
	]{$#2$}; % <- geändert
Warum?
XeLaTeX, TeX Live, vim-latexsuite

DADABBI

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

MoonKid
Forum-Meister
Forum-Meister
Beiträge: 690
Registriert: Sa 30. Jun 2012, 11:56

Beitrag von MoonKid »

Sehr geil! :D Ich denke halt zu prozuderal.
XeLaTeX, TeX Live, vim-latexsuite

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

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

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2466
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

MoonKid hat geschrieben:
Bartman hat geschrieben:
	]{$#2$}; % <- geändert
Warum?
Mit mathematischem Modus:

Bild

Ohne mathematischen Modus:

Bild
Dateianhänge
mit_mathematischem_Modus.png
mit_mathematischem_Modus.png (5.56 KiB) 3436 mal betrachtet
ohne_mathematischen_Modus.png
ohne_mathematischen_Modus.png (4.92 KiB) 3455 mal betrachtet

Antworten