多列块比周围文本窄

多列块比周围文本窄

我需要在多列环境中排版文本块,上面带有标题,并且以全线宽度为框架。

我正在使用这个multicol包。我遇到的问题是文本块(在环境中multicols)似乎比标题窄。

根据multicol文档,它应该可以正常工作:

列之间的间距由长度参数控制\columnsep。各个列的宽度将根据此参数和当前值自动计算 \linewidth

然而事实并非如此:

\documentclass{article}

\usepackage{multicol}
\usepackage{lipsum}

\begin{document}

\noindent
\fbox{
  \begin{minipage}{1.0\linewidth}
    Title
  \end{minipage}
}

\begin{multicols}{2}
  \lipsum[1-5]
\end{multicols}

\end{document}

输出

答案1

这是由填充引起fbox的,最简单的解决方案是使用,framebox因为可以指定宽度:

\documentclass{article}
\usepackage{multicol}
\usepackage{lipsum}
\begin{document}
\noindent
\framebox[\linewidth][l]{
    Title
}

\begin{multicols}{2}
  \lipsum[1-5]
\end{multicols}

\end{document}

结果如下:

结果

如果由于某种原因你确实需要minipage,你可以使用这个:

\documentclass{article}   
\usepackage{multicol}
\usepackage{lipsum}
\begin{document}
\noindent
\framebox[\linewidth]{
    \begin{minipage}{\linewidth}
    Title
    \end{minipage}
}

\begin{multicols}{2}
  \lipsum[1-5]
\end{multicols}

\end{document}

请注意,这会消除任何水平填充,因此里面的文本现在看起来像这样:

结果

但这可以通过\hspace{1mm}在之前添加以下内容轻松修复Title

水平空间

答案2

为了保持一致性,为经常做的事情创建宏总是好的(见一致的字体)因此,或许\myheading或者\myheading*可以使用:

在此处输入图片描述

\documentclass{article}
\usepackage{multicol,xparse,lipsum}% http://ctan.org/pkg/{multicol,xparse,lipsum}
\NewDocumentCommand{\myheading}{s O{\bfseries} m}{%
  \noindent
  \IfBooleanTF{#1}
    {\framebox[\linewidth][l]{#2#3}}
    {\makebox[\linewidth]{%
      \framebox[\dimexpr\linewidth+2\fboxsep+2\fboxrule][l]{#2#3}}}%
}
\begin{document}

\myheading{Title}
\begin{multicols}{2}
  \lipsum[6]
\end{multicols}

\myheading[\slshape]{\hfill Title\hfill}
\begin{multicols}{2}
  \lipsum[6]
\end{multicols}

\myheading*{Title}
\begin{multicols}{2}
  \lipsum[6]
\end{multicols}

\myheading*[\itshape]{\hfill Title}
\begin{multicols}{2}
  \lipsum[6]
\end{multicols}

\end{document}

\myheading和之间的边际差异\myheading*在于,前者将标题设置为与文本块对齐,而后者将框架框设置为与文本块对齐(例如Silex 的回答)。可选参数设置标题的字体 -大胆的\bfseries默认。xparse提供宏编程接口。


更多细节:s O{<stuff>} m规范\myheading允许

  • \myheading由于参数而带有星号的变体s。在那里,它本质上创建了两个宏\myheading\myheading*
  • 由于参数而可选的第一个参数,如果没有提供则O{<stuff>}默认为;<stuff>
  • 一个强制性的参数 - 因为m- 用于排版标题。

\IfBooleanTF用于在提供的参数之间进行条件判断。在本例中,我使用了\IfBooleanTF{#1},因此函数将根据您是否提供了 a 进行条件判断*。如果提供了,则执行第一个条件:

\framebox[\linewidth][l]{#2#3}

这将设置#2- 可选参数(\bfseries如果未提供则默认为) - 和#3- 强制参数(标题)。如果没有提供星号,则执行第二个条件:

\makebox[\linewidth]{%
  \framebox[\dimexpr\linewidth+2\fboxsep+2\fboxrule][l]{#2#3}}

这将设置一个宽度为 的框\linewidth,框内有一个\framebox。之所以\makebox设置 ,是为了让 TeX 认为框的宽度只与线的宽度相同,即使它实际上延伸到了线的宽度之外。 的默认行为是\makebox[\linewidth]将其内容居中,类似于\makebox[\linewidth][c]\framebox的宽度为 ,\linewidth+2\fboxsep+2\fboxrule因为内部内容必须适合\linewidth,但 上增加了一个框架分隔和规则两个都它的两侧 - 左侧和右侧。与 一样\makebox\framebox还有一个用于水平调整的附加可选参数,设置为[l]左对齐。

相关内容