diff options
author | Norbert Preining <preining@logic.at> | 2010-11-01 10:17:57 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2010-11-01 10:17:57 +0000 |
commit | 124ab1aa006529a0f1a3fa7c5fa7712e8eb558bf (patch) | |
tree | c5d4002cc3f3d1b2b2e7ca6804d0d012f6390fc6 /Master/texmf-dist/tex | |
parent | 6355d556f7d2698c4d2e0b2a5641737b2005c029 (diff) |
remove musixlyr package, it has been incorporated into musixtex
git-svn-id: svn://tug.org/texlive/trunk@20287 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/musixlyr/musixlyr.tex | 1102 |
1 files changed, 0 insertions, 1102 deletions
diff --git a/Master/texmf-dist/tex/generic/musixlyr/musixlyr.tex b/Master/texmf-dist/tex/generic/musixlyr/musixlyr.tex deleted file mode 100644 index 2143d8c5190..00000000000 --- a/Master/texmf-dist/tex/generic/musixlyr/musixlyr.tex +++ /dev/null @@ -1,1102 +0,0 @@ -%% -%% musixlyr.tex: Convenient lyrics handling for MusiXTeX T.52 or later -%% -%% Copyright (C) 1996-2001 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 -%% Wachtelweg 31 -%% 85591 Vaterstetten -%% Germany -%% -%% E-mail: rainer.dunker@web.de -%% -\ifx\undefined\lyr\else\endinput\fi -\immediate\write10{MusiXLYRics 2.0c\space<December 06, 2001>} - -\makeatletter - -%%%%%%%%%% -% -% register allocation -% -%%%%%%%%%% -\newtoks\alle@texte - -% internal parameters for setting text -\let\evtl@klein\empty -\let\evtl@komma\empty -\let\evtl@punktweg\empty -\let\evtl@offset\empty -\let\evtl@next@lyr\empty -\newif\if@strich -\newif\iflyr@processing -\newif\if@pmx@nextvoice -\newif\if@lyrmode -\newif\if@hyphen -\newif\ifaux@active -\newif\if@single@token -\newdimen\lyr@shift -\newbox\lyr@box -\newbox\lyr@hyphen@box -\newbox\lyr@linkbox -\newbox\lyr@linkdepthbox -\def\ma@sw{lyr@m} % "main/aux switch" - -% helpers for shuffling data around -\newtoks\@rohtext -\newtoks\@textvar - -\let\text@name\empty - -% public parameters -\newif\ifleftlyr -\newif\ifforcelyrhyphens -\newif\ifshowlyrshift -\newdimen\minlyrrulelength \minlyrrulelength=2mm -\newdimen\minmulthyphens \minmulthyphens=1.5cm -\newdimen\minlyrspace \minlyrspace=3pt -\def\lyrhyphenchar{-} -\newbox\lyrstrutbox - -\def\lyrlog#1{\immediate\write16{#1}} % just for debugging convenience - -% for testing token lists for emptyness with \ifx -\def\emp@tst{\empty@test@errmsg} -\def\empty@test@errmsg{% - \errmessage{This shouldn't happen; you have found a musixlyr bug}} - -%%%%%%%%%% -% -% lyrics definition -% -%%%%%%%%%% -% set up text completely -\def\setlyrics#1#2{% iterative variant - % Parameter: - % #1 - lyrics line name - % #2 - text - \@rohtext={#2 -}% - \@textvar={}% - %\lyrlog{setlyrics{#1}, raw text: \the\@rohtext}% - \loop - \expandafter\ifx\expandafter\emp@tst\the\@rohtext\emp@tst % no more text - \let\@weiter n\else \let\@weiter j% - \fi - \ifx\@weiter j% - \expandafter\split@lyr@by@hyphens\the\@rohtext\@end - \repeat - \expandafter\xdef\csname dertext@#1\endcsname{\the\@textvar}% - \expandafter\xdef\csname nochtext@#1\endcsname{\the\@textvar}% - %\lyrlog{setlyrics{#1}: \the\@textvar}% - \initialize@verse{#1}} - -% separate hyphens from syllables -\def\split@lyr@by@hyphens#1-#2\@end{% - % #1: text before first hyphen - % #2: text after first hyphen; may be empty - \ifx\emp@tst#2\emp@tst % -> no hyphen present - \@textvar=\expandafter{\the\@textvar#1}% - \else % -> hyphen present - \@textvar=\expandafter{\the\@textvar#1 @}% - \fi - \@rohtext={#2}% - %\lyrlog{splitlyrics 1: \the\@textvar}% - %\lyrlog{splitlyrics 2: \the\@rohtext}% - } - -% copy whole text under different name -\def\copylyrics#1#2{% - % #1 - existing text name - % #2 - new text name - % text still undefined? - \expandafter\ifx\csname dertext@#1\endcsname\relax - \errmessage{Trying to copy undefined verse "#1" to "#2"}% - \setlyrics{#2}{UNDEFINED}% - \else - \expandafter\let\expandafter\text@copy\csname dertext@#1\endcsname - \global\expandafter\let\csname dertext@#2\endcsname\text@copy - \global\expandafter\let\csname nochtext@#2\endcsname\text@copy - \initialize@verse{#2}% - \fi} - -% at 1st definition of a text name -\def\initialize@verse#1{% - % test whether lyrics line name already defined - \expandafter\ifx\csname stp@#1\endcsname\relax - \expandafter\gdef\csname stp@#1\endcsname{0pt}% tracks horizontal progress - \global\expandafter\let\csname cont@#1\endcsname\relax% context stuff - \expandafter\gdef\csname zwr@#1\endcsname{0}% flag for hyphen/rule status - % for layout definitions - \global\expandafter\let\csname llay@#1\endcsname\relax - % switch on auto-text - {\def\text@name{#1}\lyricson}% - % insert in list of all defined text names - \global\alle@texte=\expandafter{\the\alle@texte#1,}% - \fi} - -% just for more elegance ... -\def\if@multistaff{\ifnum\st@ffs>1 } - -\def\set@texte#1#2{% - % assign assigned lyrics lines to \@texte - % or \empty in case they are empty - % #1: instrument number - % #2: staff number of instrument - \expandafter\let\expandafter\@texte\csname\ma@sw#1-#2\endcsname - \ifx\@texte\relax\let\@texte\empty\fi} - -\def\set@texte@current#1{% - % apply \set@texte to current context - % using PMX, automatically switch to aux lyrics where required - \switch@pmx@aux{% - % get the verses - \ifnum\st@ffs>1 % multi-staff instrument - \set@texte{\the\noinstrum@nt}{\the\noport@@}% - \else - \set@texte{\the\noinstrum@nt}{1}% - \fi - % perform given action - #1}} - -\def\loop@texte#1\@repeat{% - % assumption: \@texte is already set properly, may be empty - % #1: action to be executed - \ifx\@texte\empty\else - \expandafter\loop@texte@step\@texte\@end{#1}% - \fi} - -\def\loop@texte@step#1,#2\@end#3{% - % assumption: text list is not empty, #1 contains list head - % #1: text list head - % #2: text list tail - % #3: action to be executed - % - % perform action on first text - \def\text@name{#1}% - #3\relax - % - % prepare iteration - \ifx\emp@tst#2\emp@tst % list tail empty - \let\@iterate \empty % stop looping - \let\text@name\empty % reset working environment - \else - \def\@iterate{\loop@texte@step#2\@end{#3}}% - \fi - \@iterate} - -% assign text name to staff -\def\assignlyrics#1{% for single-staff instruments - % #1: instrument number - \assignlyricsmulti{#1}1} - -\def\assignlyricshere#1{% assign lyrics to current instrument/staff context - % #1: comma-separated list of text names - \switch@pmx@aux{% - \ifnum\st@ffs>1 % multi-staff instrument - \assignlyricsmulti{\the\noinstrum@nt}{\the\noport@@}{#1}% - \else - \assignlyrics{\the\noinstrum@nt}{#1}% - \fi}} - -\def\assignlyricsmulti#1#2#3{% - % #1: instrument number - % #2: staff number of instrument - % #3: comma-separated list of text names - % gather farthest right current position - % of currently assigned lyrics lines - \y@v=0pt - \set@texte{#1}{#2}% - \loop@texte - % starting position greater than retrieved so far? - \ifdim\csname stp@\text@name\endcsname > \y@v - \y@v=\csname stp@\text@name\endcsname % advance maximum - \fi - \@repeat - % - % new text names list non-empty -> append comma - \ifx\emp@tst#3\emp@tst - \expandafter\global\expandafter\let\csname\ma@sw#1-#2\endcsname\relax - \else - \expandafter\gdef\csname\ma@sw#1-#2\endcsname{#3,}% - \fi - % set parameters according to newly assigned lyrics lines - \set@texte{#1}{#2}% - \loop@texte - % check for existence - \expandafter\ifx\csname stp@\text@name\endcsname\relax - \errmessage{Trying to assign undefined verse "\text@name"}% - \expandafter\setlyrics\expandafter{\text@name}{EMPTY}% - \fi - \reset@params - \@repeat} - - -\def\reset@params{% - \expandafter\xdef\csname stp@\text@name\endcsname{\the\y@v}% - \expandafter\gdef\csname zwr@\text@name\endcsname{0}} - - -% -% reset horizontal positioning parameters of all lyrics lines -% -\def\resetlyrics{% - \edef\@texte{\the\alle@texte}% - \y@v=0pt - \loop@texte \reset@params \@repeat} - - -%%%%%%%%%% -% -% process lyrics verse-wise -% -%%%%%%%%%% -% same action for all assigned verses -\def\forall@verses#1{% - % #1: action to be executed - \ifx\text@name\empty - % perform action for all assigned verses - \set@texte@current{% - \ifx\@texte\empty\else - \vplace@lyrics{\loop@texte \hbox{\lyr@strut #1}\@repeat}% - \fi}% - \else - % text name already selected -> perform action for this one only - #1% - \fi} - - -% specify separate actions per verse -\def\verses#1{% - % #1: comma-separated list of actions (from top to bottom) - \set@texte@current{% - \def\@param{#1}% running variable for per-text actions - \vplace@lyrics{% - \loop@texte \expandafter\one@verse\@param,\@end \@repeat}}} - -\def\one@verse#1,#2\@end{% - % #1: action list head = action for current verse - % #2: action list tail = actions for remaining verses - \def\@param{#2}% - % perfrom action - \hbox{\lyr@strut #1}} - - -%%%%%%%%%% -% -% line spacing for multiple verses -% -%%%%%%%%%% -\def\lyr@strut{\copy\lyrstrutbox} -\def\setlyrstrut{% set up strut according to currently active font - \setbox0=\hbox{()}% - \setbox\lyrstrutbox=\hbox{\vrule height 1.1\ht0 depth 1.1\dp0 width\z@}} -\setlyrstrut % initialize - - -%%%%%%%%%% -% -% retrieve text by syllable -% -%%%%%%%%%% -\def\next@lyr{% - \expandafter\let\expandafter\@nochtext\csname nochtext@\text@name\endcsname - %\show\@nochtext - \ifx\@nochtext\empty - % no more text - \@hyphenfalse\@lyric{???}% - \else - \@textvar=\expandafter{\@nochtext}% - \expandafter\next@syllable\the\@textvar\relax\relax - \fi} - -\def\next@syllable#1 #2#3\relax{% - % #1 - first syllable - % #2 - either hyphenation symbol @ - % or \relax (if text ends after #2) - % or 1st char/group of rest text - % #3 - rest text, may be empty - \parse@melisma{#2}{#3}#1_\@end} - -\def\test@single@token#1#2\@end{% - % #2 is empty if argument consists of a single token - \ifx\emp@tst#2\emp@tst - \@single@tokentrue - \else - \@single@tokenfalse - \fi} - -\def\parse@melisma#1#2#3_#4\@end{% parse trailing underscores - % #1: either hyphenation indicator @ - % or \relax (if text ends after #1), - % or 1st char/group of rest text - % #2: rest text, may be empty - % #3: current syllable; may be empty if melisma pending - % #4: trailing underscores, if any, or - % melisma notes number followed by single underscore, or - % empty if no melisma - % - % evaluate hyphenation sign - \ifx @#1% - \@hyphentrue - \@textvar={#2}% may be empty - \else - \@hyphenfalse - % decide rest text (#1 was no hyphen sign) - \ifx\relax#1% current syllable is final syllable - \@textvar={}% - \else - \test@single@token#1\@end % #1 may have been grouped - \if@single@token - \@textvar={#1#2}% - \else - \@textvar={{#1}#2}% - \fi - \fi - \fi - % - % melisma pending? - \ifx\emp@tst#4\emp@tst % no melisma - \let\melisma@spec\empty - \@lyric{\evtl@klein{\evtl@punktweg{#3}}\evtl@komma}% - \else % melisma - \ifx\emp@tst#3\emp@tst % syllable empty, d.i. in mid-melisma - \parse@melisma@tail#4\@end - \ifx\melisma@spec\empty % final melisma note - \lyrruleend - \fi - \else % syllable non-empty, d.i. at melisma start - \leftlyrtrue\@strichtrue - \parse@melisma@start#4\@end - \@lyric{\evtl@klein{\evtl@punktweg{#3}}\evtl@komma}% - \fi % at melisma start - \fi % in melisma - % - % set remaining text - \expandafter\xdef - \csname nochtext@\text@name\endcsname{\melisma@spec\the\@textvar}} - -\def\parse@melisma@start#1_\@end{% - % Cut trailing underscore and attach it at argument head. - % For underscore sequences, the effect is void. - % For numbers, it converts "num_" to "_num". - % Moreover, append a single space. - \def\melisma@spec{_#1 }} - -\def\parse@melisma@tail#1_\@end{% - % #1: either trailing underscores minus one - % or melisma notes number - % or empty - \ifx\emp@tst#1\emp@tst % no more underscores - \let\melisma@spec\empty - \else - \parse@melisma@tail@ii#1\@end - \fi} - -\def\parse@melisma@tail@ii#1#2\@end{% helper for deciding melisma spec type - % #1#2: either trailing underscores minus one - % or melisma notes number - \if#1_% % underscore sequence given - \def\melisma@spec{#1#2 }% - \else % number given - \ifnum#1#2>1 % more melisma notes pending - \count@=#1#2 - \advance\count@\m@ne - \edef\melisma@spec{_\the\count@\space}% - \else % no more melisma notes - \let\melisma@spec\empty - \fi - \fi} - -\def\@lyric#1{% - % #1: Text - \evtl@offset - % Alles Folgende ist Argument fuer obiges \evtl@offset: - {\csname llay@\text@name\endcsname% Layoutkontext abrufen - \lyr@processingtrue - \setbox\lyr@box=\hbox{#1}% - \setbox\lyr@hyphen@box=\hbox{\lyrhyphenchar}% - % Zwischenraum zu voriger Silbe ermitteln: - \get@lyrspace - \ifleftlyr\else - % Silbe zentriert -> Zwischenraum entspr. kleiner: - \advance\y@v -0.5\wd\lyr@box - \advance\y@v 0.5\qn@width % halbe Notenkopfbreite dazu - \fi - % Bindestrich von voriger Silbe anhaengig? - \expandafter\ifnum\csname zwr@\text@name\endcsname=1 - % Minimalzwischenraum entsprechend aendern: - \ifforcelyrhyphens - % Min. Zw.-R. mindestens so breit wie Bindestrich: - \ifdim\minlyrspace < \wd\lyr@hyphen@box - \minlyrspace=\wd\lyr@hyphen@box - \fi - \else - \minlyrspace=0pt % % kein Zwischenraum noetig - \fi - \fi - \ifdim\y@v < \minlyrspace % Zwischenraum zu klein? - \lyr@shift=\minlyrspace % Silbe um Differenz nach rechts verschieben - \advance\lyr@shift -\y@v - \y@v=\minlyrspace % Zwischenraumbreite = geg. Minimum - \else - \expandafter\ifnum\csname zwr@\text@name\endcsname=1 % Bindestrich anhaengig? - \ifforcelyrhyphens\else % Bindestrich nicht erzwungen? - \ifdim\y@v < \wd\lyr@hyphen@box % Zwischenraum zu schmal? - \advance\lyr@shift -\y@v % => Zw.raum ganz wegnehmen - % Dank an Sebastian Clauss fuer diese Verbesserung - \fi - \fi - \fi - \fi - \rlap{% - \hskip\lyr@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@name\endcsname=1 - % Bindestrich nur setzen, wenn Platz genug vorhanden: - \ifdim\y@v < \wd\lyr@hyphen@box\else - \print@hyphen - \fi - \fi - \ifshowlyrshift - % Mit Rechteck Wortverschiebung zeigen: - \llap{\vrule width \lyr@shift height \ht\strutbox}% - \fi - \unhcopy\lyr@box % Wort setzen - % Startposition des nachfolgenden Zwischenraums festhalten: - \getcurpos - \advance\y@v by \lyr@shift - \ifleftlyr - \advance\y@v \wd\lyr@box - \else - \advance\y@v 0.5\wd\lyr@box - \advance\y@v 0.5\qn@width % halbe Notenkopfbreite dazu - \fi - \expandafter\xdef\csname stp@\text@name\endcsname{\the\y@v}% Startposition setzen - \if@hyphen % Bindestrich gefordert? - \expandafter\gdef\csname zwr@\text@name\endcsname{1}% - \else - \if@strich % Verlaengerungs-Strich gefordert? - \expandafter\gdef\csname zwr@\text@name\endcsname{2}% - \else % nichts gefordert - \expandafter\gdef\csname zwr@\text@name\endcsname{0}% - \fi - \fi}}}} - -\def\print@hyphen{% - \llap{\hbox to \y@v{% - % Zwischenraum mit "Strich-Kette" ausfuellen: - \loop - \hfil\lyrhyphenchar\hss% rechter Raum darf am Systemende negativ werden - \advance\y@v by -\minmulthyphens - \ifdim\y@v > 0pt% - \repeat}}} - -\def\get@lyrspace{% - \getcurpos - \advance\y@v by -\csname stp@\text@name\endcsname - \relax} - -% Verlaengerungs-Striche abschliessen: -\def\lyrruleend{\forall@verses\lyrrule@end} - -\def\lyrrule@end{% - \expandafter\ifcase\csname zwr@\text@name\endcsname - % 0 -> Bindestrich von vorigem System anhaengig (nur bei Melisma; - % wurde bei Systemende zurückgesetzt) - % -> Einstellung fuer Bindestrich-Einfuegen an nächster Note setzen: - \expandafter\gdef\csname zwr@\text@name\endcsname{1}% - \or - % 1 -> Bindestrich anhaengig -> nichts tun - \or - % 2 -> Strich anhaengig: - \roff{% Zum rechten Notenkopf-Rand - \get@lyrspace\print@lyr@rule - % Zwischenraum-Startposition festhalten, wenn Wort nicht nach - % rechts darueber hinausragt: - \getcurpos - \ifdim\csname stp@\text@name\endcsname < \y@v - \expandafter\xdef\csname stp@\text@name\endcsname{\the\y@v}% - \fi}% - % Einstellung zuruecksetzen: - \expandafter\gdef\csname zwr@\text@name\endcsname{0}% - \fi} - -\def\print@lyr@rule{% - % Kleiner Zwischenraum zur vorherigen Silbe: - \advance\y@v by -2pt% - \ifdim \y@v > \minlyrrulelength - \llap{\vrule\@width\y@v\@height\lthick\@depth0pt}% - \fi} - - -%%%%%%%%%% -% -% Textstellen per Label anspringen -% -%%%%%%%%%% -\def\llabel#1{}% Damit Kennzeichnung bei der Ausgabe ohne Effekt bleibt - -\def\golyr#1{\forall@verses{\@golyr{#1}}} - -\def\@golyr#1{{% - \expandafter\let\expandafter\@nochtext\csname dertext@\text@name\endcsname - \def\query@label{#1}% - \loop - \expandafter\find@llabel\@nochtext\ende - \ifx\query@label\cur@label\let\@weiter n\else \let\@weiter j\fi - \if\@weiter j\repeat - \expandafter\global\expandafter\let - \csname nochtext@\text@name\endcsname\@nochtext}} - -\def\find@llabel#1\llabel#2#3\ende{% - % #1 - Text vor erstem \llabel - % #2 - naechstfolgender \llabel-Name - % #3 - Resttext - \def\cur@label{#2}% - \def\@nochtext{#3}} - - -%%%%%%%%%% -% -% Offene Silbentrennungen und -verlaengerungen am Systemende abschliessen -% -%%%%%%%%%% -\let\@orig@z@suspend\z@suspend -\def\z@suspend{% - \znotes\sysend@lyrics\empty\en - \znotes\sysend@lyrics\auxlyr\en - \@orig@z@suspend} - -\def\sysend@verse{% - % Flag auswerten: - \expandafter\ifcase\csname zwr@\text@name\endcsname - % 0 -> fertig; - \or - % 1 -> Bindestrich anhaengig: - \csname llay@\text@name\endcsname% Layoutkontext abrufen - \get@lyrspace - \print@hyphen - % Einstellung zuruecksetzen - % (-> Bindestrich wird nicht im nächsten System fortgesetzt, - % außer bei \lyrrule@end am Melisma-Ende): - \expandafter\gdef\csname zwr@\text@name\endcsname{0}% - \or - % 2 -> Verlaengerungs-Strich anhaengig: - % Platz zum rechten Systemrand, damit Strich nicht in Taktstrich ragt: - \loffset{0.3}{\get@lyrspace\print@lyr@rule}% - \fi - % Startposition fuer naechstes System zuruecksetzen: - \expandafter\gdef\csname stp@\text@name\endcsname{0pt}} - -\def\sysend@lyrics#1{% - % #1: \auxlyr or \empty - #1{\let\switch@pmx@aux\empty \forall@verses\sysend@verse}% - \if@multistaff - % loop over staves of instrument - \ifnum \noport@@ < \st@ffs - \def\@next{\nextstaff\sysend@lyrics#1}% - \else % staves of instrument finished; continue with next instrument - \sysend@lyrics@instrum@loop#1% - \fi - \else % single-staff instrument - \sysend@lyrics@instrum@loop#1% - \fi - % iterate - \@next} - -\def\sysend@lyrics@instrum@loop#1{% - % prepare instruments loop - \ifnum \noinstrum@nt < \nbinstruments - \def\@next{\nextinstrument\sysend@lyrics#1}% - \else % \noinstrum@nt >= \nbinstruments - \let\@next\empty - \fi} - - -%%%%%%%%%% -% -% Zeilenspezifisches Layout festlegen -% -%%%%%%%%%% -\def\lyrlayout#1{% - \forall@verses{% - \expandafter\gdef\csname llay@\text@name\endcsname{#1}% - % Wenn gerade Text verarbeitet wird, Kontext sofort abrufen: - \iflyr@processing #1\fi}} - -% -% Kontextbehandlung fuer Textnamen: -% -% Aktion zu Kontext hinzufuegen: -\def\add@context#1{% - \toks@=\expandafter\expandafter\expandafter - {\csname cont@\text@name\endcsname #1}% - \expandafter\xdef\csname cont@\text@name\endcsname{\the\toks@}} - -% Kontext abrufen: -\def\@context{% - \expandafter\let\expandafter\der@kontext\csname cont@\text@name\endcsname - \clear@context - \der@kontext} - -% Kontext loeschen: -\def\clear@context{% - \global\expandafter\let\csname cont@\text@name\endcsname\empty} - - -%%%%%%%%%% -% -% Zusaetzliche Textzeilen oberhalb der Notenzeile (auxiliary lyrics) -% -%%%%%%%%%% -\let\enableauxlyrics\empty % just for backward compatibility - -% Befehle auf auxlyrics beziehen: -\def\auxlyr#1{{% - \def\ma@sw{lyr@a}% - \aux@activetrue - #1}} - - -%%%%%%%%%% -% -% vertical lyrics positioning -% -%%%%%%%%%% -\def\lyrraise#1{% - % #1: instrument number - \lyrraisemulti{#1}1} - -\def\lyrraisehere#1{% - % #1: position/offset - \switch@pmx@aux{% - \ifnum\st@ffs>1 % multi-staff instrument - \lyrraisemulti{\the\noinstrum@nt}{\the\noport@@}{#1}% - \else - \lyrraise{\the\noinstrum@nt}{#1}% - \fi}} - -\def\lyrraisemulti#1#2#3{% - % #1: instrument number - % #2: staff of instrument - % #3: position/offset - \toks@=\expandafter{\csname l@raise#1-#2\endcsname}% - \expandafter\ifx\the\toks@\relax - % raise parameter still unset - \expandafter\lyrraise@init\the\toks@ - \fi - % now set raise parameter - \expandafter\expandafter\expandafter - \lyr@raise@multii\the\toks@\@end{#1}{#2}{#3}% - %\lyrlog{raise #1-#2: \expandafter\empty\the\toks@}% -} - -\def\lyr@raise@multii#1@#2\@end#3#4#5{% - % #1: current main position/offset - % #2: current aux position/offset - % #3: instrument number - % #4: staff of instrument - % #5: new position/offset - \expandafter\xdef\csname l@raise#3-#4\endcsname{% - \ifaux@active #1@#5\else #5@#2\fi}} - -% be backward compatible -\let\setsongraise@orig\setsongraise -\def\setsongraise#1#2{\setsongraise@orig{#1}{#2}\lyrraise{#1}{b#2}} -\def\auxsetsongraise#1#2{\auxlyr{\lyrraise{#1}{b#2}}} - - -\def\lyrraise@init#1{% - % #1: control sequence to be set to default value - \gdef#1{b0pt@a0pt}} - - -% vertically place lyrics columns -% replaces MusiXTeX's \C@tx -\def\vplace@lyrics#1{% - % find out applicable positioning settings - \edef\placelyr@staff{\ifnum\st@ffs>1 \the\noport@@ \else 1\fi}% - \toks@=\expandafter - {\csname l@raise\the\noinstrum@nt-\placelyr@staff\endcsname}% - % eventually initialize lyrraise setting first - \expandafter\ifx\the\toks@\relax % lyrraise still unset - \expandafter\lyrraise@init\the\toks@ - \fi - \expandafter\expandafter\expandafter\vplace@lyricsii\the\toks@\@end{#1}} - -\def\vplace@lyricsii#1#2@#3#4\@end#5{% - % #1: main lyrics positioning switch (a/b) - % #2: main lyrics raise value - % #3: aux lyrics positioning switch (a/b) - % #4: aux lyrics raise value - % #5: lyrics material to be issued - % - % decice main/aux context - % - \ifaux@active \let\lyr@ab#3\toks@={#4}% - \else \let\lyr@ab#1\toks@={#2}% - \fi - % - % decide placement situation: above/below/in-mid of system or instrument - % - \if\lyr@ab a% above staff - \ifnum\placelyr@staff<\st@ffs % non-highest staff of multiple staves - \vplaceLyricsAboveMultistaff{#5}% - \else % single or highest staff of instrument - \ifnum\noinstrum@nt<\nbinstruments % lyrics go above instrument - \vplaceLyricsAboveInstrument{#5}% - \else % lyrics go into top margin - \vplaceLyricsTopMargin{#5}% - \fi - \fi - \else % below staff - \ifnum\placelyr@staff>1 % non-lowest staff of multiple staves - \vplaceLyricsBelowMultistaff{#5}% - \else % single or lowest staff of instrument - \ifnum\noinstrum@nt>1 % lyrics go below instrument - \vplaceLyricsBelowInstrument{#5}% - \else % lyrics go into bottom margin - \vplaceLyricsBottomMargin{#5}% - \fi - \fi - \fi} - -% -% user-supersedable placement calculations -% -\def\vplaceLyricsBelowMultistaff#1{% - % #1: lyrics material - % reduced \C@Tx algorithm - \y@iv=\the\toks@\relax - \C@Inter % compute \stem@skip (?) - \advance\y@iv -0.5\stem@skip - \raise\y@iv\vbox\@to\z@{\vss\offinterlineskip#1\vss}} - -\def\vplaceLyricsAboveMultistaff#1{% - % #1: lyrics material - % reduced \C@Tx algorithm - \y@iv=\the\toks@\relax - \C@Inter % compute \stem@skip (?) - \advance\y@iv -0.5\stem@skip - % add height difference to base line of upper staff - \advance\y@iv \interportee - \raise\y@iv\vbox\@to\z@{\vss\offinterlineskip#1\vss}} - -\def\vplaceLyricsBottomMargin#1{% - % #1: lyrics material - % based on \C@tx - \y@iv=\the\toks@\relax - \advance\y@iv -\staffbotmarg - \raise\y@iv\vbox\@to\z@{\vss\offinterlineskip#1\vss}} - -\def\vplaceLyricsTopMargin#1{% - % #1: lyrics material - % based on \C@tx, "mirrored" bottom margin situation - \y@iv=\the\toks@\relax - \advance\y@iv \stafftopmarg - \Comp@High \advance\y@iv\y@v % \y@v = total height of instrument - \advance\y@iv \altitude % for multi-staff: - \advance\y@iv-\altportee % reduce by base hight of current staff - \raise\y@iv\vbox\@to\z@{\vss\offinterlineskip#1\vss}} - -\def\vplaceLyricsBelowInstrument#1{% - % #1: lyrics material - % assumption: \noinstrum@nt > 1 - % based on \C@tx - \y@iv=\the\toks@\relax - \multiply\y@iv 2 % balance division by 2 below - \advance\noinstrum@nt\m@ne - \advance\y@iv -\csname interinstrument\romannumeral\noinstrum@nt\endcsname - \C@Inter % compute \stem@skip (?) - \advance\y@iv -\stem@skip - \divide\y@iv\tw@ - \advance\noinstrum@nt\@ne - \raise\y@iv\vbox\@to\z@{\vss\offinterlineskip#1\vss}} - -\def\vplaceLyricsAboveInstrument#1{% - % #1: lyrics material - % assumption: \noinstrum@nt < \nbinstruments - % analogous to \C@tx, but refers to upper instrument instead - \y@iv=\the\toks@\relax - \multiply\y@iv 2 % balance division by 2 below - \advance\y@iv -\csname interinstrument\romannumeral\noinstrum@nt\endcsname - \C@Inter % compute \stem@skip (?) - \advance\y@iv -\stem@skip - \divide\y@iv\tw@ - % add height difference to base line of upper instrument - \begingroup - \advance\y@iv-\altportee \advance\noinstrum@nt\@ne \s@l@ctinstr - \advance\y@iv \altitude - \raise\y@iv\vbox\@to\z@{\vss\offinterlineskip#1\vss}% - \endgroup} - - -%\def\C@tx{% -% \ifnum\noinstrum@nt=\@ne -% \y@iv\staffbotmarg -% \else -% \advance\noinstrum@nt\m@ne -% \y@iv\csname interinstrument\romannumeral\noinstrum@nt\endcsname -% \C@Inter % compute \stem@skip -% \advance\y@iv\stem@skip -% \divide\y@iv\tw@ -% \advance\noinstrum@nt\@ne -% \fi -% \advance\y@iv-\csname T@R\romannumeral\noinstrum@nt\endcsname -% \lower\y@iv\uplap} -%\def\uplap#1{\vbox\@to\z@{\vss#1}} - - -%%%%%%%%%% -% -% Textsatz-Automatik -% -%%%%%%%%%% -% Text automatisch unter alle "spacing"-Noten eines Systems: -\let\orig@writ@note\writ@note -\def\writ@note{% - \ifnum\n@i<\@c % Bedingung fuer's Notenschreiben in \writ@note (warum?) -% \ifx\st@m\beamst@m -% \uptext{\csname s@bl\balken@nr\endcsname}% -% \else - \decide@lyrmode - \main@aux@or@not{\forall@verses{\@context\evtl@next@lyr}}% -% \fi - \fi - \orig@writ@note} - -\def\lyrmode@no {\def\main@aux@or@not##1{}} -\def\lyrmode@main{\def\main@aux@or@not##1{##1}} -\def\lyrmode@aux {\let\main@aux@or@not\auxlyr} -\let\pmx@auxmode\lyrmode@aux - -% Feststellen, ob Haupt- oder Nebentext oder gar nichts gesetzt werden soll: -\ifx\nextvoice\undefined % ohne PMX - \def\decide@lyrmode{% - \call@lyrmode - \if@lyrmode \decide@stem@direction % Notenhals-Automatik - \else % manuell, nur "spacing"-Noten - \ifadvance \lyrmode@main - \else \lyrmode@no - \fi - \fi} - \def\decide@stem@direction{% - \ifx\st@m\upst@m \lyrmode@aux \else - \ifx\st@m\up@flag \lyrmode@aux \else - \ifx\st@m\downst@m \lyrmode@main\else - \ifx\st@m\down@flag\lyrmode@main\else - \ifx\st@m\setst@m \lyrmode@no \else % kein Hals - \ifx\st@m\resetst@m\lyrmode@no \else - \ifx\st@m\beamst@m - \expandafter\ifx\csname s@bl\balken@nr\endcsname o\lyrmode@aux - \else\lyrmode@main - \fi - \else\errmessage{invalid \string\st@m\space setting}% - \fi\fi\fi\fi\fi\fi\fi} -\else % mit PMX - \def\decide@lyrmode{% - \ifadvance % nur "spacing"-Noten - \call@lyrmode - \if@pmx@nextvoice % Oberstimme - \if@lyrmode\lyrmode@main \else\pmx@auxmode \fi - \else % Unterstimme - \if@lyrmode\pmx@auxmode \else\lyrmode@main \fi - \fi - \else - \lyrmode@no % non-spacing Note - \fi} - \let\orig@nextvoice\nextvoice % \nextvoice erweitern - \def\nextvoice{\orig@nextvoice\@pmx@nextvoicetrue} -\fi - -\def\call@lyrmode{% activate lyrmode setting of current staff/instrument - \ifnum\st@ffs>1 % multi-staff instrument - \csname zlm@\the\noinstrum@nt-\the\noport@@\endcsname - \else % single-staff instrument - \csname zlm@\the\noinstrum@nt-1\endcsname - \fi} - -\def\switch@pmx@aux#1{% - % using PMX, automatically activate auxlyr context for #1 after \nextvoice - \ifx\nextvoice\undefined % not using PMX - #1% - \else % using PMX - \call@lyrmode - \if@pmx@nextvoice % upper PMX voice - \if@lyrmode\lyrmode@main \else\pmx@auxmode \fi - \else % lower PMX voice - \if@lyrmode\pmx@auxmode \else\lyrmode@main \fi - \fi - \main@aux@or@not{#1}% - \fi} - - - -% lyrmode umschalten: -\def\switch@lyrmode#1#2#3{% - % #1: instrument number - % #2: staff-of-instrument number - % #3: lyrmode setting - \ifnum#1=0 % % alle Zeilen einbeziehen - \switch@lyrmode@all@instrum#3% - \else % nur 1 Zeile - \global\expandafter\let\csname zlm@#1-#2\endcsname=#3% - \fi} - -% loop over all possible instruments -\def\switch@lyrmode@all@instrum#1{% - \m@loop \switch@lyrmode@all@staves#1\repeat} - -% loop over 4 possible staves of instrument -\def\switch@lyrmode@all@staves#1{% - \begingroup - \count@=0 - \loop - \advance\count@ 1 - \switch@lyrmode{\the\noinstrum@nt}{\the\count@}#1% - \ifnum\count@<4 \repeat - \endgroup} -% ... nicht wahnsinnig effizient, zugegeben ... - - -\def\lyrmodenormal#1{\lyrmodenormalmulti{#1}1} -\def\lyrmodealter #1{\lyrmodealtermulti {#1}1} - -\def\lyrmodenormalmulti#1#2{\switch@lyrmode{#1}{#2}\@lyrmodefalse} -\def\lyrmodealtermulti #1#2{\switch@lyrmode{#1}{#2}\@lyrmodetrue } - -\def\lyrmodenormalhere{\lyrmode@here\@lyrmodefalse} -\def\lyrmodealterhere {\lyrmode@here\@lyrmodetrue } - -\def\lyrmode@here#1{% apply lyrmode to current instrument/staff context - % #1: lyrmode switch - \if@multistaff - \switch@lyrmode{\the\noinstrum@nt}{\the\noport@@}#1% - \else - \switch@lyrmode{\the\noinstrum@nt}1#1% - \fi} - -\lyrmodenormal0 % auf "normal" initialisieren - -% fuer Halsrichtungs-Automatik: Balkenlage in \s@bl<nr> vermerken -\def\balk@nlage#1{\global\expandafter\let - \csname s@bl\balken@nr\endcsname #1\relax} -\let\orig@i@bu\i@bu \def\i@bu{\balk@nlage o\orig@i@bu}% <o>ben -\let\orig@i@bl\i@bl \def\i@bl{\balk@nlage u\orig@i@bl}% <u>nten - -\let\orig@s@l@ctbeam\s@l@ctbeam -\def\s@l@ctbeam#1\relax{\orig@s@l@ctbeam#1\relax \xdef\balken@nr{\number\n@i}} - - -% Auto-Text ein- und ausschalten (innerhalb \notes...\enotes): -\def\lyricson{\forall@verses{\add@context\verse@on@context}} -\def\verse@on@context{% - \let\evtl@next@lyr\next@lyr - \add@context\verse@on@context} - -\def\lyricsoff{\forall@verses\clear@context} - -\def\lyric {\let\evtl@hyph\@hyphenfalse\futurelet\ast@risk\lyric@i} -\def\lyrich{\let\evtl@hyph\@hyphentrue \futurelet\ast@risk\lyric@i} - -\def\lyric@i{% - \ifx\ast@risk*% - \let\evtl@nolyr\relax \let\@next\lyric@ii - \else - \let\evtl@nolyr\nolyr \def\@next{\nolyr\lyric@ii*}% - \fi - \@next} - -% Silben abseits vom Haupttext ausgeben: -\def\lyric@ii*#1{\forall@verses{\@context\evtl@hyph\@lyric{#1}}\evtl@nolyr} - -% Manipulationen einzelner Haupttext-Silben: -\def\forall@context#1{\forall@verses{\add@context{#1}}} - -% 1 Silbe ausgeben: -\def\lyr{\forall@verses{\@context\next@lyr}} - -% Linksbuendig: -\def\llyr{\forall@context{\leftlyrtrue}} - -% Verlaengerungs-Strich: -\def\lyrrule{\forall@context{\@strichtrue}} - -% Horizontale Verschiebung (analog \roffset): -\def\lyroffset#1{\forall@context{\def\evtl@offset{\roffset{#1}}}} - -% Kein automatischer Text: -\def\nolyr{\forall@context{\let\evtl@next@lyr\empty}} - -% Kleinbuchstaben: -\def\lclyr{\forall@context{\let\evtl@klein\@klein}} -\def\@klein#1{\lowercase\expandafter{#1}} - -% Satzzeichen anhaengen: -\def\lyrpt#1{\forall@context{\def\evtl@komma{#1}}} - -% Punkt vom Ende abschneiden: -\def\lyrnop{\forall@context{\let\evtl@punktweg\@punktweg}} -\def\@punktweg#1{{\punktweg@rek#1\ende}} -\def\punktweg@rek#1#2\ende{% - \def\par@ii{#2}% - \ifx\par@ii\empty\else - \aftergroup#1% - \expandafter\punktweg@rek\par@ii\ende - \fi} - -% Melisma beginnen und abschliessen: -\def\beginmel{\forall@verses{\llyr\lyrrule\add@context\lyricsoff}} -\def\endmel{\forall@verses{\lyrruleend\add@context\lyricson}} - -% -% Bindebogen unter zwei Silben derselben Note: -% -\def\lyrlink {\lyr@link0} -\def\lowlyrlink{\lyr@link1} - -\def\lyr@link#1{% - % Bogen erstellen: - \setbox\lyr@linkbox=\hbox{$\smile$}% - % In Box der Breite eines Wortzwischenraums einsetzen: - \setbox\lyr@linkbox=\hbox to\the\fontdimen2\the\font{% - \hss - % Unter die Grundlinie druecken: - \lower\ht\lyr@linkbox\hbox{% - % Zusaetzlicher vertikaler Abstand zur Wortunterseite: - \lower1pt\hbox{% - \if#10\relax - \hbox{$\smile$}% - \else - % Buchstabe mit Unterlaenge -> auch darunter druecken: - \setbox\lyr@linkdepthbox=\hbox{y}% - \lower\dp\lyr@linkdepthbox\hbox{$\smile$}% - \fi}}% - \hss}% - % Keine zusaetzliche Tiefe fuer Bogen anrechnen: - \dp\lyr@linkbox=0pt - % Bogen setzen: - \box\lyr@linkbox} - -\makeatother |