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