![如何防止在索引中的第一个子条目之前出现列中断?](https://linux22.com/image/274275/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E5%9C%A8%E7%B4%A2%E5%BC%95%E4%B8%AD%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AD%90%E6%9D%A1%E7%9B%AE%E4%B9%8B%E5%89%8D%E5%87%BA%E7%8E%B0%E5%88%97%E4%B8%AD%E6%96%AD%EF%BC%9F.png)
我正在使用 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
,因此如果我们在它之后添加惩罚(\nobreak
is \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}