Tonhöhenpegel mit TikZ darstellen

Tonhöhenpegel mit TikZ darstellen

Nach dem sehr produktiven Ergebnis meiner jüngsten Frage zuIntonation, ich fühle mich ermutigt, eine verwandte Frage zu stellen. In der vorherigen Frage werden bestimmte Tonhöhen miteinander verbunden, um eine Intonationskontur zu erzeugen, aber für Tonsprachen (wo jeder Silbe in einem Wort normalerweise eine bestimmte Tonhöhe zugeordnet ist) ist ein anderer Ansatz erforderlich, bei dem die Tonhöhen durch kleine horizontale Linien angezeigt werden. Ich habe ein paar Ansätze dazu, die bereits funktionieren, und ich habe jetzt einen neuen TikZ-Ansatz basierend auf Matthew Leingangs Ansatz zur vorherigen Frage erstellt, aber ich bin sicher, dass Verbesserungen möglich sind. Die Optionen sind im MWE unten anhand von Beispielen aus kiKongo, einer afrikanischen Bantusprache, dargelegt.

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode

\documentclass{article}

\usepackage{fontspec}
\defaultfontfeatures{Mapping=tex-text, Scale=MatchLowercase}
\setmainfont{Charis SIL}

\usepackage{tikz}
\usetikzlibrary{backgrounds}
\newcommand{\tikzpitch}[1]{\tikz[overlay, remember picture, baseline] \coordinate (#1);}%
\tikzstyle{pitchlevel}=[x=1mm, y=1mm, yshift=-7mm, semithick]

% Charis SIL pitchlevel glyphs
\newcommand \pitch[1]{\char"F1F#1}  % use \pitch1..9 to generate the 9 pitch-level marks fromthe glyphs F1F{1..9}

% John Frampton's pitchlevels code
\usepackage{pstricks}
\newdimen\dimpla
\newdimen\dimplb
\newdimen\dimplc
\def\1{\contourpitch{-2.5ex}{-2.5ex}}
\def\2{\contourpitch{-2.1ex}{-2.1ex}}
\def\3{\contourpitch{-1.7ex}{-1.7ex}}
\def\4{\contourpitch{-1.3ex}{-1.3ex}}
\def\5{\contourpitch{-.9ex}{-.9ex}}
\def\6{\contourpitch{-.5ex}{-.5ex}}
% level pitches
\def\contourpitch #1#2#3{\setbox0=\hbox{#3}\dimpla=.5\wd0 \dimplb=.5\wd0
\advance\dimpla by -.25em
\advance\dimplb by .25em
\dimplc=#1
\ifdim#2<#1 \dimplc=#2 \fi
\dimplc=-\dimplc
\advance\dimplc by 1ex
\psline(\dimpla,#1)(\dimplb,#2)
\vrule width0pt depth\the\dimplc #3}
% glides
\def\pitchup{\contourpitch{-2.5ex}{-1.7ex}}
\def\pitchdown{\contourpitch{-1.7ex}{-2.5ex}}
\def\steepup{\contourpitch{-2.5ex}{-.5ex}}

% format fbox
\setlength\fboxsep{1pt}


\begin{document}

% generate glides in Charis SIL
\fontspec[Renderer=Graphite]{Charis SIL}

\section{Pitchlevel marking using xelatex}

In Africanist linguistics, pitchlevel marks are often used so that the pitches can be discussed without drawing premature conclusions as to how these pitches should be represented in the eventual tone-marking.

\subsection{Word-side (inline) marking}

The example of \textbf{ibuuna [~\pitch1\, \pitch9\pitch9\, \pitch1~]} (\textit{so}) can be used to show inline marking of individual words.  This solution uses the pitchlevel glyphs in Charis SIL.  Glide variants are possible: 
[~\pitch1\, \pitch9\, \pitch1\pitch5~] 
[~\pitch1\, \pitch9\, \pitch1\pitch1\pitch5~] 
[~\pitch1\, \pitch9\, \pitch1\pitch1\pitch5\pitch5~] 
[~\pitch1\, \pitch9\, \pitch1\pitch5\pitch5~] 

\bigskip

\noindent An alternative solution to the same issue of showing \noindent \textbf{ibuuna} [ \tikz\draw[x=1mm, y=1mm, semithick](0,0)--(1.5,0) (2.5,2)--(5,2) (6,0)--(7.5,0); ] uses TikZ.  Glide variants are also possible here:
[ \tikz\draw[x=1mm, y=1mm, semithick](0,0)--(1.5,0) (2.5,2)--(5,2) (6,0)--(7.5,1); ]
[ \tikz\draw[x=1mm, y=1mm, semithick](0,0)--(1.5,0) (2.5,2)--(5,2) (6,0)--(7.5,0)--(8.5,1); ]
[ \tikz\draw[x=1mm, y=1mm, semithick](0,0)--(1.5,0) (2.5,2)--(5,2) (6,0)--(7.5,0)--(8.5,1)--(10,1); ]
[ \tikz\draw[x=1mm, y=1mm, semithick](0,0)--(1.5,0) (2.5,2)--(5,2) (6,0)--(7.5,1)--(9,1); ]


\subsection{Parallel marking}

\subsubsection{Using Charis font features}

\noindent ibuuna · basiidi kilumbu · ki-bakweenda kuna-kiziitu \\
\pitch1~~\pitch9\pitch9~~\pitch1~~~\pitch1~~\pitch9~~\pitch7~~\pitch5~\pitch3~~~~~\pitch1\pitch5 ~~~~\pitch1~~~\pitch1~~~~\pitch9\pitch9~~~\pitch8~~~\pitch4~~\pitch1~~~\pitch5~\pitch5~\fbox{\pitch1\pitch5} \\
\textit{so · they set aside a day · on which they would go to the in-laws \dots}

\subsubsection{Using pstricks}

\noindent\1ib\5u\5un\1a · b\1as\5i\5id\4i k\3il\2umb\pitchup u · k\1i-b\1akw\5e\5end\4a k\3un\1a-k\3iz\3i\3it\fbox{\pitchup u}\\
\textit{so · they set aside a day · on which they would go to the in-laws \dots}

\subsubsection{Using TikZ}

\noindent\begin{tikzpicture}[remember picture]
\node{\tikzpitch{1}ib\tikzpitch{2}u\tikzpitch{3}un\tikzpitch{4}a · b\tikzpitch{5}as\tikzpitch{6}iid\tikzpitch{7}i k\tikzpitch{8}il\tikzpitch{9}umb\tikzpitch{10}u · k\tikzpitch{11}i-b\tikzpitch{12}akw\tikzpitch{13}eend\tikzpitch{14}a k\tikzpitch{15}un\tikzpitch{16}a-k\tikzpitch{17}iz\tikzpitch{18}iit\tikzpitch{19}u}; \\
\draw[pitchlevel] (1 |- 0,0)--+(2,0) (2 |- 0, 4.5)--+(2,0) (3 |- 0, 4.5)--+(2,0) (4 |- 0, 0)--+(2,0) (5 |- 0,0)--+(2,0) (6 |- 0, 4.5)--+(2,0) (7 |- 0, 4)--+(2,0) (8 |- 0, 3)--+(2,0) (9 |- 0,1.5)--+(2,0) (10 |- 0, 0)--+(1,0.5)--+(2,1.5) (11 |- 0,0)--+(2,0) (12 |- 0, 0)--+(2,0) (13 |- 0, 4.5)--+(3,0) (14 |- 0, 3.5)--+(2,0) (15 |- 0,3)--+(2,0) (16 |- 0, 1)--+(2,0) (17 |- 0, 3)--+(2,0) (18 |- 0, 3)--+(2,0) (19 |- 0,0)--+(1,0.5)--+(2,1.5);
\end{tikzpicture}\\
\mbox{\textit{so · they set aside a day · on which they would go to the in-laws \dots}}

\end{document}

Bildbeschreibung hier eingeben

Die Inline-Markierung (1.1) ist einfach. Zu den drei Varianten der Parallel-Markierung (1.2):

1.2.1: Charis SIL kann nur mit XeTeX verwendet werden. (Für LaTeX gibt es einen alternativen Ansatz mit dem tipaPaket und etwas zusätzlichem Code - siehediese Frage.) Dies scheint derzeit die einzige Schriftart zu sein, die diese Glyphen enthält (in ihrem Bereich für private Nutzung), aber in der Praxis dürfte dies kein Problem darstellen. Das Hauptproblem ist, dass man, wie bei der Frage zur Intonation, die Glyphen durch Ausprobieren so anordnen muss, dass sie zu den Wörtern passen. Ein Vorteil ist, dass man damit \fboxeine bestimmte Tonhöhe hervorheben kann.

1.2.2: Der pstricksCode wurde freundlicherweise von John Frampton, dem Autor von , zur Verfügung gestellt expex. Der Hauptvorteil besteht darin, dass die Tonhöhen in den Text eingebettet werden, was das Schreiben des Beispiels erleichtert. Ein \fboxkann verwendet werden, um eine Tonhöhe hervorzuheben (obwohl es auch den Buchstaben markiert, was optisch weniger ansprechend ist). Die Tonhöhenlinien sind auch „schärfer“ als bei den beiden anderen Optionen. Im Gegensatz dazu ist das Kompilieren langsamer und der aktuelle Code ermöglicht keine wortseitige (Inline-)Tonhöhenmarkierung. (Es scheint auch mit LaTeX nicht zu funktionieren, aber vielleicht liegt es nur an mir.)

1.2.3: Dies ist etwas, das ich zusammengestellt habe, indem ich Matthew Leingangs Lösung für die Intonationsfrage ausgenutzt habe (ich wüsste nicht einmal, wo ich mit mwibrows umfassenderem Code anfangen sollte!). Ich hole mir nur die Koordinate und zeichne dann eine Linie von dort zu einem Punkt 2 mm rechts. (Idealerweise würde ich auf jeder Seite der Koordinate 1 mm zeichnen, aber wie?) Das funktioniert eigentlich ganz gut – insbesondere können Gleitbewegungen detaillierter angegeben werden. So wie es ist, sind jedoch zwei Kompilierungen erforderlich, da remember picture, und ich habe keine Möglichkeit, eine Tonhöhe hervorzuheben. Außerdem scheint der kiKongo-Text aus irgendeinem Grund leicht eingerückt zu sein.

Das alles funktioniert also, aber ich bin an allen Verbesserungsvorschlägen interessiert, insbesondere an der Bereinigung der TikZ-Lösung, da diese sowohl für LaTeX als auch für XeTeX funktioniert und schriftartenunabhängig ist.

Antwort1

BEARBEITENFügen Sie einige Korrekturen und ein Beispiel für die Inline-Verwendung hinzu (die wahrscheinlich in einem Makro eingebunden werden sollte).

Mit einigen zusätzlichen Ergänzungen zum Code aus der Intonationsfrage (ich stelle den gesamten Code hier zur Verfügung, da er zahlreiche Korrekturen enthält) ist es möglich, Markierungen hinzuzufügen. Ich bin mir nicht sicher, ob es schriftunabhängig ist, wahrscheinlich nicht so, wie es ist. Bei Sprachen, die von rechts nach links geschrieben werden, wird es ohne zusätzliche Arbeit sicher Mist sein.

Die Grundidee besteht darin, Symbole mit Markierungen zu verknüpfen, die dann nach dem Setzen der Zeichen analysiert werden. Das Hauptziel bestand darin, die Markierungssymbole über dem Text ausrichten zu können, was etwas sauberer aussieht, als Markierungen in den Text einzufügen.

\contour[contour marks={0.55.0..0.55.?..3.2..+..0..0..5|..!..3.2..3.33.+}]
                       {ibuuna basiidi kilumbu ki-bakweenda kuna-kiziitu};

Das unten gezeigte Beispiel erhebt keinen Anspruch auf sprachliche Korrektheit, sondern soll lediglich verdeutlichen, was es leisten kann.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fit}

\newdimen\contourraise
\newdimen\contourspacetokenwidth
\newdimen\contourtokenkern
\newcount\lasttokennumber
\newcount\currenttokennumber
\newcount\contourmarkcount
\newcount\contourtokenunderlinestate
\newbox\contourbox
\makeatletter

\tikzset{
    tight fit/.style={
        inner sep=0pt,
        outer sep=0pt,
    },
    %
    %
    % How far above the reference anchor of the text,
    contour raise/.code=\pgfmathsetlength\contourraise{#1},
    contour reference anchor/.store in=\contourreferenceanchor,
    contour reference anchor=base east,
    % The `scale' for the values in the contour height specification
    contour scale/.store in=\contourscale,
    contour scale=3pt,
    % The prefix for the contour marks.
    contour mark prefix/.store in=\contourmarkprefix,
    contour mark prefix=contour,
    % The style for the contour path
    contour/.style={
        draw, 
        rounded corners=1ex,
    },
    % The style for the token nodes
    every contour token/.style={
        anchor=base west, 
        tight fit,
    },
    contour underline/.style={
        draw
    },
    % The character to insert a mark (use with care)
    contour mark character/.store in=\contourmarkchar,
    contour mark character=|,
    % Want to change the code for contour marks? Use this key.
    contour mark code/.store in=\contourmarkcode,
    % Want to change the code for tokens? Use this key.
    contour token code/.store in=\contourtokencode,
    % Want to change the code for drawing the contour? Use this  key.
    contour code/.store in=\contourcode,
    %
    % Default stuff
    contour mark code={%
        \coordinate (\contourmarkprefix-\the\contourmarkcount)
          at ([yshift=\contourraise, y=\contourscale,               
          shift={(0,\currentcontourheight)}]token-\the\currenttokennumber.\contourreferenceanchor);
    },
    contour token code={%
        \node [every contour token/.try] at 
        ([xshift=\contourtokenkern]token-\the\lasttokennumber.base east) 
            (token-\the\currenttokennumber) {\token};
    },
    contour code={
        \draw [contour] (\contourmarkprefix-1)
            \foreach \y in {2,...,\the\contourmarkcount}{ -- 
                    (\contourmarkprefix-\y) };                  
    },
    contour marks/.style={
        contour mark list={#1},
        contour code={
             \draw [y=\contourscale, contour] \contourpath;                  
         },
         contour mark code={%
            \coordinate (@a) at ([yshift=\contourraise]token-\the\currenttokennumber.base west);
            \coordinate (@b) at ([yshift=\contourraise]token-\the\currenttokennumber.base east);
            \node [tight fit, fit={(@a) (@b)}] (\contourmarkprefix-\the\contourmarkcount) {};
        },
    },
    % Don't draw the contour.
    tokens only/.style={
        contour code={}
    },
    %
    % Only draw the contour (but the space is still used for the tokens)
    contour only/.style={
        every contour token/.append style={
            execute at begin node={\setbox\contourbox=\hbox\bgroup},
            execute at end node=\egroup\phantom{\box\contourbox}%
        },
        underline/.style={
            draw=none
        }
    },
    %
    % Make tokens follow the contour marks.
    tokens follow contour/.style={
        tokens only,
        contour token code={%
            \node [every contour token/.try, y=\contourscale] at 
                ([xshift=\contourtokenkern]token-\the\lasttokennumber.base east |- 
                0,\currentcontourheight) 
                (token-\the\currenttokennumber) {\token};
        },
    },
    % What style to use when drawing underline
    underline/.style={
        draw
    },
    % The underline is drawn along the south side of a node which 
    % takes this style.
    underline token/.style={
        inner ysep=1pt
    },
    % When grouping tokens (e.g., for putting box around)
    % this style is applied to a node that is fitted around the group
    token group/.style={
        inner xsep=1pt,
        inner ysep=2pt,
        rounded corners=2pt
    },
    % Draw boxes around tokens groups.
    box tokens/.style={
        token group/.append style={
            draw
        }
    },  
    % Change the width of the spaces.
    space token width/.code=\pgfmathsetlength\contourspacetokenwidth{#1},
    space token width=0.125cm,
    contour mark list/.store in=\@contourmarklist%
}




\def\at@{@}

\let\@contourmarklist=\@empty

\def\contour{%
    \pgfutil@ifnextchar[{\contour@opts}{\contour@opts[]}}
\def\contour@opts[#1]{%
    \pgfutil@ifnextchar x{\contour@@opts[#1]}{\contour@@opts[#1]}}
\def\contour@@opts[#1]#2;{%
    \begin{scope}[#1]
        \coordinate (token-0);
        \currenttokennumber=0\relax%
        \lasttokennumber=0\relax%
        \contourmarkcount=0\relax%
        \def\lastcontourheight{0}%
        \contourtokenunderlinestate=0\relax%
        \let\lastcontourtoken=\relax%
        \contourtokenkern=0pt\relax%
        \def\contourpath{}%
        \@contour#2@%
}


% Must check for a spaces
\def\@contour{\futurelet\@token\@checkforspace}

\def\@uscore{_}
\def\@checkforspace{%
    \ifx\@token\pgfutil@sptoken%
        \let\@next=\@replacespace%
    \else%
        \if\@token\contourmarkchar%
            \let\@next=\@contour@insertmark
        \else%
            \if\@token\@uscore
                \let\@next=\@contourtoggleunderline%
            \else%
                \let\@next=\@@contour%
            \fi%
        \fi%
    \fi%
    \@next%
}

\def\@contourtoggleunderline#1{%
    \advance\contourtokenunderlinestate by1\relax
    \ifnum\contourtokenunderlinestate>3\relax%
        \contourtokenunderlinestate=0\relax%
    \fi%
    \@contour%
}

\def\@contour@insertmark{%
    \afterassignment\@@contour@insertmark\let\@token=%
}

\def\@@contour@insertmark{%
    \futurelet\@token\@@@contour@insertmark}%



\def\@@@contour@insertmark{%
    \if\@token[%
        \let\@next=\@@@@contour@insertmark%
    \else%
        \let\currentcontourheight=\lastcontourheight%
        \let\@next=\@@@@@contour@insertmark%
    \fi%
    \@next%
}


\def\@@@@contour@insertmark[#1]{%
    \def\@tmp{#1}%
    \ifx\@tmp\@empty%
        \let\currentcontourheight=\lastcontourheight%
    \else%
        \def\currentcontourheight{#1}%
    \fi%
    \@@@@@contour@insertmark}

\def\@@@@@contour@insertmark{%
    \advance\contourmarkcount by1\relax%
     % Code for inserting mark
    \contourmarkcode%
    \let\lastcontourheight=\currentcontourheight%
    \@contour}

\def\contourspacetoken{{\hbox to \contourspacetokenwidth{\hfill}}}

\def\@replacespace#1{%
    \@contour\contourspacetoken#1%
}

\def\@@countour@afterlatenode{%
    \pgf@x=\pgfpositionnodelatermaxx\relax%
    \advance\pgf@x by-\pgfpositionnodelaterminx\relax%
    \global\edef\@contournodewidth{\the\pgf@x}%
}

\def\@@contour#1{%
    \def\@token{#1}%
    \if\@token\at@%
        \@contourdounderline%
        \pgfutil@ifundefined{pgf@sh@ns@tokengroup}{}{%
            \node [tight fit, fit={(tokengroup)}, token group/.try] {};
            \global\let\pgf@sh@ns@tokengroup=\relax%
        }%
        \let\@next=\@@@contour%
    \else%
        \lasttokennumber=\currenttokennumber%
        \advance\currenttokennumber by1%
        \contourtokenkern=0pt\relax%
        \ifnum\currenttokennumber>1\relax%
            %
            % Take care of kerning.
            % 
            % First get the width of the last and current token in the same hbox.
            %
            \let\pgfpositionnodelaterbox=\contourbox
            \pgfpositionnodelater\@@countour@afterlatenode%
            \def\token{\lastcontourtoken\@token}%
            \begingroup%
                \tikzset{every contour token/.append style={tight fit}}%
                \contourtokencode%
            \endgroup%
            \let\@contourkerntmp=\@contournodewidth%
            % 
            % Now subtract the width of last and current token in separate boxes.
            %
            \def\token{\hbox{\lastcontourtoken}\hbox{\@token}}%
            \begingroup%
                    \tikzset{every contour token/.append style={tight fit}}%
                    \contourtokencode%
            \endgroup%
            \pgfmathsetlength\contourtokenkern{\@contourkerntmp-\@contournodewidth}%
            \pgfpositionnodelater\relax%
        \fi%
        %
        % OK, now actually typset the current token
        %
        \let\token=\@token%
        \contourtokencode%
        \let\lastcontourtoken=\token%
        % Manage underline state
        \@contourdounderline%
        \def\@@token{\contourspacetoken}%
        \ifx\@token\@@token%
            \pgfutil@ifundefined{pgf@sh@ns@tokengroup}{}{%
                \pgfutil@ifundefined{pgf@sh@ns@underline}{}{%
                    \node [tight fit, fit={(tokengroup) (underline)}] 
                    (tokengroup) 
                {};}%
                \node [tight fit, fit={(tokengroup)}, token group/.try] {};
                \global\let\pgf@sh@ns@tokengroup=\relax%
            }%
        \else
            \pgfutil@ifundefined{pgf@sh@ns@tokengroup}{%
                \node [tight fit, 
                fit={(token-\the\currenttokennumber)}] 
                (tokengroup) {};
            }{%
                \node [tight fit, 
                fit={(token-\the\currenttokennumber) 
                (tokengroup)}] 
                (tokengroup){};
            }%
        \fi%
        \let\@next=\@contour
        %
    \fi%
    \@next%
}

\def\@contourdounderline{%
    \ifcase\contourtokenunderlinestate%
     \or
         \node [tight fit, fit={(token-\the\currenttokennumber)}] 
         (underline) {};
         \contourtokenunderlinestate=2\relax%
     \or%
            \node [tight fit,fit={(token-\the\currenttokennumber) (underline)}]
            (underline) {};
     \or%
            \node [tight fit, fit={(underline)}, underline token/.try] 
            (underline) {};
         \draw [underline/.try]
                    (underline.south west) -- (underline.south east);
            \pgfutil@ifundefined{pgf@sh@ns@tokengroup}{}{%
                 \node [tight fit, fit={(tokengroup) (underline)}] 
                 (tokengroup) {};%
                 \node [tight fit, fit={(tokengroup)}, token group/.try] {};
                 \global\let\pgf@sh@ns@tokengroup=\relax%
                 \global\let\pgf@sh@ns@underline=\relax%
             }
         \contourtokenunderlinestate=0\relax
     \fi%
}
\def\@@@contour{%
    \ifx\@contourmarklist\@empty%
    \else%
        \@contourdolist%
    \fi%
    \ifnum\contourmarkcount>1
        % Code for drawing contour
        \contourcode%
    \fi%
    \end{scope}%
    \ignorespaces%
}



\def\@contourstackpop{%
    \let\@contourstackitem=\@empty%
    \ifx\@contourstack\@empty%
    \else%
        \expandafter\@@contourstackpop\@contourstack\@@contourstackpop%
    \fi%
}


\def\@@contourstackpop#1#2\@@contourstackpop{%
    \def\@contourstackitem{#1}%
    \ifx\@contourstackitem\@empty%
        \def\@contourstackitem{#2}%
        \let\@contourstack=\@empty%
    \else%
        \def\@contourstack{#2}%
    \fi%
}

\def\@contourdolist{%
    \let\@contourstack=\@contourmarklist%
    \let\@contourstacklastitem=\@empty%
    \let\contourpath=\@empty%
    \edef\contourtotaltokens{\the\currenttokennumber}%
    \currenttokennumber=0\relax%
    \contourmarkcount=0\relax%
    \@@contourdolist%
}

\def\@@contourdolist{%
    \@contourstackpop%
    \advance\currenttokennumber by1\relax%
    \ifx\@contourstackitem\@empty%
        \let\@next=\relax%
    \else%
        \expandafter\ifx\csname contourcontourpathcommand@\@contourstackitem @\endcsname\relax%
        \else%
            \advance\contourmarkcount by1\relax%
            \let\currentcontourheight=\@contourstackitem%
            \contourmarkcode%
            \def\contourmarkstart{\contourmarkprefix-\the\contourmarkcount.west}%
            \def\contourmarkend{\contourmarkprefix-\the\contourmarkcount.east}%         
            \edef\contourpath{\contourpath \csname contourcontourpathcommand@\@contourstackitem @\endcsname}%
        \fi%
        \let\@next=\@@contourdolist%
        \let\@contourstacklastitem=\@contourstackitem%
    \fi
    \@next%
}


% \contourcontourpathcommand{<symbol>}{<contour path command code>}
% \contourmarkstart and \contourmarkend are setup as the
% left and right points of the charactor at zero contour height.
\def\contourcontourpathcommand#1{\expandafter\def\csname contourcontourpathcommand@#1@\endcsname}

% \contourmark{<symbol>}{<mark start height>}{<mark end height>}
%

\def\contourmark#1#2#3{%
    \contourcontourpathcommand{#1}{([shift={(0,#2)}]\contourmarkstart) -- ([shift={(0,#3)}]\contourmarkend)}
}

\makeatother

% Separator. 
\contourcontourpathcommand{.}{}

\contourmark{0}{0}{0}
\contourmark{1}{1}{1}
\contourmark{2}{2}{2}
\contourmark{3}{3}{3}
\contourmark{4}{4}{4}
\contourmark{5}{5}{5}
\contourmark{+}{0}{1}

\contourcontourpathcommand{!}{
    (\contourmarkstart) .. controls ++(0,2) and ++(0,2) .. (\contourmarkend)
}

\contourcontourpathcommand{?}{
    (\contourmarkstart) .. controls ++(0,-1) and ++(0,-1) .. ([shift={(0,2)}]\contourmarkend)
}
\contourcontourpathcommand{|}{
    % Continue previous path
    -- ([shift={(0, 3)}]\contourmarkend)
}



\begin{document}

\begin{tabular}{c}
\begin{tikzpicture}
\contour[contour/.append style={rounded corners=0}, contour raise=-0.75cm,
    contour marks={0.55.0..0.55.?..3.2..+..0..0..5|..!..3.2..3.33.+}]
                  {ibuuna basiidi kilumbu ki-bakweenda kuna-kiziitu};

\end{tikzpicture}
\\[0.5cm]
in line marking: ibuuna [\tikz[baseline={(0,0.25ex)}]%  
\contour[contour only, contour scale=2ex/6,
    contour marks={0.55.0}]
                  {ibuuna};]

\end{tabular}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen