环境开始或结束于标题定义

环境开始或结束于标题定义

我正在尝试在章节标题之前和之后添加自动\end{multicols}\begin{multicols}{2}。(文档是 2 列,章节标题应该横跨整个页面。)

这是我的最小工作示例:

这有效:

\documentclass{book}
\usepackage{multicol}
\usepackage[compact,tiny]{titlesec}
\titleformat{\chapter}{}{\thechapter}{0em}{}[]

\begin{document}
\begin{multicols}{2}
\end{multicols}
\chapter{Breaking Things}
\begin{multicols}{2}
\end{multicols}

\end{document} 

但是,将\begin&\end移入 titleformat 命令会产生错误。每个命令都会产生不同的错误(因为我分别尝试过每个命令)。\protect 没有帮助。

最小损坏示例:

\documentclass{book}
\usepackage{multicol}
\usepackage[compact,tiny]{titlesec}
\titleformat{\chapter}{}{\thechapter}{0em}{\end{multicols}}[\begin{multicols}{2}]

\begin{document}
\begin{multicols}{2}
\chapter{Breaking Things}
\end{multicols}
\end{document} 

像上面所示那样将其\end{multicols}放入命令的“before”部分会产生“缺失 } 插入”问题。\begin{multicols}像上面所示那样将其放入命令的“after”部分(将 保留\end{multicols}在文档本身中)会产生“额外 } 或忘记 \endgroup。”错误。

答案1

您必须\chapter稍微重新定义该命令,将其\begin{multicols}{2}直接插入到章节标题之后和\end{multicols} 发出真正的章节命令之前。

但是,这样会multicol在开头留下一个未打开的,multicol在结尾留下一个未关闭的。环境会根据定义钩住\AtBeginDocument\AtEndEnvironment打开和关闭此环境。

\AtBeginDocument如果您想将 移至较后的位置,请注释掉\begin{multicols}{2}—— 然后手动执行此操作。对于较早的 ,同样如此\end{multicols}

\documentclass{book}
\usepackage{multicol}
\usepackage[compact,tiny]{titlesec}
\usepackage{blindtext}
%\usepackage{etoolbox}%

\titleformat{\chapter}{}{\thechapter}{0em}{}[]



\let\LaTeXStandardChapter\chapter
\makeatletter
\newcommand{\unstarredchapter@noopt}[1]{%
\unstarredchapter@opt[#1]{#1}%
}%

\newcommand{\unstarredchapter@opt}[2][]{%
\end{multicols}\relax%
\LaTeXStandardChapter{#1}%
\begin{multicols}{2}
  % 
}%

\newcommand{\unstarredchapter}{%
\@ifnextchar[{\unstarredchapter@opt}{\unstarredchapter@noopt}
}%

\newcommand{\starredchapter}[1]{%
\LaTeXStandardChapter*{#1}
}%

\renewcommand{\chapter}{%
\@ifstar{\starredchapter}{\unstarredchapter}%
}%


\makeatother

\AtEndDocument{%
\end{multicols}\relax%
}%

\AtBeginDocument{%
\begin{multicols}{2}\relax%
}%



\begin{document}
\blindtext
\chapter{Breaking Things}
\blindtext[2]

\chapter{Other stuff}
\blindtext[4]

\end{document} 

笔记

我的解决方案是问题multicols在开头自动打开,因为这也将提供两列,内容列表\tableofcontents也是如此。\listof....

答案2

这是第二种方法,它利用了多色使用环境的可选参数显示跨列标题的包mulicols

我定义了一个新\Chapter命令。起初我只是覆盖了它\chapter,但后来我认为最好不要管实际章节。我的代码已经\chapter打开和关闭了multicols环境,因此如果您想在多列模式下获取第一章之前的材料,那么您必须手动执行此操作。

\documentclass{book}
\usepackage{multicol}
\usepackage[compact,tiny]{titlesec}
\titleformat{\chapter}{}{\thechapter}{0em}{}[]
\usepackage{blindtext}
\let\endLastMultiCols\relax
\newcommand\Chapter[2][\relax]{\endLastMultiCols% end the last multicols, if there was one
  \begin{multicols}{2}[\protect{\ifx\relax#1\relax\chapter{#2}\else\chapter[#1]{#2}\fi}]%
  \def\endLastMultiCols{\end{multicols}}%
}
\AtEndDocument{\endLastMultiCols}

\begin{document}
\Chapter{Breaking Things}
\blindtext
\Chapter{Breaking more Things}
\Blindtext
\end{document}

相关内容