我可以让章节标题自动中断多栏吗?

我可以让章节标题自动中断多栏吗?

我已经写好了整篇文档,现在想将其格式化为两列。

但是,我非常依赖这样的标题\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 页

第 1 页


第2页

第2页


第 3 页

第 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*,如下所示:

未编号部分的屏幕截图

相关内容