改变tikz矩阵的内部sep而不影响其内部的节点

改变tikz矩阵的内部sep而不影响其内部的节点

这与括号内的 tikz 图片基线但这是另一个问题。

考虑以下 MWE:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix} % for "matrix of math nodes"

\begin{document}

\begin{equation}
    \begin{tikzpicture}[baseline=(current bounding box.center)]
        \matrix[matrix of math nodes, draw, nodes={draw}] {
            a & b & c \\
            d & e & f \\
        };
    \end{tikzpicture}
\end{equation}

\end{document}

它产生以下输出:

在此处输入图片描述

我想消除矩阵内部节点与矩阵边界框之间的空间。将矩阵设置inner sep为 0 可以实现这一点 --- 但它也会改变矩阵内部所有节点的内部 sep,这不是我想要的:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix} % for "matrix of math nodes"

\begin{document}

\begin{equation}
    \begin{tikzpicture}[baseline=(current bounding box.center)]
        \matrix[matrix of math nodes, draw, nodes={draw}, inner sep=0pt] {
            a & b & c \\
            d & e & f \\
        };
    \end{tikzpicture}
\end{equation}

\end{document}

在此处输入图片描述

我怎样才能改变矩阵节点的内部分离,同时保持其内部的节点不变?

我发现了一个几乎重复的问题,如何固定 TikZ 矩阵边框和其节点之间的一定距离?。但是,该问题的答案只是明确设置了节点的内部 sep,这是我想避免的 - 我想将每个节点的内部 sep 保留为如果它不在矩阵中则会具有的任何值。

答案1

随着风格/tikz/every outer matrix您可以仅更改矩阵节点的样式,而不能更改矩阵的节点的样式。

代码

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix} % for "matrix of math nodes"
\tikzset{tight matrix/.style={every outer matrix/.append style={inner sep=+0pt}}}
\begin{document}
\begin{equation}
    \begin{tikzpicture}[baseline=(current bounding box.center)]
        \matrix[matrix of math nodes, draw, nodes={draw}, tight matrix] {
            a & b & c \\
            d & e & f \\
        };
    \end{tikzpicture}
\end{equation}
\end{document}

输出

在此处输入图片描述

答案2

据我所知,没有inner sep参数matrix node。因此,当某个inner sep固定时,它决定了节点的内部分离,也决定了节点与矩阵边界之间的分离。为了避免这种行为,您应该使用 M. Al Jumaily 的解决方案:nodes={inner sep=...}

如果您不喜欢它,一个可能的替代方案是使用not draw矩阵边框并用节点绘制它fit。在这种情况下,您可以保留原始节点内部分隔(最初为 .3333em),并且可以将边框绘制到您决定的任何分隔。

以下代码展示了此解决方案。矩阵边框未绘制,并且添加了三个带有fit节点的不同边框。

我认为这不是一个好的解决方案,因为您必须区分真实矩阵节点和拟合节点,并且您必须知道哪些内部节点更大才能将它们包含在fit列表中。

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix, fit} % for "matrix of math nodes"

\begin{document}

\begin{equation}
    \begin{tikzpicture}[baseline=(current bounding box.center)]
        \matrix[matrix of math nodes, nodes={draw}] (A) {
            a & b & c \\
            d & e & f \\
        };
     \node[fit={(A-1-1) (A-1-2) (A-2-3)}, inner sep=0pt, draw=green, inner sep=2pt] (B) {};
     \node[fit={(A-1-1) (A-1-2) (A-2-3)}, inner sep=0pt, draw=blue, inner sep=0pt] (C) {};
     \node[fit={(A-1-1) (A-1-2) (A-2-3)}, inner sep=0pt, draw=red, inner sep=5mm] (D) {};
    \end{tikzpicture}
\end{equation}

\end{document}

在此处输入图片描述

答案3

此答案基于弗里茨的回答始终值得称赞。

输出

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix}

\tikzset{custom nodes/.style={
    draw=red,
    matrix of math nodes,
    cells/.expanded={
        nodes={draw=blue},
        inner xsep=\pgfkeysvalueof{/pgf/inner xsep},
        inner ysep=\pgfkeysvalueof{/pgf/inner ysep}
    }
}}
\begin{document}
    \begin{equation}
        \begin{tikzpicture}[ baseline=(current bounding box.center)]
        \matrix[custom nodes, inner sep=0pt] {
            a & b & c \\
            d & e & f \\
            };
        \end{tikzpicture}
    \end{equation}
\end{document}

相关内容