下面的代码是一个以 .tex 结尾的最小 dtx 代码(仅用于示例)。
我试图了解何时创建索引以及何时不创建索引,以及这如何受到 hyperref 加载的影响,但未能看到 doc.sty 命令的行为与文档所述一致。
% \iffalse
%<*driver>
\ProvidesFile{dtxcode.tex}
%</driver>
%
%<*driver>
\documentclass{ltxdoc}
% \usepackage{hyperref}
% \EnableCrossrefs % (default) Every new macro name used within a macrocode or
% macrocode∗ environment will produce an index entry.
\DisableCrossrefs % turn off this feature
%
% If an index is created is determined by the use of the following
% declarations in the driver file preamble; if neither is used, no index is
% produced.
% \PageIndex % all index entries refer to their page number
% \CodelineIndex % index entries produced by \DescribeMacro and \DescribeEnv
% refer to page number but those produced by the macro
% environment refer to the code lines,
% which will be numbered automatically.
% \CodelineNumbered % no index is created, but the code lines are numbered
\RecordChanges
\listfiles
\begin{document}
\DocInput{dtxcode.tex}
\PrintIndex
\end{document}
%</driver>
% \fi
%%
% \DescribeMacro{\foobar} Prints out foobar \index{test}
%
% \Finale
\endinput
在此代码中,索引由\DisableCrossrefs
和创建DisableCrossrefs
但是如果我另外加载包 hyperref,无论我激活什么命令,索引都会完全消失。创建的索引文件仍然相同 - 只是没有加载。
并且如果我\CodelineNumbered
在加载 hyperref 时使用,索引会再次出现,但根据 doc.sty 的文档,它不应该出现。
对我来说,这看起来像是 ltxdoc/doc.sty 中的一个错误。
编辑:以下是场景及其结果的列表。在所有情况下,idx 文件在执行前都被删除,并且 pdf 是用pdflatex
、makeindex.exe -s gind.ist %.idx
、pdflatex
(a)无超链接,\EnableCrossrefs 和 \PageIndex
%\usepackage{hyperref}
\EnableCrossrefs
\PageIndex
索引已创建。
(b)无超链接,\DisableCrossrefs 和 \PageIndex
%\usepackage{hyperref}
\DisableCrossrefs
\PageIndex
索引已创建(但不应该创建吗?)
(c)无超链接,\DisableCrossrefs 和 \CodelineNumbered
%\usepackage{hyperref}
\DisableCrossrefs
\CodelineNumbered
未创建索引,idx 文件为空。
(d)无超链接,\EnableCrossrefs 和 \CodelineNumbered
%\usepackage{hyperref}
\EnableCrossrefs
\CodelineNumbered
未创建索引。与文档的描述相反,它似乎无法控制索引\EnableCrossrefs
。\DisableCrossrefs
(e)使用 hyperref、\EnableCrossrefs 和 \PageIndex
\usepackage{hyperref}
\EnableCrossrefs
\PageIndex
\index
idx 文件已创建,但仅显示自定义条目。在这种情况下test
,但不是foobar
,尽管两者都在 idx 文件中,
\indexentry{foobar=\verb!*+\foobar+|usage|hyperpage}{1}
\indexentry{test|hyperpage}{1}
(f)使用 hyperref、\EnableCrossrefs 和 \CodelineNumbered
\usepackage{hyperref}
\EnableCrossrefs
\CodelineNumbered
由于没有 hyperref,因此不会创建 idx 文件。
总结一下:加载 hyperref 不会影响索引文件的创建,但在 pdf 编译过程中不会包含 doc.sty 的索引条目。
答案1
\EnableCrossrefs
和\DisableCrossrefs
这些宏控制是否对环境内的命令名称macrocode
进行macrocode*
索引。从包装文件doc
:
2.7 交叉引用所有使用的宏
\DisableCrossrefs
,\EnableCrossrefs
如前所述,在
macrocode
或macrocode*
环境中使用的每个新宏名称都会生成一个索引条目。这样,人们可以轻松找出特定宏的使用位置。由于 TeX 在生成如此大量的索引条目时会变得非常慢,因此可以使用\DisableCrossrefs
驱动程序文件中的 来关闭此功能。要再次打开它,只需使用\EnableCrossrefs
。
索引生成
与往常一样,索引生成由\makeindex
.Macros触发\CodelineIndex
,或者\PageIndex
也可以调用\makeindex
。
病例讨论
我已经扩展dtxcode.tex
以显示以下效果\EnableCrossrefs
:
% \begin{macrocode}
\def\foobar{...}
% \end{macrocode}
(a)否hyperref
,\EnableCrossrefs
并且\PageIndex
:
\indexentry{foobar=\verb!*+\foobar+|usage}{1}
\indexentry{test}{1}
\indexentry{def=\verb!*+\def+}{1}
\indexentry{foobar=\verb!*+\foobar+}{1}
⇒ 基于整页的索引。
(e)与hyperref
,\EnableCrossrefs
以及\PageIndex
:
\indexentry{foobar=\verb!*+\foobar+|usage|hyperpage}{1}
\indexentry{test|hyperpage}{1}
\indexentry{def=\verb!*+\def+|hyperpage}{1}
\indexentry{foobar=\verb!*+\foobar+|hyperpage}{1}
\DescribeMacro
⇒ 基于整页的索引,但/的索引条目错误\usage
,因为hyperref
不直接支持 的索引格式doc
。
(b)否hyperref
,\DisableCrossrefs
并且\PageIndex
:
\indexentry{foobar=\verb!*+\foobar+|usage}{1}
\indexentry{test}{1}
\DescribeMacro
⇒ 仅为和索引条目\index
。
(c)、(d)和(f)无/有hyperref
,\DisableCrossrefs
/\EnableCrossrefs
和\CodelineNumbered
:
⇒ 根本没有索引,因为\makeindex
或\PageIndex
或之一\CodelineIndex
缺失。
链接索引条目
包裹hypdoc
可以代替使用hyperref
:它加载包hyperref
,禁用对hyperref
包的索引支持( ),并实现对包的索引命令hyperindex=false
的支持。但是,对于普通命令,没有添加,因此需要添加()。doc
hyperpage
\index
\index{test|hyperpage}
% \iffalse
%<*driver>
\ProvidesFile{dtxcode.tex}
%</driver>
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{hypdoc}
\EnableCrossrefs
\PageIndex
%\CodelineIndex
\RecordChanges
\listfiles
\begin{document}
\DocInput{dtxcode.tex}
\PrintIndex
\end{document}
%</driver>
% \fi
%
% \DescribeMacro{\foobar} Prints out foobar \index{test|hyperpage}.
%
% \begin{macrocode}
\def\foobar{...}
% \end{macrocode}
%
% \Finale
\endinput
dtxcode.idx
然后包含:
\indexentry{foobar=\verb!*+\foobar+|hdclindex{2}{usage}}{1}
\indexentry{test|hyperpage}{1}
\indexentry{def=\verb!*+\def+|hdpindex{}}{1}
\indexentry{foobar=\verb!*+\foobar+|hdpindex{}}{1}
并且所有条目均已链接。