使用 \tikzstyle 对放置在 \path [line] 上的文本进行样式设置。

使用 \tikzstyle 对放置在 \path [line] 上的文本进行样式设置。

我是 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=\tinyfont=\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}

相关内容