如何避免分页符,并正确分组 使用 imakeidx 吗?

如何避免分页符,并正确分组 使用 imakeidx 吗?

我正在使用imakeidx。如何对(人员)索引中的条目进行分组,使它们不会跨页面边界分割?我的目标是在索引中设置姓氏“Smith”组和姓氏“Jones”组,以及每个组 1-12 个名字,并将这些组保留在同一页面上。

我觉得某些应用程序\nopagebreak可能会解决这个问题,但是在哪里呢?

这是 pdflatex MWE,下面是输出的图像,其中有一个大红色矩形作为注释,显示索引中的姓氏与几个名字分开的位置。所有“Wilson”名字都应该在同一页上。

MWE 是 pdflatex 文件:

\documentclass{article}  

\usepackage{imakeidx}

\makeindex[name=person, title={Index},options=-s example.ist, columns=1] % Use .ist for dotfill

\makeindex

\begin{document}
Page1

\index[person]{{Smith}!{John1 , something}}
\index[person]{{Smith}!{John2 , something}}
\index[person]{{Smith}!{John3 , something}}

\index[person]{{Johnson}!{John1 , something}}
\index[person]{{Johnson}!{John2 , something}}
\index[person]{{Johnson}!{John3 , something}}

\index[person]{{Williams}!{John1 , something}}
\index[person]{{Williams}!{John2 , something}}
\index[person]{{Williams}!{John3 , something}}

\index[person]{{Brown}!{John1 , something}}
\index[person]{{Brown}!{John2 , something}}
\index[person]{{Brown}!{John3 , something}}

\index[person]{{Jones}!{John1 , something}}
\index[person]{{Jones}!{John2 , something}}
\index[person]{{Jones}!{John3 , something}}

\index[person]{{Miller}!{John1 , something}}
\index[person]{{Miller}!{John2 , something}}
\index[person]{{Miller}!{John3 , something}}

\index[person]{{Davis}!{John1 , something}}
\index[person]{{Davis}!{John2 , something}}
\index[person]{{Davis}!{John3 , something}}

\index[person]{{Wilson}!{John1 , something}}
\index[person]{{Wilson}!{John2 , something}}
\index[person]{{Wilson}!{John3 , something}}

\index[person]{{Taylor}!{John1 , something}}
\index[person]{{Taylor}!{John2 , something}}
\index[person]{{Taylor}!{John3 , something}}

\index[person]{{Martinez}!{John1 , something}}
\index[person]{{Martinez}!{John2 , something}}
\index[person]{{Martinez}!{John3 , something}}

\index[person]{{Thompson}!{John1 , something}}
\index[person]{{Thompson}!{John2 , something}}
%\index[person]{{Thompson}!{John3 , something}}

\index[person]{{Lee}!{John1 , something}}
\index[person]{{Lee}!{John2 , something}}
\index[person]{{Lee}!{John3 , something}}

\printindex[person]

\end{document}

使用单行样式 example.ist

delim_1 "\\nobreak\\dotfill "

以实现漂亮的点填充。请所有 Wilson 都达成共识

所有姓氏和名字都分组得很好,很好。但是,“Wilson”这个名字(及其三个名字)却分布在两页上。我该怎么做呢?

我尝试以 .ist 样式添加\nopagebreak,但没有达到预期的效果。例如

% group_skip "\n\n \\nopagebreak\\indexspace\n" 
% item_1 "\\par\\nopagebreak" 
% item_0 "\\nopagebreak" 
% prefix "\\par\\nopagebreak" 
% delim_1 "\\nobreak\\nopagebreak\\dotfill "
% delim_1 "\\nobreak\\par\\nopagebreak\\dotfill "
% delim_1 "\\nopagebreak\\dotfill "
% delim_1 "\\nolinebreak\\dotfill "

如何调整 .ist 样式,使姓氏组和 1-12 个名字保持在同一页上?在这种情况下,我希望第 2 页有一个额外的空行,并且“Wilson”和 3 个名字作为一个组放在页面上。

附言:当我查看初始评论时,我意识到上面的示例集中在 1-12 个子项(名字)上,而完整的 latex 文件有几个实例,其中近 100 个子项(名字)跨越一页以上,这带来了额外的挑战。理想情况下,解决方案可以处理整个范围。

这只是猜测,但如果我们选择一个阈值 N,并可以将所有 N 组放在一起,然后拆分较大的组,这样可行吗?也许可以做一些简单的事情,例如

if there are less than N==5 sub-items/names 
then keep them together
else do nothing and break as usual 

可能有效?但如何编码呢?

