如何在歌曲包中添加索引链接?

如何在歌曲包中添加索引链接?

我正在使用歌曲包,我无法改变\showindex添加歌曲名称链接的行为,而不是索引中的歌曲编号。

据我所知,我必须重新定义\songtarget命令,但没有成功。我该如何实现?

示例(假设songs包已安装):

\documentclass[letterpaper]{article}
\usepackage[bookmarks]{hyperref}
\usepackage[chorded]{songs}

\newindex{titleidx}{ind}
\titleprefixword{}
\begin{document}
\showindex{Index}{titleidx}
\begin{songs}{titleidx}
\beginsong{Songname}
\beginverse
Song \[C]with chords
\endverse
\endsong
\end{songs}

\end{document}

然后,如果将其保存在中mwe.tex,则必须运行:

$ pdflatex mwe.tex
$ songidx ind.sxd
$ pdflatex mwe.tex

答案1

songs 软件包本身并不支持该功能,因为一般来说,任何索引条目的右侧都可能引用多首歌曲。这在标题索引中并不像在其他索引中那么常见,但仍偶尔发生。例如,在一本包含三首歌曲的书中,所有歌曲的标题都是“你”,索引条目如下所示:

你......3, 37, 218

该包仅链接出现在右侧的项目,因为只有这些项目才保证具有唯一的引用。

更改此行为需要重新定义内部包代码的\SB@ellipspread宏,该宏排版省略号行。(重新定义\songtarget不会帮助您;这只会创建超链接指向的不可见目标标记,而不是指向它们的链接。)以下代码(在 songs 版本 2.18 上测试)成功链接了右侧只有一个引用项的索引条目的左侧,但其他条目的左侧未链接。我不能保证它在所有可能的情况下都能正常工作,因为索引的右侧可能包含任何内容。但它适用于我测试的样本书。

\newcommand\savetarget[2]{%
  \gdef\mytarget{#1}%
  \def\songlink##1##2{\global\let\mytarget=\relax}%
}
\newbox\dummybox
{\makeatletter
 \global\let\oldellipsis=\SB@ellipspread
 \gdef\SB@ellipspread#1#2{%
   \global\let\mytarget=\relax
   {\let\songlink=\savetarget
    \setbox\dummybox\hbox{#2}}%
   \oldellipsis{\ifx\mytarget\relax#1\else\songlink{\mytarget}{#1}\fi}{#2}%
 }
}

相关内容