使用 l3doc 类时进行索引

使用 l3doc 类时进行索引

我正在使用该类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]可以具有与类似的功能。这用于非命令条目。使用我有其他一切的宏,除了这个。所以会打印一个三级条目并正确排序。我知道我可以为此使用和定义自定义命令,但我想给作者这种灵活性,因为有太多的变化。indexl3doc\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\Indexdoc\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但我没有尝试让l3docdoc和很好地一起玩。我担心splitidx可能仍处于并行播放阶段……hyperrefl3doc

请注意,\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 函数和变量的所需编号样式。

相关内容