% ScriptTeX screenplay macros -- typed manuscript version
% Copyright 1991-2002 Adrian McCarthy.  See documentation for re-distribution info.
\def\banner{ScriptTeX 1.04, 10-MAR-2002, typed screenplay format}%version
\immediate\write16{\banner}
%
% These macros will produce a manuscript that looks as though it were typed.
%
% With the fixed pitch font and narrow dialog paragraphs, I've set the
% penalties and such to be extremely tolerant of TeX's concept of badness.
% These are probably more extreme than they have to be, but they can be
% tuned later.
%
\font\mainfont=cmpica % Don Hosek's pica fonts.  Use cmtt12 if not available.
\font\emfont=cmpicati % Change to underlined \mainfont if not available.
\mainfont
\pretolerance=500 % acceptable "badness" before trying to hyphenate
\tolerance=10000  % acceptable "badness" of a line
\linepenalty=0    % penalty for each line in a paragraph
\adjdemerits=0    % demerits for adjacent tight and loose line juxtapositions
\finalhyphendemerits=0 % demerits for hyphenating the penultimate line
\doublehyphendemerits=0 % demerits for hyphenating consecutive lines
\hbadness=10000   % avoid useless underfull hbox messages
%
% General page layout:
%
\newdimen\lineskip \lineskip=12bp % 6 lines per inch
\newdimen\charwid {\setbox0=\hbox{\mainfont M} \global\charwid=\wd0}
\baselineskip=\lineskip  % 2\lineskip for sitcoms
\spaceskip=\charwid   % for true typewriter spacing (redundant in cmtt)
\xspaceskip=2\charwid % for two spaces after a sentence (redundant in cmtt)
\voffset=-4\lineskip % 1 blank line from top
\hoffset=0.5truein   % extra room for hole punch
\vsize=58\lineskip
\hsize=60\charwid
\parindent 0pt
\parskip\baselineskip
\splittopskip=\topskip
\splitmaxdepth=\maxdepth
\newdimen\rightmar
\def\hotzone{8\charwid} % right margin hotzone
\def\margins#1#2{%
  \leftskip=#1
  \rightmar=\hsize \advance\rightmar by -\leftskip \advance\rightmar by -#2
  \rightskip=\rightmar plus \hotzone
}
%
% My first output routine.  Marks have six parts:  act/scene header,
% previous scene continued, dialog continued, \nukeline for (MORE),
% continuing dialog (MORE), \nukeline for continuing scene, and
% continuing scene.  The seventh part is reserved for rev pages.
% I realize that I use \splitbotmark before a \vsplit is ever done, but
% this is correct.  \topmark has the wrong value if I put back lines back
% during the previous \output run.
%
\output={%
  \dimen0=\ht255
  \ifx\LR\empty \else
    \if L\LR \hoffset=0.0truein \global\def\LR{R}
      \else \hoffset=0.5truein \global\def\LR{L}
    \fi
  \fi%x
  \shipout\vbox to 62\lineskip{%
    \boxmaxdepth=\maxdepth%
    \makeheadline%
    \pagebody%
    \makefootline%
  }
  \unvbox255 \penalty\outputpenalty % put back unused text
  \advancepageno
}
\def\makeheadline{%  Act/scene header and page number
  \line{%
    \mainfont%
    \ifcase1\expandafter\relax\splitbotmark\fi%
    \ifnum\pageno>0 \hss \folio\rlap{.}\fi}
  \vskip\lineskip
}
\def\pagebody{%
  \ifcase2\expandafter\relax\splitbotmark\fi   % So-and-so (CONT'D) \nukeline
  \ifcase3\expandafter\relax\botmark\fi        % \nukeline for (MORE)
  \ifcase5\expandafter\relax\botmark\fi        % \nukelines for CONTINUED
  {%
    \vbadness=10000
    \setbox0=\vsplit255 to \dimen0             % split to new height
    \unvbox0                                   % put page into output
  }%
  \ifcase4\expandafter\relax\splitbotmark\fi   % (MORE)
  \ifcase6\expandafter\relax\splitbotmark\fi   %   CONTINUED
  \kern-\dimen0 \vfil % kern keeps \vfil from being discarded
}
\def\makefootline{%
  \vskip\lineskip
  \line{\mainfont \footer}
}
\def\nukeline{%
  \advance\dimen0 by -\lineskip
}
\def\mymark{{
  \header \noexpand\or %
  \contprevscene \noexpand\or %
  \contprevdialog \noexpand\or %
  \contdialoga \noexpand\or %
  \contdialogb \noexpand\or %
  \contscenea \noexpand\or %
  \contsceneb %\noexpand\or
% \contrev
}}
\def\contprevscene{}
\def\contprevdialog{}
\def\contdialoga{}
\def\contdialogb{}
\def\contscenea{}
\def\contsceneb{}
%\def\contrev{}
%
% Revision information
%
\def\titletext{Screenplay}
\def\title#1{\def\titletext{#1}}
\def\seriestext{}
\def\series#1{\def\seriestext{#1}}
\def\authortext{}
\def\author#1{\def\authortext{#1}}
\def\drafttext{}
\def\draft#1{\def\drafttext{\uppercase{#1}}}
\def\basedon#1{\def\basedontext{#1}}
\def\basedontext{}
\def\showcopyright#1{\def\copyrighttext{$\copyright$~#1}}
\def\copyrighttext{}
\def\address#1{\def\addresstext{\vtop{\settabs 1\columns \tabalign #1\cr}}}
\def\\{\cr\tabalign}
\def\addresstext{}
\def\today{%
  \hbox{\number\day-\ifcase\month\or JAN\or FEB\or MAR\or APR\or MAY%
    \or JUN\or JUL\or AUG\or SEP\or OCT\or NOV\or DEC\fi%
    -\number\year}%
}
\edef\datetext{\today}  % \edef for efficiency; it won't change during job
\def\date#1{\def\datetext{#1}}
%
% We count acts and scenes for you.
%
\newcount\actcnt \actcnt=0
\def\currentact{}
\newcount\scenecnt \scenecnt=0
\def\resetscenecnt{\scenecnt=0}
\def\currentscene{}
\def\stdhang{\leavevmode\llap{\number\scenecnt.\ }}
\def\stdhead{\ifx\currentscene\empty \else \number\scenecnt.\fi}
\def\stdfoot{%
  \ifx\seriestext\empty \else
    {\emfont \seriestext} \hss
  \fi%
  ``\titletext'' \hss \drafttext
}
\def\stdxref{%
  \ifx\currentact\empty \else%
    \currentact; %
  \fi%
  \ifx\currentscene\empty \else%
    \currentscene%
  \fi
}
\def\Roman#1{\uppercase\expandafter{\romannumeral#1}}
\def\roman#1{\romannumeral#1}
%
% Keep track of last speaker.
%
\global\def\lastspeaker{}
%
% Variants
%
\def\LR{}
\def\twoside{\def\LR{R}}
\def\jlbrooks{
  \hsize=65\charwid
  \def\hotzone{3\charwid}
  \hfuzz=5\charwid
}
\def\movie{
  \def\resetscenecnt{}
  \def\actheadblock##1{}
  \def\acttailblock{}
  \def\actpgbreak{}
  \def\stdxref{}
}
\def\TV{}
\def\sitcom{\lineskip=24bp}
\def\manuscript{
  \def\header{}
  \def\footer{}
  \def\hangscene{}
  \def\draftblock{}
  \def\stdxref{}
  \def\sound##1{##1}
}
\def\proof{
  \ifx\drafttext\empty \draft{Working Draft}\fi
  \def\header{\stdhead}
  \def\footer{\stdfoot}
  \def\hangscene{\stdhang}
  \def\sound##1{##1}
}
\def\shoot{
  \ifx\drafttext\empty \draft{Shooting Script}\fi
  \def\header{}
  \def\footer{}
  \def\hangscene{\stdhang}
}
%
% Breakdowns (desupported)
%
\def\makecastlist{\immediate\write16{Cast lists no longer supported.}}
\def\collectcast{\immediate\write16{Cast lists no longer supported.}}
\def\makescenelist{\immediate\write16{Scene lists no longer supported.}}
\def\collectscenes{\immediate\write16{Scene lists no longer supported.}}
%
% Make a title page
%
\def\maketitle{%
  \ifx\LR\empty \else \def\LR{R} \fi
  \hbox{}
  \vskip 2in
  \ifx\seriestext\empty \else 
    \centerline{{\emfont \uppercase{\seriestext}}}
    \vskip 3\baselineskip
  \fi
  \centerline{``\uppercase{\titletext}''}
  \vskip\baselineskip
  \ifx\authortext\empty \else
    \centerline{\authortext}
  \fi
  \vskip\baselineskip
  \centerline{\basedontext}
  \vskip 3.5in
  \line{\copyrighttext\hfill\addresstext}
  \vskip 3\baselineskip
  \draftblock
  \pageno=0
  {
    \def\header{}
    \def\footer{}
    \eject
  }
  \pageno=1
}
\def\draftblock{%
  \ifx\drafttext\empty \else
    \rightline{{\emfont \uppercase{\drafttext}}}
  \fi
  \rightline{\datetext}
}
%
% Standard header for acts, tags, and teasers
%
\def\actpgbreak{\vfill \penalty-10000}

\def\actheadblock#1{
  \vskip 2\lineskip
  \centerline{{\emfont \uppercase{#1}}}
  \vskip 4\lineskip
}
\def\acttailblock{
  \vskip 2\lineskip
  {\edef\tempact{end of \currentact}
    \centerline{{\emfont \uppercase\expandafter{\tempact}}}
  }
}
\def\acthead#1{%
  \acttail
  \advance\actcnt by 1
  \resetscenecnt
  \edef\currentact{#1}
  \def\contprevscene{}
  \def\contprevdialog{}
  \def\contdialoga{}
  \def\contdialogb{}
  \def\contscenea{}
  \def\contsceneb{}
  \expandafter\mark\mymark
  \actpgbreak
  \parskip\baselineskip
  \actheadblock{#1}
  \immediate\write16{#1}
}
%
% Standard tail for acts, tags, and teasers
%
\def\acttail{%
  \penalty1000
  \ifx\currentact\empty \else
    \acttailblock
    \def\currentact{}
  \fi
}
%
% Regular script constructs:
%
\def\act{\acthead{Act \ifcase\actcnt\or One\or Two\or Three\or Four\or
     Five\or Six\or Seven\or Eight\or Nine\or Ten\or Eleven\or
     Twelve\or Thirteen\or Fourteen\or Fifteen\or Sixteen\else\Roman\actcnt\fi}
}
\def\teaser{\acthead{Teaser}\actcnt=0}
\def\tag{\acthead{Tag}}
\def\prolog{\acthead{Prolog}\actcnt=0}
\def\epilog{\acthead{Epilog}}
\def\prologue{\acthead{Prologue}\actcnt=0}
\def\epilogue{\acthead{Epilogue}}
\def\theend{
  \def\acttailblock{
    \vskip 2\lineskip
    \centerline{{\emfont THE END}}
  }
}

\def\scene#1{%
  \penalty10000
  \def\contprevscene{}
  \def\contprevdialog{}
  \def\contdialoga{}
  \def\contdialogb{}
  \def\contscenea{}
  \def\contsceneb{}
  \expandafter\mark\mymark
  \penalty-100
  \advance\scenecnt by 1
  \edef\currentscene{Scene \number\scenecnt}
  \parskip\baselineskip
  \margins{0in}{\hsize}
  \leavevmode\hangscene\uppercase{#1}\par
  \def\contprevscene{\hangscene CONTINUED}
  \def\contscenea{\nukeline\nukeline}
  \def\contsceneb{\vskip\lineskip \line{\hskip 40\charwid CONTINUED}}
  \expandafter\mark\mymark
  \global\def\lastspeaker{}
  \penalty1000
}
\def\shot#1{\scene{#1}}

\def\stage{%
  \penalty10000
  \def\contprevdialog{}
  \def\contdialoga{}
  \def\contdialogb{}
  \expandafter\mark\mymark
  \penalty-100
  \margins{0in}{\hsize}
  \parskip\baselineskip
}

\def\trans#1{%
  \def\contprevdialog{}
  \def\contdialoga{}
  \def\contdialogb{}
  \expandafter\mark\mymark
  \parskip\baselineskip
  \penalty100
  {\margins{40\charwid}{20\charwid} \uppercase{#1} \par}
  \penalty-100
}

\def\open#1{%
  \def\contprevscene{}
  \def\contprevdialog{}
  \def\contdialoga{}
  \def\contdialogb{}
  \def\contscenea{}
  \def\contsceneb{}
  \expandafter\mark\mymark
  \parskip\baselineskip
  {\margins{0in}{\hsize} \uppercase{#1} \par}
}

\def\close#1{\open{#1}}

\def\dialog#1#2\par{%
  \penalty10000 % make sure we don't break until after the clear mark
  \def\contprevdialog{}
  \def\contdialoga{}
  \def\contdialogb{}
  \expandafter\mark\mymark
  \penalty-100 % OK to break now
  \parskip\lineskip
  {\margins{24\charwid}{36\charwid} \uppercase{#1}%
    \global\def\thisspeaker{#1}%
    \ifx\thisspeaker\lastspeaker \ (CONT'D)\fi
    \global\def\lastspeaker{#1}
  \par}
  \parskip 0pt
  \def\contprevdialog{%
    \nukeline%
    \line{\hskip 24\charwid \uppercase{#1} (CONT'D)}%
  }
  \def\contdialoga{\nukeline}
  \def\contdialogb{\line{\hskip 24\charwid (MORE)}}
  \expandafter\mark\mymark
  \margins{10\charwid}{35\charwid} % rightmar = \hsize-\leftskip-35\charwid
  \penalty10000
  #2\par
  \stage
}

\def\paren#1#2\par{%
  \par
  \penalty10000
  {%
    \margins{17\charwid}{20\charwid} % rightmar = \hsize-\leftskip-20\charwid
    (#1)%
    \par%
  }
  \penalty10000
  #2\par
  \stage
}

\def\leadin#1{#1~\ldots\par\penalty200}  % These are more exciting in the
\def\pickup{\ldots~}                     % stageplay format.

\def\em#1{{\emfont #1}}
\def\extra#1{\uppercase\expandafter{#1}}
\def\introduce#1{\uppercase\expandafter{#1}}
\def\sound#1{\uppercase{#1}}
\def\ldots{.~.~.}  % Formal typing version.  OK to use "..."

\def\cleanup{%
  \par
  \acttail
  \def\contdialoga{}
  \def\contdialogb{}
  \def\contscenea{}
  \def\contsceneb{}
  \expandafter\mark\mymark
  \vfill
  \penalty-10000
}
\def\bye{%
  \cleanup
  \end
}
%
% Shortcuts:
%
\def\beat{\paren{beat}}
\def\cut{\trans{cut to}}
\let\dialogue=\dialog
\def\dissolve{\trans{dissolve to}}
\def\ext#1{\scene{ext.\ #1}}
\def\fadein{\open{fade in}}
\def\fadeout{\close{fade out}}
\def\int#1{\scene{int.\ #1}}
\def\os{\paren{off screen}}
\let\shot=\scene
\let\tv=\TV
\def\vo{\paren{voice over}}
%
% Defaults
%
\TV\proof
