![如何避免分页符,并正确分组 使用 imakeidx 吗?](https://linux22.com/image/432331/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E5%88%86%E9%A1%B5%E7%AC%A6%EF%BC%8C%E5%B9%B6%E6%AD%A3%E7%A1%AE%E5%88%86%E7%BB%84%20%E4%BD%BF%E7%94%A8%20imakeidx%20%E5%90%97%EF%BC%9F.png)
我正在使用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”这个名字(及其三个名字)却分布在两页上。我该怎么做呢?
我尝试以 .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}
答案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 文件中使用的键的列表(如)。