我正在用 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
环境;由于您使用的是twocolumn
class 选项,因此可以通过在文档的前言中添加以下几行来完成重新定义:
\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
虽然我在 2012 年给出的答案可以在我 2012 年的系统上使用,但它在 TeX Live 2022 上却无法使用(对于一个有两页的索引,第一页根本就不显示)。我没有查明在哪里、什么时候、为什么会出现问题以及如何修复它。
@Daniel Harbour:关于第二列从顶部开始而不是从“索引”(章节标题)下方开始:以 Gonzalo Medina 的答案为例,添加一个,
\usepackage{afterpage}
然后在\section*{\indexname}%
添加两行\edef\idxtmp{\the\pagetotal}%
和之后\afterpage{\vspace*{\idxtmp}}%
。\pagetotal
是 LaTeX 已经用完的垂直空间(在该列中)。\afterpage
在双列模式下表示“\aftercolumn
”,即在第一列结束后发出空白垂直空间。(而不是可能\edef
使用实际长度,看看是否需要添加或删除一些垂直空间以获得最佳的两列视觉效果。)
Gonzalo Medina 的回答对于使用twocolumn
class-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}