索引不应开始新页面

索引不应开始新页面

我正在用 LaTeX 2e 写一篇文章\documentclass[twocolumn]{article},其中包括一个索引。文档前言包括\usepackage{makeidx}\makeindex命令。在我想要打印索引的地方,我说\printindex。索引操作都运行正常。但是,在格式化文档时,索引前后都会插入分页符。我想消除这两个分页符。我假设调用\printindex\include执行\clearpage,虽然我并不知道这一点。我怎样才能消除这两个分页符?

答案1

环境theindex定义article.cls如下:

\newenvironment{theindex}
               {\if@twocolumn
                  \@restonecolfalse
                \else
                  \@restonecoltrue
                \fi
                \twocolumn[\section*{\indexname}]%
                \@mkboth{\MakeUppercase\indexname}%
                        {\MakeUppercase\indexname}%
                \thispagestyle{plain}\parindent\z@
                \parskip\z@ \@plus .3\p@\relax
                \columnseprule \z@
                \columnsep 35\p@
                \let\item\@idxitem}
               {\if@restonecol\onecolumn\else\clearpage\fi}

线路

\twocolumn[\section*{\indexname}]

强制打开新页面(\twocolumn这样做)并且行

\if@restonecol\onecolumn\else\clearpage\fi

还强制生成一个新页面(\onecolumn\clearpage处理该页面)。

为了避免这种行为,您可以重新定义theindex环境;由于您使用的是twocolumnclass 选项,因此可以通过在文档的前言中添加以下几行来完成重新定义:

\makeatletter
\renewenvironment{theindex}
               {\section*{\indexname}%
                \@mkboth{\MakeUppercase\indexname}%
                        {\MakeUppercase\indexname}%
                \thispagestyle{plain}\parindent\z@
                \parskip\z@ \@plus .3\p@\relax
                \columnseprule \z@
                \columnsep 35\p@
                \let\item\@idxitem}
               {}
\makeatother

一个小的工作示例:

\documentclass[twocolumn]{article}
\usepackage{makeidx}

\makeatletter
\renewenvironment{theindex}
               {\section*{\indexname}%
                \@mkboth{\MakeUppercase\indexname}%
                        {\MakeUppercase\indexname}%
                \thispagestyle{plain}\parindent\z@
                \parskip\z@ \@plus .3\p@\relax
                \columnseprule \z@
                \columnsep 35\p@
                \let\item\@idxitem}
               {}
\makeatother

\makeindex

\begin{document}

A\index{A}B\index{B}
\printindex
some text

\end{document}

产生

在此处输入图片描述

答案2

  1. 虽然我在 2012 年给出的答案可以在我 2012 年的系统上使用,但它在 TeX Live 2022 上却无法使用(对于一个有两页的索引,第一页根本就不显示)。我没有查明在哪里、什么时候、为什么会出现问题以及如何修复它。

  2. @Daniel Harbour:关于第二列从顶部开始而不是从“索引”(章节标题)下方开始:以 Gonzalo Medina 的答案为例,添加一个,\usepackage{afterpage}然后在\section*{\indexname}%添加两行\edef\idxtmp{\the\pagetotal}%和之后\afterpage{\vspace*{\idxtmp}}%\pagetotal是 LaTeX 已经用完的垂直空间(在该列中)。\afterpage在双列模式下表示“ \aftercolumn”,即在第一列结束后发出空白垂直空间。(而不是可能\edef使用实际长度,看看是否需要添加或删除一些垂直空间以获得最佳的两列视觉效果。)


Gonzalo Medina 的回答对于使用twocolumnclass-option 的文档非常有用(按照 OP 的要求;已经为 Gonzalo Medina 的回答给出了 +1)。

对于“过度杀伤”(http://tex.blogoverflow.com/2011/10/overkill-is-a-good-thing/;并且因为这对于评论来说太长了,并且评论不能像这样格式化)可以处理单列和双列文档(我在单列文档中遇到了这个问题,并且能够解决它因为 Gonzalo Medina 的回答):

\documentclass{article}
%\documentclass[twocolumn]{article}
% both work
\usepackage{makeidx}

\makeatletter

% * define a `\twoidxcolumn` based on `\twocolumn`:
\def\twoidxcolumn{%
%\clearpage
\global\columnwidth\textwidth
\global\advance\columnwidth-\columnsep
\global\divide\columnwidth\tw@
\global\hsize\columnwidth
\global\linewidth\columnwidth
\global\@twocolumntrue
\global\@firstcolumntrue
\col@number \tw@
%\@ifnextchar [\@topnewpage
\@floatplacement
}


% * define a `\oneidxcolumn` based on `\onecolumn`:
\def\oneidxcolumn{%
%\clearpage
\global\columnwidth\textwidth
\global\hsize\columnwidth
\global\linewidth\columnwidth
\global\@twocolumnfalse
\col@number \@ne
\@floatplacement}


% * replace `\twocolumn` in `theindex` by `\twoidxcolumn`, remove the `[` `]`, 
% and replace `\if@restonecol\onecolumn\else\clearpage\fi` by 
% `\if@restonecol\oneidxcolumn\else\relax\fi`:
\renewenvironment{theindex}
  {\if@twocolumn
     \@restonecolfalse
   \else
     \@restonecoltrue
   \fi
   \twoidxcolumn \section*{\indexname}%
   \@mkboth{\MakeUppercase\indexname}%
           {\MakeUppercase\indexname}%
   \thispagestyle{plain}\parindent\z@
   \parskip\z@ \@plus .3\p@\relax
   \columnseprule \z@
   \columnsep 35\p@
   \let\item\@idxitem}
  {\if@restonecol\oneidxcolumn\else\relax\fi}
\makeatother

\makeindex

\begin{document}

A\index{A} B\index{B} Lorem ipsum dolor sit amet, consectetuer adipiscing elit. 
Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. 
\par\printindex 
% Note the `\par` before `\printindex`! Without this, the paragraph
% before `\printindex` will be in twocolumn mode, too. 
% (An empty line before `\printindex` works, too, of course.)
Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, 
vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant morbi 
tristique.

\end{document}

相关内容