理解小页面 - 顶部对齐

理解小页面 - 顶部对齐

我希望能够将两个对齐minipage在顶部,而不必担心 中的内容minipage。我知道可选参数[t],但对于这一切的工作原理仍然有些困惑。我倾向于将 视为minipage常规页面,因为放置在其上的所有内容都从顶部开始,然后填满整个页面,然后向下移动,但事实似乎并非如此。

在下面的 MWE 示例中,我对各个部分进行了颜色编码以供参考。

  1. 第一种情况(黑色的) 的工作方式与我预期的一样。两者minipages与说明符完全一致[t]。这里没有问题。

    下一个案例(红色的) 仅在内部minipage也具有[t]说明符时才有效。 为什么这是必要的? 我原本以为任何内容都会放在此页面的顶部,并且由于外部minipage都有[t]内容,因此应该在顶部对齐。

  2. 我想在第二个小页面中放置一个图形,并且仍然让两个图形在顶部对齐。

    简单情况(蓝色的\includegraphics并不会导致内容在顶部对齐。

    因此,我尝试将其放入\parbox绿色的) 但这也没有产生预期的结果。

    我还尝试将图形放在内部minipage棕色的)并指定[t]对齐方式,尽管这在红色的部分,这里没有。红色的棕色的因为红色的部分有文字,而棕色的部分有一个图形。

    我知道关于使用小页面将图像和文本对齐到顶部建议将其放置\vspace{0pt}在 的顶部minipage,并且确实提供了所需的对齐方式(青色),但在顶部增加了垂直空间。

    所以,我的第二个问题是,为什么\vspace{0pt}包含图形时需要,而包含文本时则不需要。这似乎是一种黑客行为,我想知道是否有minipage更好的替代品,而不必担心迷你页面中到底有什么?

    另外,为什么将图形包裹在parbox绿色的) 或其他minipage棕色的)这个问题没法解决?

以下是 MWE:

\documentclass{article}
\usepackage[demo]{graphicx}
\usepackage{lipsum}
\usepackage{xcolor}

\begin{document}
\section{This Works - Aligned at top as desired}
\begin{minipage}[t]{0.6\linewidth}
    \lipsum[1]
\end{minipage}
\hfill
\begin{minipage}[t]{0.3\linewidth}
    \lipsum[2]
\end{minipage}

\color{red}
\section{Why does inner mini page required the [t]?}
\label{Minipage-in-minipage}
\begin{minipage}[t]{0.6\linewidth}
    \lipsum[3]
\end{minipage}
\hfill
\begin{minipage}[t]{0.3\linewidth}
    \begin{minipage}[t]{\linewidth}% Why is [t] required here
        \lipsum[4]
    \end{minipage}
\end{minipage}

\color{blue}
\section{Why are These not aligned at top?}
\begin{minipage}[t]{0.6\linewidth}
    \lipsum[3]
\end{minipage}
\hfill
\begin{minipage}[t]{0.3\linewidth}
    \includegraphics[width=\linewidth]{foo}
\end{minipage}

\color{green}
\section{Why are These not aligned at top?}
\begin{minipage}[t]{0.6\linewidth}
    \lipsum[3]
\end{minipage}
\hfill
\begin{minipage}[t]{0.3\linewidth}
    \parbox{\linewidth}{\includegraphics[width=\linewidth]{foo}}
\end{minipage}

\newpage
\color{brown}
\section{Why does this not work with the [t] as it did in red section?}
This worked fine in Section \ref{Minipage-in-minipage}

\begin{minipage}[t]{0.6\linewidth}
    \lipsum[3]
\end{minipage}
\hfill
\begin{minipage}[t]{0.3\linewidth}
    \begin{minipage}[t]{\linewidth}% Even with [t] here, this does not work
        \parbox{\linewidth}{\includegraphics[width=\linewidth]{foo}}
    \end{minipage}
\end{minipage}


\color{cyan}
\section{Adding a \textbackslash{}vspace\{0pt\} works}
\begin{minipage}[t]{0.6\linewidth}
    \vspace{0pt}% Hack!! But does do the job
    \lipsum[3]
\end{minipage}
\hfill
\begin{minipage}[t]{0.3\linewidth}
    \vspace{0pt}% Hack!! But does do the job
    \begin{minipage}[t]{\linewidth}% Why is [t] required here
        \parbox{\linewidth}{\includegraphics[width=\linewidth]{foo}}
    \end{minipage}
\end{minipage}
\end{document}

答案1

这始终是一个参考点的问题。minipage在 TeX 原始术语中,A 是一个垂直框,有三种形式:

  • A\vbox
  • A\vtop
  • A\vcenter

它们的参考点计算方式不同;参考点始终位于框最终排版的基线上。

在第一种情况下,参考点位于框中的最后一条基线(对应于[b]小页面);在第二种情况下,参考点位于框中的第一条基线([t]小页面);在第三种情况下,它位于框顶部到底部的中间(\vcenter实际上仅在数学模式下才允许,并且 LaTeX 实际上在一对$符号内构建小页面)。

您的第二个示例显示了效果:如果省略内部[t],则嵌套小页面的参考点位于中间,并且它与另一个小页面的参考点完美对齐minipage