PS2:感谢您迄今为止提供的所有帮助。在第一个答案中,建议的解决方案似乎有效,但不适用于索引中的换行。在这里添加第二个 MWE 来演示,并添加第二张图片来可视化问题。

\documentclass{article}  

\usepackage{imakeidx}

% ---- 
\makeatletter
\newcommand{\nobreakafteritem}{}
\newcommand{\setnobreakafteritem}{\renewcommand{\nobreakafteritem}{\par\penalty10000\relax
  \renewcommand{\nobreakafteritem}{}}}
\usepackage{etoolbox}\pretocmd\subitem{\nobreakafteritem}{}{\fail}
\usepackage{etoolbox}\pretocmd\@idxitem{\setnobreakafteritem}{}{\fail}
\makeatother
%----------------

\makeindex[name=person, title={Index},options=-s example.ist, columns=1] % Use .ist for dotfill

\makeindex

\begin{document}
Page1

\index[person]{{Smith}!{John1 , something}}
\index[person]{{Smith}!{John2 , something}}
\index[person]{{Smith}!{John3 , something}}

\index[person]{{Johnson}!{John1 , something}}
\index[person]{{Johnson}!{John2 , something}}
\index[person]{{Johnson}!{John3 , something}}

\index[person]{{Williams}!{John1 , something}}
\index[person]{{Williams}!{John2 , something}}
%\index[person]{{Williams}!{John3 , something}} %ORG
\index[person]{{Williams}!{John3 , something very long wrap the line extra long and longer and longer and longer}}

\index[person]{{Brown}!{John1 , something}}
\index[person]{{Brown}!{John2 , something}}
\index[person]{{Brown}!{John3 , something}}

\index[person]{{Jones}!{John1 , something}}
\index[person]{{Jones}!{John2 , something}}
\index[person]{{Jones}!{John3 , something}}

\index[person]{{Miller}!{John1 , something}}
\index[person]{{Miller}!{John2 , something}}
\index[person]{{Miller}!{John3 , something}}

\index[person]{{Davis}!{John1 , something}}
\index[person]{{Davis}!{John2 , something}}
\index[person]{{Davis}!{John3 , something}}

\index[person]{{Wilson}!{John1 , something}}
\index[person]{{Wilson}!{John2 , something}}
%\index[person]{{Wilson}!{John3 , something}}

\index[person]{{Taylor}!{John1 , something}}
\index[person]{{Taylor}!{John2 , something}}
\index[person]{{Taylor}!{John3 , something}}

\index[person]{{Martinez}!{John1 , something}}
\index[person]{{Martinez}!{John2 , something}}
\index[person]{{Martinez}!{John3 , something}}

\index[person]{{Thompson}!{John1 , something}}
\index[person]{{Thompson}!{John2 , something}}
\index[person]{{Thompson}!{John3 , something}} % 

\index[person]{{Lee}!{John1 , something}}
\index[person]{{Lee}!{John2 , something}}
\index[person]{{Lee}!{John3 , something}}

\printindex[person]

\end{document}

对于 PS2,索引中的换行示例分为 2 页

答案1

一种完全未经测试的可能性:

\makeatletter
\newcommand{\nobreakafteritem}{}
\newcommand{\setnobreakafteritem}{\renewcommand{\nobreakafteritem}{\par\penalty10000\relax
  \renewcommand{\nobreakafteritem}{}}}
\pretocmd\subitem{\nobreakafteritem}{}{\fail}
\pretocmd\@idxitem{\setnobreakafteritem}{}{\fail}
\makeatother

基本思想:\item在索引中的 之后(由 生成\@idxitem),定义\nobreakafteritem为放置无中断惩罚,但在第一次调用之后,它将恢复为无操作。然后修补\subitem以调用\nobreakafteritem。在一定数量的调用之后可以\nobreakafteritem自毁,或者甚至可以在每次调用时降低惩罚,直到它降至零。

答案2

添加item_01 "\\nopagebreak\n \\subitem "到您的 .ist 文件以\nopagebreak在 0 级(主)和 1 级(子)之间插入项目。

添加item_1 "\\nopagebreak\n \\subitem "到您的 .ist 文件以\nopagebreak在 1 级(子)和 1 级(子)之间的项目之间插入。

添加item_x1 "\\nopagebreak\n \\subitem "到您的 .ist 文件以\nopagebreak在级别 0(主)上没有关联页码的项目和级别 1(子)上插入一个项目。

"\n \\subitem "是这些位置默认插入的内容,因此上面所做的只是\\nopagebreak在开始下一个子项之前进行插入。

这里item_01是您可以在 .ist 文件中使用的键的列表(如)。

相关内容