朋友们,你们可能知道,我有一个相当复杂的歌曲分类文档。:)
作为我的常规工作流程,我使用book
加载了几十个包的文档类。我已经memoir
在其他文档中尝试了一段时间,并获得了非常好的结果。“包含电池”类的想法很诱人,它的一些功能使我的大部分工作非常容易实现。
因此,迁移的所有事项都已解决,除了一件事:索引。
我的这个特定文档需要多个索引,最多 30 个。众所周知,如果设置得当,这个疯狂的 TeX 可能会在眨眼间耗尽寄存器。我一直使用或splitidx
将imakeidx
索引输出到一个大.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 支持多个索引,所以它有更好的设置标题的方法:-)