musixTeX \islur... a \tslur...

Petr Mandys mandp0am at artax.karlin.mff.cuni.cz
Tue May 28 14:44:11 CEST 2002


To bude mozna problem...
Mne totiz tato makra fungovala jen pod jednou verzi musixTeXu

Upravami v musixlyr jsem docilil toho, aby se mi menila velikost
fontu textu v zavislosti na velikosti fontu not (prikaz \...notesize).

On Tue, 28 May 2002, Michal Měšťan wrote:

> >
> > No pojal jsem to trochu globalneji. Sazim vse v modu extract a sirku
> > notovych osnov resim na tri pruchody na urovni TeXu.
> >
> > Sazbu textu jsem provadel pomoci musixlyr, ale musel jsem si tam neco
> > upravovat...
> >
> > Pokud mate zajem, muzu vam poslat sva makra i upraveny musixlyr.tex
>
> Zajímalo. Pri tvorbe sveho stylu jsem ale nechtel rozbourat si,
> ci stat se zavislym na je jedne vezri musixtexu.
>
> Michal
> --
>     ^(w)^.
>
> mailto:Wohnivec at iol.cz
> P. S. doporucuji odpovidat sem, jinak se muze stat, ze reakce na
> majlik bude nekdy az tydny...
>
>
>
>
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Zpmacros.tex
Type: application/x-tex
Size: 14762 bytes
Desc: 
URL: <http://lists.felk.cvut.cz/pipermail/cstex/attachments/20020528/bb2b1026/attachment-0004.tex>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: musixlyr.tex
Type: application/x-tex
Size: 23810 bytes
Desc: 
URL: <http://lists.felk.cvut.cz/pipermail/cstex/attachments/20020528/bb2b1026/attachment-0005.tex>
-------------- next part --------------
%%

%% musixlyr.tex:  Convenient lyrics handling for MusiXTeX T.52 or later

%%

%% Copyright (C) 1996-1997  Rainer Dunker

%%

%% This program is free software; you can redistribute it and/or modify

%% it under the terms of the GNU General Public License as published by

%% the Free Software Foundation; either version 2 of the License, or

%% any later version.

%%

%% This program is distributed in the hope that it will be useful,

%% but WITHOUT ANY WARRANTY; without even the implied warranty of

%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

%% GNU General Public License for more details.

%%

%% You should have received a copy of the GNU General Public License

%% along with this program; if not, write to the Free Software

%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

%%

%% Author:

%%  Rainer Dunker

%%  Arnikastr. 4

%%  85591 Vaterstetten

%%  Germany

%%

%%  E-mail:  rainer.dunker at munich.ixos.de

%%

\ifx\undefined\lyr\else\endinput\fi

\immediate\write10{MusiXLYRics 1.1\space<18 December 1997>}



\makeatletter



%%%%%%%%%%

%

%  Register-Allokation

%

%%%%%%%%%%

% Array fuer Zuordnung von Textnamen zu Zeilennummer:

\expandafter\newtoks\csname zt1\endcsname

\expandafter\newtoks\csname zt2\endcsname

\expandafter\newtoks\csname zt3\endcsname

\expandafter\newtoks\csname zt4\endcsname

\expandafter\newtoks\csname zt5\endcsname

\expandafter\newtoks\csname zt6\endcsname

\expandafter\newtoks\csname zt7\endcsname

\expandafter\newtoks\csname zt8\endcsname

\expandafter\newtoks\csname zt9\endcsname

\expandafter\newtoks\csname zt10\endcsname

\expandafter\newtoks\csname zt11\endcsname

\expandafter\newtoks\csname zt12\endcsname



\newtoks\alle at texte



% Interne Parameter fuer Textausgabe:

\let\evtl at klein\empty

\let\evtl at komma\empty

\let\evtl at punktweg\empty

\let\evtl at offset\empty

\let\evtl at next@lyr\empty

\newif\if at strich

\newif\iflyr at processing

\newif\if at pmx@nextvoice

\newif\if at lyrmode

\newdimen\lyr at shift

\newbox\lyr at box

\newbox\lyr at hyphen@box

