我正在使用 LaTeX 整理一本爵士吉他和弦书。我一直在使用 gchords.sty (https://kasper.phi-sci.com/gchords/),到目前为止,它对我来说效果很好,除了一件事:您必须指定相对于您为和弦框提供的基准品格的品格号。例如,这是我输入的和弦的示例:
\chord{2}{x,p{5},p{3},p{1},p{1},p{3}}{{Em11(\ensuremath{\flat}5)}}
这是您可能写为 x75335 的和弦——宏中的 p{5} 实际上代表第七品(2 品位的基本品位加上从该品位向上的 5 品位)。对于我这个吉他手来说,这非常不直观,这意味着我必须对我写出的每个和弦进行心算——找出一个合理的基本品位,然后从和弦中的每根弦中减去它。我更希望宏的工作方式如下:
\chord{2}{x,p{7},p{5},p{3},p{3},p{5}}{{Em11(\ensuremath{\flat}5)}}
其中,和弦网格内每个点的位置计算为指定品位减去基准品位。
不幸的是,我的 LaTeX-foo 根本达不到这样的水平。如果这是 C 或 Java,我只需创建一个包装函数,该函数调用 chord 函数,每个参数都是 (arg - base) - 在 LaTeX 中可以实现这样的功能吗?有人知道怎么做吗?
值得一提的是,我向作者提出了功能请求,但没有收到回复。
谢谢!
编辑:这是一个完整的工作示例:
\documentclass[12pt,pdftex]{report}
\usepackage{gchords}
\begin{document}
\chords{
\def\numfrets{6}
\chord{2}{x,p{5},p{3},p{1},p{1},p{3}}{{Em11(\ensuremath{\flat}5)}}
\chord{2}{3,x,p{3},p{1},p{2},p{3}}{{A7(\ensuremath{\flat}9)(\ensuremath{\sharp}11)}}
}
\end{document}
答案1
我使用 LuaLaTex 为和弦宏制作了一个包装器,从而解决了这个问题。
\documentclass{report}
\usepackage{gchords}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
function fret_to_str(base_fret, fret)
if (fret == "x") then
return "x";
end
if (fret == "o") then
return "o";
end
return tonumber(fret) - base_fret;
end
local function split(str,pat)
local tbl = {}
str:gsub(pat, function(x) tbl[#tbl+1]=x end)
return tbl
end
function print_chord(base_fret, strinfo)
local strarray, outstr
local pat = "[^,]*"
strarray = split(strinfo, pat)
outstr = string.format([[\chord{%d}{]], base_fret);
outstr = outstr .. fret_to_str(base_fret, strarray[1]) .. ",";
outstr = outstr .. fret_to_str(base_fret, strarray[2]) .. ",";
outstr = outstr .. fret_to_str(base_fret, strarray[3]) .. ",";
outstr = outstr .. fret_to_str(base_fret, strarray[4]) .. ",";
outstr = outstr .. fret_to_str(base_fret, strarray[5]) .. ",";
outstr = outstr .. fret_to_str(base_fret, strarray[6]) .. "}";
return outstr;
end
\end{luacode*}
\newcommand*{\testchord}[2]{%
\directlua{tex.print(print_chord(#1, [[#2]]))}%
}%
\def\numfrets{6}
\chords{
\testchord{2}{x,7,5,3,3,5}{{Em11($\flat$5)}}
}
\end{document}
答案2
在 中pdflatex
使用修改后的语法:
\xchord{2}{x 7 5 3 3 5}{...}
代替
\chord{2}{x,p{5},p{3},p{1},p{1},p{3}}{...}
妇女权利委员会:
\documentclass[12pt,pdftex]{report}
\usepackage{gchords}
\newcommand\xchord[3]{\edef\z{\xxchord{#1} #2}%
\def\tmp{\chord{#1}}%
\expandafter\tmp\expandafter{\z}{#3}}
\def\xxchord#1 #2 #3 #4 #5 #6 #7{%
\ifx x#2 x,\else\the\numexpr#2-#1\relax,\fi
\ifx x#3 x,\else p{\the\numexpr#3-#1\relax},\fi
\ifx x#4 x,\else p{\the\numexpr#4-#1\relax},\fi
\ifx x#5 x,\else p{\the\numexpr#5-#1\relax},\fi
\ifx x#6 x,\else p{\the\numexpr#6-#1\relax},\fi
\ifx x#7 x\else p{\the\numexpr#7-#1\relax}\fi
}
\begin{document}
Gchords method:
\chords{
\def\numfrets{6}
\chord{2}{x,p{5},p{3},p{1},p{1},p{3}}{{Em11(\ensuremath{\flat}5)}}
\chord{2}{3,x,p{3},p{1},p{2},p{3}}{{A7(\ensuremath{\flat}9)(\ensuremath{\sharp}11)}}
}
Proposed alternative:
\chords{
\def\numfrets{6}
\xchord{2}{x 7 5 3 3 5}{{Em11(\ensuremath{\flat}5)}}
\xchord{2}{5 x 5 3 4 5}{{A7(\ensuremath{\flat}9)(\ensuremath{\sharp}11)}}
}
\end{document}