我需要帮助如何在 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
所有注释/空间/线条都变得相同,以使它们垂直对齐。
这低音总是在相同的垂直位置对齐(下标类型)。第一的列表中较高声音的变化也具有固定的垂直位置(上标的一种),所有后续变化都堆叠在上面。
如果您使用其他字体(大小),则必须调整所有ex
和em
值。
结果:
或多或少复杂的声音:
\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-stack
x\-[y]z
x
z
y
选修的条的长度(以 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}