如何防止在索引中的第一个子条目之前出现列中断?

如何防止在索引中的第一个子条目之前出现列中断?

我正在使用 imakeidx 编写索引,并且还想使用子条目。正如您在图片上看到的,我得到了一个分栏符,我认为这让它更难理解。我能以某种方式控制它吗?我应该吗?

在此处输入图片描述

编辑如果我有“gap”、“axial”和“radial”,那么最后两个之间的分离就不会造成太大影响。但是“gap”后面的分离看起来很奇怪。


MWE 可供玩耍:

% arara: lualatex
% arara: makeindex
% arara: lualatex

\documentclass{article}
\usepackage{imakeidx}
% we don't want a page break before THE FIRST subitem
\makeatletter\renewcommand\subitem{\nobreak\@idxitem\hspace*{20\p@}}\makeatother
\makeindex
\begin{document}
\index{gap!radial}\index{gap!axial}
\index{gapa!radial}\index{gapa!axial}
\index{gapb!radial}\index{gapb!axial}
\index{gapc!radial}\index{gapc!axial}
\index{gapd!radial}\index{gapd!axial}
\index{gap1!radial}\index{gap1!axial}
\index{gapa1!radial}\index{gapa1!axial}
\index{gapb1!radial}\index{gapb1!axial}
\index{gapc1!radial}\index{gapc1!axial}
\index{gapd1!radial}\index{gapd1!axial}
\index{gap2!radial}\index{gap2!axial}
\index{gapa2!radial}\index{gapa2!axial}
\index{gapb2!radial}\index{gapb2!axial}
\index{gapc2!radial}\index{gapc2!axial}
\index{gapd2!radial111}\index{gapd2!axial111}
\printindex
\end{document}

列分隔符应出现在 gapd2 之前或 axial111 之后。

答案1

解决方案是移动\nobreak\@idxitem

% arara: lualatex
% arara: makeindex
% arara: lualatex

\documentclass{article}
\usepackage{makeidx}

\makeatletter
% we don't want a page break before a subitem
\renewcommand\subitem{\@idxitem\nobreak\hspace*{20\p@}}
\makeatother

\makeindex
\begin{document}
\index{gap!radial}\index{gap!axial}
\index{gapa!radial}\index{gapa!axial}
\index{gapb!radial}\index{gapb!axial}
\index{gapc!radial}\index{gapc!axial}
\index{gapd!radial}\index{gapd!axial}
\index{gap1!radial}\index{gap1!axial}
\index{gapa1!radial}\index{gapa1!axial}
\index{gapb1!radial}\index{gapb1!axial}
\index{gapc1!radial}\index{gapc1!axial}
\index{gapd1!radial}\index{gapd1!axial}
\index{gap2!radial}\index{gap2!axial}
\index{gapa2!radial}\index{gapa2!axial}
\index{gapb2!radial}\index{gapb2!axial}
\index{gapc2!radial}\index{gapc2!axial}
\index{gapd2!radial}\index{gapd2!axial}
\printindex
\end{document}

在此处输入图片描述

\subitem没有的标准定义是\nobreak;该命令\@idxitem只执行\par并设置\hangindent,因此如果我们在它之后添加惩罚(\nobreakis \penalty 10000),TeX 此时将不会分页。


\makeatletter如果您只希望第一个子项保持附加到主条目,则将和之间的代码更改\makeatother

\makeatletter
% we don't want a page break before the first subitem
\newif\iffirst@subitem
\def\@idxitem{%
  \par\hangindent40\p@ % original
  \first@subitemtrue   % added
}
\def\subitem{%
  \par\hangindent40\p@
  \iffirst@subitem
    \nobreak
    \first@subitemfalse
  \fi
  \hspace*{20\p@}}
\makeatother

这将仅在主项目和第一个子项目之间添加惩罚。

答案2

我正在处理一本教科书的长索引。我发现使用 LaTeX 的 renew 命令实现 egreg 的建议很有用,我可以将其放入序言中。此代码还抑制了第一个子项之前的中断,并将 \see 条目保持在同一页上。(\see 修复有点实验性,因为我不确定它是否适合较长的条目,但它确实消除了寡妇......)

    \newif\iffirst@subitem
    \newif\iffirst@subsubitem\first@subsubitemfalse
    \renewcommand\@idxitem{\par\hangindent 40\p@ \first@subitemtrue}
    \renewcommand\subitem{\par\hangindent 
           40\p@\iffirst@subitem\nobreak\first@subitemfalse\fi 
           \hspace*{20\p@}\first@subsubitemtrue}
    \renewcommand\subsubitem{\par\hangindent 
           40\p@\iffirst@subsubitem\nobreak\first@subsubitemfalse\fi 
           \hspace*{30\p@}}
    \renewcommand\see[2]{\samepage\emph{\seename} #1}

相关内容