是的,我想要的东西和这个问题。但是,我正在尝试解决以下三个问题repeatindex
/afterpage
:
afterpage
原因令人厌恶的该列中第二个条目后面的小垂直空间。repeatindex
如果索引条目包含命令则不起作用。- 我对第二个问题的解决方案对于仅有子条目的条目不起作用。
我不知道第一个问题的真正原因是什么,但肯定是afterpage
。它的文档说它在双列模式下不起作用,所以这有点合理,但无论如何......我试过做类似的事情
\gdef\ResetAfterFix{\gdef\AfterFix{\ResetAfterFix}}
\ResetAfterFix
% ...
\newcommand{\metaitem}[2]{\item #1 #2\relax\AfterFix}
然后放入应该输出的\gdef\AfterFix{\vskip-1234pt\ResetAfterFix}
内容afterpage
,但似乎afterpage
扩展并布局了它的“后文”后第二页的前几行,因此\AfterFix
应用在了错误的地方。
repeatindex
似乎对这个扩展问题有一个解决方案(参见\@entry
和\@@entry
),但我未能将其应用到我的情况。
我不太明白afterpage
延迟输出是如何工作的,但我还怀疑它的\baselineskip
“伪造”\addboxcontents
是导致问题的原因。
repeatindex
我通过放弃扩展内容的空延续检查来解决了第二个问题:
% Reset afterpage contents
\long\def\ResetAfterPage#1{%
\gdef\AP@{{#1\par}}%
\global\output{%
\the\AP@output
\ifnum\outputpenalty>-\@Mi
\global\output\expandafter{\the\AP@output}%
\aftergroup\AP@@
\fi
}%
}
% This will be put at the top of the page
\gdef\index@cont{}
% Continuation label
\newcommand{\indexcont}{(\textit{cont.})}
% These commands are output by index-preparing program
\newcommand{\metaitem}[2]{%
\item #1 #2
\gdef\index@cont{#1\relax\ \indexcont}% Store what will be repeated
\ResetAfterPage{}% And prevent repeating it without any following \subitems
}
\newcommand{\metasubitem}[2]{%
\subitem #1 #2
\ResetAfterPage{\index@cont}%
}
\newcommand{\metasubsubitem}[2]{
\subsubitem #1 #2
\ResetAfterPage{\index@cont}%
}
第三个问题与以下条目有关:
foo
bar, 12
baz, 42
导致
foo (cont.)
foo
bar, 12
baz, 42
如果这种情况发生在柱子的顶部。我相信它与afterpage
:它似乎被 LaTeX 欺骗,认为它foo
被遗漏了,但 LaTeX 将它放到了下一页。然而,我怀疑这是否是一个正确的解释,因为无论条目长度如何,这种情况都会发生,但项目后的页码确实重要。
我通过让索引准备器输出来规避这个问题\ResetAfterPage{}
在之后输出来解决这个问题第一个子项没有页面的项目,但这不是一个优雅的解决方案。
答案1
我无法开始afterpage
工作。为了解决这个问题,我最终采用了手工和软件相结合的方法。
假设我有一个项目 ITEM,其子项目 SUB6 位于一列底部,而 SUB7 位于下一列顶部。我需要在它们之间插入一个延续。
在包含延续列表的文件中,我在需要延续的位置添加索引条目。例如,
\index{ITEM!SUB61}
这些条目通过一个程序运行,该程序最后的列表中的项目,用续篇替换“实际”文本,并添加页码 CCC。例如,
\index{ITEM!SUB61}
变成
\indexentry {ITEM!SUB61@z{\par\penalty-9000 \item ITEM (continued)}}{CCC}
和
\index{ITE}
变成
\indexentry {ITE@z{\par\penalty-9000}}{CCC}
和
\index{ITEM!SUB12!SUBSUB97}
变成
\indexentry {ITEM!SUB12+SUBSUB97@z{\par\penalty-9000\item ITEM (continued) \subitem SUB12 (continued)}}{CCC}
这些
\indexentry
行被添加到文档的idx
文件中。makeindex
使用该选项运行-s wide.ist
,添加以下样式选项:line_max 2000
对生成的
.ind
文件进行后处理,查找页面 CCC 中的所有行,剥离页面和初始控制序列,并仅包含匹配括号之间的内容z{...}
。
这个过程很繁琐,因为每次将新的续篇添加到列表中时,所有后续项目的位置都会发生变化。但对于一个两栏、27 页的索引,我能够在不到一小时内完成所有工作。而且结果是完美的。