有没有办法更改歌曲包的代码,以便将所有歌曲添加到默认歌曲中tableofcontents
,而用户则必须使用索引系统? 类似这样的方法对我来说不起作用:
\renewcommand{\songchapter}{\section*}
答案1
您可以使用以下重新定义\beginsong
:
\makeatletter
\renewcommand\beginsong[1]{%
\ifSB@insong\SB@errboo\SB@closeall\fi%
\ifSB@intersong\SB@errbor\SB@closeall\fi%
\SB@insongtrue%
\def\SB@closeall{\endsong}%
\SB@parsetitles{#1}%
\global\setbox\SB@songwrites\box\voidb@x%
\SB@clearbskeys%
\@ifnextchar[\SB@bskvfmt\SB@@beginsong%
\hypersetup{bookmarksdepth=0}%
\phantomsection%
\addcontentsline{toc}{subsection}{\numberline{\thesongnum}#1}%
\hypersetup{bookmarksdepth=2}%
}
\makeatother
将歌曲作为目录中的子部分,并提供适当的书签和从每个条目到相应歌曲的超链接。
完整的代码,使用软件包作者提供的文件downloads section
:
\documentclass[letterpaper]{article}
\usepackage{etoolbox}
\usepackage[bookmarks]{hyperref}
\usepackage[lyric]{songs}
% \includeonlysongs{2}
\makeatletter
\renewcommand\beginsong[1]{%
\ifSB@insong\SB@errboo\SB@closeall\fi%
\ifSB@intersong\SB@errbor\SB@closeall\fi%
\SB@insongtrue%
\def\SB@closeall{\endsong}%
\SB@parsetitles{#1}%
\global\setbox\SB@songwrites\box\voidb@x%
\SB@clearbskeys%
\@ifnextchar[\SB@bskvfmt\SB@@beginsong%
\hypersetup{bookmarksdepth=0}%
\phantomsection%
\addcontentsline{toc}{subsection}{\numberline{\thesongnum}#1}%
\hypersetup{bookmarksdepth=2}%
}
\makeatother
\setlength{\oddsidemargin}{0in}
\setlength{\evensidemargin}{0in}
\setlength{\textwidth}{6.5in}
\setlength{\topmargin}{0in}
\setlength{\topskip}{0in}
\setlength{\headheight}{0in}
\setlength{\headsep}{0in}
\setlength{\textheight}{9.1in}
\settowidth{\versenumwidth}{1.\ }
\pagestyle{empty}
\newindex{titleidx}{lbtitle}
\newauthorindex{authidx}{lbauth}
\newscripindex{scripidx}{lbscrip}
\begin{document}
\tableofcontents
\clearpage
\songsection{Worship Songs}
\begin{songs}{titleidx,authidx,scripidx}
\input{songs.sbd}
\end{songs}
\showindex{Index of Authors and Composers}{authidx}
\showindex{Index of Scripture}{scripidx}
\end{document}
生成的 ToC 的图像:
答案2
这接受的答案不幸的是,这个问题破坏了 song 包的解析器\beginsong
。这里有一个不同的方法,它使用 songs 包对新键值的内置支持:
\newcommand\toctitle{}
\newcommand\toclink{}
{\makeatletter\gdef\toclink{\@ifundefined{href}{}{{song\theSB@songsnum-\thesongnum
.\ifnum\value{section}=0 1\else2\fi}}}}
\newcommand\addtotoc[1]{\addtocontents{toc}{\protect\contentsline
{\ifnum\value{section}>0sub\fi section}{\numberline\thesongnum#1}{\thepage}\toclink}}
\newsongkey{toc}
{\def\toctitle{\resettitles\addtotoc\songtitle}}
{\def\toctitle{\addtotoc{#1}}}
\renewcommand\extendprelude{\showrefs\showauthors\toctitle}
这会产生与接受的答案相同的输出,但是
- 不会破坏解析器,
- 无论是否加载 hyperref,都可以工作,
- 作品既有章节书籍,也有分节文章文档,
- 提供一个新的
\beginsong
键值toc={title}
,可让您自定义目录中每首歌曲的标题,并且 - 更有可能与歌曲包的未来版本保持兼容,因为它没有重新定义包的任何内部宏。