在下一列重复顶级索引条目(正确完成)

在下一列重复顶级索引条目(正确完成)

是的,我想要的东西和这个问题。但是,我正在尝试解决以下三个问题repeatindex/afterpage

  1. afterpage原因令人厌恶的该列中第二个条目后面的小垂直空间。
  2. repeatindex如果索引条目包含命令则不起作用。
  3. 我对第二个问题的解决方案对于仅有子条目的条目不起作用。

我不知道第一个问题的真正原因是什么,但肯定是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 位于下一列顶部。我需要在它们之间插入一个延续。

  1. 在包含延续列表的文件中,我在需要延续的位置添加索引条目。例如,

    \index{ITEM!SUB61}
    
  2. 这些条目通过一个程序运行,该程序最后的列表中的项目,用续篇替换“实际”文本,并添加页码 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文件中。

  3. makeindex使用该选项运行-s wide.ist,添加以下样式选项:

    line_max 2000
    
  4. 对生成的.ind文件进行后处理,查找页面 CCC 中的所有行,剥离页面和初始控制序列,并仅包含匹配括号之间的内容z{...}

这个过程很繁琐,因为每次将新的续篇添加到列表中时,所有后续项目的位置都会发生变化。但对于一个两栏、27 页的索引,我能够在不到一小时内完成所有工作。而且结果是完美的。

相关内容