多列环境中的框架不对齐

多列环境中的框架不对齐

此代码:

\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也许可以采取一些措施来解决这个问题,但我认为改变朋友的行为是相当危险的。

相关内容