TikZ를 사용하여 피치 레벨 묘사

TikZ를 사용하여 피치 레벨 묘사

최근 질문에 대한 매우 생산적인 결과를 얻은 후인토네이션, 관련 질문을 하게 되었습니다. 이전 단계에서는 특정 음조 수준을 연결하여 억양 윤곽을 생성했지만, 성조 언어(단어의 각 음절에 일반적으로 관련된 특정 음조가 있는 경우 음조 수준이 작은 수평선으로 표시되는 다른 접근 방식이 필요함) 이에 대한 몇 가지 접근 방식이 이미 작동하고 있으며 이제 이전 질문에 대한 Matthew Leingang의 접근 방식을 기반으로 새로운 TikZ 접근 방식을 만들었습니다. 그러나 개선이 가능하다고 확신하는 옵션은 아래 MWE에 나와 있습니다. , 아프리카 반투어인 kiKongo의 예를 사용합니다.

%!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}

여기에 이미지 설명을 입력하세요

인라인 마킹(1.1)은 간단합니다. 병렬 표시의 세 가지 버전(1.2)은 다음과 같습니다.

1.2.1: Charis SIL은 XeTeX에서만 사용할 수 있습니다. (LaTeX의 경우 tipa패키지와 일부 추가 코드를 사용하는 대체 접근 방식이 있습니다 .이 질문.) 이것은 현재 이러한 문자 모양을 포함하는 유일한 글꼴인 것 같지만(개인 사용 영역에) 실제로는 문제가 되지 않습니다. 주요 문제는 억양 질문에서와 마찬가지로 단어와 일치하도록 문자 모양의 간격을 조정하기 위해 시행착오를 거쳐야 한다는 것입니다. 한 가지 이점은 \fbox특정 피치를 강조하는 데 사용할 수 있다는 것입니다 .

1.2.2: pstricks코드는 의 저자인 John Frampton이 친절하게 제공했습니다 expex. 가장 큰 이점은 피치 레벨을 텍스트에 포함시켜 예제를 작성하기가 더 쉽게 한다는 것입니다. An은 \fbox피치를 강조하는 데 사용할 수 있습니다(물론 문자도 표시하므로 시각적으로 덜 매력적입니다). 피치 레벨 라인도 다른 두 옵션보다 "더 선명"합니다. 그에 반해 컴파일 속도가 느리고 현재 코드에서는 단어 측(인라인) 피치 표시를 허용하지 않습니다. (LaTeX에서도 작동하지 않는 것 같지만 아마도 나만 그럴 것입니다.)

1.2.3: 이것은 억양 질문에 대한 Matthew Leingang의 솔루션을 성추행하여 구성한 것입니다(mwibrow의 더 포괄적인 코드에서는 어디서부터 시작해야 할지조차 모르겠습니다!). 내가 하는 일은 좌표를 구한 다음 그 좌표에서 오른쪽으로 2mm 지점까지 선을 그리는 것뿐입니다. (이상적으로는 좌표의 각 측면에 1mm를 그리겠지만 어떻게 될까요?) 이것은 실제로 꽤 잘 작동합니다. 특히 글라이드를 더 자세히 지정할 수 있습니다. 그러나 현재로서는 로 인해 두 개의 컴파일이 필요 remember picture하고 피치를 강조할 방법이 없습니다. 또한, kiKongo 텍스트는 어떤 이유에서인지 약간 들여쓰기된 것 같습니다.

따라서 이러한 모든 작업이 작동하지만 특히 TikZ 솔루션 정리에 대한 개선 제안에 관심이 있습니다. 이는 LaTeX 및 XeTeX 모두에서 작동하고 글꼴 독립적이기 때문입니다.

답변1

편집하다몇 가지 수정 사항과 인라인 사용 예를 추가합니다(아마도 매크로에 묶여 있어야 함).

억양 질문의 코드에 몇 가지 추가 사항을 추가하면(수많은 수정 사항이 포함되어 있으므로 여기에 전체 코드를 제공합니다) 표시를 추가할 수 있습니다. 글꼴 독립적인지는 확실하지 않습니다. 아마도 현재 상태로는 그렇지 않을 것입니다. 확실히 추가 작업 없이 오른쪽에서 왼쪽으로 쓰는 언어는 쓰레기가 될 것입니다.

기본 아이디어는 기호를 표시와 연관시킨 다음 문자를 조판한 후 구문 분석하는 것입니다. 주요 목표는 마킹 기호를 텍스트 위에 정렬할 수 있도록 하는 것이었습니다. 이는 텍스트에 표시를 하는 것보다 좀 더 깔끔하게 보입니다.

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

아래에 표시된 예는 언어적으로 정확하다고 가정되지는 않지만 단지 이것이 수행할 수 있는 작업을 보여줍니다.

\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}

여기에 이미지 설명을 입력하세요

관련 정보