我正在用这个(相当不错!)软件包写歌本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}