![使用 l3doc 类时进行索引](https://linux22.com/image/474438/%E4%BD%BF%E7%94%A8%20l3doc%20%E7%B1%BB%E6%97%B6%E8%BF%9B%E8%A1%8C%E7%B4%A2%E5%BC%95.png)
我正在使用该类l3doc
进行编写,文档需要索引宏和普通索引,即带有普通单词而非命令的情况。
\documentclass{l3doc}
\usepackage{makeidx}
\def\thepage{\Alph{part}-\arabic{page}}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\part {First Part}
\section{first section}
\subsection{first subsection}
Just a test
\cmd{\chapter}
\index{Book Class>chapter}
\index{chapter design}
\cs{l_tmpa_tl}
\cs{tl_new:N}
\newpage
\part{Second Part}
\cs{l_tmpa_seq}
\cs{seq_new:N}
\printindex
\end{document}
l3doc 使用罗马字母强制对 l3 函数和变量进行排序,这会导致正常索引出现问题(见图)。
我添加了悬赏以吸引更多关注,我只是在寻找一个宏,在使用类时Index[options]
可以具有与类似的功能。这用于非命令条目。使用我有其他一切的宏,除了这个。所以会打印一个三级条目并正确排序。我知道我可以为此使用和定义自定义命令,但我想给作者这种灵活性,因为有太多的变化。index
l3doc
\NewDocElement
\Index[module={Gods}]{Greece>Zeus}
NewDocElement
答案1
方法 I 和 II 是 的联合对立面l3
。这似乎是可以接受的,因为l3doc.cls
也没有全心全意地致力于索引。
方法 I
方法 I 创建一个包含索引中的其他条目的单个索引usage
。这会创建具有目标结构的超链接条目,例如Gods>Greek>Zeus
。我不确定module=Gods
具体用途是什么,所以我忽略了模块部分,但一旦你搞清楚了基本索引,你大概就可以定义一些东西来做它应该做的事情。
唯一的要求是,对于您不想劫持的条目,请使用\myindex{<entry>}
而不是。显然,您可以使用if 。我选择避免这样做,因为该包使用 CamelCase 命令,包括用于索引,我很确定我最终会感到困惑。可能您不太容易感到困惑,但我建议至少在 之前使用。index{<entry>}
l3doc
\Index
doc
\newcommand\Index
\def\Index
\documentclass{l3doc}
\usepackage{makeidx}
\def\thepage{\Alph{part}-\arabic{page}}
% ateb: https://tex.stackexchange.com/a/714572/ addaswyd o gwestiwn yannisl: https://tex.stackexchange.com/q/712156/
\makeatletter
\def\makemyindex{% modified from latex.ltx
\def\myindex{\@bsphack\begingroup
\@sanitize
\@mywrindex}\typeout
{Writing index file \jobname-my.idx}%
\let\makemyindex\@empty
}
\@onlypreamble\makemyindex
\def\@mywrindex#1{% ditto
\protected@write\@indexfile{}%
{\string\indexentry{#1|hdpindex{usage}}{\thepage}}%
\endgroup
\@esphack}
\def\myindex{\@bsphack\begingroup \@sanitize\@myindex}
\def\@myindex#1{\endgroup\@esphack}
\makeatother
\usepackage{bookmark}% optional
\makemyindex
\begin{document}
\tableofcontents
\part {First Part}
\section{first section}
\subsection{first subsection}
Just a test
\cmd{\chapter}
\myindex{Book Class>chapter}
\myindex{chapter design}
\cs{l_tmpa_tl}
\cs{tl_new:N}
\newpage
\part{Second Part}
\cs{l_tmpa_seq}
\cs{seq_new:N}
\myindex{Gods>Greek>Zeus}
\printindex
\end{document}
方法 II
此方法生成第二个索引,使用 打印\printmyindex
,条目设置使用\myindex
与前面相同。它同样生成具有目标结构的超链接条目。序言和标题可单独配置。
此方法需要额外的write
。但是,除非您使用多个词汇表,否则这可能不是一个大问题glossaries
。另一种方法是splitidx
但我没有尝试让l3doc
、doc
和很好地一起玩。我担心splitidx
可能仍处于并行播放阶段……hyperref
l3doc
请注意,\printmyindex
是 的修改形式,\PrintIndex
而不是\printindex
。这是因为我修改了 中的命令,doc.sty
使用前者而不是后者。它还对标题进行了硬编码,原因我并不完全清楚。因此,如果索引名称导致问题,您可能需要对其进行硬编码。
\documentclass{l3doc}
\usepackage{makeidx}
\def\thepage{\Alph{part}-\arabic{page}}
\makeatletter
% ateb: https://tex.stackexchange.com/a/714572/ addaswyd o gwestiwn yannisl: https://tex.stackexchange.com/q/712156/
\def\makemyindex{%
\newwrite\@myindexfile
\immediate\openout\@myindexfile=\jobname-my.idx
\def\myindex{\@bsphack\begingroup
\@sanitize
\@mywrindex}\typeout
{Writing index file \jobname-my.idx}%
\let\makemyindex\@empty
}
\@onlypreamble\makemyindex
\def\@mywrindex#1{%
\protected@write\@myindexfile{}%
{\string\indexentry{#1|hdpindex{usage}}{\thepage}}%
\endgroup
\@esphack}
\def\myindex{\@bsphack\begingroup \@sanitize\@myindex}
\def\@myindex#1{\endgroup\@esphack}
\def\printmyindex{% modified from doc.sty
\let\index@prologue@orig\index@prologue
\let\index@prologue\myindex@prologue
\@input@{\jobname-my.ind}%
\let\index@prologue\index@prologue@orig
\global\let\printmyindex\@empty}
\newcommand\myindex@prologue{%
\section*{\myindexname}%
\markboth{\myindexname}{\myindexname}%
A prefix, prologue, introduction and foreward.%
}
\makeatother
\usepackage{bookmark}
\makemyindex
\newcommand\myindexname{Another Index}
\begin{document}
\tableofcontents
\part {First Part}
\section{first section}
\subsection{first subsection}
Just a test
\cmd{\chapter}
\myindex{Book Class>chapter}
\myindex{chapter design}
\cs{l_tmpa_tl}
\cs{tl_new:N}
\newpage
\part{Second Part}
\cs{l_tmpa_seq}
\cs{seq_new:N}
\myindex{Gods>Greek>Zeus}
\printindex
\printmyindex
\end{document}
[由于 Okular 错误,未提供任何图像。第一个应显示集成索引;第二个显示带有标准序言的“索引”,然后显示带有替代序言的“另一个索引”。]
答案2
为了解决由于 l3 函数和变量使用罗马字母编号而导致的正常索引排序问题,您可以修改页码处理方式。无需重新定义 \thepage,您可以自定义 \pagenumbering 命令以实现仅针对 l3 函数和变量的所需编号样式。