这是我的第一篇帖子,所以提前感谢大家对我的耐心。
我一直在使用“Songs”软件包来生成包含和弦的歌本。我经常发现使用“gtab”命令在歌曲开头生成和弦图很有用,正如软件包手册中所述。
有了这些和弦图,我希望有一种方法可以自动将所用和弦插入歌曲开头,而不是为每首歌曲复制和粘贴所用和弦的 gtab 定义。对于下面的示例,它需要识别出使用了 G、C 和 D 和弦,然后使用和弦的定义在前奏和第一节之前输出它。例如,G 和弦是:
\gtab{G}{320033:120034}
另外,图表是否可以根据移调进行调整?使用“\transpose”命令,歌词显示的输出和弦可能与输入“[]”中的和弦不同。如果图表与输出和弦相匹配,那就太理想了。
这是我的示例:
\documentclass[letterpaper]{article}
\usepackage[chorded]{songs}
\usepackage[margin=1.25in]{geometry}
\begin{document}
\begin{songs}{}
\beginsong{I Saw the Light}[
by={Hank Williams},
sr={Isaiah 9:2}]
\gtab{G}{320033:120034} \gtab{C}{X32010:032010} \gtab{D}{X00232:000132}
\ifchorded
\beginverse*
{\nolyrics Intro: \[G] \[D] \[G]}
\endverse
\fi
\beginverse \memorize
\[G]I wandered so aimless life filled with sin
\[C]I wouldn't let my dear savior \[G]in
\[G]Then Jesus came like a stranger in the night
\[(G)]Praise the Lord \[D]I saw the \[G]light
\endverse
\beginchorus
^I saw the light I saw the light
^No more darkness no more ^night
^Now I'm so happy no sorrow in sight
^Praise the Lord ^I saw the ^light
\endchorus
\endsong
\end{songs}
\end{document}
答案1
由于以下原因,这通常无法完全自动化:
和弦有很多别名,您必须详尽列举才能让 LaTeX 将它们识别为同一和弦。例如,“G#”、“G\shrp”、“(G#)”、“G#maj”和“Ab”可能都是同一和弦。
从和弦名称到指法图的映射通常不是一一对应的,因为同名和弦可能根据上下文具有不同的指法图。例如,一首歌曲可能在一处需要“开放”G 和弦,而在另一处需要“禁止”G 和弦。这两者通常都标记为“G”,但指法图不同。
但是,如果您愿意手动为文档中的每个和弦名称定义一个唯一的宏名称(包括每个和弦别名的唯一宏),并且每个和弦名称只有一个指法图,那么至少可以自动执行所述和弦的移调。 songs 包有一个\gtabtrans
用于此目的的宏,以下代码重新定义了该宏以从预定义集合中找到合适的指法图:
\makeatletter
\newcommand\chordlist{}
\newcommand\trychord[1]{%
\expandafter\ifx\csname cname@\string#1\endcsname\thischord
#1\let\do\@gobble\fi}
\renewcommand\gtabtrans[2]{{%
\SB@dotranspose{#1}\edef\thischord{\the\SB@toks}\SB@transposefactor0
\let\do\trychord\chordlist
\ifx\do\trychord?\GenericError{}{Tab diagram not found for: \the\SB@toks}{}\fi
}}
\newcommand\newchord[1]{\SB@begincname\@newchord#1}
\newcommand\@newchord[3]{\SB@endcname
\newcommand#1{#3}%
\g@addto@macro\chordlist{\do#1}%
\expandafter\def\csname cname@\string#1\endcsname{#2}}
\makeatother
\newchord{\myA}{A}{\gtab{A}{X02220:001230}}
\newchord{\myBb}{B\flt}{\gtab{B&}{X1333X:012340}}
\begin{document}
\begin{songs}{}
\beginsong{Sample Song}
\beginverse
\[\myA]This should show an A chord.
\endverse
\transpose{1}
\beginverse
\[\myA]This should show a Bb chord.
\endverse
\endsong
\end{songs}
\end{document}
这\newchord
需要三个参数:(1)您将在文档中用来产生和弦的宏名称,(2)通过自动转调产生的此和弦的名称,以及(3)您希望和弦出现的方式。
请注意,参数 2 必须非常精确。例如,上面的示例将\myBb
使用定义B\flt
为第二个参数,而不是B&
或A#
,因为是B\flt
songs 包在将 A 自动移调半音时生成的名称。如果自动移调产生的和弦名称与您定义的任何和弦都不完全匹配,您将收到一条错误消息,显示它正在寻找的确切和弦名称。