\underbrace 在一个奇怪的地方,跨越数组列

\underbrace 在一个奇怪的地方,跨越数组列

看一下下面的代码:

$$\begin{array}{rr|r|c|l}
vd_2:&\raisebox{0pt}[0pt]{\makebox[0pt][l]{$\overbrace{\phantom{b_1\dots b_{n-l_{k-1}-2k}\hspace{2\arraycolsep}b_{n-l_{k-1}-2k+1}\dots b_{n-k-1}b_{n-k}\hspace{2\arraycolsep}c^k}}^v$}}b_1\dots b_{n-l_{k-1}-2k}&b_{n-l_{k-1}-2k+1}\dots b_{n-k-1}b_{n-k}&c^k&d_2\\
\mathrm{PW}(w):&\dots w_r c^{r+1-k}&c^k\raisebox{0pt}[0pt][0pt]{\makebox[0pt][l]{$\underbrace{\phantom{w_{k-1}\hspace{4.17em}\hspace{2\arraycolsep}c^k\hspace{2\arraycolsep}\widetilde{w_{k-1}}\dots}}_{w_r}$}}w_{k-1}\hspace{4.17em}&c^k&\widetilde{w_{k-1}}\dots\dots
\end{array}$$

我想\underbrace以更优雅的方式绘制。主要问题是如何确保$c^kw_{k-1}$位于列的正中央。在建议的代码中,这是人为完成的:4.17em在右侧添加长度为的空白空间$c^kw_{k-1}$,其中的值4.17em是通过反复试验获得的。这在中运行良好12pt,但如果字体大小发生变化,它会从中心滑落。即使更改字体大小没有问题,似乎有一种更好的方法来实现此效果,而不是猜测值4.17em(或适用于特定字体大小的任何方法),直到达到足够好的像素精度。

答案1

使用savepos来自的模块可以相当直接地完成此操作zref包裹。它允许您在文本中放置标记(或标签)并以小点(或)为sp单位检索它们的坐标(x 和 y)。如果没有您使用的框调整,代码也会更加简洁。

采用您的代码,我已定义标签L来表示您最左边的条目array(作为参考框架),TL并将其表示为顶行中的TR左右坐标,并将其表示为底行中的左右坐标。\overbraceBLBR\underbrace

然后,我在排版实际表格之前构建一个不可见的表格。不可见的表格与实际表格重叠,使用\mathrlap来自mathtools包裹\hspace。最后,根据需要通过 s 获得间距。使用 来校正垂直对齐\strut,因为否则没有内容可以调整 / 上方/下方的高度/深度\overbrace。相反,\underbrace使用\mathstrut会导致垂直对齐稍弱:

在此处输入图片描述

\documentclass{article}
\usepackage{mathtools}% http://ctan.org/pkg/mathtools
\usepackage[savepos]{zref}% http://ctan.org/pkg/zref
\begin{document}
\[
  \mathrlap{\begin{array}{l}
    \hspace{\dimexpr\zposx{TL}sp-\zposx{L}sp\relax}\overbrace{\strut\hspace{\dimexpr\zposx{TR}sp-\zposx{TL}sp\relax}}^v \\
    \hspace{\dimexpr\zposx{BL}sp-\zposx{L}sp\relax}\underbrace{\strut\hspace{\dimexpr\zposx{BR}sp-\zposx{BL}sp\relax}}_{w_r}
  \end{array}}%
  \begin{array}{rr|c|c|l}
    vd_2: & \zsavepos{TL}b_1\dots b_{n-l_{k-1}-2k} & b_{n-l_{k-1}-2k+1}\dots b_{n-k-1}b_{n-k} & c^k\zsavepos{TR} & d_2 \\
    \zsavepos{L}\mathrm{PW}(w): & \dots w_r c^{r+1-k} & c^k\zsavepos{BL}w_{k-1} & c^k & \widetilde{w_{k-1}}\dots\zsavepos{BR}\dots
  \end{array}
\]

\[
  \begin{array}{rr|r|c|l}
    vd_2:&\raisebox{0pt}[0pt]{\makebox[0pt][l]{$\overbrace{\phantom{b_1\dots b_{n-l_{k-1}-2k}\hspace{2\arraycolsep}b_{n-l_{k-1}-2k+1}\dots b_{n-k-1}b_{n-k}\hspace{2\arraycolsep}c^k}}^v$}}
      b_1\dots b_{n-l_{k-1}-2k}&b_{n-l_{k-1}-2k+1}\dots b_{n-k-1}b_{n-k}&c^k&d_2\\
    \mathrm{PW}(w):&\dots w_r c^{r+1-k}&c^k\raisebox{0pt}[0pt][0pt]{\makebox[0pt][l]{$\underbrace{\phantom{w_{k-1}\hspace{4.17em}\hspace{2\arraycolsep}c^k\hspace{2\arraycolsep}\widetilde{w_{k-1}}\dots}}_{w_r}$}}
      w_{k-1}\hspace{4.17em}&c^k&\widetilde{w_{k-1}}\dots\dots
\end{array}
\]
\end{document}​

上面是新zref版本,而您原来的构造如下所示。由于这使用了zref定位标签,因此您必须编译(至少)两次才能使引用正确。

答案2

如果你只是有时需要它,那么可以使用以下解决方法\multicolumn

\documentclass{article}
\begin{document}
\[
\begin{array}{rr|c|c|l}
                & \multicolumn{3}{c}{\overbrace{\rule{0.65\columnwidth}{0pt}}^v}\\
vd_2:           &  b_1\dots b_{n-l_{k-1}-2k}       & b_{n-l_{k-1}-2k+1}\dots b_{n-k-1}b_{n-k} & c^k & d_2\\
\mathrm{PW}(w): & \dots w_r c^{r+1-k} & c^kw_{k-1} & c^k       &\widetilde{w_{k-1}}\dots\dots\\[-0.5\normalbaselineskip]
                & \multicolumn{4}{r}{\underbrace{\rule{0.4\columnwidth}{0pt}}_{w_r}\quad}                  
\end{array} 
\]
\end{document}

在此处输入图片描述

答案3

该问题已转发至LaTeX 社区并解决了。正如 Thorsten 指出的那样,我将添加我的TikZ 支撑架解决方案这里也是如此,基于\tikzmark这里经常使用的:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture,baseline=(#1.base)]
  \node (#1) {\strut};}
\begin{document}
\[
  \begin{array}{rr|c|c|l}
    vd_2:
      &\tikzmark{topleft}b_1\dots b_{n-l_{k-1}-2k}
      &  b_{n-l_{k-1}-2k+1}\dots b_{n-k-1}b_{n-k}
      & c^k \tikzmark{topright}
      & d_2 \\
    \mathrm{PW}(w):
      & \dots w_r c^{r+1-k}
      & \tikzmark{bottomleft} c^k w_{k-1}
      & c^k
      &\widetilde{w_{k-1}}\dots\dots\tikzmark{bottomright}
  \end{array}
\]
\tikz[overlay, remember picture, decoration={brace, amplitude=10pt}] {
  \draw[decorate,thick] (topleft.north) -- (topright.north)
      node [midway,above=10pt] {$v$};
  \draw[decorate,thick] (bottomright.south) -- (bottomleft.south)
      node [midway,below=10pt] {$w_r$};
}
\end{document}

支撑不足和支撑过度

相关内容