Verwenden von TikZ zur Darstellung der Intonation

Verwenden von TikZ zur Darstellung der Intonation

Ich möchte TikZ verwenden, um Tonmuster über einer Phrase oder einem Satz darzustellen (Intonation).

Ich habe es bereits geschafft, einige brauchbare Ergebnisse zu erzielen, wie im beigefügten MWE (obwohl sich die Grundlinien in 1.1 nicht zu verbessern scheinen).

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
\documentclass[a4paper,12pt, oneside]{article}

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

\usepackage{tikz}

\begin{document}

\section{Marking intonation using TikZ}

\subsection{Setting words on different levels}

\begin{table}[hbtp]
\begin{tabular}{ll}
\cline{1-1} \noalign{\smallskip}
\tikz[x=1mm,y=1mm,baseline=12] \draw (0,10) node {\underline{Where}} (10,2) node {are} (20,2) node {you} (30,6) node {\underline{go}} (40,0) node{ing?}; & \textit{neutral/default - stress represented by underlining}\\
\cline{1-1} \noalign{\smallskip}
\tikz[x=1mm,y=1mm,baseline=12] \draw (0,0) node {Where} (10,10) node {\underline{are}} (20,5) node {you} (30,2) node {go} (40,0) node{ing?}; & \textit{ e.g. in response to ``I'm not going to the shops after all.''}\\
\cline{1-1}
\end{tabular}
\end{table}

Why do ``are'' and ``you'' in the first example appear on slightly
different levels, even though they are both set to 1mm on the y axis? 
Likewise for ``where'' and ``ing'' in the second example.

I'm not sure I'm using ``baseline'' properly here!

\subsection{As above, but boxed}

\begin{tikzpicture}
\node[draw] at (0,1) {\underline{Where}};
\node[draw] at (1,0.1) {are};
\node[draw] at (2,0.1) {you};
\node[draw] at (3,0.6) {\underline{go}};
\node[draw] at (4,0) {ing?};
\end{tikzpicture}\
Still have to figure out the difference between ``\textbackslash draw node'' and ``\textbackslash node[draw]''!

\subsection{Graphical contour}

\begin{table}[hbtp]
\begin{tabular}{l}
\tikz[x=1mm,y=1mm,rounded corners=2mm] \draw[very thick, gray](0,10)--(10,2)--(20,2){[red]--(30,6)--(40,0)}; \\
Where are you~~~going?
\end{tabular}
\end{table}

\begin{table}[hbtp]
\begin{tabular}{l}
\tikz[x=1mm,y=1mm,rounded corners=2mm] \draw[very thick, gray](0,10)--(12,2)--(23,2){[red]--(26,6)--(35,0)}; \\
Where are you going?
\end{tabular}
\end{table}

This is preferable to setting the individual words on different levels, but
requires trial and error in (i) matching the length of the whole contour to
the utterance, and (ii) spreading the parts of the contour to match the words
of the utterance, either by spacing the words (first example) or adjusting the
contour points (second example).

\end{document}

Meine Hauptfrage ist jedoch, ob jemand eine Methode hat, um das Problem in 1.3 zu lösen. Dies erfordert Ausprobieren, um die Kontur an die Wörter anzupassen, und ich habe mich gefragt, ob es eine Möglichkeit gibt, bestimmte Konturkoordinaten irgendwie an bestimmten Silben zu verankern. Ich weiß, dass Linien an Knoten angehängt werden können, aber ich konnte keine Möglichkeit finden, die Linien über den Knoten „schweben“ zu lassen. Gibt es Vorschläge, wie man eine Textzeile beim Eintippen mit Ankerpunkten markieren und die Kontur dann zwischen diesen zeichnen kann?

Bildbeschreibung hier eingeben

Antwort1

Als Fortsetzung der Antwort von Matthew Leingang folgt hier der gleiche Ansatz, der mit etwas syntaktischem Zucker verknüpft ist. Es bringt \catcodeDinge durcheinander, also ist Vorsicht geboten.

\documentclass{standalone}
\usepackage{tikz}

\newcount\contourmarkcount
\newdimen\contourraise

{\catcode`\|=13
\gdef\installbarmark#1\ignorespaces{%
    #1\ignorespaces%
    \catcode`\|=13%
    \global\contourmarkcount=0\relax%
    \global\def\lastmarkshift{0}%
    \let|=\marktext}%
}


