此代码:
\documentclass{article}
\usepackage{polyglossia}
\usepackage{multicol}
\usepackage{calc}
\setlength{\parindent}{0pt}
\begin{document}
\begin{multicols}{2}
\begin{center}
\huge Left
\end{center}
\framebox[.5\textwidth-.5\columnsep]{
Left
}
\columnbreak
\begin{center}
\huge Right
\end{center}
\framebox[.5\textwidth-.5\columnsep]{
Right
}
\end{multicols}
\end{document}
生成:
http://flyx.org/files/multicols.png
为什么大文本对齐了,而框架却没有对齐?
答案1
你需要在前面留一个空行\columnbreak
\documentclass{article}
%\usepackage{polyglossia}
\usepackage{multicol}
\usepackage{calc}
\setlength{\parindent}{0pt}
\begin{document}
\begin{multicols}{2}
\begin{center}
\huge Left
\end{center}
\framebox[.5\textwidth-.5\columnsep]{
Left
}
\columnbreak
\begin{center}
\huge Right
\end{center}
\framebox[.5\textwidth-.5\columnsep]{
Right
}
\end{multicols}
\end{document}
%
另一种解决方法是,在段落末尾添加一个,这样可以真正指出根本原因
\documentclass{article}
%\usepackage{polyglossia}
\usepackage{multicol}
\usepackage{calc}
\setlength{\parindent}{0pt}
\begin{document}
\begin{multicols}{2}
\begin{center}
\huge Left
\end{center}
\framebox[.5\textwidth-.5\columnsep]{
Left
}%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
\columnbreak
\begin{center}
\huge Right
\end{center}
\framebox[.5\textwidth-.5\columnsep]{
Right
}
\end{multicols}
\end{document}
通常,段落末尾的行尾会被转换为空格标记,但这并没有什么坏处,因为 TeX 的原始换行例程会\unskip
在水平列表中执行一个操作,以在换行之前删除最后一个空格。但在这里\vadjust
节点后空间,因此空间不会被删除\unskip
并且由于段落的前一部分已经是全宽(框架框),换行符会创建一个新行,仅有的包含一个空格(和\parfillskip
粘连),所以看起来像额外的垂直空间实际上是水平的段落的额外行(恰好是白色的)。您会看到相同的内容,\label{}
无论是 还是\vspace{}
,甚至\mbox{}
任何保护最后一个空格不受 的影响的内容\unskip
。
答案2
这实际上不是问题,而是 LaTeX 核心功能的一般问题。如果您用或或multicol
替换,您将获得完全相同的行为...\columnbreak
\label{foo}
\index
问题是这些“不可见”命令在内部使用\@bsphack
...\@esphack
来隐藏自身,以避免出现两个空格(左侧和右侧)。问题是它们保留左侧的空格并隐藏右侧的空格(如果存在)。
但是由于不可见的命令(在\columnbreak
这种情况下是\vadjust
),命令不会删除空格\par
。因此,您最终会得到一个宽度恰好为一行 + 1 个空格(即第二行)的框架框。
但是,如果您先结束该段落,它将只有一行长。
一般答案是,如果在水平模式下使用不可见命令,则将其附加到前一个单词,尤其是在段落末尾。(例如 % 也可以)
\@bsphack
也许可以采取一些措施来解决这个问题,但我认为改变朋友的行为是相当危险的。