LaTeX 歌曲使用目录

LaTeX 歌曲使用目录

有没有办法更改歌曲包的代码,以便将所有歌曲添加到默认歌曲中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},可让您自定义目录中每首歌曲的标题,并且
  • 更有可能与歌曲包的未来版本保持兼容,因为它没有重新定义包的任何内部宏。

相关内容