svindd.ist 中有漏洞吗?

svindd.ist 中有漏洞吗?

让我们将 Springer 的类与makeindex 应该使用的svmono文件一起考虑;参见svindd.istSpringer 的指南,其中引用了模板.让我们编译输入

\documentclass{svmono}
\usepackage{multicol}
\usepackage{makeidx}
\usepackage{hyperref}
\usepackage{lipsum}
\makeindex
\begin{document}
\pagenumbering{none}%%% Makes sure that if we drop "-s svindd.ist", the hyperlinks point where they should point.
\title{Book's title}
\maketitle
\mainmatter
\chapter{Chapter's title}
\lipsum[1-2]
keyword\index{keyword}
\lipsum[1-2]\section{Section's title}keyword\index{keyword}%%% culprit line
\printindex
\end{document}

book.tex使用标准循环存储:

pdflatex book && makeindex -s svindd.ist book && pdflatex book

(备注:当然,以上只是 MWE;真正的书籍还使用了更多的类选项、包和 bibtex。)

我们在输出 PDF 的最后一页看到的是索引,其中两个参考文献合并为一个:

输出的最后一页

点击红色框会转到标题页,而不是关键字定义。在日志中,您会看到警告:

name{page.1,\\relax\040\\hskip\0400.2em\\ignorespaces\0402} has been referenced but does not exist, replaced by a fixed one

可以有两种解决方法:

  • 删除源文件中的罪魁祸首行(但你确实希望索引中包含这两个页面),

  • 删除-s svindd.ist(但德国书籍应该这么用)。

现在,我们是否以错误的方式使用 Springer 的课程文件或者是否svindd.ist有误?

svindd.ist的内容如下:

quote '+'
headings_flag 1
heading_prefix "{\\bf "
heading_suffix "}\\nopagebreak%\n \\indexspace\\nopagebreak%"
delim_0 "\\idxquad "
delim_1 "\\idxquad "
delim_2 "\\idxquad "
delim_n ",\\,"

答案1

hyerrref 尝试按,(逗号空格)拆分页面列表,但svindd.ist使列表被,\,(逗号细空格)分隔,因此您需要调整拆分循环,将其替换\,

\documentclass{svmono}
\usepackage{multicol}
\usepackage{makeidx}
\usepackage{hyperref}
\makeatletter
\def\@commahyperpage#1{\@@commahyperpage#1,\,,\\}
\def\@@commahyperpage#1,\,#2,#3\\{%
  \ifx\\#2\\%
    \HyInd@pagelink{#1}%
  \else
    \HyInd@pagelink{#1},\,\HyInd@pagelink{#2}%
  \fi
}
\makeatother
\usepackage{lipsum}
\makeindex
\begin{document}
\pagenumbering{none}
\title{Book's title}
\maketitle
\mainmatter
\chapter{Chapter's title}
\lipsum[1-2]
keyword\index{keyword}
\lipsum[1-2]\section{Section's title}keyword\index{keyword}%%% culprit line
\printindex
\end{document}

相关内容