看一下下面的代码:
$$\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
左右坐标,并将其表示为底行中的左右坐标。\overbrace
BL
BR
\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}