我对另一个歌本项目很感兴趣,这个项目有一个特殊的功能:在标题中,显示歌曲编号的范围,以便于搜索(类似于字典)。
我同时使用了songs
和fancyhdr
包。考虑以下代码:
\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
似乎是最后一个。