我正在尝试索引列表中的标记,但如果它们后面跟着逗号,它们总会被拒绝。
这里是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}