使用带有回忆录的索引包

使用带有回忆录的索引包

朋友们,你们可能知道,我有一个相当复杂的歌曲分类文档。:)

作为我的常规工作流程,我使用book加载了几十个包的文档类。我已经memoir在其他文档中尝试了一段时间,并获得了非常好的结果。“包含电池”类的想法很诱人,它的一些功能使我的大部分工作非常容易实现。

因此,迁移的所有事项都已解决,除了一件事:索引。

我的这个特定文档需要多个索引,最多 30 个。众所周知,如果设置得当,这个疯狂的 TeX 可能会在眨眼间耗尽寄存器。我一直使用或splitidximakeidx索引输出到一个大.idx文件中,然后使用splitindex命令行应用程序来拆分索引。:)

memoir具有内置索引支持。就我所查阅的文档而言,没有提到索引数量的限制,但似乎暗示了这一点,因为我们还定义了索引扩展。我找不到任何关于依赖外部索引包的参考资料,并且它被称为imakeidx兼容memoir。呜呜!编辑:从 1.1 版本开始,imakeidx现在支持memoir,耶!:)

各位高级用户,我恳求你们提供智慧memoir:我如何使用索引包,或者memoir如果可能的话,让它支持 16 个以上的索引?:)

编辑:非常抱歉,我应该做一个 M(n)WE。:)

\documentclass{memoir}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeindex[aaa]
\makeindex[bbb]
\makeindex[ccc]
\makeindex[ddd]
\makeindex[eee]
\makeindex[fff]
\makeindex[ggg]
\makeindex[hhh]
\makeindex[iii]
\makeindex[jjj]
\makeindex[kkk]
\makeindex[lll]
\makeindex[mmm]
\makeindex[nnn]
\makeindex[ooo]
\makeindex[ppp]
\makeindex[qqq]
\makeindex[rrr]
\makeindex[sss]
\makeindex[ttt]
\makeindex[uuu]
\makeindex[vvv]
\makeindex[www]
\makeindex[xxx]
\makeindex[yyy]
\makeindex[zzz]

\begin{document}

Hello world.

\end{document}

摧毁邪恶

