在使用 `\transpose` 功能时,我可以使用带有“歌曲”包的自定义小写和弦名称吗?

在使用 `\transpose` 功能时,我可以使用带有“歌曲”包的自定义小写和弦名称吗?

我正在用这个(相当不错!)软件包写歌本songs。我想利用它的移调功能,但我注意到手册:如果我想使用唱名音符名称(即拉丁文,Do - Re - Mi 等),我必须在首都字母,这很乏味。我仍然可以使用 ~\notenamesin \notenamesout` 宏编写带有小写注释的文档/,但我想知道:有解决方法吗?我应该打开一个功能或拉取请求吗?

谢谢!


编辑:需要澄清的是,当前的行为给出了三种可能性:

  • 正常设置:仅限字母名称
\[G]How many \[C]roads must a \[D]man walk \[G]down,
before you \[C]call him a \[G]man
  • 使用\solfedge宏,但和弦必须大写才能进行转调
\solfedge
[...]
\[SOL]How many \[DO]roads must a \[RE]man walk \[SOL]down,
before you \[DO]call him a \[SOL]man

请注意这也会产生大写的和弦。

我想改为:

\somecommands
[...]
\[Sol]How many \[Do]roads must a \[Re]man walk \[Sol]down,
before you \[Do]call him a \[Sol]man

但这不能被转置引擎识别。

我发现的当前部分解决方案是:

\notenamesin{LA}{SI}{DO}{RE}{MI}{FA}{SOL}
\notenamesout{La}{Si}{Do}{Re}{Mi}{Fa}{Sol}
[...]
\[SOL]How many \[DO]roads must a \[RE]man walk \[SOL]down,
before you \[DO]call him a \[SOL]man

这样,我仍然需要用大写字母输入和弦,但它们只用首字母大写,并且正确转置。重点是和弦需要 (IIUC) 大写,这样软件包才能将它们与重音 (降号、升号、小调、七度音程等) 区分开来。

答案1

一种“不假思索”的方式就是修补/堆积\[(无论它是什么)的原始定义,以在查找表中替换该定义。

\documentclass{article}
\usepackage[chorded]{songs}
\noversenumbers

\ExplSyntaxOn

\cs_new_protected:Npn \__aless_patched_value_Sol: { \__aless_old_open_bracket:w SOL] }
\cs_new_protected:Npn \__aless_patched_value_Do:  { \__aless_old_open_bracket:w DO]  }
% type the rest yourself

\cs_new_protected:Npn \__aless_patched_open_bracket:w #1 ] {
    \cs_if_exist_use:cF {__aless_patched_value_ #1 :} {  % unlike e-TeX's \ifdefined this also returns true when the control sequence has meaning \relax
        \__aless_old_open_bracket:w #1 ]
    }
}

\cs_new_protected:Npn \custompatch {
    \let \__aless_old_open_bracket:w \[
    \let \[ \__aless_patched_open_bracket:w
}

\ExplSyntaxOff

\begin{document}
\songsection{Worship Songs}
\begin{songs}{}

\solfedge
\notenamesout{La}{Si}{Do}{Re}{Mi}{Fa}{Sol}

\beginsong{Doxology}[by={Louis Bourgeois and Thomas Ken},
sr={Revelation 5:13},
cr={Public domain.}]
\beginverse

\transpose{1}

\custompatch  % ← run this command here

\[Sol]How many \[Do]roads 

\endverse
\endsong
\end{songs}
\end{document}


控制序列名称“大致”遵循 expl3 命名约定,使用 OP 用户名作为模块名称。

(请注意,这可能包含某些强命令的定义,这些命令\[本身在包的源代码中被内部调用。尽管如此,它基本上可以工作。)

答案2

定义\Sol宏,重新定义\[并重新定义\beginverse以应用\Sol

\def\Sol {\let\solori=\[ \def\[##1]{\uppercase{\solori##1]}}}
\expandafter\def \expandafter\beginverse \expandafter{\beginverse\Sol}

相关内容