是否可以定义一个适用于 \chapter 的 `multicols{2}` 前导开关?

是否可以定义一个适用于 \chapter 的 `multicols{2}` 前导开关?

使用标准 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发出。\chaptermulticols

\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}

enter image description here

是否可以定义一个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命令已被定义为环境。这是更好的选择,因为这样您就可以更好地调整章节的开头布局。例如,在这里我使用类似的方法来添加图片布局。

enter image description hereenter image description here

相关内容