Writing index file lll.idx 
! No room for a new \write .
\alloc@ ...else \errmessage {No room for a new #2}
                                                  \fi \fi 
l.49 \makeindex[mmm]

?

答案1

刚刚上传到 CTAN 的1.1 版imakeidx允许定义任意数量的索引:

\documentclass{memoir}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[splitindex]{imakeidx}[2012/05/09]

\makeindex[name=aaa]
\makeindex[name=bbb]
\makeindex[name=ccc]
\makeindex[name=ddd]
\makeindex[name=eee]
\makeindex[name=fff]
\makeindex[name=ggg]
\makeindex[name=hhh]
\makeindex[name=iii]
\makeindex[name=jjj]
\makeindex[name=kkk]
\makeindex[name=lll]
\makeindex[name=mmm]
\makeindex[name=nnn]
\makeindex[name=ooo]
\makeindex[name=ppp]
\makeindex[name=qqq]
\makeindex[name=rrr]
\makeindex[name=sss]
\makeindex[name=ttt]
\makeindex[name=uuu]
\makeindex[name=vvv]
\makeindex[name=www]
\makeindex[name=xxx]
\makeindex[name=yyy]
\makeindex[name=zzz]

\begin{document}

Hello world.

\index[aaa]{A}
\index[bbb]{B}
\index[ccc]{C}
\index[ddd]{D}
\index[eee]{E}
\index[fff]{F}
\index[ggg]{G}
\index[hhh]{H}
\index[iii]{I}
\index[jjj]{J}
\index[kkk]{K}
\index[lll]{L}
\index[mmm]{M}
\index[nnn]{N}
\index[ooo]{O}
\index[ppp]{P}
\index[qqq]{Q}
\index[rrr]{R}
\index[sss]{S}
\index[ttt]{T}
\index[uuu]{U}
\index[vvv]{V}
\index[www]{W}
\index[xxx]{X}
\index[yyy]{Y}
\index[zzz]{Z}


\printindex[aaa]
\printindex[bbb]
\printindex[ccc]
\printindex[ddd]
\printindex[eee]
\printindex[fff]
\printindex[ggg]
\printindex[hhh]
\printindex[iii]
\printindex[jjj]
\printindex[kkk]
\printindex[lll]
\printindex[mmm]
\printindex[nnn]
\printindex[ooo]
\printindex[ppp]
\printindex[qqq]
\printindex[rrr]
\printindex[sss]
\printindex[ttt]
\printindex[uuu]
\printindex[vvv]
\printindex[www]
\printindex[xxx]
\printindex[yyy]
\printindex[zzz]

\end{document}

答案2

事实上,这是我第一次使用回忆录,因此并没有经过严格的测试,但它似乎有效。

安排将所有索引条目写入同一个.idx文件,但使用不同的\indexentry命令。

为每个所需索引运行一次 makeindex,每次输出到单独的.ind文件并指定用于该索引的适当关键字(忽略有关所有其他索引条目的警告)

.ind由于可以输入任意数量的文件,因此索引的打印不受影响。

所以:id1.tex

\documentclass{memoir}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\makeatletter
\renewcommand*{\makeindex}[1][\jobname]{%
  \if@filesw
    \def\index{\@bsphack%
      \@ifnextchar [{\@index}{\@index[\jobname]}}
    \def\specialindex{\@bsphack\@spindex}%
    \expandafter\let\csname #1@idxfile\endcsname\@empty
    \makememindexhook
  \mkindexonce
  \fi}

\def\mkindexonce{%
    \expandafter\newwrite\csname \jobname @idxfile\endcsname
    \expandafter\immediate\openout \csname \jobname @idxfile\endcsname \jobname.idx\relax
    \typeout{Writing index file \jobname.idx }%
    \let\mkindexonce\relax}

\renewcommand{\@@wrindexm@m}[1]{\begingroup
  \def\@idxfile{\@nameuse{#1@idxfile}}%
  \def\@idxfil@{#1}%
  \@sanitize
  \@@@wrindexm@m}

\AtBeginDocument{%
  \def\@@@wrindexm@m#1#2{%
    \if@filesw
      \immediate\write\csname \jobname @idxfile\endcsname{\string\indexentry\@idxfil@{#1}{#2}}%
    \fi
    \endgroup}%
}


\makeatother
\makeindex[aaa]
\makeindex[bbb]
\makeindex[ccc]
\makeindex[ddd]
\makeindex[eee]
\makeindex[fff]
\makeindex[ggg]
\makeindex[hhh]
\makeindex[iii]
\makeindex[jjj]
\makeindex[kkk]
\makeindex[lll]
\makeindex[mmm]
\makeindex[nnn]
\makeindex[ooo]
\makeindex[ppp]
\makeindex[qqq]
\makeindex[rrr]
\makeindex[sss]
\makeindex[ttt]
\makeindex[uuu]
\makeindex[vvv]
\makeindex[www]
\makeindex[xxx]
\makeindex[yyy]
\makeindex[zzz]

%
\begin{document}
\makeatletter


Hello world.\index[aaa]{one}\index[bbb]{tkwo}

\printindex[aaa]
\printindex[bbb]
\end{document}

如果你处理它,你会得到id1.idx如下结果:

\indexentryaaa{one}{1}
\indexentrybbb{tkwo}{1}

所以现在你需要

aaa.is

 keyword "\\indexentryaaa"

bbb.is

keyword "\\indexentrybbb"

然后你可以用

makeindex -s aaa.is  -o aaa.ind id1
makeindex -s bbb.is  -o bbb.ind id1

产生

aaa.ind

\begin{theindex}

  \item one, 1

\end{theindex}

bbb.ind

\begin{theindex}

  \item tkwo, 1

\end{theindex}

最后会得到输入。正如它们一样,它们会得到标题“索引”,但您可以在 tex(重新定义theindex)或 makeindex 样式中更改它(编写与默认前缀不同的前缀\begin{theindex},或者大概因为 memoir 支持多个索引,所以它有更好的设置标题的方法:-)

答案3

也许不是你的问题的直接答案,而是一个解决方法:我建议你尝试 Markus Kohm 的scrwfile。该包旨在提供一种绕过 LaTeX 中文件句柄数量有限的方法。它包含在他出色的KOMA 脚本包

作者已经开始改进英文手册。他scrwfile在第 259 页及后续页面进行了描述。您会发现KOMA-Script加拿大运输安全局贝尔利奥斯

另外,看看类似问题几周前:

相关内容