为什么 \index 会丢失带有续行的文本?

为什么 \index 会丢失带有续行的文本?

我有一份包含大量索引字符串的文档,希望将它们拆分成多行以便于阅读!前两个 \index 命令按预期工作,但在 @ 之后拆分的命令在一行上仅生成 G 而不是 G,在下一行上生成缩进的 I 和页码。

Gold Man 建议的修复方法很有效:

\documentclass[draft]{amsart}

% suppress verbatim for \index
\newcommand \indexfold [1] {\index{#1}}

% Generate paired subindex entries
\newcommand \indexpair [2] {\index{#1!#2}\index{#2!#1}}

% Generate paired subsubindex entries 2!3, 3!2, 1!2!3, 1!3!2
\newcommand \indextriple [3]%
  {%
    \index{#2!#3}%
    \index{#3!#2}%
    \index{#1!#2!#3}%
    \index{#1!#3!#2}%
  }

\makeindex

\begin{document}

\begin{flushleft}

{\textbackslash}index\{A!B@C\}
\index{A!B@C}

{\textbackslash}index\{D!\% \\
  E@F\}
\index{D!%
  E@F}

{\textbackslash}index\{G!H@\% \\
  I\}
\index{G!H@%
  I}

{\textbackslash}indexfold\{text1!sublabel1@\% \\
  subtext1\}
\indexfold{text1!sublabel1@%
  subtext1}

{\textbackslash}indexpair\{\{text2\}\{sublabel2@subtext2\}\}
\indexpair{text2}{sublabel2@subtext2}

{\textbackslash}indextriple\% \\
    \{text3\}\% \\
    \{sublabel3@subtext3\}\% \\
    \{subsublabel3@subsubtext3\}
\indextriple%
    {text3}%
    {sublabel3@subtext3}%
    {subsublabel3@subsubtext3}

\end{flushleft}

\printindex

\end{document}

答案1

index 命令按字面意思接受参数,并且仅在排版后才进行处理。这意味着您的注释字符实际上是作为文字 % 符号读入的。如果您查看 .idx 文件,您会发现以下条目:

\indexentry{D!%   E@F}{1}
\indexentry{G!H@%   I}{1}

这两种情况都是不正确的,因为您没有将第二个条目排序在 % 下,并且您希望读取第三个条目中 % 之后的任何内容。

您可以通过定义一个接受参数并将其提供给以下命令来解决此问题,\index如下所示:

\def\myindex#1{\index{#1}}

这将使 TeX 首先扫描输入,并正确忽略 %。

答案2

的参数\index是“逐字”读取的,因此使用你的代码,.idx文件将类似于

\indexentry{A!B@C}{1}
\indexentry{D!%   E@F}{1}
\indexentry{G!H@%   I}{1}

并且,在运行 MakeIndex 时,该.ind文件将

\begin{theindex}

  \item A
    \subitem C, 1

  \indexspace

  \item D
    \subitem F, 1

  \indexspace

  \item G
    \subitem %   I, 1

\end{theindex}

因此,不可以:您不能将其%用于此目的,除非您将其%重新转换为注释字符:

\documentclass[draft]{amsart}
\usepackage{xpatch}

\makeindex

\makeatletter
\xpatchcmd{\index}
  {\@sanitize}
  {\@sanitize\catcode`\%=14 }
  {}{}
\makeatother


\begin{document}

{\textbackslash}index\{A!B@C\}
\index{A!B@C}

{\textbackslash}index\{D!\% \\
  E@F\}
\index{D!%
  E@F}

{\textbackslash}index\{G!H@\% \\
  I\}
\index{G!H@%
  I}

\printindex

\end{document}

请注意,行首的空格不会被忽略。这样,.idx文件将看起来像

\indexentry{A!B@C}{1}
\indexentry{D!  E@F}{1}
\indexentry{G!H@  I}{1}

是的,你没看错:\%没有通过。恐怕你无法同时拥有两者。

相关内容