summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/musical/musical.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-04-10 03:06:35 +0000
committerNorbert Preining <norbert@preining.info>2020-04-10 03:06:35 +0000
commit25111608e6aa05042b0c6f83009262e1973d7a45 (patch)
tree4e47675c9f816298a780508cf0b31db2f84bd5fd /macros/latex/contrib/musical/musical.sty
parent122d129e46fd990f791aeb4ff07eaa1b35b9af0d (diff)
CTAN sync 202004100306
Diffstat (limited to 'macros/latex/contrib/musical/musical.sty')
-rw-r--r--macros/latex/contrib/musical/musical.sty372
1 files changed, 372 insertions, 0 deletions
diff --git a/macros/latex/contrib/musical/musical.sty b/macros/latex/contrib/musical/musical.sty
new file mode 100644
index 0000000000..1f528f2cc4
--- /dev/null
+++ b/macros/latex/contrib/musical/musical.sty
@@ -0,0 +1,372 @@
+%% musical.sty version 3.1 (April 2020)
+%% Created by and copyright Dave Howell, February 2018
+%% Email: dh.musical@howell.seattle.wa.us
+%% This is a "maintained" package.
+%% Inspired primarily by stage.cls from Robert Jahrling
+
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, version 1.3
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+
+% This work consists of the files musical.sty and musical.pdf
+% Version 1.x: 2018/03/20
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{musical}[2020/04/06 Manuscript Format for stage plays]
+
+% We provide a friendly warning when an option is specified;
+% since musical provides no options, all options return an error.
+\DeclareOption*{%
+ \ClassWarning{stage}{Unknown option `\CurrentOption'}%
+}
+
+% Required to process options, or not process them, I suppose.
+\ProcessOptions\relax
+
+\RequirePackage{ifthen}
+\RequirePackage{fancyhdr}
+\RequirePackage{etoolbox}
+\RequirePackage{xspace}
+
+\newtoggle{stagedir} % true when we're inside a stage direction
+\newtoggle{dialog} % true when we're inside dialog
+\newtoggle{scaplyrics}
+\togglefalse{scaplyrics} % use \toggletrue{scaplyrics} to set lyrics in Cap/small cap style.
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%% PAGE FORMATTING
+% use fancy pagestyle
+\pagestyle{fancy}
+
+% Redefining \chapter and \section for acts and scenes.
+\RequirePackage{titlesec}
+\newcommand{\scripttitles}{% redefine \scripttitles to change how chapters/acts and sections/scenes' headers look.
+ \titlespacing*{\chapter}{0pt}{0cm}{0cm}%
+ \titleformat{\chapter}[block]{\center}{\LARGE\sc Act \Roman{actcounter}}{0pt}{}%
+ \titlespacing*{\section}{0pt}{0pt plus 1\baselineskip}{0pt}%
+ \titleformat{\section}[display]{\center}{\Large\sc Scene \arabic{scenecounter}}{4pt}{\sc}%
+ \setcounter{tocdepth}{1} % include acts and scenes in the Table of Contents
+}
+
+% If titlecontents for sections is
+\titlecontents{chapter}[2em]{\pagebreak[2]\addvspace{1ex plus 2ex}}{}{}{\hfill}[\nopagebreak]%
+
+% page numbers are {act}--{scene}--{pagenumber}
+\newcommand{\themusicalpage}{\Roman{actcounter}--\arabic{scenecounter}--\arabic{page}}
+
+%%% Running heads
+\fancypagestyle{scriptheader}{%
+ \fancyhf{}% Reset headers and footers to blank to start
+ \fancyhead[LE,RO]{\themusicalpage}%
+ \fancyhead[RE,LO]{\it Act \Roman{actcounter}, Scene \arabic{scenecounter}%
+ \ifx\sectionname\undefined\else
+ : \sectionname
+ \fi%
+ }%
+}
+
+% empties center foot; otherwise, the page number would display here.
+\cfoot{}
+
+% Wrapped around the actual play's text. Prob. should
+% include Dramatis Personae, but currently doesn't. Hmm.
+\newenvironment{script}{%
+ \begingroup
+ \setcounter{actcounter}{0}
+ \let\thepage=\themusicalpage
+ \scripttitles
+ \pagestyle{scriptheader}%
+ }{\endgroup
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%% ACTS AND SCENES (CHAPTERS AND SECTIONS)
+
+% Counts acts
+\newcounter{actcounter}
+% We need to initialize actcounter for page numbering.
+\setcounter{actcounter}{0}
+% Counts scenes per act
+\newcounter{scenecounter}[actcounter]
+
+% \act creates an act header with roman numerals, and redefines
+% the running heads to use theatrical-style page numbers
+\newcommand{\act}{%
+ \stepcounter{actcounter}%
+ \newpage
+ \chapter[Act \Roman{actcounter}]{}
+}
+
+% \scene creates a scene header with arabic numerals
+% There's an optional title for the scene, and a required set description, so
+% \scene{George's Office}
+% \scene[Mad Hatter's Tea Party]{Mad Hatter's House, exterior}
+% if the required parameter is empty, (i.e. \scene{} ) then the Set:#2 won't appear.
+% Start a new page for each scene except the first
+\newcommand{\scene}[2][\relax]{%
+ \gdef\sectionname{#1}
+ \stepcounter{scenecounter}%
+ \ifthenelse{\value{scenecounter} > 1}{\newpage}{}%
+ \noindent
+ \section{#1}%
+ \def\setdescription{#2}% this holds the setting for the scene
+ \ifdefempty{\setdescription}{}{\stdir{Set: #2}\par}%
+}
+
+\newcommand{\rehe@rsalmark}[1]{%
+ {(\textit{Rehearsal Mark} \fbox{#1})}%
+}
+
+% In sheet music, rehearsal marks are usually boxed letters, so we box it here to match.
+% An alternative would be to use \marginpar to float the rehearsal marks in the margin.
+\newcommand{\rehearsalmark}[1]{%
+ {\raggedleft\small
+ \vspace{1ex}%
+ \rehe@rsalmark{#1}\par
+ \vspace{1ex}%
+ }
+}
+
+% To denote a transition of some kind. The optional parameter invokes \rehearsalmark on the same line.
+\newcommand{\transition}[1][\relax]{%
+ \noindent\hbox to \textwidth{\hfil*\hspace{2em}*\hspace{2em}*\hfil
+ \if#1\relax
+ \else
+ \hbox to 0pt{\hss\rehe@rsalmark{#1}}%
+ \fi
+ }\par
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%% PARAGRAPH-LEVEL COMMANDS
+
+% How far to inset dialog.
+% Lyrics are inset twice the speech margin.
+\newlength{\speechmargin}
+\setlength{\speechmargin}{2em}
+
+% tcolorbox is probably overkill, but it made for such an easy solution to the problem.
+% It provides a
+% Character Name, continued
+% header for dialog that crosses a page break.
+\usepackage{tcolorbox}
+\tcbuselibrary{breakable,skins}
+% standard dialog is inset by \speechmargin on both sides
+\newtcolorbox{spokentext}{breakable,frame hidden,interior hidden,boxrule=0pt,
+ boxsep=0pt,top=0pt,bottom=0pt,center title,
+ title={\charactername\strut },title after break={\center\charactername~(cont.)\strut },
+ colback=white,left={\speechmargin},right={\speechmargin},colbacktitle=white,coltitle=black,colframe=white
+}
+
+% lyrics ares inset by twice the \speechmargin on the left,
+% but in order to reduce awkward breaks mid-lyric, the right margin
+% goes to the page margin. Because the actual box is now offset to the right,
+% the title (aka the name of the character speaking) has to be offset the other way to
+% keep it centered on the page.
+\newtcolorbox{lyrictext}{breakable,frame hidden,interior hidden,boxrule=0pt,
+ boxsep=0pt,top=0pt,bottom=0pt,center title,
+ title={\charactername\hspace{2\speechmargin}\strut},title after break={\center\charactername~(cont.)\hspace{2\speechmargin}\strut},
+ colback=white,left={2\speechmargin},right={0pt},colbacktitle=white,coltitle=black,colframe=white
+}
+
+
+% jiggery-pokery to try to make footnotes work reasonably close to usefully.
+\usepackage[symbol,perpage,para,ragged,flushmargin]{footmisc}
+\DefineFNsymbols{dave}[text]{*†‡¤{**}{††}{‡‡}{¤¤}}
+\setfnsymbol{dave}
+\renewcommand{\thempfootnote}{\fnsymbol{mpfootnote}}
+
+% I've tried a couple of different things to get footnotes to come out right.
+% Currently, I'm letting everything operate 'normally.'
+% If you want footnotes at the bottom of the dialog box, rather than the bottom of the page,
+% uncomment the \let command in the \dialog command.
+\let\di@logfootnotetext=\relax
+\newcommand{\dialogfootnote}[1]{%
+ \gdef\di@logfootnotetext{#1}%
+ \footnotemark
+}
+
+% \dialog sets the character's name above their speech.
+% the text is inset \speechmargin from the text margins.
+\newcommand{\dialog}[2]{%
+ %\let\footnote=\dialogfootnote
+ \toggletrue{dialog}%
+ \def\charactername{\textsc{#1}}% used by the spokentext environment
+ \vspace{1ex}%
+ \if\di@logfootnotetext\relax\else
+ \footnotetext{\di@logfootnotetext}%
+ \let\di@logfootnotetext=\relax
+ \fi
+ \begin{spokentext}
+ \raggedright
+ #2
+ \end{spokentext}%
+ \togglefalse{dialog}%
+}
+
+% getting \obeylines to work on the input to \lyrics is tricky.
+% It has to be done *before* the command picks up the input.
+% so I pick up the first parameter (the speaker's id) and set
+% it aside, then invoke \obeylines, and have \@lyrics work on
+% what's left.
+
+\newcommand{\@lyrics}[1]{%
+ \toggletrue{dialog}% change behavior of \stdir
+ \def\@lyricontents{{#1\par}}% pick up the lyrics
+ \vspace{1ex}%
+ \begin{lyrictext}
+ \raggedright
+ \iftoggle{scaplyrics}{\scshape}{}
+ \@lyricontents% put the lyrics down inside the lyrictext box
+ \end{lyrictext}%
+ \togglefalse{dialog}%
+\egroup
+}
+
+\newcommand{\lyrics}[1]{\bgroup
+ \def\charactername{{\textsf\lyricsymbol} \textsc{#1} {\textsf\lyricsymbol}}%
+ \obeylines\@lyrics
+}
+
+% \spacer is intended to use inside \lyrics commands to maintain the structure of stanzas
+% across different speakers. Put whatever was spoken by a previous speaker inside the \spacer
+% parameter, and the current text will be offset by that distance.
+
+\newbox\music@lbox
+
+\newcommand{\spacer}[1]{
+ \setbox\music@lbox\hbox{#1}%
+ \noindent\hbox to \wd\music@lbox{\strut\hfil}%
+}
+
+\newcommand{\stdir}[1]{%
+ \begingroup
+ \toggletrue{stagedir}%
+ \iftoggle{dialog}{% we're inside a dialog or lyric.
+ (\textit{#1})%
+ }{% or we're NOT inside a dialog or lyric.
+ \vspace{1ex}%
+ \raggedright
+ \noindent\textit{#1}\par%
+ }%
+ \endgroup\xspace
+}
+
+% Musical cue
+\newcommand{\music}[1]{%
+ {\raggedleft\small
+ \vspace{1ex}%
+ \addcontentsline{los}{section}{#1}%
+ \textit{Music Cue: “#1”}\par
+ \vspace{1ex}%
+ }
+}
+
+%Dance cue
+\newcommand{\dance}[1]{% a dance cue
+ {\raggedleft\small
+ \vspace{1ex}%
+ \addcontentsline{lod}{section}{#1}%
+ \textit{Dance Cue: “#1”}\par
+ \vspace{1ex}%
+ }
+}
+
+% \pause is just convenient.
+\newcommand{\pause}{\stdir{pause}}
+
+% \dialogue, for people who like that spelling better
+\newcommand{\dialogue}[1]{\dialog{#1}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%% TABLES OF CONTENTS, CAST LIST, AND OTHER LISTS
+
+\newcommand{\listofsongs}{% generates a list of musicial cues
+ \section*{List of Songs}%
+ \@starttoc{los}%
+ }
+
+\newcommand{\listofdances}{% generates a list of dance cues
+ \section*{List of Dances}%
+ \@starttoc{lod}%
+}
+
+% Yes, the following commands internally use "cast" when they're actually referring to
+% the characters that cast members are playing. But "cast" is way shorter than "character,"
+% and "character" is much more likely to run into namespace collisions.
+
+\newsavebox{\c@stbox}
+\newlength{\c@stboxwidth} % how wide do the character name boxes need to be?
+\newlength{\c@stdescwidth} % the width of the box for the character's descriptive text.
+\setlength{\c@stboxwidth}{0pt} % default value to start
+\gdef\s@vedcastboxwidth{0pt} % the max width from the previous run
+
+
+% \@recallcastboxwidth is called from the .aux files as they're read back in.
+% When they're all processed, \s@vedcastboxwidth will contain the largest value
+% passed to any of the \@recallcastboxwidth commands..
+\def\@recallcastboxwidth#1{%
+ \ifdim#1>\s@vedcastboxwidth
+ \setlength\c@stboxwidth{#1}%
+ \gdef\s@vedcastboxwidth{#1}
+ \fi}
+
+\newcommand{\addcharacter}[3][\relax]{%
+ % If the optional parameter is present, we need to define a command with that name.
+ % Normally, that command is equivalent to \dialog{Character Name}.
+ % If it appears in the body of a \dialog or \lyrics command, then it's just
+ % the character name (the 1st required parameter). If it's inside \stdir, then
+ % it's the character name in small caps.
+ \if#1\relax\else% do we need to define the \charactername because the nickname parameter is present?
+ \expandafter\gdef\csname #1\endcsname{%
+ \iftoggle{stagedir}{% inside a stdir command
+ \textsc{#2\strut}\xspace% it's in small caps
+ }{\iftoggle{dialog}{% inside a dialog or lyrics command
+ #2\xspace% we leave the formatting to the environment it's in.
+ }{% if it's in none of these, then it's being used AS a \dialog shortcut.
+ \dialog{#2}%
+ }%
+ }%
+ }%
+ \fi
+
+ % The \addcharacter command also typesets the Dramatis Personae list where it's used.
+ % Name on left, comments/explanations on right. To make page breaks simple, tables and tabs are
+ % avoided. Instead, names are measured in the first pass, and that width info is used on the
+ % second pass to make the alignment consistent.
+
+ % put the final form of the character's name in a box for measuring
+ \sbox\c@stbox{\hspace{\parindent}\textsc{#2}\emspace\strut}%
+
+ % save the measured minimum width to determine \s@vedcastboxwidth for the next run
+ \protected@write\@auxout{}{\string\@recallcastboxwidth{\the\wd\c@stbox}}%
+
+ % check if this character's required box width is greater
+ % than the width of the box we used for the previous character
+ \ifdim\wd\c@stbox>\c@stboxwidth \setlength{\c@stboxwidth}{\wd\c@stbox}\fi
+
+ % check if the max box width from the last run is bigger than the current one
+ % (If the .aux files are read before this .sty file is loaded, this could be done just
+ % once. Are they?)
+ \ifdim\s@vedcastboxwidth>\c@stboxwidth \setlength{\c@stboxwidth}{\s@vedcastboxwidth}\fi
+
+ \setlength{\c@stdescwidth}{\textwidth}%
+ \addtolength{\c@stdescwidth}{-\c@stboxwidth}%
+ \medskip
+ \noindent\hbox to \c@stboxwidth{\usebox\c@stbox\hfill}%
+ \parbox[t]{\c@stdescwidth}{\raggedright #3}%
+}
+
+% used to add an all-caps/small-caps character name to stage directions
+\newcommand{\character}[1]{\textsc{#1}}
+
+% For adding comments into the script. Useful when some of the people working on the script
+% don't know TeX very well. The \comment{} command works like all the other TeX commands, instead
+% of having to remember to start EVERY line of a comment with a % sign.
+\def\comment#1{} \ No newline at end of file