这是 Frédéric 回答的稍加修改的代码如何在矩阵上方添加剪辑?
\documentclass{mwrep}
\usepackage{amsmath}
\usepackage{tikz}
\newcommand{\tikzmark}[2]{\tikz[overlay,remember picture,baseline] \node [anchor=base] (#1) {$#2$};}
\usetikzlibrary{decorations.pathreplacing}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Proin nibh augue, suscipit a, scelerisque sed, lacinia in, mi.
\begin{equation}
\bar{P}=
\bordermatrix{ \mathrm{state} & \tikzmark{left}{1} & \tikzmark{right}{2} \cr
1 & 0.3 & 0.1 \cr
2 & 0.3 & 0.2}
\end{equation}
\tikz[overlay,remember picture]{\draw[decoration=brace,decorate,blue] (left.north west) -- (right.north east) node[midway,above=15pt] {$S_1$};}
\end{document}
可以看到,蓝色部分画在了文本上。这是因为 LaTeX 没有将其计入公式大小。我该怎么做?
我above=15pt
特意这样设置,这样效果更明显。
答案1
(我感觉我应该表现得像那些房屋改造节目的主持人一样,他们到处走动,看着以前做过的所有粗制滥造的工作,然后大声啧啧称奇地说“谁告诉你把厨房水槽放在卧室里的?”)
问题是你想在这里发生冲突。当括号和它的标签放置那么您希望 TeX 忽略它们的大小。但是当放置方程式时,您又神奇地希望 TeX 再次注意到它们(“哦!它一直在那里吗?我以前没注意到它真是太傻了。”)。这也许是可能的,但需要比我更了解 TeX 的人来弄清楚。
在这种情况下,我实际上会使用单个 TikZ 图片来排版整个内容,从而完全避免这个问题。但是,由于在某些情况下这是不可能的,我将提出一个解决方案这这里有一个问题。这绝对是个 hack。它的作用是向零宽度和正确高度的方程添加一个新元素。我们在矩阵及其所有 gubbins 都已构建之后执行此操作,因此它不会影响它(我确实尝试在矩阵内部执行此操作,但那搞砸了)。新元素是 TikZ 路径。它需要从 TikZ 构建,因为我们想要引用括号上的标签。由于我们希望 TeX 注意到这个元素的大小,因此我们不能使用该overlay
选项,但由于我们想要引用其他图表中的内容,因此我们必须使用该remember picture
选项。使用remember picture
没有该overlay
选项非常危险,因为它会严重干扰边界框(可能会出现边界框随着每次新的 tex 运行而不断增大的情况)。为了避免这种情况,我们仅使用现有图片中的坐标。
神奇的命令是:
\tikz[remember picture,inner sep=0pt,baseline=0pt] \path (label.north);
关键remember picture
意味着 TikZ 会记录当前的tikzpicture。这意味着它可以计算其他记忆图片中坐标的相对位移,因此坐标规范(label.north)
确实指向标签顶部指定的页面上的位置(我将名称添加到节点$S_1$
)。然而,它是相对于当前图片。也就是说,它是相对于当前图片的原点的。这样就没问题了,但当 TikZ 将图片交给 TeX 放置在页面上时,TeX 不知道内部坐标,只知道边界框。由于我们只参考坐标(label.north)
,TeX 认为该图片由一个小点组成,并将其放置在这个位置(您可以通过替换\path (label.north);
为更复杂的东西来看到这一点,例如\draw (label.south) -- (label.north);
线条的高度正确,但被移位到当前位置)。为了解决这个问题,我们添加了一个baseline=0pt
选项,当 TikZ 将框交给 TeX 时,它还会说“应该将框放置在内部坐标 (0,0) 位于当前线的基线上的位置”。对我们来说,这会使图表向上移动,这样(label.north)
现在垂直方向就是它应该在的位置。事实上,它不是垂直它应该在的位置。同样,如果你\path
用合适的命令替换该命令\draw
,你会看到所有内容都移到了当前的水平位置。但那没关系,因为这里的问题只是垂直位移。
这是完整的代码。
\documentclass{mwrep}
\usepackage{amsmath}
\usepackage{tikz}
\newcommand{\tikzmark}[2]{\tikz[overlay,remember picture,baseline] \node [anchor=base] (#1) {$#2$};}
\usetikzlibrary{decorations.pathreplacing}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Proin nibh augue, suscipit a, scelerisque sed, lacinia in, mi.
\begin{equation}
\bar{P}=
\bordermatrix{ \mathrm{state} & \tikzmark{left}{1} & \tikzmark{right}{2} \cr
1 & 0.3 & 0.1 \cr
2 & 0.3 & 0.2}
\tikz[overlay,remember picture]{\draw[decoration=brace,decorate,blue] (left.north west) -- (right.north east) node[midway,above=15pt] (label) {$S_1$};}
\tikz[remember picture,baseline=0pt] \path (label.north);
\end{equation}
\end{document}
正如我所警告的,乱remember picture
用overlay
会导致边界框出现问题。如果内容开始放置在页面上奇怪的位置,请删除该.aux
文件。这会重置所有内容。
结果如下:
我的实验表明,该解决方案不会给方程添加任何水平空间。
答案2
我认为对于简单的括号来说,David 的解决方案很棒,而 TikZ 有点矫枉过正。但如果你打算在 TikZ 中使用更复杂的东西,也许你可以多花一点打字成本来更精确地控制你的数学表达式。在这种情况下,我尝试快速复制边框矩阵。
\documentclass{mwrep}
\usepackage{tikz}
\usepackage{amsmath}
\usetikzlibrary{matrix,decorations.pathreplacing}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Proin nibh augue,
suscipit a, scelerisque sed, lacinia in, mi.
\begin{equation}
\bar{P}=
\begin{tikzpicture}[baseline = (M.center),% center with respect to the matrix center
every left delimiter/.style={xshift=1ex},%tighter delimiter spacing
every right delimiter/.style={xshift=-1ex}]
\matrix (M) [matrix of math nodes,left delimiter={[},right delimiter={]}
]{
0.3 & 0.1 & 0.6 & 0.0 & 0.0 & 0.0 & 0.0 \\
0.2 & 0.1 & 0.7 & 0.0 & 0.0 & 0.0 & 0.0 \\
0.3 & 0.4 & 0.3 & 0.0 & 0.0 & 0.0 & 0.0 \\
0.0 & 0.0 & 0.0 & 0.2 & 0.8 & 0.0 & 0.0 \\
0.0 & 0.0 & 0.0 & 0.3 & 0.7 & 0.0 & 0.0 \\
0.0 & 0.4 & 0.1 & 0.0 & 0.0 & 0.2 & 0.3 \\
0.0 & 0.0 & 0.1 & 0.0 & 0.3 & 0.1 & 0.5 \\
};
\node[anchor=south east] (cornernode) at (M-1-1.north west) {state}; %Position this more
%precisely if desired
\foreach[count=\xi] \x in {1,2,4,3,6,5,7}{ %\xi is the counter \x is the value
\node (M-\xi-0) at (cornernode |- M-\xi-1) {\x}; %Gets the left most column
\node (M-0-\xi) at (cornernode -| M-1-\xi) {\x}; % Gets the top row
}
\draw[decoration=brace,decorate,blue] (M-0-1.north west) -- (M-0-3.north east)%
node[midway,above] {$S_1$};
\draw[decoration=brace,decorate,blue] (M-0-4.north west) -- (M-0-5.north east)%
node[midway,above] {$S_2$};
\end{tikzpicture}
\end{equation}
\end{document}