我正在使用歌曲包,我无法改变\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}%
}
}