如何在 TikZ 矩阵节点中插入换行符?

如何在 TikZ 矩阵节点中插入换行符?

如何在matrix节点内获取换行符?以下给出错误:

软件包 tikz 错误:放弃此路径。您忘记了分号吗?

除非我删除换行符。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{chains}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
    \matrix (m) [
        matrix of nodes
    ] {
         {some text} &
         {this node \\ does not work} \\
         {other text} &
         {more text} \\
    };
\end{tikzpicture}
\end{document}

答案1

就像在任何节点一样,您需要指定对齐方式才能断线。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{chains}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
    \matrix (m) [
        matrix of nodes, 
        nodes={align=left, text width=3cm} % New!
    ] {
         {some text} &
         {text with \\ linebreak} \\
         {other text} &
         {more text} \\
    };
\end{tikzpicture}
\end{document}

出于某种原因,对于矩阵中的节点,您还需要指定节点文本的宽度。

任何大于实际宽度的值都应该可以工作,但是在完成文档时,您应该尝试使该值尽可能接近文本的实际宽度,以便节点锚点能够位于预期的位置。

- - 编辑 - -

如果想避免text width指定,可以手动绘制节点:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{chains}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
    \matrix (m) [
        matrix of nodes%, 
        %nodes={align=left, text width=3cm} % Not needed now
    ] {
         {some text} &
         \node[align=left] {text with \\ linebreak}; \\      
         {other text} &
         {more text} \\
    };
\end{tikzpicture}
\end{document}

答案2

这里有一个替代方案,它使用选项将矩阵中每个节点的内容包装在包\pbox定义的可变宽度中。您可以有选择地将应用于有问题的材料,但这种方法允许使用问题的语法。是节点的最大宽度。由于节点的大小是单独确定的,我认为默认的左对齐看起来很奇怪,因此将内容居中。pboxexecute at begin cell\pbox\linewidth\pboxregexpatch

编辑:正如@cfr 在评论中指出的那样,\usetikzlibrary{chains}从原始问题中的 MWE 来看,这是没有必要的。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}

\usepackage{pbox}
\usepackage{regexpatch}
\makeatletter
    \xpatchcmd{\pb@xiii}{{\parbox[\pb@xargi]{\pb@xlen}{#2}}}{{\parbox[\pb@xargi]{\pb@xlen}{\centering#2}}}{}{fail}%
\makeatother

\begin{document}
\begin{tikzpicture}
    \matrix (m) [
        matrix of nodes,
        execute at begin cell = {\pbox[t]{\linewidth}},
    ] {
         {some text to test} &
         {really long text with\\ linebreak}\\
         {other text} &
         {more text} \\
    };
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

我不知道为什么。但是这有效。

\makeatletter
\def\tikz@lib@matrix@smuggle{%
  \bgroup%
  \def\\{\egroup\tikz@lib@matrix@saved@eol\bgroup}%
}
\tikz{
    \matrix(m)[matrix of nodes,nodes={anchor=center,align=center}]{
        some text  & {this node \\ now works}& \\
        other text & more text                 \\
    };
}

PS 原来的定义在/tikzlibrarymatrix.code.tex第60行:

\def\tikz@lib@matrix@smuggle{%
  \bgroup%
  \let\\=\tikz@lib@matrix@saved@eol%
}

这表明 TiZ 停止了,因为到达了类似

 \node{{this node \\ does not work}};

新的定义导致

 \node{{this node }\\{ now works}};

PS2. 这尚未经过广泛测试。

相关内容