我是 LaTeX 的新手,我正在尝试弄清楚如何配置 TikZ 以将文本定位在此流程图中的连接线上(而不是旁边),然后为该文本填充白色背景矩形。
我的问题主要来自于这样的事实:我无法将样式与行内的文本节点关联(我无法执行 [text]),并且我不知道如何使用 \tikzstyle 执行子样式来匹配没有关联样式的节点(在 CSS 中,这将是 .line > node 或类似的东西)。
我确信这是一个非常非常简单的问题,但不幸的是谷歌似乎没有答案!
有人可以帮忙吗?
% Define block styles
\tikzstyle{decision} = [diamond, draw, fill=blue!20,
text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt]
\tikzstyle{block} = [rectangle, draw, fill=blue!20,
text width=5em, text centered, rounded corners, minimum height=4em]
\tikzstyle{line} = [draw, text centered , -latex']
\tikzstyle{line node} = [draw, fill=white, font=\tiny ]
\tikzstyle{cloud} = [draw, ellipse,fill=red!20, node distance=3cm,
minimum height=2em]
\begin{center}
\begin{tikzpicture}[node distance = 3cm, auto]
% Place nodes.
\node [] (_split01) {};
\node [block, left of=_split01, node distance = 2cm] (program) {Program};
\node [block, right of=_split01, node distance = 2cm] (unit) {Unit};
\node [block, below of=_split01] (procedure) {Procedure};
\node [block, left of=procedure] (entrypoint) {Entry Point};
\node [block, right of=procedure] (function) {Function};
\node [block, below of=procedure] (block) {Block};
\node [block, below of=block] (statement) {Statement};
\node [below of=statement] (_split02) {};
\node [block, left of=_split02, node distance = 2cm] (assignment) {Assignment Statement};
\node [block, right of=_split02, node distance = 2cm] (expression) {Expression Statement};
% Connect nodes.
\path [line] (program) -- node {References} (unit);
\path [line] (program) -- node {Defines and Calls} (entrypoint);
\path [line] (program) -- node {Defines} (procedure);
\path [line] (program) -- node {Defines} (function);
\path [line] (unit) -- node {Defines} (procedure);
\path [line] (unit) -- node {Defines} (function);
\path [line] (entrypoint) -- (block);
\path [line] (procedure) -- (block);
\path [line] (function) -- (block);
\end{tikzpicture}
\end{center}
答案1
关键的一行是\begin{tikzpicture}
这样的。它目前的内容是:
\begin{tikzpicture}[node distance = 3cm, auto]
为了获得想要的效果,它应该是:
\begin{tikzpicture}[node distance = 3cm,every node/.style={rectangle,fill=white}]
得出的结果为:
但值得指出的是,您的某些节点重叠,因此需要进行一些调整以避免这种情况。
以下是对这些差异的一些解释。
您需要一种“默认”样式,它与尚未具有样式的任何内容相匹配。我不知道这是否完全可行,但接近的做法是定义一个默认样式,用于设置后续样式中未指定的内容的处理方式。区别在于本地样式完全地覆盖默认值或仅覆盖其指定的部分。(实际上,我对 CSS 的有限经验是后者也是那里的标准行为。)因此,我们使用语法设置默认节点样式every node/.style={...}
。我们说我们希望所有节点都是矩形并填充白色。由于您的自定义样式都指定了形状和填充颜色,因此这不会传播到其中任何一个,但会影响标签。如果我们将键添加到默认样式中,我们可以看到这一点font=\tiny
。如果我们只这样做,全部节点上的文本很小。如果我们添加font=\normalsize
自定义样式,它们就会恢复到原来的大小。
另一个区别是单词auto
。这会影响线上节点的定位方式。如果给出,则对于线上指定的节点,如 ,\path (0,0) -- node {a} (1,0);
则节点会移到线上(尽管如果线是倒置的,“上面”可能意味着“下面”!)(添加键swap
会交换它)。删除它可确保标签现在实际上是在这条线就是你想要的。
为了避免冲突,您可以使用pos=.X
语法按比例沿其线移动节点。我还会缩小文本(font=\tiny
或font=\small
),否则您将看不到单词“References”后面的行。以下是该版本:
完整代码如下:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
% Define block styles
\tikzstyle{decision} = [diamond, draw, fill=blue!20,
text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt]
\tikzstyle{block} = [rectangle, draw, fill=blue!20,
text width=5em, text centered, rounded corners, minimum height=4em,font=\normalsize]
\tikzstyle{line} = [draw, -latex']
\tikzstyle{line node} = [draw, fill=white, font=\tiny ]
\tikzstyle{cloud} = [draw, ellipse,fill=red!20, node distance=3cm,
minimum height=2em]
\begin{center}
\begin{tikzpicture}[node distance = 3cm,every node/.style={rectangle,fill=white,font=\tiny}]
% Place nodes.
\node [] (_split01) {};
\node [block, left of=_split01, node distance = 2cm] (program) {Program};
\node [block, right of=_split01, node distance = 2cm] (unit) {Unit};
\node [block, below of=_split01] (procedure) {Procedure};
\node [block, left of=procedure] (entrypoint) {Entry Point};
\node [block, right of=procedure] (function) {Function};
\node [block, below of=procedure] (block) {Block};
\node [block, below of=block] (statement) {Statement};
\node [below of=statement] (_split02) {};
\node [block, left of=_split02, node distance = 2cm] (assignment) {Assignment Statement};
\node [block, right of=_split02, node distance = 2cm] (expression) {Expression Statement};
% Connect nodes.
\path [line] (program) -- node {References} (unit);
\path [line] (program) -- node[pos=.3] {Defines and Calls} (entrypoint);
\path [line] (program) -- node[pos=.7] {Defines} (procedure);
\path [line] (program) -- node[pos=.3] {Defines} (function);
\path [line] (unit) -- node[pos=.3] {Defines} (procedure);
\path [line] (unit) -- node {Defines} (function);
\path [line] (entrypoint) -- (block);
\path [line] (procedure) -- (block);
\path [line] (function) -- (block);
\end{tikzpicture}
\end{center}
\end{document}