自定义歌曲包中的索引

自定义歌曲包中的索引

我要用“歌曲”包制作一本歌本。我已经做了一些格式化,使歌本符合我的需求。

现在我要自定义歌本的索引。在标题索引中

\newindex{titleidx}{cbtitle}
\indexsongsas{titleidx}{\thepage}
\renewcommand{\songchapter}{\chapter*}
[...]
\showindex{Title index}{titleidx}

我想在每个条目中添加歌曲的作者。

实际上它看起来像:

Lady in Black ..................... 4
Lemon Tree ........................ 6

但我希望它看起来像,例如:

Lady in Black (Uriah Heep) ........ 4
Lemon Tree (Fool's Garden) ........ 6

有人能帮我解决这个问题吗?!:) 我希望清楚,我现在无法上传图像。:(

非常感谢!并致以最良好的祝愿!

// 编辑:完整示例(使用最新的歌曲包)。

\documentclass[11pt,a4paper,twoside,ngerman]{book}
\usepackage[bookmarks]{hyperref}
\usepackage[chorded]{songs}
\usepackage[utf8x]{inputenc}
\usepackage{textcomp}
\usepackage{geometry}
\usepackage{lastpage}
\usepackage{lmodern}

\renewcommand{\familydefault}{\sfdefault}

\geometry{a4paper, top=15mm, left=20mm, right=20mm, bottom=22.5mm, headsep=2.5mm, footskip=5mm}
\setlength{\headheight}{10mm}

\renewcommand{\lyricfont}{\sffamily}
\renewcommand{\chorusfont}{\sffamily}

\songcolumns{1}
\songpos{0}

\newindex{titleidx}{cbtitle}
\indexsongsas{titleidx}{\thepage}
\renewcommand{\idxtitlefont}{\sffamily\normalfont}

\begin{document}
\showindex{Title index}{titleidx}

\begin{songs}{titleidx}

\beginsong{Lady In Black}[by={Uriah\ Heep}]
  \beginverse*
    {\nolyrics Intro: \[Em Em]}
  \endverse
  \beginverse
    \memorize
    She \[Em]came to me one morning, one \[Em]lonely Sunday morning
    Her \[D]long hair flowing in the \[Em]mid-winter wind
    I \[Em]know not how she found me, for in \[Em]darkness I was walking
    And de\[D]struction lay around me, from a \[Em]fight I could not win
    \[Em]Ahh Ahh Ahh \[D]Ahh \[Em]Ahh ... \[Em]Ahh \[D]Ahh \[Em]Ahh \[Em] \[Em] \[Em]
  \endverse
  \beginverse*
    ...
  \endverse
\endsong

\beginsong{Lemon Tree}[by={Fool's\ Garden}]
  \beginverse*
    \nolyrics{Intro: \[Em] ~ \[Bm] ~ \[Em] ~ \[Bm] ~ \[Am] ~ \[Bm] ~ \[Em]}
  \endverse
  \beginverse
    I'm \[Em]sitting here in the \[Bm]boring room
    It's \[Em]just another rainy Sunday \[Bm]afternoon
    I'm \[Em]wasting my time, I got \[Bm]nothing to do
    I'm \[Em]hanging around, I'm \[Bm]waiting for you
    But \[Am]nothing ever happens \[Bm] and I \[Em]wonder
  \endverse
  \beginverse*
    ...
  \endverse
\endsong

\end{songs}

\end{document}

// 编辑 2:哦,还有另一个问题,也许很容易解决:我想更改“标题索引”的(1 列)宽度。实际上它不够宽,一些条目在行末被打破了。有什么想法吗?! :)

答案1

以下是我的谦卑尝试。:)

这里的想法是修补.sdx文件中负责索引标题歌曲的行。步骤如下:

  • 添加当前歌曲的标题,在 中定义\songtitle
  • 通过发出条件来检查当前歌曲是否有作者\songauthors
  • 如果没有作者(\ifx\songauthors\empty),则不执行任何操作。
  • 如果我们有作者(\else分支),请将其排版在括号内。

与其重新定义整个宏,不如使用这个神奇的xpatch包来简化我们的生活。我们将使用\xpatchcmdon \SB@@@beginsong,其中包含我们需要更改的行。

补丁:

\xpatchcmd{\SB@@@beginsong}
  {\SB@addtoindexes\songtitle}
  {\SB@addtoindexes{\songtitle\ifx\songauthors\empty\else\ (\songauthors)\fi}}
  {}{}

完整示例(为了让示例更简洁,我擅自删除了一些原始软件包,希望您不介意):

\documentclass{book}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage[chorded]{songs}

\usepackage{xpatch}

\makeatletter
\xpatchcmd{\SB@@@beginsong}
  {\SB@addtoindexes\songtitle}
  {\SB@addtoindexes{\songtitle\ifx\songauthors\empty\else\ (\songauthors)\fi}}
  {}{}
\makeatother

\newindex{titleidx}{cbtitle}
\indexsongsas{titleidx}{\thepage}

\begin{document}

\showindex{Title index}{titleidx}

\begin{songs}{titleidx}

\beginsong{Lady In Black}[by={Uriah\ Heep}]
  \beginverse*
    ...
  \endverse
\endsong

\beginsong{Lemon Tree}[by={Fool's\ Garden}]
  \beginverse*
    ...
  \endverse
\endsong

\beginsong{Orange Tree}
  \beginverse 
   ...
  \endverse
\endsong

\end{songs}

\end{document}

如果我们看一下索引,我们将会发现:

图像

希望能帮助到你。:)

更新:正如您自己所想的那样,\showindex有一个可选参数,用于指定列数。根据包源,\showindex定义为

\newcommand\showindex[3][0]{%

因此默认列数实际上是0。提供1给宏的可选参数即可完成此工作。


¹ 正如 egreg 在聊天室,使用这个词非常危险谦逊的当 Uriah Heep 参与其中时。:)这是对查尔斯·狄更斯著名小说的引用大卫·库珀菲尔德,其中 Uriah Heep 总是宣称他(虚假的)谦逊。:)当然,在这个答案的背景下,我们有其他Uriah Heep 是一支英国摇滚乐队;奇怪的是,他们有一张专辑名为很重,很笨重这是他们的首秀。:)现在回到我们的正常日程。:P

鸭子

相关内容