我正在尝试创建一个 C++ 类层次结构。层次结构中的每个节点都是一个类描述,其中包含代码列表,多个节点通过描绘层次结构的线条和箭头连接。我正在尝试使用其中的tcolorbox
代码列表创建节点并将框包含在内,tikz node
以便我可以在节点之间画线。
所以我创建了 CodeNode 环境,并尝试node
在环境中调用相关内容。MWE 在这里
\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}
我在 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}
我在这里遗漏了什么?
答案1
tikz
主要问题似乎是在与和交互时捕获逐字文本environ
。
我的解决方案建议跳过environ
包,这是一个很棒的工具,但这里不需要。选项由和CodeNode
保存。我在选项中添加了节点名称和位置等强制参数。您可以轻松地根据自己的需要调整我给出的示例设置。mynodeoptions
mytcboptions
\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}