在 dtx 文件中使用 imakeidx 的另一个问题

在 dtx 文件中使用 imakeidx 的另一个问题

我指的是 ltxdoc 中多个索引仍然存在问题

那里给出的解决方案适用于那个简单的 MWE,但在我的实际项目中,我遇到了更严重的问题。下一个 M_not_WE 显示了它。当我运行“pdflatex testidx.dtx”时,它响应:

! Undefined control sequence.
\special@index ...w \immediate \write \@indexfile
  {\string \indexentry
{#1}{...
l.26 % \begin{macro}{\my@macroA}

当我注释掉“\CodelineIndex”行时,它会运行

我的代码有什么问题?

% \iffalse
%<*driver>
\documentclass{ltxdoc}
\usepackage{imakeidx}
\CodelineIndex
\EnableCrossrefs
\indexsetup{level=\section*}
\makeindex[name=other]
\makeindex[options=-s gind.ist,title={General Index}]
\begin{document}
  \DocInput{testidx.dtx}
\end{document}
%</driver>
% \fi
%
% \DescribeMacro{\my@macroA}
% \DescribeMacro{\mymacroB}
%
% \StopEventually{}
%
% \section{Implementation}
%
% \iffalse
%<*package>
% \fi
% \begin{macro}{\my@macroA}
%    \begin{macrocode}
\def\my@macroA{A}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\mymacroB}
%    \begin{macrocode}
\def\mymacroB#1{B#1}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\endinput
%    \end{macrocode}
%
% \iffalse
%</package>
% \fi
%
% \Finale
\printindex
\printindex[other]
\endinput

答案1

根本没有回复,所以我回答了自己的问题。经过一些实验,我找到了一个解决方案,即根本不使用 imakeidx。我所做的基本上是这样的(请记住,我想在我的包文档末尾使用 ltxdoc 列出用户命令列表):

首先,我将命令写入一个包含一些格式化内容的文件中。然后,我使用 hyperref 来获取可点击的索引。最后,我读取此文件以获取列表。

前期工作

\newwrite\UCFile
\DeleteShortVerb{\|}
\immediate\openout\UCFile="| sort -d > \jobname.odw
\MakeShortVerb{\|}

阅读命令

\newcommand\bs{\texttt{\textbackslash}}
\newcommand\usercom[1]{%
  \label{#1}\immediate\write\UCFile{%
    \noexpand\hyperref[#1]{\noexpand\bs#1,
    \thepage\noexpand\newline}}%
}

呼叫示例

\DescribeMacro{\CompassMid}\usercom{CompassMid}

写入文件

\immediate\closeout\UCFile
\begin{multicols}{3}[\section{List of User Commands}]
  \IfFileExists{\jobname.odw}
     {\noindent\input{\jobname.odw}}
     {\PackageWarning{ODw}{File \jobname.odw not found}}
\end{multicols}

评论

pdflatex 必须使用选项 --shell-escape 来调用

相关内容