示例 3。包含图形的基线就是图形的底部:TeX 正在执行其职责。示例 4 与示例 2 完全相同,只是省略了[t],因为两个构造

\parbox{<dimen}{...}
\begin{minipage}{<dimen>}...\end{minipage}

大部分是等价的(并且[c]隐含说明符)。

示例 5 显示了 a\parbox内部的minipage另一个内部minipage:由于\parbox意味着[c]对齐,因此行为与 4 中完全相同。

示例 6 更微妙:两个小页面中的第一个项目是\vskip(对应于 的原语\vspace)。将其视为例外(实际上并非如此,但对垂直框的全面讨论会太长):如果垂直框以 glue 开头,则假定顶部有一个零高度空行,因此真实的top 将是包含参考点的线。inner\parbox不执行任何操作,可以消除。类似地,如果框以粘连结束,则底部隐含零高度空线。

答案2

顺便说一句:所有这些问题都已经有解决方案了:软件包调整框

\documentclass{article}
\usepackage[demo]{graphicx}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage{adjustbox}

\begin{document}
\section{This Works - Aligned at top as desired}
\adjustbox{valign=t}{\begin{minipage}{0.6\linewidth}
    \lipsum[1]
\end{minipage}}%
\hfill
\adjustbox{valign=t}{\begin{minipage}[t]{0.3\linewidth}
    \lipsum[2]
\end{minipage}}

\color{red}
\section{No one of the mini pages required the [t]?}
\label{Minipage-in-minipage}
\adjustbox{valign=t}{\begin{minipage}{0.6\linewidth}
    \lipsum[3]
\end{minipage}}%
\hfill
\adjustbox{valign=t}{\begin{minipage}{0.3\linewidth}
    \begin{minipage}{\linewidth}% no [t] required here
        \lipsum[4]
    \end{minipage}
\end{minipage}}

\color{blue}
\section{Even pictures are no problem?}
\adjustbox{valign=t}{\begin{minipage}[t]{0.6\linewidth}
    \lipsum[3]
\end{minipage}}%
\hfill
\adjustbox{valign=t}{\begin{minipage}[t]{0.3\linewidth}
    \includegraphics[width=\linewidth]{foo}
\end{minipage}}

\color{green}
\section{And you may use a parbox}
\adjustbox{valign=t}{\begin{minipage}[t]{0.6\linewidth}
    \lipsum[3]
\end{minipage}}%
\hfill
\adjustbox{valign=t}{\begin{minipage}[t]{0.3\linewidth}
    \parbox{\linewidth}{\includegraphics[width=\linewidth]{foo}}
\end{minipage}}

\newpage
\color{brown}
\section{No brown problems}

\adjustbox{valign=t}{\begin{minipage}[t]{0.6\linewidth}
    \lipsum[3]
\end{minipage}}%
\hfill
\adjustbox{valign=t}{\begin{minipage}[t]{0.3\linewidth}
    \begin{minipage}[t]{\linewidth}% Even with [t] here, this does not work
        \parbox{\linewidth}{\includegraphics[width=\linewidth]{foo}}
    \end{minipage}
\end{minipage}}


\color{cyan}
\section{\textbackslash{}vspace\{0pt\} changes nothing}
\adjustbox{valign=t}{\begin{minipage}[t]{0.6\linewidth}
    \vspace{0pt}% Hack!! But does do the job
    \lipsum[3]
\end{minipage}}%
\hfill
\adjustbox{valign=t}{\begin{minipage}[t]{0.3\linewidth}
    \vspace{0pt}% Hack!! But does do the job
    \begin{minipage}[t]{\linewidth}% Why is [t] required here
        \parbox{\linewidth}{\includegraphics[width=\linewidth]{foo}}
    \end{minipage}
\end{minipage}}%
\end{document}

我已经删除了一些[t],但您也可以删除其他的。该包非常适合解决垂直对齐问题。您甚至可以删除周围的 minipages 和 parboxes \includegraphics。并且有新的命令来组合\includegraphics\adjustbox。您还可以将\adjustbox选项导出到\includegraphics,但包 adjustbox 的 0.7 版本有一个错误。因此,如果您想使用包选项,export请使用版本 > 0.7。

答案3

简而言之,除非您明确升高或降低框,否则 TeX 始终与基线对齐。

在此处输入图片描述

想象一下您的小页面仅包含一个字母或一个图像。在水平列表中,它们按照下图对齐。图像 - 就 TeX 而言只是另一个框,想象一下由字母组成的图像。事实上,图像除了高度和宽度之外还有深度。

\documentclass{article}
\usepackage[demo]{graphicx}
\begin{document}
  \fbox{\large fjord}\fbox{\Huge I}%
  \includegraphics[width=2cm,height=2cm]{test}\fbox{\LARGE J}
\end{document}

LaTeX 只是提供了一个方便的宏来使用 TeX 的 vbox、vtop 等,但底层机制保持不变。理解它的最佳方式是阅读 TeX Book 中有关盒子和胶水的部分(看看 Knuth 的小盒子包裹着字母)。

相关内容