LaTeX 音乐

LaTeX 音乐

我需要帮助如何在 Latex 中构建以下内容:

在此处输入图片描述

这是音乐理论或实践中的标准和弦解释之一。它用于解释一段音乐中的和声过程。有几种不同的方法来描述和声进行,这是德国标准,源于巴洛克音乐和 Generalbaß (数字低音)。作为一名音乐老师,我需要在乐谱中放入这些符号来解释音乐。这是音调系统(T、D、S、s、P、F……)和数字低音数字的组合。

答案1

你可以使用矩阵来实现这一点。我把所有东西都放在自定义命令中。像这样,你可以稍后调整字距、线条粗细、数组拉伸、字体等等。

% arara: pdflatex

\documentclass{article}
\usepackage{mathtools}
\newcommand{\mystack}[1]{\mspace{1mu}{\scriptsize\begin{matrix*}[l]#1\end{matrix*}}\mspace{4mu}}
\newcommand*{\myrule}[1]{~\rule[.5ex]{#1}{0.3pt}~}

\begin{document}    
\[D\mystack{7 \cr 6\myrule{2em}5  \cr 4\myrule{1.5em}3} T\mystack{5\\3}\]
\end{document}

在此处输入图片描述

答案2

我在我的博客中更详细地解释了这个实现:http://tobiw.de/tbdm/funktionssymbole(仅限德语​​)

用法:

\function{<Function>}[<Bass Notes>][<Length>]{<Notes>}
  • <Funtion>= T、D、S、Sp、s、…
    该命令还允许一些特殊功能符号:
    • DD对于双显性(可能是错误的英文术语,抱歉,我只知道德语的……)
    • /D无根主导
    • SS对于双下属
  • <Length>= 和之间的空间长度
  • <Notes>= 以逗号分隔的音符变化列表(从低到高两个声部)。请注意,与我的第一个实现相比,顺序是相反的。
  • <Bass Notes>= 低音/最低音的变化
  • 在所有注释定义中:
    • -被破折号取代
    • .被空格替换
    • 大于 9 的数字必须放在括号中,{11}例如11

所有注释/空间/线条都变得相同,以使它们垂直对齐。

低音总是在相同的垂直位置对齐(下标类型)。第一的列表中较高声音的变化也具有固定的垂直位置(上标的一种),所有后续变化都堆叠在上面。

如果您使用其他字体(大小),则必须调整所有exem值。

结果:

或多或少复杂的声音:

\function{T}{..7-8,3---4} \enskip
\function{D}{4---3, 6-5, ..7-8} \enskip
\function{D}{4----3, 6-5---, ..7-8-,{11}-----} \enskip
\function{s}{5,6}

复杂的声音

特殊功能:

\function{DD}{8-7} \enskip \function{/D}{8-7} \enskip \function{SS}{5,6}

特殊功能

手动调整功能符号和注释变化之间的间距:

\function{D}[]{8-7} \enskip \function{D}[4-3]{} \enskip \function{D}[4-3]{8-7}
\par vs. \par
\function{D}[][-1pt]{8-7} \enskip \function{D}[4-3][-2.3pt]{} \enskip \function{D}[4-3][-1pt]{8-7} 

调整间距

并附有显示基线等的指南:

\showAllLines\mbox{}\enskip
% single change in upper voice
\function{D}{8-7} \enskip
% single chane in bass voice
\function{D}[8-7]{} \enskip
% change in upper and bass voice
\function{D}[8-7]{4-3} \enskip
% multiple changes
\function{D}[8--7]{4-3,6-5}

结果

完整代码:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

% width of the boxes containing the note numbers
\dim_new:N \l_palamas_boxwidth_dim
\dim_set:Nn \l_palamas_boxwidth_dim { 0.5em }

% token for the line betwwen two numbers
\tl_new:N \g_palamas_line_tl
\tl_set:Nn \g_palamas_line_tl { \rule [ 0.7ex ] { \l_palamas_boxwidth_dim } { 0.3pt } }

% token for a space between two numbers / befor a number
\tl_new:N \g_palamas_space_tl
\tl_set:Nn \g_palamas_space_tl { \hspace { \l_palamas_boxwidth_dim }  }

% function to place the numbers/lines/space in an equal width box
\cs_new_protected:Npn \palamas_makebox:n #1 {
   \makebox [ \l_palamas_boxwidth_dim ] [ c ] { #1 }
}
% function to porcess a change in notes (replace dash and dot)
\cs_new_protected:Npn \palamas_process_list:n #1 {
   \tl_set:Nn \l_tmpa_tl { #1 }
   \tl_replace_all:Nnn \l_tmpa_tl { - } { \g_palamas_line_tl }
   \tl_replace_all:Nnn \l_tmpa_tl { . } { \g_palamas_space_tl }
   \tl_map_function:NN \l_tmpa_tl \palamas_makebox:n
   \\
}

% some tokes for special function symbols
%% double dominat
\tl_new:N \g_double_dominat_tl
\tl_set:Nn \g_double_dominat_tl { \makebox[0.2em][l]{\raisebox{0.2em}{D}}D }
%% double dominat
\tl_new:N \g_dominat_without_root_tl
\tl_set:Nn \g_dominat_without_root_tl { \makebox[0em][l]{\raisebox{0.25ex}{\small\kern0.2em/}}D }
%% double dominat
\tl_new:N \g_double_subdominat_tl
\tl_set:Nn \g_double_subdominat_tl { \makebox[0.1em][l]{\raisebox{0.2em}{S}}S }

% main function
\NewDocumentCommand { \function } { m O{} O{0pt} m } {
   \tl_set:Nn \l_tmpa_tl { #1 }
   \tl_replace_all:Nnn \l_tmpa_tl { DD } { \g_double_dominat_tl }
   \tl_replace_all:Nnn \l_tmpa_tl { /D } { \g_dominat_without_root_tl }
   \tl_replace_all:Nnn \l_tmpa_tl { SS } { \g_double_subdominat_tl }
   \tl_use:N \l_tmpa_tl
   \clist_set:Nn \l_tmpa_clist { #4 }
   \clist_reverse:N \l_tmpa_clist
   \kern#3
   {
      \tiny
      \renewcommand { \arraystretch } { 0.75 }
      \raisebox { -0.68ex } {
         \begin{tabular}[b]{@{}l@{}}
            % upper voices
            \clist_map_function:NN \l_tmpa_clist \palamas_process_list:n
            % shift/gap
            \\[-1.2ex]
            % bass line
            \palamas_process_list:n { #2 }
         \end{tabular}
      }
   }
}

\ExplSyntaxOff

% following is only for the demo
\usepackage{parskip}
\usepackage{xcolor}
\newcommand{\showBaseLine}{\makebox[0pt][l]{\color{magenta}\rule{\textwidth}{0.1pt}}}
\newcommand{\showXHeightLine}{\makebox[0pt][l]{\color{yellow}\rule[1ex]{\textwidth}{0.1pt}}}
\newcommand{\showMidLine}{\makebox[0pt][l]{\color{cyan}\rule[0.785ex]{\textwidth}{0.1pt}}}
\newcommand{\showCapHeightLine}{\makebox[0pt][l]{\color{magenta}\rule[1.57ex]{\textwidth}{0.1pt}}}
\newcommand{\showAllLines}{\showBaseLine\showXHeightLine\showMidLine\showCapHeightLine}

\begin{document}
\showAllLines\mbox{}\enskip
% single change in upper voice
\function{D}{8-7} \enskip
% single chane in bass voice
\function{D}[8-7]{} \enskip
% change in upper and bass voice
\function{D}[8-7]{4-3} \enskip
% multiple changes
\function{D}[8--7]{4-3,6-5}

% more complex examples
\function{T}{..7-8,3---4} \enskip
\function{D}{4---3, 6-5, ..7-8} \enskip
\function{D}{4----3, 6-5---, ..7-8-,{11}-----} \enskip
\function{s}{5,6}

% special function symbols
\function{DD}{8-7} \enskip
\function{/D}{8-7} \enskip
\function{SS}{5,6}


% adjust the space between function letter and notes
\function{D}[]{8-7} \enskip
\function{D}[4-3]{} \enskip
\function{D}[4-3]{8-7}

vs.

\function{D}[][-1pt]{8-7} \enskip
\function{D}[4-3][-2.3pt]{} \enskip
\function{D}[4-3][-1pt]{8-7} 
\end{document}

答案3

这里我使用了的语法\muse{Note}{space-separated-stack}来表示各个行。和是显示在左对齐行开头和结尾的数字,是space-separated-stackx\-[y]zxzy选修的条的长度(以 4ex 的倍数表示,默认倍数=1)。

已编辑,因此\-具有可选参数而不是强制参数。

\documentclass{article}
\usepackage{stackengine}
\newcommand\sline[1][1]{~\rule[2pt]{4\dimexpr#1ex}{.6pt}~}
\newcommand\muse[2]{\let\-\sline\setstackgap{L}{.9\baselineskip}{\itshape%
  #1 \scriptsize\raisebox{1pt}{\Centerstack[l]{#2}}%
}}
\begin{document}
\muse{D}{7 6\-[2]5 4\-3}\quad\muse{T}{5 3}
\end{document}

在此处输入图片描述

\muse是完全可调的。例如,在这里,我修改了它以反映\tiny数字,更细\rule,更少的前后线规则间距,更窄的堆叠间隙......

\documentclass{article}
\usepackage{stackengine}
\newcommand\sline[1][1]{\,\,\rule[1.3pt]{4\dimexpr#1ex}{.4pt}\,\,}
\newcommand\muse[2]{\let\-\sline\setstackgap{L}{.85\baselineskip}{\itshape%
  #1 \tiny\raisebox{1.5pt}{\Centerstack[l]{#2}}%
}}
\begin{document}
\muse{D}{7 6\-[2]5 4\-3}\quad\muse{T}{5 3}
\end{document}

在此处输入图片描述

相关内容