我希望能够将两个对齐minipage
在顶部,而不必担心 中的内容minipage
。我知道可选参数[t]
,但对于这一切的工作原理仍然有些困惑。我倾向于将 视为minipage
常规页面,因为放置在其上的所有内容都从顶部开始,然后填满整个页面,然后向下移动,但事实似乎并非如此。
在下面的 MWE 示例中,我对各个部分进行了颜色编码以供参考。
第一种情况(黑色的) 的工作方式与我预期的一样。两者
minipages
与说明符完全一致[t]
。这里没有问题。下一个案例(红色的) 仅在内部
minipage
也具有[t]
说明符时才有效。 为什么这是必要的? 我原本以为任何内容都会放在此页面的顶部,并且由于外部minipage
都有[t]
内容,因此应该在顶部对齐。我想在第二个小页面中放置一个图形,并且仍然让两个图形在顶部对齐。
简单情况(蓝色的)
\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 的小盒子包裹着字母)。