问题
我想将两张 TikZ 图片并排放置:
笔记:
- 它们是垂直居中的。
- 其中一个比页面的一半还宽。
- 三个间隙相等(如同使用
\hfil <a> \hfil <b> \hfil
)。 - 标题垂直对齐。
长字幕也应该被正确处理(即它们应该像平常一样换行)。
\begin{minipage}{5.95cm}
解决方案应该避免诸如和\begin{minipage}{0.3\textwidth}
之类的反复试验长度\qquad
。
我尝试过的方法
我在这里查看了大约二十几个问题,但没有一个答案令人满意。本节试图总结这些答案并解决它们的缺陷。
假设以下序言:
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{tikz}
\usepackage{caption}
\usepackage{subfig}
\usepackage{floatrow}
\usepackage{tabularx}
\newcommand\rectangle[2]{%
\begin{tikzpicture}[baseline=(current bounding box.center)]
\draw(0,0) rectangle(#1, #2);
\end{tikzpicture}%
}
小页面
\vspace{0.5cm}
\noindent
\begin{minipage}{5.95cm} % (1)
\centering
\rectangle{4}{8}
\captionsetup{type=figure}
\caption{A tall boi.}
\end{minipage}
\begin{minipage}{8cm}
\rectangle{8}{4}
\captionsetup{type=figure}
\caption{A wide boi.} % (2)
\end{minipage}
\vspace{0.5cm} % (3)
问题
- 小页面的宽度是通过反复试验来确定的。
- 字幕未垂直对齐。
- 我不知道要使用多少垂直空间。如果我不使用垂直空间,则图形和段落之间没有垂直空间。
子浮点型
\begin{figure}[H]
\centering
\subfloat[\centering A tall boi.]{% (1)
\rectangle{4}{8}
}%
\qquad% (2)
\subfloat[\centering A wide boi.]{% (3)
\rectangle{8}{4}
}
\end{figure}
问题
- 标题的风格不同,并且编号也不同。
- 图形之间的间距是通过反复试验来确定的。
- 字幕未垂直对齐。
浮行
\begin{figure}[H]
\centering
\begin{floatrow}
\ffigbox[\FBwidth]{\caption{A tall boi.}}{%
\rectangle{4}{8}
}% (1)
\ffigbox[\FBwidth]{\caption{A wide boi.}}{%
\rectangle{8}{4} % (2)
}%
\end{floatrow}
\end{figure}
问题
- 间距错误。
- 图形没有垂直居中。
表格型
\vspace{0.5cm} % (1)
\noindent
\begin{tabularx}{\textwidth}{XX} % (2)
\rectangle{4}{8} &
\rectangle{8}{4} \\
\captionsetup{type=figure}
\caption{A tall boi.} &
\captionsetup{type=figure}
\caption{A wide boi.}
\end{tabularx}
问题
\vspace
再次。- 两列的宽度相同(足够宽以适合第二个数字)。
这是目前为止最好的一个
最小工作示例
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
\newcommand\rectangle[2]{%
\begin{tikzpicture}[baseline=(current bounding box.center)]
\draw(0,0) rectangle(#1, #2);
\end{tikzpicture}%
}
\begin{document}
\lipsum[1][1-3]
\noindent\hfil
\rectangle{4}{8}
\hfil
\rectangle{8}{4}
\hfil
\lipsum[2][1-3]
\end{document}
答案1
saveboxes
这使用了和es的组合\parbox
。标题放在\parbox
es 中以控制宽度(minipages 也可以)。s\null
可防止\abovecaptionskip
被忽略。
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
\usepackage{caption}
\newcommand\rectangle[2]{%
\begin{tikzpicture}[baseline=(current bounding box.center)]
\draw(0,0) rectangle(#1, #2);
\end{tikzpicture}%
}
\begin{document}
\lipsum[1][1-3]
\begin{figure}[ht]
\sbox0{\rectangle{4}{8}}% measure width
\sbox1{\rectangle{8}{4}}%
\centering
\usebox0\hfil\usebox1\par
\parbox[t]{\wd0}{\null
\caption{A tall boi.}}\hfil
\parbox[t]{\wd1}{\null
\caption{A wide boi.}}
\end{figure}
\lipsum[2][1-3]
\end{document}
答案2
作为起点:
- 使用
tabularray
包 - 计算表格列分隔符。对于您的情况,
(\linewidth-<width of first image>-<width of second image>)/6
其中6
是表中列分隔符的数量。
在这种情况下,当提前知道图像的宽度时,特定情况下的 MWE 可以是:
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
\usepackage{tabularray}
\UseTblrLibrary{counter}
\newcommand\rectangle[2]{%
\begin{tikzpicture}[baseline=(current bounding box.center)]
\draw(0,0) rectangle(#1, #2);
\end{tikzpicture}%
}
\begin{document}
\lipsum[1][1-3]
\begin{figure}[ht]
\centering
\begin{tblr}{colsep = {(\linewidth-8cm-4cm)/6},
colspec = {Q[m, wd=4cm] Q[m, wd=8cm]},
row{2} = {h},
}
\rectangle{4}{8}
&
\rectangle{8}{4} \\
\caption{figure 1}
& \caption{figure 2}
\end{tblr}
\end{figure}
\lipsum[2][1-3]
\end{document}
编辑:
但是,当事先不知道图像的宽度时,您需要像@John Kormylo 在他的回答中所做的那样测量它们的宽度,并将这些宽度插入列的宽度中,并用于计算,colsep
如答案开头所示:
\usepackage[showframe]{geometry}
\usepackage{tikz}
\usepackage[skip=1ex]{caption}
\usepackage{lipsum}
\usepackage{tabularray}
\UseTblrLibrary{counter}
\newcommand\rectangle[2]{%
\begin{tikzpicture}[baseline=(current bounding box.center)]
\draw(0,0) rectangle(#1, #2);
\end{tikzpicture}%
}
\begin{document}
\lipsum[1][1-3]
\begin{figure}[ht]
\centering
\sbox0{\rectangle{4}{8}}% measure of the first image width
\sbox1{\rectangle{8}{4}}% measure of the second image width
\begin{tblr}{colsep = {(\linewidth-\wd0-\wd01)/6},
colspec = {Q[m, wd=\wd0] Q[m, wd=\wd1]},
row{2} = {h},
rowsep = 0pt
}
\rectangle{4}{8}
&
\rectangle{8}{4} \\
\caption{figure 1}
& \caption{figure 2}
\end{tblr}
\end{figure}
\lipsum[2][1-3]
\end{document}
结果和以前一样。
答案3
这个答案延伸约翰的回答:
前 | 后 |
---|---|
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
\usepackage{caption}
\usepackage{calc}
\newcommand\rectangle[2]{%
\begin{tikzpicture}[baseline=(current bounding box.center)]
\draw(0,0) rectangle(#1, #2);
\end{tikzpicture}%
}
\begin{document}
\lipsum[1][1-3]
\begin{figure}[ht]
\sbox0{\rectangle{3}{6}}%
\sbox1{\rectangle{6}{3}}%
\centering
\usebox0\hfil\usebox1\par
\parbox[t]{\wd0+(\textwidth-\wd0-\wd1)/3-6pt}{\null% (2)
\caption{\lipsum[1][4-6]}}%
\hspace{6pt}% (1)
\parbox[t]{\wd1+(\textwidth-\wd0-\wd1)/3-6pt}{\null% (2)
\caption{\lipsum[1][7-9]}}%
\end{figure}
\lipsum[2][1-3]
\end{document}
- 标题 \parboxes 之间有 6pt 的间隙。这是表格环境中列之间的默认间隙。
- 每个 \parbox 的宽度等于其对应图形的宽度(由 \wd 确定)加上图形之间的间距(
(\textwidth-\wd0-\wd1)/3
)减去 \parbox 之间的间隙(6pt)。这确保它们位于各自图形下方的中心。
需要尾随注释以防止换行符扩展为空格。