我已经写好了整篇文档,现在想将其格式化为两列。
但是,我非常依赖这样的标题\section
,并且希望这些标题不是位于列中。换句话说,双列文本应在页面中间结束,部分标题应出现,然后双列文本应再次开始。
multicol
我可以通过专门结束环境然后重新启动它来获得所需的效果:
...
\end{multicol}
\begin{multicol}{2}[\section{Section Name Here}]
...
但是,将其应用到文档中的每个标题,然后如果我更改列数则浏览并修改每个实例,这会很繁琐。
有没有办法可以自动实现这一点,也许通过修改\section
、\subsection
等的定义,或者使用titlesec
?
梅威瑟:
\documentclass{article}
\usepackage{lipsum}
\usepackage{multicol}
\begin{document}
\begin{multicols}{2}
\section{First section}
\lipsum[1-3]
\section{Second section}
\lipsum[4-6]
\section{Third section}
\lipsum[7-9]
\end{multicols}
\end{document}
答案1
尽管测试\@currenvir
可能没有必要,但它并不像我最初想象的那么简单。
\documentclass{article}
\usepackage{lipsum}
\usepackage{multicol}
\let\oldsection=\section
\makeatletter
\def\section{\@ifnextchar*\oldsection\newsection}% handle \section*
\newcommand{\newsection}[2][\empty]{% #1=short title (optonsl), #2=title
\def\test{multicols}%
\ifx\@currenvir\test
\end{multicols}\begin{multicols}{2}[{%
\ifx\empty#1\relax
\oldsection{#2}%
\else
\oldsection[#1]{#2}%
\fi}]%
\else
\ifx\empty#1\relax
\oldsection{#2}%
\else
\oldsection[#1]{#2}%
\fi
\fi}
\makeatother
\begin{document}
\tableofcontents
\begin{multicols}{2}
\section{First section}
\lipsum[1-3]
\section[Sec 2]{Second section}
\lipsum[4-6]
\section{Third section}
\lipsum[7-9]
\end{multicols}
\end{document}
答案2
你可以使用这个:
\documentclass{article}
\usepackage{xparse}
\usepackage{lipsum}
\usepackage{multicol}
\ExplSyntaxOn
\cs_new_protected:Npn \draconis_start_multicols_env:nn #1#2
{
\begin{multicols}{#1}[{#2}]
}
\cs_generate_variant:Nn \draconis_start_multicols_env:nn { nV }
\tl_new:N \l__draconis_sectioning_command_tl
\cs_new_protected:Npn \draconis_startsection:Nnnn #1#2#3#4
{
\tl_if_eq:nnF {#4} { first } { \end{multicols} }
\tl_set:Nn \l__draconis_sectioning_command_tl { \section }
\tl_put_right:Nx \l__draconis_sectioning_command_tl
{
\IfBooleanT {#1} { * } % star form
\IfValueT {#2} { [ \exp_not:n {#2} ] } % title for toc and headers
{ \exp_not:n {#3} } % title
}
% This 2 is the number of columns (passed to 'multicols')
\draconis_start_multicols_env:nV {2} \l__draconis_sectioning_command_tl
}
\NewDocumentCommand \startsection { s o m O{} }
{
\draconis_startsection:Nnnn #1 {#2} {#3} {#4}
}
\NewDocumentCommand \stoplastsection { }
{
\end{multicols}
}
\ExplSyntaxOff
\begin{document}
\startsection{First section}[first]
\lipsum[1-3]
\startsection[Short title]{Second section}
\lipsum[4-6]
\startsection*{Unnumbered section}
\lipsum[7-9]
\startsection{Third section}
\lipsum[10-12]
\stoplastsection
\end{document}
我的\startsection
作品类似\section
(包括星号形式),除了它具有multicols
您想要的包装并接受可选的最终参数:如果最终参数是first
,\startsection
则不插入\end{multicols}
(否则,这是它放入输入流中的第一件事)。
第 1 页
第2页
第 3 页
如果你不介意的话:
在第一部分之前启动一个空
multicols
环境(被实现隐藏,但已完成);在文档的几个部分重复列数(从您的问题中我了解到您想避免这种情况,但显然不是),并且;
明确打开和关闭
multicols
环境后\begin{document}
,
很容易调整上述解决方案以使其看起来完全符合您的喜好:
\documentclass{article}
\usepackage{xparse}
\usepackage{lipsum}
\usepackage{multicol}
\ExplSyntaxOn
\cs_set_eq:NN \draconis_orig_section \section
\cs_new_protected:Npn \draconis_start_multicols_env:nn #1#2
{
\begin{multicols}{#1}[{#2}]
}
\cs_generate_variant:Nn \draconis_start_multicols_env:nn { nV }
\tl_new:N \l__draconis_sectioning_command_tl
\cs_new_protected:Npn \draconis_startsection:Nnnn #1#2#3#4
{
\tl_if_eq:nnF {#4} { first } { \end{multicols} }
\tl_set:Nn \l__draconis_sectioning_command_tl { \draconis_orig_section }
\tl_put_right:Nx \l__draconis_sectioning_command_tl
{
\IfBooleanT {#1} { * } % star form
\IfValueT {#2} { [ \exp_not:n {#2} ] } % title for toc and headers
{ \exp_not:n {#3} } % title
}
% This 2 is the number of columns (passed to 'multicols')
\draconis_start_multicols_env:nV {2} \l__draconis_sectioning_command_tl
}
\NewDocumentCommand \startsection { s o m O{} }
{
\draconis_startsection:Nnnn #1 {#2} {#3} {#4}
}
% Replace \section with \startsection (ugh...)
\cs_set_eq:NN \section \startsection
\ExplSyntaxOff
\begin{document}
\begin{multicols}{2}
\section{First section}
\lipsum[1-3]
\section[Short title]{Second section}
\lipsum[4-6]
\section*{This is the title of an unnumbered section}
\lipsum[7-9]
\section{Third section}
\lipsum[10-12]
\end{multicols}
\end{document}
请注意,此实现确实适用于\section*
,如下所示: