我需要在多列环境中排版文本块,上面带有标题,并且以全线宽度为框架。
我正在使用这个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]
左对齐。