
Ich versuche, eine C++-Klassenhierarchie zu erstellen. Jeder Knoten in der Hierarchie ist eine Klassenbeschreibung mit einer Codeliste darin und mehrere Knoten sind durch Linien und Pfeile verbunden, die die Hierarchie darstellen. Ich versuche, den Knoten mit einer tcolorbox
Codeliste darin zu erstellen und das Feld einzuschließen, tikz node
damit ich Linien zwischen den Knoten zeichnen kann.
node
Also habe ich eine CodeNode-Umgebung erstellt und versuche , verwandte Dinge in der Umgebung aufzurufen . Das MWE ist hier
\documentclass{book}
\usepackage{tcolorbox}
\usepackage{tikz}
\usepackage{environ}
\tcbuselibrary{listings}
\NewEnviron{CodeNode}{
\node{%
\begin{minipage}{0.8\textwidth}
\begin{tcbwritetemp}
{\BODY}
\end{tcbwritetemp}
\tcbox[arc=0pt,outer arc=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
boxrule=0.6pt,title=#1]{\tcbusetemplisting}
\end{minipage}
};
}
\begin{document}
\begin{figure}
\begin{tcolorbox}
\begin{tikzpicture}
\begin{CodeNode}[class name]
virtual void draw() = 0;
virtual void some_other_function() = 0;
\end{CodeNode}
\end{tikzpicture}
\end{tcolorbox}
\end{figure}
\end{document}
Ich erhalte einen Fehler in tcbwritetemp
Library (tcolorbox): 'tcblistingscore.code.tex' version '2.60'
)) (./mwe.aux) ABD: EveryShipout initializing macros
! Argument of \next has an extra }.
<inserted text>
\par
l.30 \end{CodeNode}
Was übersehe ich hier?
Antwort1
Das Hauptproblem scheint die Erfassung des wörtlichen Textes im Zusammenspiel mit tikz
und zu sein environ
.
Mein Lösungsvorschlag verzichtet auf das environ
Paket, das zwar ein tolles Tool ist, hier aber nicht benötigt wird. Die CodeNode
Optionen werden von mynodeoptions
und gespeichert mytcboptions
. Ich habe den Optionen obligatorische Parameter wie Knotenname und Position hinzugefügt. Meine angegebenen Beispieleinstellungen können Sie problemlos an Ihre eigenen Bedürfnisse anpassen.
\documentclass{book}
\usepackage{tcolorbox}
\usepackage{tikz}
\tcbuselibrary{listings}
\newenvironment{CodeNode}[4][]{
\tikzset{mynodeoptions/.style={at={(#2)},name=#3,#1}}%
\tcbset{mytcboptions/.style={title=#4}}%
\tcboutputlisting%
}{\endtcboutputlisting%
\node[inner sep=0pt,outer sep=0pt,draw=none,fill=none,mynodeoptions]{%
\tcbinputlisting{listing only,width=0.8\textwidth,colback=white,
arc=0pt,outer arc=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
boxrule=0.6pt,mytcboptions}};%
}
\begin{document}
\begin{figure}
\begin{tcolorbox}[center upper,colframe=blue!50!black,colback=blue!5!white]
\begin{tikzpicture}
\begin{CodeNode}{0,2}{anode}{class name}
virtual void draw() = 0;
virtual void some_other_function() = 0;
\end{CodeNode}
\begin{CodeNode}{0,-2}{bnode}{other class name}
virtual void other_draw() = 0;
virtual void yet_some_other_function() = 0;
\end{CodeNode}
\draw[red,very thick,->] (anode)--(bnode);
\draw[red,very thick,->] (anode.east)-- ++(1,0);
\draw[red,very thick,->] (anode.west)-- ++(-1,0);
\end{tikzpicture}
\end{tcolorbox}
\end{figure}
\end{document}