包裹splitidx

包裹splitidx

(注:这有点相关类似帖子,但问题却截然不同。)

我正在尝试使用\index带有粗体页码的索引条目,所有这些都是在hyperref加载包时进行的。通常,当 hyperref 看到|textbf索引条目中手动插入的内容时,它会做一些巧妙的事情,例如修改或删除通常的|hyperpage插入。没问题。没问题。

问题在于当我尝试首先解析\index使用宏的参数\comma@parsekvsetkeys包,如下所示:

%with hyperref is loaded, this produces a bad .idx entry
\comma@parse{But this fails on makeindex|textbf}{\index{\comma@entry}\@gobble}

上述代码在 .idx 文件中生成以下条目:

\indexentry{But this fails on makeindex|textbf|hyperpage}{1}

如您所见,|条目中有两个符号,导致makeindex拒绝它。hyperref应该已经发现这一点。

  • 如果我禁用 hyperref,一切都正常运行。
  • 如果我不使用\comma@parse宏,一切都正常。
  • |textbf如果不执行“我这样做|see”,也会发生同样的事情。

就好像使用\comma@parse不允许hyperref完成其工作一样。

有什么方法可以让我让.idx条目格式正确,同时保持超链接加载?

这是我正在使用的 MWE:

\documentclass[12pt]{book}

\usepackage{makeidx}\makeindex
\usepackage{lipsum}
\usepackage{kvsetkeys}
\usepackage{hyperref}

\begin{document}

\lipsum[1]

\index{1@This works fine|textbf}
\makeatletter
    \comma@parse{2@So does this}{\index{\comma@entry}\@gobble}
    \comma@parse{3@But this fails on makeindex|textbf}{\index{\comma@entry}\@gobble}
\makeatother

\printindex

\end{document}

以下是.idx排版后创建的文件:

\indexentry{This works fine|hyperindexformat{\textbf}}{1}
\indexentry{So does this|hyperpage}{1}
\indexentry{But this fails on makeindex|textbf|hyperpage}{1}

答案1

|宏隐藏\comma@entry。因此,当它附加到索引中的超链接页码 hyperref时,看不到它。帮助:|hyperpage\expandafter

\documentclass[12pt]{book}

\usepackage{makeidx}\makeindex
\usepackage{lipsum}
\usepackage{kvsetkeys}
\usepackage{hyperref}

\begin{document}

\lipsum[1]

\index{This works fine|textbf}%
\makeatletter
    \comma@parse{So does this}{\index{\comma@entry}\@gobble}%
    \comma@parse{This also works|textbf}{%
      \expandafter\index\expandafter{\comma@entry}\@gobble 
    }%
\makeatother

\printindex

\end{document}

或者更简单,\index已经用作接受条目的命令,因此可以直接用作逗号列表处理器:

\documentclass[12pt]{book}

\usepackage{makeidx}\makeindex
\usepackage{lipsum}
\usepackage{kvsetkeys}
\usepackage{hyperref}

\begin{document}

\lipsum[1]

\index{This works fine|textbf}%
\makeatletter
    \comma@parse{So does this}\index
    \comma@parse{This also works|textbf}\index
\makeatother

\printindex

\end{document}

结果

包裹splitidx

前面例子中的技巧也适用于带有附加参数的命令,如果它们位于获取列表条目的参数之前:

\comma@parse{my, comma, list}{\sindex[...]}

可以定义一个宏\idxboldpage来获取超链接的粗体页码,因为\sindexsplitidx不自动支持hyperref

\newcommand*{\idxboldpage}[1]{%
  \textbf{\hyperpage{#1}}%
}

然后\index{...|idxboldpage}使用 来代替\index{...|textbf}

完整示例:

\documentclass[12pt]{book}

\usepackage[makeindex]{splitidx}
\newindex[Author index]{authidx}
\newcommand*{\idxboldpage}[1]{%
  \textbf{\hyperpage{#1}}%
}

\usepackage{lipsum}
\usepackage{kvsetkeys}
\usepackage{hyperref}

\begin{document}

\lipsum[1]

\index{This works fine|textbf}%
\makeatletter
    \comma@parse{So does this}{\sindex[authidx]}
    \comma@parse{This also works|idxboldpage}{\sindex[authidx]}
\makeatother

\printindex[authidx]

\end{document}

相关内容