\newbox\lyr at linkbox

\newbox\lyr at linkdepthbox

\def\zt at reg{zt}



\let\text at name\empty



% Oeffentlich zugaengliche Parameter:

\newif\ifleftlyr

\newif\ifforcelyrhyphens

\newif\ifshowlyrshift

\newdimen\minlyrrulelength     \minlyrrulelength=2mm

\newdimen\minmulthyphens       \minmulthyphens=1.5cm

\newdimen\minlyrspace          \minlyrspace=3pt

\def\lyrhyphenchar{-}

\newbox\lyrstrutbox





%%%%%%%%%%

%

%  Text-Definition

%

%%%%%%%%%%

% Text komplett erstellen:

\def\setlyrics#1#2{%   iterative Variante

  % Parameter:

  % #1 - Textname

  % #2 - Text

  \def\@rohtext{#2 -}%

  \def\@text{}%

  \loop

   \ifx\@rohtext\empty \let\@weiter n\else \let\@weiter j\fi

   \ifx\@weiter j%

    \expandafter\@setzetext\@rohtext\ende

  \repeat

  \expandafter\let\csname dertext@#1\endcsname\@text

  \expandafter\let\csname nochtext@#1\endcsname\@text

  \alloc at verse{#1}}



% Bindestriche von Silben abtrennen:

\def\@setzetext#1-#2\ende{%

  % #1: Text vor erstem Strich

  % #2: Text nach erstem Strich; evtl. leer

  \def\@resttext{#2}%

  \ifx\@resttext\empty  % -> kein Strich im Text

   \expandafter\def\expandafter\@text\expandafter{\@text#1}%

   \def\@rohtext{}%

  \else                 % -> Strich vorhanden

   \expandafter\def\expandafter\@text\expandafter{\@text#1 @}%

   \def\@rohtext{#2}%

  \fi}



% Ganzen Text unter anderen Namen kopieren:

\def\copylyrics#1#2{%

  % #1 - vorhandener Textname

  % #2 - neuer Textname

  % Text noch nicht definiert?

  \expandafter\ifx\csname stp@#1\endcsname\relax

    \errmessage{Textname "#1" nicht definiert}

  \fi

  {\expandafter\let\expandafter\@text\csname dertext@#1\endcsname

   \expandafter\global\expandafter\let\csname dertext@#2\endcsname\@text

   \expandafter\global\expandafter\let\csname nochtext@#2\endcsname\@text}%

  \alloc at verse{#2}}



% Bei 1. Definition eines Textnamens:

\def\alloc at verse#1{%

  \expandafter\ifx\csname stp@#1\endcsname\relax

    {% Groesse fuer Silbentrenn-Startposition allokieren:

     \def\@newdimen{newdimen}% durch Gruppierung lokal

     \expandafter\csname\expandafter\@newdimen\expandafter\endcsname

       \csname stp@#1\endcsname

     % Register fuer Kontextbefehle:

     \def\@newtoks{newtoks}% durch Gruppierung lokal

     \expandafter\csname\expandafter\@newtoks\expandafter\endcsname

       \csname cont@#1\endcsname

     % Register fuer Layoutdefinitionen:

     \expandafter\csname\expandafter\@newtoks\expandafter\endcsname

       \csname llay@#1\endcsname

     % Auto-Text einschalten:

     \def\text at name{#1}%

     \lyricson}%

    % Flag fuer Zwischenraum-Status:

    \expandafter\gdef\csname zwr@#1\endcsname{0}%

    % In Namenliste eintragen:

    \global\alle at texte=\expandafter{\the\alle at texte#1,}%

  \fi}



% Textnamen einer Notenzeile zuordnen:

\def\assignlyrics#1#2{%

  % #1: Zeilennummer arabisch

  % #2: Textname(n)

  % Am weitesten rechts liegende Startposition der bisher

  % zugeordneten Textzeilen ermitteln:

  \y at v=0pt\relax

  \edef\@texte{\the\csname\zt at reg#1\endcsname}%

  \loop

    \ifx\@texte\empty\let\weiter n\else\let\weiter j\fi

    \if\weiter j%

      \expandafter\get at right@stp\@texte\ende

  \repeat

  % Neue Textzeilenliste nichtleer -> Komma anhaengen:

  \def\@texte{#2}%

  \ifx\@texte\empty

    \global\csname\zt at reg#1\endcsname={}%

  \else

    \global\csname\zt at reg#1\endcsname={#2,}%

  \fi

  \edef\@texte{\the\csname\zt at reg#1\endcsname}%

  % Parameter der neu zugewiesenen Textzeilen entspr. einstellen:

  \loop

    \ifx\@texte\empty\let\weiter n\else\let\weiter j\fi

    \if\weiter j%

      \expandafter\reset at params\@texte\ende

  \repeat}



\def\get at right@stp#1,#2\ende{%

  \def\@texte{#2}%

  % Startpos. von #1 groesser als bisher ermittelt?

  \expandafter\ifdim\csname stp@#1\endcsname > \y at v

    \y at v=\csname stp@#1\endcsname

  \fi}



\def\reset at params#1,#2\ende{%

  \def\@texte{#2}%

  \global\csname stp@#1\endcsname=\y at v

  \global\expandafter\def\csname zwr@#1\endcsname{0}}



%

% Horizontale Positionierungsparameter aller Textzeilen zuruecksetzen:

%

\def\resetlyrics{%

  \edef\@texte{\the\alle at texte}%

  \y at v=0pt\relax

  \loop

    \ifx\@texte\empty\let\weiter n\else\let\weiter j\fi

    \if\weiter j%

      \expandafter\reset at params\@texte\ende

  \repeat}





%%%%%%%%%%

%

%  Text strophenweise abarbeiten

%

%%%%%%%%%%

% Dieselbe Aktion fuer alle Strophen:

\def\forall at verses#1{%

  % #1: Durchzufuehrende Aktion

  \ifx\text at name\empty

    % Aktion fuer alle zugeordneten Textnamen ausfuehren:

    {\edef\@texte{\the\csname\zt at reg\number\noinstrum at nt\endcsname}%

     \C at tx{%

       \offinterlineskip

       \loop

	 \ifx\@texte\empty \let\weiter n\else \let\weiter j\fi

	 \if\weiter j%

	   \expandafter\forone at verse\@texte\ende{#1}%

       \repeat

       \vss}}%

  \else

    % Textname bereits vorgewaehlt -> nur fuer diesen Aktion ausfuehren:

    #1%

  \fi}



\def\forone at verse#1,#2\ende#3{%

  \def\text at name{#1}%

  \def\@texte{#2}%

  % Aktion durchfuehren:

  \hbox{\lyr at strut#3}}



% Pro Strophe 1 Aktion angeben:

\def\verses#1{{%

  % #1: Komma-separierte Aufzaehlung der Aktionen von oben nach unten

  \edef\@texte{\the\csname\zt at reg\number\noinstrum at nt\endcsname}%

  % Parameter fuer Iteration: Textnamen + Aktionen

  \expandafter\def\expandafter\@param\expandafter{\@texte\ende1#1,\ende2}%

  \C at tx{%

    \offinterlineskip

    \loop

      \ifx\@texte\empty \let\weiter n\else \let\weiter j\fi

      \if\weiter j%

	\expandafter\one at verse\@param

    \repeat

    \vss}}}



\def\one at verse#1,#2\ende1#3,#4\ende2{%

  \def\text at name{#1}%

  \def\@texte{#2}%

  \def\@param{#2\ende1#4,\ende2}%

  % Aktion durchfuehren:

  \hbox{\lyr at strut#3}}





%%%%%%%%%%

%

% Zeilenabstand bei mehreren Versen

%

%%%%%%%%%%

\def\lyr at strut{\copy\lyrstrutbox}

\def\setlyrstrut{% Stuetze anhand des aktuellen Fonts einrichten

  \setbox0=\hbox{()}%

  \setbox\lyrstrutbox=\hbox{\vrule height 1.1\ht0 depth 1.1\dp0 width\z@}}

\setlyrstrut     % initialisieren



%%%%%%%%%%

%

%  Text silbenweise abrufen

%

%%%%%%%%%%

\def\next at lyr{%

  \expandafter\let\expandafter\@nochtext\csname nochtext@\text at name\endcsname

  \ifx\@nochtext\empty

    % Kein Text mehr vorraetig:

    \@lyric0{???}%

  \else

    \expandafter\@schreibetext\@nochtext\relax\relax

  \fi}



\def\@schreibetext#1 #2#3\relax{%

  % Parameter:

  % #1 - erste Silbe

  % #2 - evtl. Bindestrich-Zeichen @,

  %      evtl. \relax (wenn Text nach #2 zu Ende),

  %      sonst 1. Zeichen vom Resttext

  % #3 - Resttext, evtl. leer

  % Ist #2 ein Bindestrich-Zeichen?

  \ifx @#2%

    \@lyric 1{\evtl at klein{\evtl at punktweg{#1}}\evtl at komma}%

    % Resttext ohne Strichzeichen:

    \expandafter\gdef\csname nochtext@\text at name\endcsname{#3}%

  \else

    \@lyric 0{\evtl at klein{\evtl at punktweg{#1}}\evtl at komma}%

    % Resttext (#2 war kein Bindestrich-Zeichen) setzen:

    \ifx#2\relax%		 #1 war letzte Silbe

      % Resttext leer:

      \expandafter\global\expandafter\let

       \csname nochtext@\text at name\endcsname\empty

    \else

      \expandafter\gdef\csname nochtext@\text at name\endcsname{#2#3}%

    \fi

  \fi}



\def\@lyric#1#2{%

  % Parameter:

  % #1: 1 -> Bindestrich initiieren; kein Verl.-Strich, auch wenn verlangt

  %     0 -> kein Bindestrich

  % #2: Text

  \evtl at offset

    % Alles Folgende ist Argument fuer obiges \evtl at offset:

    {\the\csname llay@\text at name\endcsname% Layoutkontext abrufen

     \lyr at processingtrue

     \setbox\lyr at box=\hbox{#2}%

     \setbox\lyr at hyphen@box=\hbox{\lyrhyphenchar}%

     % Zwischenraum zu voriger Silbe ermitteln:

     \get at lyrspace

     \ifleftlyr\else

       % Silbe zentriert -> Zwischenraum entspr. kleiner:

       \advance\y at v -0.5\wd\lyr at box%

       \advance\y at v  0.5\qn at width%    halbe Notenkopfbreite dazu

     \fi

     % Bindestrich von voriger Silbe anhaengig?

     \expandafter\ifnum\csname zwr@\text at name\endcsname=1

       % Minimalzwischenraum entsprechend aendern:

       \ifforcelyrhyphens

         % Min. Zw.-R. mindestens so breit wie Bindestrich:

         \ifdim\minlyrspace < \wd\lyr at hyphen@box

           \minlyrspace=\wd\lyr at hyphen@box

         \fi

       \else

         \minlyrspace=0pt\relax      % kein Zwischenraum noetig

       \fi

     \fi

     \ifdim\y at v < \minlyrspace       % Zwischenraum zu klein?

       \lyr at shift=\minlyrspace       % Silbe um Differenz nach rechts verschieben

       \advance\lyr at shift -\y at v

       \y at v=\minlyrspace             % Zwischenraumbreite = geg. Minimum

     \else

       \expandafter\ifnum\csname zwr@\text at name\endcsname=1 % Bindestrich anhaengig?

         \ifforcelyrhyphens\else                            % Bindestrich nicht erzwungen?

           \ifdim\y at v < \wd\lyr at hyphen@box                  % Zwischenraum zu schmal?

             \advance\lyr at shift -\y at v                       % => Zw.raum ganz wegnehmen

	     % Dank an Sebastian Clauss fuer diese Verbesserung

           \fi

         \fi

       \fi

     \fi

     \rlap{%

       \hskip\lyr at shift

       {\ifleftlyr

          \aftergroup\rlap    % linksbuendig

        \else

          \aftergroup\qlrlap  % zentriert

        \fi}%

       % Alles Folgende ist Argument fuer obiges \qlrlap bzw. \rlap:

       {% Ist von voriger Silbe noch ein Bindestrich anhaengig?

        \expandafter\ifnum\csname zwr@\text at name\endcsname = 1%

          % Bindestrich nur setzen, wenn Platz genug vorhanden:

          \ifdim\y at v < \wd\lyr at hyphen@box\else

            \print at hyphen

          \fi

        \fi

        \ifshowlyrshift

          % Mit Rechteck Wortverschiebung zeigen:

          \llap{\vrule width \lyr at shift height \ht\strutbox}%

        \fi

        \unhcopy\lyr at box     % Wort setzen

        % Startposition des nachfolgenden Zwischenraums festhalten:

        \getcurpos

        \advance\y at v by \lyr at shift

        \ifleftlyr

          \advance\y at v \wd\lyr at box

        \else

          \advance\y at v 0.5\wd\lyr at box

          \advance\y at v 0.5\qn at width                   % halbe Notenkopfbreite dazu

        \fi

        \global\csname stp@\text at name\endcsname=\y at v  % Startposition setzen

        \if 1#1%          Bindestrich gefordert?

          \expandafter\gdef\csname zwr@\text at name\endcsname{1}%

        \else

	  \if at strich    % Verlaengerungs-Strich gefordert?

            \expandafter\gdef\csname zwr@\text at name\endcsname{2}%

          \else         % nichts gefordert

            \expandafter\gdef\csname zwr@\text at name\endcsname{0}%

          \fi

        \fi}}}}



\def\print at hyphen{%

  \llap{\hbox to \y at v{%

    % Zwischenraum mit "Strich-Kette" ausfuellen:

    \loop

      \hfil\lyrhyphenchar\hss% rechter Raum darf am Systemende negativ werden

      \advance\y at v by -\minmulthyphens

      \ifdim\y at v > 0pt%

    \repeat}}}



\def\get at lyrspace{%

  \getcurpos

  \advance\y at v by -\csname stp@\text at name\endcsname}



% Verlaengerungs-Striche abschliessen:

\def\lyrruleend{\forall at verses\lyrrule at end}



\def\lyrrule at end{%

  \expandafter\ifcase\csname zwr@\text at name\endcsname

    % 0 -> Bindestrich von vorigem System anhaengig -> Einstellung fuer

    %      spaeteres Einfuegen setzen:

    \expandafter\gdef\csname zwr@\text at name\endcsname{1}%

  \or

    % 1 -> Bindestrich anhaengig -> nichts tun

  \or

    % 2 -> Strich anhaengig:

    \roff{% Zum rechten Notenkopf-Rand

      \get at lyrspace\print at lyr@rule

      % Zwischenraum-Startposition festhalten, wenn Wort nicht nach

      % rechts darueber hinausragt:

      \getcurpos

      \expandafter\ifdim\csname stp@\text at name\endcsname < \y at v

	\global\csname stp@\text at name\endcsname=\y at v

      \fi}%

    % Einstellung zuruecksetzen:

    \expandafter\gdef\csname zwr@\text at name\endcsname{0}%

  \fi}



\def\print at lyr@rule{%

  % Kleiner Zwischenraum zur vorherigen Silbe:

  \advance\y at v by -2pt%

  \ifdim \y at v > \minlyrrulelength

    \llap{\vrule\@width\y at v\@height\lthick\@depth0pt}%

  \fi}



%%%%%%%%%%

%

%  Textstellen per Label anspringen

%

%%%%%%%%%%

\def\llabel#1{}%   Damit Kennzeichnung bei der Ausgabe ohne Effekt bleibt



\def\golyr#1{\forall at verses{\@golyr{#1}}}



\def\@golyr#1{{%

  \expandafter\let\expandafter\@nochtext\csname dertext@\text at name\endcsname

  \def\query at label{#1}%

  \loop

    \expandafter\find at llabel\@nochtext\ende

    \ifx\query at label\cur at label\let\@weiter n\else \let\@weiter j\fi

  \if\@weiter j\repeat

  \expandafter\global\expandafter\let

    \csname nochtext@\text at name\endcsname\@nochtext}}



\def\find at llabel#1\llabel#2#3\ende{%

  % #1 - Text vor erstem \llabel

  % #2 - naechstfolgender \llabel-Name

  % #3 - Resttext

  \def\cur at label{#2}%

  \def\@nochtext{#3}}



%%%%%%%%%%

%

%  Offene Silbentrennungen und -verlaengerungen am Systemende abschliessen

%

%%%%%%%%%%

\let\@orig at z@suspend\z at suspend

\def\z at suspend{%

  \znotes\sysend at lyrics\en

  \ifx\auxlyr at active\relax \znotes\aux at sysend@lyrics\en \fi

  \@orig at z@suspend}



\def\sysend at verse{%

  % Flag auswerten:

  \expandafter\ifcase\csname zwr@\text at name\endcsname

    % 0 -> fertig;

  \or

    % 1 -> Bindestrich anhaengig:

    \the\csname llay@\text at name\endcsname% Layoutkontext abrufen

    \get at lyrspace

    \print at hyphen

    % Einstellung zuruecksetzen:

    \expandafter\gdef\csname zwr@\text at name\endcsname{0}%

  \or

    % 2 -> Verlaengerungs-Strich anhaengig:

    % Platz zum rechten Systemrand, damit Strich nicht in Taktstrich ragt:

    \loffset{0.3}{\get at lyrspace\print at lyr@rule}%

  \fi

  % Startposition fuer naechstes System zuruecksetzen:

  \global\csname stp@\text at name\endcsname=0pt}



\def\sysend at lyrics{%

  \forall at verses\sysend at verse

  % Schleife ueber Zeilen:

  {\ifnum\noinstrum at nt<\nbinstruments

     \aftergroup\nextinstrument

     \aftergroup\sysend at lyrics

   \fi}}



\def\aux at sysend@lyrics{%

  \auxlyr{\forall at verses\sysend at verse}%

  % Schleife ueber Zeilen:

  {\ifnum\noinstrum at nt<\nbinstruments

     \aftergroup\nextinstrument

     \aftergroup\aux at sysend@lyrics

   \fi}}



%%%%%%%%%%

%

%  Zeilenspezifisches Layout festlegen

%

%%%%%%%%%%

\def\lyrlayout#1{%

  \forall at verses{%

    \global\csname llay@\text at name\endcsname={#1}%

    % Wenn gerade Text verarbeitet wird, Kontext sofort abrufen:

    \iflyr at processing

      \the\csname llay@\text at name\endcsname

    \fi}}



%

% Kontextbehandlung fuer Textnamen:

%

% Aktion zu Kontext hinzufuegen:

\def\add at context#1{%

  \global\csname cont@\text at name\endcsname

    =\expandafter{\the\csname cont@\text at name\endcsname #1}}



% Kontext abrufen:

\def\@context{%

  \edef\der at kontext{\the\csname cont@\text at name\endcsname}%

  \clear at context

  \der at kontext}



% Kontext loeschen:

\def\clear at context{\global\csname cont@\text at name\endcsname={}}



%%%%%%%%%%

%

%  Zusaetzliche Textzeilen oberhalb der Notenzeile (auxiliary lyrics)

%

%%%%%%%%%%

% auxlyrics aktivieren (12 Token-Register gespart, wenn nicht gebraucht):

\def\enableauxlyrics{%

  \global\let\auxlyr at active\relax

  \global\let\pmx at auxmode\lyrmode at aux

  {\def\@newtoks{newtoks}%

   \count0=0\relax

   \loop

     \advance\count0 by 1\relax

     \expandafter\csname\expandafter\@newtoks\expandafter\endcsname

	\csname azt\number\count0\endcsname

     \expandafter\gdef\csname assr\number\count0\endcsname{0pt}%

   \ifnum\count0 < 12\repeat}}



% Befehle auf auxlyrics beziehen:

\def\auxlyr#1{{%

  \def\zt at reg{azt}%

  \expandafter\setsongraise\expandafter\noinstrum at nt

    \expandafter{\csname assr\number\noinstrum at nt\endcsname}%

  #1}}



% Vertikale Position einstellen:

\def\auxsetsongraise#1#2{%

  \expandafter\def\csname assr#1\endcsname{#2}}



%%%%%%%%%%

%

%  Textsatz-Automatik

%

%%%%%%%%%%

% Text automatisch unter alle "spacing"-Noten eines Systems:

\let\orig at writ@note\writ at note

\def\writ at note{%

  \ifnum\n at i<\@c        % Bedingung fuer's Notenschreiben in \writ at note (warum?)

%    \ifx\st at m\beamst at m

%      \uptext{\csname s at bl\balken at nr\endcsname}%

%    \else

    \decide at lyrmode

    \main at aux@or at not{\forall at verses{\@context\evtl at next@lyr}}%

%    \fi

  \fi

  \orig at writ@note}



\def\lyrmode at no  {\def\main at aux@or at not##1{}}

\def\lyrmode at main{\def\main at aux@or at not##1{##1}}

\def\lyrmode at aux {\let\main at aux@or at not\auxlyr}

\let\pmx at auxmode\lyrmode at no               % initial keine auxlyrics mit PMX



% Feststellen, ob Haupt- oder Nebentext oder gar nichts gesetzt werden soll:

\ifx\nextvoice\undefined    % ohne PMX

  \def\decide at lyrmode{%

    \csname zlm@\number\noinstrum at nt\endcsname % Einstellung der akt. Zeile abfragen

    \if at lyrmode  \decide at stem@direction        % Notenhals-Automatik

    \else                                      % manuell, nur "spacing"-Noten

      \ifadvance \lyrmode at main

      \else      \lyrmode at no

      \fi

    \fi}

  \def\decide at stem@direction{%

    % reset set beam

    % down down at flag

    % up up at flag

    \ifx\st at m\upst at m   \lyrmode at aux \else

    \ifx\st at m\up at flag  \lyrmode at aux \else

    \ifx\st at m\downst at m \lyrmode at main\else

    \ifx\st at m\down at flag\lyrmode at main\else

    \ifx\st at m\setst at m  \lyrmode at no  \else    % kein Hals

    \ifx\st at m\resetst at m\lyrmode at no  \else

    \ifx\st at m\beamst at m

      \expandafter\ifx\csname s at bl\balken at nr\endcsname o\lyrmode at aux

      \else\lyrmode at main

      \fi

    \else\errmessage{invalid \string\st at m\space setting}%

    \fi\fi\fi\fi\fi\fi\fi}

\else                       % mit PMX

  \def\decide at lyrmode{%

    \ifadvance              % nur "spacing"-Noten

      \csname zlm@\number\noinstrum at nt\endcsname % Einstellung der akt. Zeile abfragen

      \if at pmx@nextvoice     % Oberstimme

	\if at lyrmode\lyrmode at main \else\pmx at auxmode  \fi

      \else                 % Unterstimme

	\if at lyrmode\pmx at auxmode  \else\lyrmode at main \fi

      \fi

    \else

      \lyrmode at no           % non-spacing Note

    \fi}

  \let\orig at nextvoice\nextvoice         % \nextvoice erweitern

  \def\nextvoice{\orig at nextvoice\@pmx at nextvoicetrue}

\fi



% lyrmode umschalten:

\def\switch at lyrmode#1#2{%

  \ifnum#1=0                 % alle Zeilen einbeziehen

    \count@\z@               % vgl. TeXbook S. 346

    \loop

      \ifnum\count@<12

	\advance\count@\@ne

	\switch at lyrmode{\number\count@}#2%

      \repeat

  \else                      % nur 1 Zeile

    \global\expandafter\let\csname zlm@#1\endcsname=#2%

  \fi}

% ... nicht wahnsinnig effizient, zugegeben ...



\def\lyrmodenormal#1{\switch at lyrmode{#1}\@lyrmodefalse}

\def\lyrmodealter #1{\switch at lyrmode{#1}\@lyrmodetrue }



\lyrmodenormal0              % auf "normal" initialisieren



% fuer Halsrichtungs-Automatik: Balkenlage in \s at bl<nr> vermerken

\def\balk at nlage#1{\global\expandafter\let\csname s at bl\balken at nr\endcsname #1\relax}

\let\orig at i@bu\i at bu \def\i at bu{\balk at nlage o\orig at i@bu}% <o>ben

\let\orig at i@bl\i at bl \def\i at bl{\balk at nlage u\orig at i@bl}% <u>nten



\let\orig at s@l at ctbeam\s at l@ctbeam

\def\s at l@ctbeam#1\relax{\orig at s@l at ctbeam#1\relax \xdef\balken at nr{\number\n at i}}





% Auto-Text ein- und ausschalten (innerhalb \notes...\enotes):

\def\lyricson{\forall at verses{\add at context\verse at on@context}}

\def\verse at on@context{%

  \let\evtl at next@lyr\next at lyr

  \add at context\verse at on@context}



\def\lyricsoff{\forall at verses\clear at context}



% Silben abseits vom Haupttext ausgeben (Haupttext dabei unterdruecken):

\def\lyric#1{\forall at verses{\@context\@lyric 0{#1}\nolyr}}

\def\lyrich#1{\forall at verses{\@context\@lyric 1{#1}\nolyr}}   % mit Bindestrich



% Manipulationen einzelner Haupttext-Silben:

\def\forall at context#1{\forall at verses{\add at context{#1}}}



% 1 Silbe ausgeben:

\def\lyr{\forall at verses{\@context\next at lyr}}



% Linksbuendig:

\def\llyr{\forall at context{\leftlyrtrue}}



% Verlaengerungs-Strich:

\def\lyrrule{\forall at context{\@strichtrue}}



% Horizontale Verschiebung (analog \roffset):

\def\lyroffset#1{\forall at context{\def\evtl at offset{\roffset{#1}}}}



% Kein automatischer Text:

\def\nolyr{\forall at context{\let\evtl at next@lyr\empty}}



% Kleinbuchstaben:

\def\lclyr{\forall at context{\let\evtl at klein\@klein}}

\def\@klein#1{\lowercase\expandafter{#1}}



% Satzzeichen anhaengen:

\def\lyrpt#1{\forall at context{\def\evtl at komma{#1}}}



% Punkt vom Ende abschneiden:

\def\lyrnop{\forall at context{\let\evtl at punktweg\@punktweg}}

\def\@punktweg#1{{\punktweg at rek#1\ende}}

\def\punktweg at rek#1#2\ende{%

  \def\par at ii{#2}%

  \ifx\par at ii\empty\else

    \aftergroup#1%

    \expandafter\punktweg at rek\par at ii\ende

  \fi}



% Melisma beginnen und abschliessen:

\def\beginmel{\forall at verses{\llyr\lyrrule\add at context\lyricsoff}}

\def\endmel{\forall at verses{\lyrruleend\add at context\lyricson}}



%

% Bindebogen unter zwei Silben derselben Note:

%

\def\lyrlink{\lyr at link0}

\def\lowlyrlink{\lyr at link1}



\def\lyr at link#1{%

  % Bogen erstellen:

  \setbox\lyr at linkbox=\hbox{$\smile$}%

  % In Box der Breite eines Wortzwischenraums einsetzen:

  \setbox\lyr at linkbox=\hbox to \the\fontdimen2\the\font{%

    \hss

    % Unter die Grundlinie druecken:

    \lower\ht\lyr at linkbox\hbox{%

      % Zusaetzlicher vertikaler Abstand zur Wortunterseite:

      \lower1pt\hbox{%

	\if#10\relax

	  \hbox{$\smile$}%

	\else

	  % Buchstabe mit Unterlaenge -> auch darunter druecken:

	  \setbox\lyr at linkdepthbox=\hbox{y}%

	  \lower\dp\lyr at linkdepthbox\hbox{$\smile$}%

	\fi}}%

    \hss}%

  % Keine zusaetzliche Tiefe fuer Bogen anrechnen:

  \dp\lyr at linkbox=0pt\relax

  % Bogen setzen:

  \box\lyr at linkbox}



\makeatother



More information about the csTeX mailing list