我如何修改 gchords.sty 以使用实际的音格号?

我如何修改 gchords.sty 以使用实际的音格号?

我正在使用 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}

在此处输入图片描述

相关内容