Tikz-Knoten mit Listing-Umgebung

Tikz-Knoten mit Listing-Umgebung

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 tcolorboxCodeliste darin zu erstellen und das Feld einzuschließen, tikz nodedamit ich Linien zwischen den Knoten zeichnen kann.

nodeAlso 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 tikzund zu sein environ.

Mein Lösungsvorschlag verzichtet auf das environPaket, das zwar ein tolles Tool ist, hier aber nicht benötigt wird. Die CodeNodeOptionen werden von mynodeoptionsund 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}

Bildbeschreibung hier eingeben

verwandte Informationen