两个高大的身影并肩而立

两个高大的身影并肩而立

问题

我想将两张 TikZ 图片并排放置:

两个段落中间有 TikZ 图片。标题对齐。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)

问题

  1. 小页面的宽度是通过反复试验来确定的。
  2. 字幕未垂直对齐。
  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}

问题

  1. 标题的风格不同,并且编号也不同。
  2. 图形之间的间距是通过反复试验来确定的。
  3. 字幕未垂直对齐。

浮行

\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}

问题

  1. 间距错误。
  2. 图形没有垂直居中。

表格型

\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}

问题

  1. \vspace再次。
  2. 两列的宽度相同(足够宽以适合第二个数字)。

这是目前为止最好的一个



最小工作示例

\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。标题放在\parboxes 中以控制宽度(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}
  1. 标题 \parboxes 之间有 6pt 的间隙。这是表格环境中列之间的默认间隙。
  2. 每个 \parbox 的宽度等于其对应图形的宽度(由 \wd 确定)加上图形之间的间距((\textwidth-\wd0-\wd1)/3)减去 \parbox 之间的间隙(6pt)。这确保它们位于各自图形下方的中心。

需要尾随注释以防止换行符扩展为空格。

相关内容