![如何将文本和图像放置在精确的子图上方?](https://linux22.com/image/264266/%E5%A6%82%E4%BD%95%E5%B0%86%E6%96%87%E6%9C%AC%E5%92%8C%E5%9B%BE%E5%83%8F%E6%94%BE%E7%BD%AE%E5%9C%A8%E7%B2%BE%E7%A1%AE%E7%9A%84%E5%AD%90%E5%9B%BE%E4%B8%8A%E6%96%B9%EF%BC%9F.png)
我想要画这样的东西:
我可以像这样画:
这是相同的代码:
\documentclass{article}
\usepackage{tikz,subfig}
\begin{document}
\begin{figure}
\centering
\subfloat[Iteration Domain for a Tile]{
\begin{tikzpicture}
\draw (0,0) rectangle (3.8,3.8);
\end{tikzpicture}
}
\subfloat[Convex Bounding Boxes]{
\begin{tikzpicture}
\draw (0,0) rectangle (3.8,3.8);
\end{tikzpicture}
}
\subfloat[Disjoint Bounding Boxes]{
\begin{tikzpicture}
\draw (0,0) rectangle (3.8,3.8);
\end{tikzpicture}
}
\subfloat[Disjoint Bounding Boxes]{
\begin{tikzpicture}
\draw (0,0) rectangle (3.8,3.8);
\end{tikzpicture}
}
\caption{Bounding boxes for disjoint union of data regions}
\end{figure}
\end{document}
现在,我面临两个问题:
- 如何将中心对齐的文本精确地放置在图 1(b)以及图 1(C)和(d)的上方?
- 如何仅在图 (b)、(c) 和 (d) 上方绘制一个矩形?
有什么办法吗?
答案1
你需要这样的东西,
\begin{figure}
\centering
\begin{tabular}[t]{cccc}
&\multicolumn{3}{c}{
\begin{tikzpicture}
\draw (0,0) rectangle (10.0,0.8);
\end{tikzpicture}
}\\
&{\bfseries Something}&\multicolumn{2}{c}{\bfseries Something}\\
\subfloat[Iteration Domain for a Tile]{
....
}&
\subfloat[Convex Bounding Boxes]{
....
}&
\subfloat[Disjoint Bounding Boxes]{
....
}&
\subfloat[Disjoint Bounding Boxes]{
....
}
\end{tabular}
\caption{Bounding boxes for disjoint union of data regions}
\end{figure}
我的结果是这样的,
为了控制列间间距,使用\setlength{\tabcolsep}{some value}
和其他行间空间控制技术来控制垂直放置。
答案2
对于问题 1,使用tabular
具有 3 个居中列的:
\begin{tabular}{ccc} foo & foo & foo\\
\subfloat[Iteration Domain for a Tile]{
\begin{tikzpicture}
\draw (0,0) rectangle (3.8,3.8);
\end{tikzpicture}
}
&
\subfloat[Convex Bounding Boxes]{
\begin{tikzpicture}
\draw (0,0) rectangle (3.8,3.8);
\end{tikzpicture}
}
&
\subfloat[Disjoint Bounding Boxes]{
\begin{tikzpicture}
\draw (0,0) rectangle (3.8,3.8);
\end{tikzpicture}
}
\subfloat[Disjoint Bounding Boxes]{
\begin{tikzpicture}
\draw (0,0) rectangle (3.8,3.8);
\end{tikzpicture}
}
\end{tabular}
答案3
另一个想法:将所有子图放在同一个 tikzpicture 中,这样您就可以使用 tikz 命令将标签放置在框中。您还可以使用 tikz 节点来包含子标题。
这里的问题是每个子标题的标签 (a)、(b) 等。有两种方法:
- 手动。自己编写 (a)、(b) 等作为子标题文本的一部分。这当然不是最佳选择,因为您无法
\ref
添加这些子标题,但如果您不需要这样做,这可能是一个简单的解决方案。 - 用作
\subfloat
tikz 节点的内容,以便子标题自动编号和标记。
在下面的代码中,我采用了第二种方法。我使用的技术对其他类似问题也很有用。
\documentclass{article}
\usepackage{tikz,subfig}
\usetikzlibrary{positioning,calc}
\begin{document}
\def\subcaption#1#2{
\node[subcaption=#1]{\subfloat[#2]{\hskip\linewidth}};
}
\begin{figure}
\centering
\begin{tikzpicture}
\tikzset{
box/.style = {draw, rectangle, minimum width=3.8cm, minimum height=3.8cm, node distance=2mm},
subcaption/.style = {below=-\baselineskip of #1, text width=4.2cm, inner sep=0pt},
something/.style = {above=2mm of #1, font=\sffamily\bfseries\footnotesize},
red bar/.style = {fill=red, draw=black, ultra thick, minimum width=10cm, minimum height=4mm},
}
\node[box] (a) {};
\node[box,right=of a] (b) {};
\node[box,right=of b] (c) {};
\node[box,right=of c] (d) {};
\subcaption{a}{Iteration Domain for a Tile};
\subcaption{b}{Convex Bounding Boxes};
\subcaption{c}{Disjoint Bounding Boxes};
\subcaption{d}{Disjoint Bounding Boxes};
\node[something=b] {Something};
\coordinate (aux) at ($(c.north)!.5!(d.north)$);
\node[something=aux] {Something};
\node[red bar, above=1cm of c] {};
\end{tikzpicture}
\caption{Bounding boxes for disjoint union of data regions}
\end{figure}
\end{document}
结果: