![是否可以定义一个适用于 \chapter 的 `multicols{2}` 前导开关?](https://linux22.com/image/244266/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E9%80%82%E7%94%A8%E4%BA%8E%20%5Cchapter%20%E7%9A%84%20%60multicols%7B2%7D%60%20%E5%89%8D%E5%AF%BC%E5%BC%80%E5%85%B3%EF%BC%9F.png)
使用标准 LaTeX,\twocolumn
在序言中发布会导致文档排版为两列 - 但\chapter
会产生单独的单列章节标题。
\documentclass{book}
\twocolumn% Note: this doesn't change page margins
\usepackage{lipsum}
\begin{document}
\chapter{foo}
\lipsum[1-2]
\end{document}
如果希望最后一页(章节)末尾的列保持平衡,可以使用multicol
包及其multicols
环境。但是,简单地将整个文档主体放在\begin{multicols}{2}
...中\end{multicols}
是不行的,因为 a)\chapter
标题会成为第一列的一部分,并且 b) 除了最后一章之外,任何最后一页都不会具有平衡的列。相反,必须对每一章使用单独的环境,并在 的可选参数中multicols
发出。\chapter
multicols
\documentclass{book}
\usepackage{multicol}
\usepackage{lipsum}
\begin{document}
\begin{multicols}{2}
\chapter{First}
\lipsum[1-2]
\chapter{Second}
\lipsum[1-2]
\end{multicols}
\begin{multicols}{2}[\chapter{Third}]
\lipsum[1-2]
\end{multicols}
\end{document}
是否可以定义一个multicols{2}
类似于\twocolumn
在文档序言中发出的开关,并产生单独的单列\chapter
标题?
答案1
一个简单的解决方案看起来有点像这样:
\documentclass{book}
\usepackage{multicol}
\makeatletter
\def\closeopenmulticols{%
% test if current env is "multicols" if so close it
\def\@tempa{multicols}%
\ifx\@tempa\@currenvir
\end{multicols}%
\fi
}
\makeatother
\newcommand\Mychapter[1]{%
\closeopenmulticols
% start new multicols with chapter
\begin{multicols}{2}[\chapter{#1}]}
% close last open multicols
\AtEndDocument{\closeopenmulticols}
\usepackage{lipsum}
\begin{document}
\Mychapter{First}
\lipsum[1-2]
\Mychapter{Second}
\lipsum[1-2]
\end{document}
明显的改进是重新定义\chapter
工作方式,\Mychapter
但使用标准标题命令的可选参数 - 为读者练习;-) ...新年快乐(很快)。
更新
这是一个稍微更复杂的解决方案,它实际上实现了所要求的开关(或者更确切地说是两个开关\startchaptercols[<colno>]
和\stopchaptercols
),它们会改变下一个命令的行为\chapter
)。
\documentclass{book}
\usepackage{multicol}
\makeatletter
\def\closeopenmulticols{%
% test if current env is "multicols" if so close it
\def\@tempa{multicols}%
\ifx\@tempa\@currenvir
\end{multicols}%
\fi }
\makeatother
\let\origchapter\chapter
%parse optional args if present and save them
\def\mychapter#1#{\gdef\buildmychapter{\origchapter#1}\mychapteri}
% parse mandatory arg and do the work
\def\mychapteri#1{\closeopenmulticols
% start new multicols with chapter
\begin{multicols}{\chaptercols}[\buildmychapter{#1}]}
\newcommand\startchaptercols[1][2]{\gdef\chaptercols{#1}\global\let\chapter\mychapter}
\def\stopchaptercols{\gdef\chapter{\closeopenmulticols\origchapter}}
% close last open multicols
\AtEndDocument{\closeopenmulticols}
\usepackage{lipsum}
\begin{document}
\startchaptercols % start next chapter with two columns
\tableofcontents
\startchaptercols[3] % start next chapter with three columns
\chapter{First}
\section{foo} \lipsum[1-2]
\startchaptercols % start next chapter with two columns (no immediate change)
\section{foo} \lipsum[1-2]
\chapter[Running second]{Second}
\lipsum[1-2] \section{foo} \lipsum[1-2]
\stopchaptercols % stop at next chapter (if any)
\section{foo} \lipsum[1-2]
\chapter*{Third}
\lipsum[1-2]
\end{document}
答案2
这是一个简短的解决方案:
\documentclass{book}
\usepackage{lipsum}
\usepackage{multicol,etoolbox}
\newenvironment{Chapter}[2][1]{\chapter[#1]{#2}}{}
%\usepackage{setlistings} private code edited out
\makeatletter
\def\multicols@string{multicols}
\BeforeBeginEnvironment{Chapter}{%
\ifx\@currenvir\multicols@string
\xdef\resume@multicols{\noexpand\begin{multicols}{\number\col@number}}%
\end{multicols}%
\else
\global\let\resume@multicols\@empty
\fi}
\AfterEndEnvironment{Chapter}{\resume@multicols}
\makeatother
\begin{document}
\begin{multicols}{2}
\begin{Chapter}{Multivariate Algebra I}
\end{Chapter}
\lipsum[1-2]
\begin{Chapter}{Multivariate Algebra II}
\end{Chapter}
\lipsum[3-4]
\end{multicols}
\end{document}
如果您注意到\Chapter
命令已被定义为环境。这是更好的选择,因为这样您就可以更好地调整章节的开头布局。例如,在这里我使用类似的方法来添加图片布局。