"Undefined control sequence" in Verbindung mit TikZ-matrix

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: "Undefined control sequence" in Verbindung mit TikZ-matrix

von Bartman » Fr 22. Jul 2016, 14:12

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

Bild

Ohne mathematischen Modus:

Bild
Dateianhänge
ohne_mathematischen_Modus.png
ohne_mathematischen_Modus.png (4.92 KiB) 3462 mal betrachtet
mit_mathematischem_Modus.png
mit_mathematischem_Modus.png (5.56 KiB) 3443 mal betrachtet

von esdd » Fr 22. Jul 2016, 11:37

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.

von MoonKid » Fr 22. Jul 2016, 10:57

Sehr geil! :D Ich denke halt zu prozuderal.

von DADABBI » Fr 22. Jul 2016, 09:58

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.

von MoonKid » Fr 22. Jul 2016, 09:53

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?

von MoonKid » Fr 22. Jul 2016, 09:39

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

von Johannes_B » Do 21. Jul 2016, 15:25

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.

von Bartman » Do 21. Jul 2016, 14:29

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

von esdd » Do 21. Jul 2016, 12:01

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}

"Undefined control sequence" in Verbindung mit TikZ-matrix

von MoonKid » Do 21. Jul 2016, 11:28

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?

Nach oben