\def\star{*}
\newcommand\marktext[1][*]{%
    \def\markshift{#1}%
    % When not followed by the optional argument
    % the contour mark is set at the previous height.
    \ifx\markshift\star
        \let\markshift=\lastmarkshift%
    \fi
    \global\advance\contourmarkcount by1\relax%
    \xdef\tmpmark{\the\contourmarkcount}%
    \tikz[remember picture, overlay, y=\pgfkeysvalueof{/tikz/contour scale}]
        \path [yshift=\contourraise, shift={(0,\markshift)}]
                coordinate (\contourmarkprefix-\tmpmark);%
    \global\contourmarkcount=\tmpmark\relax% 
    \global\let\lastmarkshift=\markshift%
}


\tikzset{
    intonation contour/.style={%
        execute at begin node={%
            \installbarmark%
        },
        append after command={%
            \pgfextra{%
                \ifnum\contourmarkcount>1
                    \draw [contour] (\contourmarkprefix-1)
                        \foreach \y in {2,...,\the\contourmarkcount}{ -- (\contourmarkprefix-\y) };
                \fi
            }
        }
    },
    % How far above the base line of the text,
    raise contour/.code=\pgfmathsetlength\contourraise{#1},
    % The `scale' for the values in the contour height specification
    contour scale/.initial=3pt,
    % The prefix for the contour marks.
    contour mark prefix/.code=\xdef\contourmarkprefix{#1},
    contour mark prefix=intonation contour,
    contour/.style={
        draw, 
        rounded corners=1ex,
    }           
}

\begin{document}

\begin{tikzpicture}[remember picture]

\node [intonation contour, raise contour=0.5cm] 
    {|[10]Where |[3]are |[3]you |[5]go|[2]ing|[0]?};

\end{tikzpicture}

\begin{tikzpicture}[remember picture]

\node [intonation contour, raise contour=0.5cm, contour mark prefix=my contour] 
    {|[2]I  |am  |[7]fina|lly |[4]go|ing |[2]home|[0].};

\path [draw=red, ->] ([yshift=0.25cm]my contour-2) -- ([yshift=0.25cm]my contour-3)
        node [midway, left] {\tiny rising};

\path [draw=red, ->] ([yshift=0.25cm]my contour-4) -- ([yshift=0.25cm]my contour-5)
    node [midway, right] {\tiny falling};
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Und nur zum Spaß, hier ist eine Version, die nicht verwendet wird remember pictureund daher keine zwei Kompilierungen benötigt. Außerdem gibt es kein Herumspielen mit Kategoriecodes. Es ist leider etwas komplizierter und die Buchstaben sind nicht optimal gesetzt, da sie alle in separaten Kästchen stehen.

BEARBEITENEs wurde etwas mehr Vielseitigkeit implementiert, dadurch ist es aber auch etwas komplexer.

\documentclass{standalone}
\usepackage{tikz}

\newdimen\contourraise

\tikzset{
    % How far above the base line of the text,
    raise contour/.code=\pgfmathsetlength\contourraise{#1},
    % The `scale' for the values in the contour height specification
    contour scale/.initial=3pt,
    % The prefix for the contour marks.
    contour mark prefix/.code=\xdef\contourmarkprefix{#1},
    contour mark prefix=contour,
    % The style for the contour path
    contour/.style={
        draw, 
        rounded corners=1ex,
    },
    % The style for the token nodes
    contour token/.style={
        anchor=base west, 
        inner sep=0pt,
        text depth=0.6ex, % controls underline depth
    },
    contour underline/.style={
        draw
    },
    % The character to insert a mark (use with care)
    contour mark character/.store in=\contourmarkchar,
    contour mark character=|
}


\makeatletter

\def\at@{@}

\newcount\lasttokennumber
\newcount\currenttokennumber
\newcount\contourmarkcount
\newcount\contourtokenunderlinestate
\newcommand\contour[2][]{%
    \begin{scope}[#1]
        \coordinate (token-0);
        \currenttokennumber=0\relax%
        \lasttokennumber=0\relax%
        \contourmarkcount=0\relax%
        \def\lastcontourheight{0}%
        \contourtokenunderlinestate=0\relax%
        \@contour#2@%
}


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

\def\@uscore{_}
\def\@checkforspace{%
    \ifx\@token\@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
    \coordinate (\contourmarkprefix-\the\contourmarkcount)
        at ([yshift=\contourraise, y=\pgfkeysvalueof{/tikz/contour scale}, 
        shift={(0,\currentcontourheight)}]token-\the\currenttokennumber.base east);
    %
    \let\lastcontourheight=\currentcontourheight
\@contour}

\def\customspace{{\hbox to 1ex{\hfill}}}

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

\def\@@contour#1{%
    \def\@token{#1}%
    \if\@token\at@
        \let\@next=\@@@contour%
    \else%
        \lasttokennumber=\currenttokennumber%
        \advance\currenttokennumber by1%
        % Code for typesetting token
        \node [contour token/.try] at (token-\the\lasttokennumber.base east) (token-\the\currenttokennumber) {\@token};
        % Manage underline state
        \ifnum\contourtokenunderlinestate=1\relax%
            \coordinate (underline start) at (token-\the\currenttokennumber.south west);
            \contourtokenunderlinestate=2\relax%
        \else
            \ifnum\contourtokenunderlinestate=3\relax%
                \coordinate (underline end) at (token-\the\currenttokennumber.south west);
                \draw (underline start) -- (underline end);
                \contourtokenunderlinestate=0\relax
            \fi%
        \fi%
        \let\@next=\@contour
        %
    \fi%
    \@next%
}
\def\@@@contour{%
    \ifnum\contourmarkcount>1
        % Code for drawing contour
        \draw [contour] (\contourmarkprefix-1)
            \foreach \y in {2,...,\the\contourmarkcount}{ -- (\contourmarkprefix-\y) };
        %
    \fi%
    \end{scope}%
}

\makeatother

\begin{document}

\begin{tikzpicture}[baseline={(0,-0.25)}]

    \contour[raise contour=0.5cm]
        {|[10]Where |[3]are |[3]_you_ |[5]go|[2]ing|[0]?}

\end{tikzpicture} 


\begin{tikzpicture}[baseline={(0,-0.25)}]

\contour[
    raise contour=0.5cm, 
    contour mark prefix=my contour, 
    contour/.style={
        thick, 
        rounded corners=1mm,
        line cap=round,
        dotted},
    contour mark character=*] 
    {*[2]I *am  *[7]_{fi}na*lly_ *[4]go*ing *[2]home*[0].};

\path [draw=red, ->] ([yshift=0.25cm]my contour-2) -- ([yshift=0.25cm]my contour-3)
        node [midway, left] {\tiny rising};

\path [draw=red, ->] ([yshift=0.25cm]my contour-4) -- ([yshift=0.25cm]my contour-5)
    node [midway, right] {\tiny falling};

\path (0,-0.25);
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

BEARBEITEN:erweiterte Version, die hoffentlich alle oben genannten Anwendungsfälle abdeckt.

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

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

\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, 
        inner sep=0pt,
    },
    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 
        (token-\the\lasttokennumber.base east) 
            (token-\the\currenttokennumber) {\token};
    },
    contour code={
        \draw [contour] (\contourmarkprefix-1)
            \foreach \y in {2,...,\the\contourmarkcount}{ -- 
                    (\contourmarkprefix-\y) };                  
    },
    %
    % 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 
                (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
}


\makeatletter

\def\at@{@}


\newcommand\contour[2][]{%
    \begin{scope}[#1]
        \coordinate (token-0);
        \currenttokennumber=0\relax%
        \lasttokennumber=0\relax%
        \contourmarkcount=0\relax%
        \def\lastcontourheight{0}%
        \contourtokenunderlinestate=0\relax%
        \@contour#2@%
}


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

\def\@uscore{_}
\def\@checkforspace{%
    \ifx\@token\@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\@@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%
        \let\token=\@token%
        % Code for typesetting token
        \contourtokencode%
        % 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{%
    \ifnum\contourmarkcount>1
        % Code for drawing contour
        \contourcode%
    \fi%
    \end{scope}%
}

\makeatother

\begin{document}

\begin{tabular}{c}
\\
\begin{tikzpicture}
    \contour[tokens follow contour]
        {|[10]_Where_ |[3]are you |[6]_go_|[1]ing?|[0]}
\end{tikzpicture} 

\\[0.5cm]

\begin{tikzpicture}
    \contour[tokens follow contour, box tokens, space token width=0.2cm]
       {|[10]_Where_ |[3]are you |[6]_go_ |[1]ing?|[0]}
\end{tikzpicture} 

\\[0.5cm]

\begin{tikzpicture}
    \contour[contour raise=0.5cm]
        {|[10]_Where_ |[3]are you |[6]_go_|[1]ing?|[0]}
\end{tikzpicture} 


\\[0.5cm]

\begin{tikzpicture}
    \contour[contour raise=0.5cm]
        {|[10]Where |[3]are |[3]_you_ |[5]go|[2]ing?|[0]}

    \contour[contour raise=0.5cm, contour only, contour/.append style={dashed}]
            {|[0]Where |[2]are |[8]you |[2]go|[2]ing?|[1]}

\end{tikzpicture} 

\\[1cm]

\begin{tikzpicture}
\contour[tokens follow contour,
    contour mark character=*] 
    {*[2]I *am  *[7]_{fi}na*lly_ *[4]go*ing *[2]_home_*[0]};
\end{tikzpicture} 
\\[0.5cm]
\begin{tikzpicture}
\contour[
    contour raise=0.5cm, 
    contour mark prefix=my contour,
    contour/.style={
        thick, 
        rounded corners=1mm,
        line cap=round,
        dotted},
    contour mark character=*] 
    {*[2]I *am  *[7]_{fi}na*lly_ *[4]go*ing *[2]home*[0].};

\path [draw=red, ->] ([yshift=0.25cm]my contour-2) -- ([yshift=0.25cm]my 
contour-3)
        node [midway, left] {\tiny rising};

\path [draw=red, ->] ([yshift=0.25cm]my contour-4) -- ([yshift=0.25cm]my 
contour-5)
    node [midway, right] {\tiny falling};

\end{tikzpicture}

\end{tabular}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Ich würde das berühmte\tikzmarkMakro und kombinieren Sie es mit Schnittpunktkoordinaten. Hier ist der Code:

\documentclass{standalone}
\usepackage{tikz}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture,baseline] \node [anchor=base] (#1) {};}%
\tikzstyle{intonation}=[rounded corners=2mm,yshift=1.5ex]
\begin{document}

\begin{tikzpicture}[remember picture]
\node{\tikzmark{w}Where \tikzmark{a}are \tikzmark{y}you \tikzmark{g}go\tikzmark{i}ing\tikzmark{q}?};
\draw[intonation] (w |- 0,1) -- (a |- 0,0.2) -- (y |- 0,0.2) -- (g |- 0,0.6) -- (q |- 0,0);
\end{tikzpicture}

\end{document}

Das \tikzmarkMakro speichert die Koordinaten des Punkts im Dokument, an dem es aufgerufen wird. Der Knotentext \tikzmark{w}Where \tikzmark{a}are...speichert also an verschiedenen Stellen im Satz die Koordinaten w, , usw.a

Wenn Aund BTikZ-Knoten oder -Koordinaten sind, dann (A |- B)ist der Schnittpunkt einer vertikalen Linie durch Aund einer horizontalen Linie durch B. Daher (w |- 0,1)hat alsXkoordinieren den Grundlinien-linken Punkt desmInWo, UndjKoordinate 1. Sie können diese ändernjKoordinate nach Wunsch für die anderen Koordinatennamen.

Hier ist das Ergebnis:

Beispielcodeausgabe

Möglicherweise können Sie ein Makro entwerfen, das den Text angibt/markiert und definiert,j-Werte im selben Argument. Aber das ist eine mögliche Implementierung.

Antwort3

Ich bin nicht sicher, ob ich die Koordinaten an den richtigen Stellen gesetzt habe (und \zzban zwei Punkten wiederverwendet habe), aber so etwas wie

Bildbeschreibung hier eingeben

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

\documentclass[a4paper,12pt, oneside]{article}

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

\makeatletter
\def\savecoordinate#1#2{\sbox0{#2}\edef#1{\strip@pt\wd0}}
\makeatother

\usepackage{tikz}

\begin{document}


\savecoordinate\zza{Where }
\savecoordinate\zzb{Where are you}
\savecoordinate\zzc{Where are you going?}

\begin{table}[hbtp]
\begin{tabular}{l}
\tikz[x=1pt,y=1mm,rounded corners=2mm] \draw[very thick, gray](0,10)--(\zza,2)--(\zzb,2)--(\zzb,6)--(\zzc,0); \\
\mbox{Where are you going?}
\end{tabular}
\end{table}

\end{document}

Antwort4

1.1

Das Problem ist nicht baseline. Eine Tikzpicture-Umgebung definiert eine Box (eine Tex-Box). Diese Box hat Tiefe und Höhe. Standardmäßig ist die Tiefe null und die Höhe ist die Höhe der Box. Das liegt daran, dass der untere linke Punkt die Grundlinie definiert. Im nächsten Code habe ich geschrieben, baseline=(current bounding box.east) weil ich keine Tabelle verwenden möchte. Ich denke, es ist sehr einfach, Objekte mit Tikz zu platzieren. Der Text \textit{neutral/default - stress represented by underlining}wird an der Mitte der Box ausgerichtet.

Bemerkung: Ich muss den Text einfügen, da es einen Zwischenschritt zum nächsten Text \mboxgibt .\overful box

Das Problem mitSindUndDuwird mit vermieden every node/.style={anchor=base}. Es ist ein Problem von Box und Tiefe. Die Box mit dem Buchstaben yhat eine große Tiefe. Mit anchor=basehaben alle Knoten die gleiche Grundlinie.

Letzte Anmerkung: Um das gleiche Ergebnis wie mit der tabellarischen Darstellung zu erhalten, habe ich show background bottomusw. verwendet.

\begin{table}[hbtp]
\begin{tikzpicture}[baseline=(current bounding box.east),every node/.style={anchor=base},show background top,show background bottom]
\path (0,1) node {\underline{Where}} (1,.2) node {are} (2,.2) node {you} (3,.6) node {\underline{go}} (4,0) node{ing?}; 
\end{tikzpicture}%
\mbox{\textit{neutral/default - stress represented by underlining}}%

\begin{tikzpicture}[baseline=(current bounding box.east),every node/.style={anchor=base},show background bottom] 
    \draw (0,0) node {Where} (1,1) node {\underline{are}} (2,.5) node {you} (3,.2) node {go} (4,0) node{ing?}; 
\end{tikzpicture}%
\mbox{\textit{e.g. in response to ``I'm not going to the shops after all.''}}%
\end{table}

1.2

Wenn Sie einen Knoten in einen Pfad einfügen, ist dieser Knoten nicht genau Teil des Pfads. Es ist ein Objekt, das an den Pfad angehängt ist, aber einige Optionen des Pfads werden für den Knoten nicht verwendet.

\draw node ...,bedeutet, dass \path[draw] node ... ; Sie sich entscheiden, den Pfad zu zeichnen, aber die drawOption des Pfads ist nicht die drawOption des Knotens. Wenn Sie den Pfad und den Knoten zeichnen möchten, müssen Sie schreiben\path[draw] node[draw] ... ;

1.3

Vollständiger Code und Ergebnis

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
\documentclass[a4paper,12pt, oneside]{article}

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

\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}

\section{Marking intonation using TikZ}

\subsection{Setting words on different levels}

\begin{table}[hbtp]
\begin{tikzpicture}[baseline=(current bounding box.east),every node/.style={anchor=base},show background top,show background bottom]
\path (0,1) node {\underline{Where}} (1,.2) node {are} (2,.2) node {you} (3,.6) node {\underline{go}} (4,0) node{ing?}; 
\end{tikzpicture}%
\mbox{\textit{neutral/default - stress represented by underlining}}%

\begin{tikzpicture}[baseline=(current bounding box.east),every node/.style={anchor=base},show background bottom] 
    \draw (0,0) node {Where} (1,1) node {\underline{are}} (2,.5) node {you} (3,.2) node {go} (4,0) node{ing?}; 
\end{tikzpicture}%
\mbox{\textit{e.g. in response to ``I'm not going to the shops after all.''}}%
\end{table}


\subsection{Final attempt}

\makeatletter
\xdef\tmp{}

\def\MarkWord(#1/#2){%
\node[anchor=base west,inner sep=0pt] (a) at (\xa,#2) {#1};
\path (a.west);\pgfgetlastxy{\xa}{\ya}
 \xdef\tmp{\tmp(\xa,#2)}%
\path (a.base east) -- ++(1 ex,0) coordinate (a);
\path (a);
\pgfgetlastxy{\xa}{\ya}
\global\let\xa\xa
}

\def\util@empty{}

\def\multiwords#1 #2\@nil{%
 \protected@edef\@temp{%
   \noexpand\MarkWord(#1)}\@temp
   \def\@nextArg{#2}%  
    \ifx\util@empty\@nextArg
       \let\next\@gobble
     \fi
   \next#2\@nil
    }

\def\MarkWords#1{% 
  \begingroup
    \path (0,0) coordinate (a);
    \xdef\xa{0}
   \let\next\multiwords
   \next#1 \@nil %    
\endgroup 
} 
\makeatother

\begin{tikzpicture}
    \MarkWords{Where/1 are/.2 you/.2 go/.6 ing?/0}
   \path[draw,red] (0,0) plot[smooth] coordinates{\tmp};
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen