(注:这有点相关类似帖子,但问题却截然不同。)
我正在尝试使用\index
带有粗体页码的索引条目,所有这些都是在hyperref
加载包时进行的。通常,当 hyperref 看到|textbf
索引条目中手动插入的内容时,它会做一些巧妙的事情,例如修改或删除通常的|hyperpage
插入。没问题。没问题。
问题在于当我尝试首先解析\index
使用宏的参数\comma@parse
时kvsetkeys
包,如下所示:
%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
来获取超链接的粗体页码,因为\sindex
包splitidx
不自动支持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}