修补歌曲环境

修补歌曲环境

我对另一个歌本项目很感兴趣,这个项目有一个特殊的功能:在标题中,显示歌曲编号的范围,以便于搜索(类似于字典)。

我同时使用了songsfancyhdr包。考虑以下代码:

\documentclass[twoside]{article}

\usepackage{ifthen}
\usepackage{fancyhdr}

\renewcommand{\sectionmark}[1]{}
\newcommand{\mymarks}{%
\ifthenelse{\equal{\leftmark}{\rightmark}}
{\rightmark}
{From \rightmark\ until \leftmark}}
\fancyhead[LE,RO]{\mymarks} 
\fancyhead[LO,RE]{\thepage}

\pagestyle{fancy}

\usepackage[lyric]{songs}
\newindex{titleidx}{cbtitle}

\begin{document}

\songpos{0}

\begin{songs}{titleidx}

\beginsong{Amazing Grace}[
  by={John Newton},
  sr={Luke 15:4; 2 Corinthians 4:8,9; Ephesians 2:8; Revelation 14:3},
  cr={Public domain.}]

\markboth{\thesongnum}{\thesongnum}

\beginverse
A\[E]mazing \[E/D#]grace! How \[A/C#]sweet the \[E/B]sound
That \[E]saved a \[E/C#]wretch like \[B7]me!
I \[E]once was \[E/D#]lost, but \[A/C#]now am \[E/B]found;
Was \[A]blind, but \[A/B]now I \[E]see.
\endverse

\beginverse
T'was ^grace that ^taught my ^heart to ^fear,
And ^grace my ^fears re^lieved;
How ^precious ^did that ^grace ap^pear
The ^hour I ^first be^lieved!
\endverse

\endsong

<<... MORE SONGS HERE ...>>

\end{songs}

\end{document}

该代码非常有效:

标头

\markboth{\thesongnum}{\thesongnum}每首歌都充满魔力;\thesongnum代表当前歌曲编号。到目前为止一切顺利。

我想避免重复,所以我决定添加一些趣味etoolbox。我的第一个想法是在歌曲环境开始后立即附加魔幻线。

我想到了下面这句话:

\apptocmd{\beginsong}{\markboth{\thesongnum}{\thesongnum}}{}{}

并且它确实有效。好吧,有点。方括号内的选项将被忽略:

耻辱!

我可能打错了。等一下,我修补错误。但我不知道如何做才是正确的。

我可以\endsong使用以下命令修补该命令:

\pretocmd{\endsong}{\markboth{\thesongnum}{\thesongnum}}{}{}

这样做是可行的,但当一首歌分两页时,标记指向第二页,而不是歌曲开始的第一页。所以我必须以某种方式修补第一页。

有任何想法吗?

答案1

您应该尝试修补该\SB@@@beginsong命令:

\makeatletter
\appto\SB@@@beginsong{\markboth{\thesongnum}{\thesongnum}}
\makeatother

一般来说,使用可选参数修补命令比较棘手。如果它是通过一般的 LaTeX 机制定义的,则必须通过以下方式调用要修补的命令

\expandafter\patchcmd\csname\string\xyz\endcsname...

\patchcmd其中代表电子工具箱修补命令。如果像本例一样,命令是通过 定义的\@ifnextchar,则必须遵循所有调用的宏。这里\SB@@@beginsong似乎是最后一个。

相关内容