为什么由逗号前面的列表标记生成的索引条目会被拒绝?

为什么由逗号前面的列表标记生成的索引条目会被拒绝?

我正在尝试索引列表中的标记,但如果它们后面跟着逗号,它们总会被拒绝。

这里是mwe.tex

\documentclass{article}
\usepackage{listings}

\lstset{index={foobar}}

\makeindex

\begin{document}
  \begin{lstlisting}
    foobar, baz
  \end{lstlisting}
\end{document}

pdflatex mwe生成mwe.idx

\indexentry{{\ttfamily  foobar\unhbox \voidb@x \kern \z@ }}{1}

makeindex mwe但是拒绝了该条目,如下所示mwe.ilg

This is makeindex, version 2.15 [TeX Live 2018] (kpathsea + Thai support).
Scanning input file mwe.idx...
!! Input index error (file = mwe.idx, line = 1):
   -- Extra `@' at position 44 of first argument.
done (0 entries accepted, 1 rejected).
Nothing written in mwe.ind.
Transcript written in mwe.ilg.

我觉得\unhbox \voidb@x \kern \z@不应该在那里。我发现那是的扩展\lst@nolig

我找到了\lst@nolig的定义,listings.sty但是它的目的对我来说并不清楚,而且我不确定为什么仅当标记位于逗号前面时才会发生这种情况。

\let\lst@nolig\@empty是一个解决方案,但当然这并不令人满意。

这个问题的正确解决办法是什么?

另外,发生了什么事\lst@nolig

答案1

问题确实出在逗号上,因为在这种情况下\index传递了foobar\lst@nolig。在本地重新定义\lst@nolig以避免出现此问题。

\documentclass{article}
\usepackage{listings}

\makeatletter
\renewcommand{\lstindexmacro}[1]{%
  \begingroup
  \def\lst@nolig{}%
  \index{#1@{\ttfamily#1}}%
  \endgroup
}
\makeatother

\lstset{index={foobar,baz}}

\makeindex

\begin{document}

\begin{lstlisting}
foobar, baz
\end{lstlisting}

\end{document}

的标准定义\lstindexmacro就是\index{#1},但这会带来排序问题。生成的文件如下.idx

\indexentry{foobar@{\ttfamily  foobar}}{1}
\indexentry{baz@{\ttfamily  baz}}{1}

相关内容