\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tonevalue} [2021/07/25 v1.0 LaTeX Package (Tone value: visualising tone value patterns)] \RequirePackage{etoolbox} \RequirePackage{listofitems} \RequirePackage{xstring} \RequirePackage{xkeyval} \RequirePackage{xcolor} \RequirePackage{tikz} \usetikzlibrary{positioning,decorations.markings,arrows} \RequirePackage{contour} % package options % font command \DeclareOptionX{fontcmd}[\sffamily]{\def\toneVisualisationFontCmd{#1}} % colors \DeclareOptionX{defaultcolors}{ \definecolor{1}{HTML}{7E2639} \definecolor{2}{HTML}{FF98AF} \definecolor{3}{HTML}{AD724A} \definecolor{4}{HTML}{DE6A1C} \definecolor{5}{HTML}{426579} \definecolor{6}{HTML}{86B8F3} \definecolor{7}{HTML}{769164} \definecolor{8}{HTML}{ACC551} } % contour around numbers \DeclareOptionX{draft}{\contournumber{50}} \DeclareOptionX{contourlength}[0.075em]{\contourlength{#1}} \DeclareOptionX{contournumber}[1000]{\contournumber{#1}} \ExecuteOptionsX{ contourlength=0.075em, contournumber=1000, fontcmd=\sffamily, } \ProcessOptionsX*\relax \ProcessOptionsX\relax \def\xjoinbycomma<#1#2>{% \ifx\relax#1 \else #1,\xjoinbycomma<#2>% \fi } \def\sendiauToListStr#1{\xjoinbycomma<#1\relax>} % environment for unt's visualisation approach \define@key{untVisualisation}{minmax}{\def\untVisualisation@minmax{#1}} \define@key{untVisualisation}{scale}{\def\untVisualisation@scale{#1}} \define@key{untVisualisation}{showlabels}{\def\untVisualisation@showlabels{#1}} \newenvironment{untVisualisation}[1][]{ \setkeys{untVisualisation}{minmax={1,5}, scale=1, showlabels=false} \setkeys{untVisualisation}{#1} \toneVisualisationFontCmd % mxn minmax \pgfmathparse{{\untVisualisation@minmax}[0]} \edef\xstart{\pgfmathresult} \pgfmathparse{{\untVisualisation@minmax}[1]} \edef\xend{\pgfmathresult} \pgfmathparse{{\untVisualisation@minmax}[0]} \edef\ystart{\pgfmathresult} \pgfmathparse{{\untVisualisation@minmax}[1]} \edef\yend{\pgfmathresult} \tikzpicture[scale=\untVisualisation@scale] \begin{scope}[rotate=45, scale=1.4142, line width=0.1em, gray] \foreach \x in {\xstart,...,\xend} \draw (\x,\ystart) -- (\x,\yend); \foreach \y in {\ystart,...,\yend} \draw (\xstart,\y) -- (\xend,\y); \end{scope} \begin{scope}[gray] \expandafter\ifstrequal\expandafter{\untVisualisation@showlabels}{true}{ \node at (0,\ystart*2-0.5) {\large\bfseries\xstart}; \node at (-\xend+0.6767+\xstart-1,\yend+0.6767+\ystart-1) {\large\bfseries\xend}; \node at (\xend-0.6767-\xstart+1,\yend+0.6767+\ystart-1) {\large\bfseries\xend}; \node (xAxisArrowTip) at (-\xend+0.6767+\xstart-1+\xend/2-\xstart/2,\yend+0.6767+\ystart-1-\yend/2+\ystart/2) {}; \node[below left=1.25em of xAxisArrowTip] (xAxisArrowTail) {}; \draw[line width=0.125em, -angle 60] (xAxisArrowTail) -- (xAxisArrowTip); \node (yAxisArrowTail) at (\xend-0.6767-\xstart+1-\xend/2+\xstart/2,\yend+0.6767+\ystart-1-\yend/2+\ystart/2) {}; \node[below right=1.25em of yAxisArrowTail] (yAxisArrowTip) {}; \draw[line width=0.125em, -angle 60] (yAxisArrowTail) -- (yAxisArrowTip); }{} \end{scope} }{ \endtikzpicture } % draw a point \newcommand{\drawuntpoint}[9][]{ % override tikz options, background color, coordinates, tone name, tone value in numbers, label position \node[draw, shape=circle, scale=#9*0.75, inner sep=0.1em, fill, #2, text=white, #1, xshift=#7, yshift=#8] ({#5}{#4}) at ({#3}[0],{#3}[1]) {#4}; \node[#2, #6 = 0pt of {#5}{#4}] {\contour{white}{#5}}; } \newcounter{sumOfPitchHeights} % keys of options \define@key{untpoint}{label}{\def\untpoint@label{#1}} \define@key{untpoint}{tikzoptions}{\def\untpoint@tikzoptions{#1}} \define@key{untpoint}{bgcolor}{\def\untpoint@bgcolor{#1}} \define@key{untpoint}{xshift}{\def\untpoint@xshift{#1}} \define@key{untpoint}{yshift}{\def\untpoint@yshift{#1}} \define@key{untpoint}{scale}{\def\untpoint@scale{#1}} \define@key{untpoint}{stem}{\def\untpoint@stem{#1}} % drawing interface \newcommand{\untpoint}[3][]{ % options, tone value in numbers, tone name \setkeys{untpoint}{label=above, tikzoptions={}, bgcolor=black, xshift=0pt, yshift=0pt, scale=1, stem=false} \setkeys{untpoint}{#1} \StrGobbleRight{\sendiauToListStr{#2}}{2}[\sendiaulistStr] % readlist cannot parse trailing comma \readlist\sendiaulist{\sendiaulistStr} \edef\len{\listlen\sendiaulist[]} \ifnum0\len=1 \drawuntpoint[{\untpoint@tikzoptions}]{\untpoint@bgcolor}{0,{#2}[0]*2}{#3}{#2} {\untpoint@label}{\untpoint@xshift}{\untpoint@yshift}{\untpoint@scale} \else \setcounter{sumOfPitchHeights}{0} \pgfmathparse{\len-2} % calculate the sum of pitch heights \foreach \pitchHeightIndex in {0,...,{\pgfmathresult}} { \pgfmathparse{{#2}[\pitchHeightIndex]} \addtocounter{sumOfPitchHeights}{\pgfmathresult} \pgfmathparse{{#2}[\pitchHeightIndex+1]} \addtocounter{sumOfPitchHeights}{\pgfmathresult} } % draw the point \drawuntpoint[\untpoint@tikzoptions] {\untpoint@bgcolor} {{-({#2}[0])+{#2}[\len-1]},{\thesumOfPitchHeights/(\len-1)}} {#3}{#2} {\untpoint@label}{\untpoint@xshift}{\untpoint@yshift}{\untpoint@scale} % draw the stem \expandafter\ifstrequal\expandafter{\untpoint@stem}{true}{ \draw[\untpoint@bgcolor, line width=0.1em] ({-({#2}[0])+{#2}[\len-1]},{#2}[0]+{#2}[\len-1]) -- ({#2}{#3}); }{} \fi } % link points \define@key{linkuntpoints}{color}{\def\linkuntpoints@color{#1}} \define@key{linkuntpoints}{bend}{\def\linkuntpoints@bend{#1}} \newcommand{\linkuntpoints}[3][]{ \setkeys{linkuntpoints}{color=black, bend={}} \setkeys{linkuntpoints}{#1} \begin{scope}[ decoration={ markings, mark=at position 0.5 with {\arrow[scale=0.875]{angle 60}}} ] \draw[postaction={decorate}, line width=0.15em, \linkuntpoints@color] (#2) to [\linkuntpoints@bend] (#3); \end{scope} } \endinput