TikZ 中矩阵周围的括号

TikZ 中矩阵周围的括号

我正在使用 TikZ 编写一个用于标记矩阵的自定义包。我注意到 TikZ 中存在不一致。以下 MWE 可以最好地说明这一点:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
\begin{tikzpicture}[baseline=(m.west)]
\matrix (m) [draw=white!80!black, 
         left delimiter=[,right delimiter={]}, matrix of math nodes] 
         { 1 & 1 \\ };
\end{tikzpicture} 
\begin{tikzpicture}[baseline=(m.west)]
\matrix (m) [draw=white!80!black,
         left delimiter=[,right delimiter={]}, matrix of math nodes] 
         { 1 & 1 \\ 2 & 2 \\ };
\end{tikzpicture} 
\begin{tikzpicture}[baseline=(m.west)]
\matrix (m) [draw=white!80!black, 
         left delimiter=[,right delimiter={]}, matrix of math nodes] 
         { 1 & 1 \\ 2 & 2 \\ 3 & 3 \\ };
\end{tikzpicture}

\end{document}

令人惊讶的是(至少对我来说),它呈现如下:

在此处输入图片描述

显然,单行矩阵的括号与多行矩阵的对齐方式不同。我期望所有情况下的括号都比灰色框略小。

为什么会这样?更重要的是,我该如何补救?

更新 1:根据下面@percusse的评论,补救措施似乎是添加outer sep=0pt到每个矩阵的选项中。现在我遇到了下一个问题:我想控制行之间的空间量。当添加row sep=0.1em到每个矩阵时(除了outer sep=0pt),这再次令人惊讶地呈现为:

在此处输入图片描述

答案1

我在 @percusse 的提示下发现了这个问题。问题的原因是 TeX 对分隔符的高度进行了某种舍入。以下代码说明了这一点:

\documentclass{standalone}
\begin{document}
$\left[\vcenter{\vbox to 33pt {}}\right]$
$\left[\vcenter{\vbox to 34pt {}}\right]$
$\left[\vcenter{\vbox to 35pt {}}\right]$
$\left[\vcenter{\vbox to 36pt {}}\right]$
$\left[\vcenter{\vbox to 37pt {}}\right]$
$\left[\vcenter{\vbox to 38pt {}}\right]$
$\left[\vcenter{\vbox to 39pt {}}\right]$
$\left[\vcenter{\vbox to 40pt {}}\right]$
\end{document}

其呈现形式如下:

在此处输入图片描述

PGF 中的违规代码位于文件中

texmf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymatrix.code.tex, 

定义如下宏:

\def\tikz@delimiter#1#2#3#4#5#6#7#8{%
  \bgroup
    \pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name}%
    node[outer sep=0pt,inner sep=0pt,draw=none,draw=none,fill=none,anchor=#1,at=(\tikz@last@fig@name.#2),#3]
    {%
      {\nullfont\pgf@process{\pgfpointdiff{\pgfpointanchor{\tikz@last@fig@name}{#4}}{\pgfpointanchor{\tikz@last@fig@name}{#5}}}}%
      $\left#6\vcenter{\hrule height .5#8 depth .5#8 width0pt}\right#7$%
    }
    \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}%
  \egroup%
}

节点主体内的第一行计算分隔符的所需高度。第二行创建一个具有左分隔符和右分隔符的数学环境,内部主体(\vcenter{\hrule height .5#8 depth .5#8 width0pt})是一个具有所需高度的空框。但是,放置在此框周围的分隔符大小不正确。因此:为了正确绘制括号,我想我们应该使用 TikZ 来绘制括号(即“手动”绘制线条),而不是让 TeX 完成这项工作。

但也许更好的方法是稍微缩放 TeX 生成的括号以匹配正确的大小。Martin Scharrer 已经实现了这一点。他的代码可以在以下位置找到:TikZ 中正确的分隔符高度

相关内容