summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/technica/drama.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/technica/drama.dtx')
-rw-r--r--macros/latex/contrib/technica/drama.dtx1972
1 files changed, 1972 insertions, 0 deletions
diff --git a/macros/latex/contrib/technica/drama.dtx b/macros/latex/contrib/technica/drama.dtx
new file mode 100644
index 0000000000..92eef65509
--- /dev/null
+++ b/macros/latex/contrib/technica/drama.dtx
@@ -0,0 +1,1972 @@
+% \iffalse meta-comment
+%
+%
+% COPYRIGHT NOTICE AND LICENSE
+%
+%
+% COPYRIGHT
+% =========
+%
+% Copyright Gianfranco Boggio-Togna 2006
+%
+%
+% DEFINITIONS
+% ===========
+%
+% In this document the following terms are used:
+%
+% `Work'
+% The files TEXNIKA.dtx, poetry.dtx, drama.dtx, technica.ins and
+% the derived files TEXNIKA.sty, poetry.sty, drama.sty
+%
+% 'Copyright Holder'
+% Gianfranco Boggio-Togna
+%
+% `Derived Work'
+% Any work that under any applicable law is derived from the Work.
+%
+% `Modification'
+% Any procedure that produces a Derived Work under any applicable
+% law -- for example, the production of a file containing an
+% original file associated with the Work or a significant portion of
+% such a file, either verbatim or with modifications and/or
+% translated into another language.
+%
+% `Modify'
+% To apply any procedure that produces a Derived Work under any
+% applicable law.
+%
+% `Distribution'
+% Making copies of the Work available from one person to another, in
+% whole or in part. Distribution includes (but is not limited to)
+% making any electronic components of the Work accessible by
+% file transfer protocols such as FTP or HTTP or by shared file
+% systems such as Sun's Network File System (NFS).
+%
+%
+% CONDITIONS ON DISTRIBUTION AND MODIFICATION
+% ===========================================
+%
+% 1. You may distribute a complete, unmodified copy of the Work as you
+% received it. Distribution of only part of the Work is considered
+% modification of the Work, and no right to distribute such a Derived
+% Work may be assumed under the terms of this clause.
+%
+% 2. The Copyright Holder may, without restriction, modify the Work,
+% thus creating a Derived Work. The Copyright Holder may also distribute
+% the Derived Work without restriction. Derived Works distributed in
+% this manner by the Copyright Holder are considered to be updated
+% versions of the Work.
+%
+% 3. If you are not the Copyright Holder, you are not allowed
+% to modify the Work.
+%
+% 4. The conditions above are not intended to prohibit, and hence do
+% not apply to, the modification, by any method, of any component so that it
+% becomes identical to an updated version of that component of the Work as
+% it is distributed by the Copyright Holder under Clause 2, above.
+%
+% 5. Distribution of the Work in an alternative format, where the Work
+% is then produced by applying some process to that format, does not
+% relax or nullify any sections of this license as they pertain to the
+% results of applying that process.
+%
+% 6. This license places no restrictions on works that are unrelated to
+% the Work, nor does this license place any restrictions on aggregating
+% such works with the Work by any means.
+%
+% 7. Nothing in this license is intended to, or may be used to, prevent
+% complete compliance by all parties with all applicable laws.
+%
+%
+% CONDITIONS ON USE
+% =================
+%
+% The Work may be used without charge for non-commercial private
+% or academic purposes. Use of the Work for commercial purposes is
+% prohibited. To use the Work for commercial purposes you must obtain a
+% license for commercial use from the Copyright Holder.
+%
+%
+% NO WARRANTY
+% ===========
+%
+% There is no warranty for the Work. Except when otherwise stated in
+% writing, the Copyright Holder provides the Work `as is', without
+% warranty of any kind, either expressed or implied, including, but not
+% limited to, the implied warranties of merchantability and fitness for
+% a particular purpose. The entire risk as to the quality and performance
+% of the Work is with you. Should the Work prove defective, you
+% assume the cost of all necessary servicing, repair, or correction.
+%
+% In no event unless agreed to in writing will the Copyright Holder or
+% any other party who may distribute the Work as permitted above, be
+% liable to you for damages, including any general, special, incidental
+% or consequential damages arising out of any use of the Work or out
+% of inability to use the Work (including, but not limited to, loss of
+% data, data being rendered inaccurate, or losses sustained by anyone
+% as a result of any failure of the Work to operate with any other
+% programs), even if the Copyright Holder or said other party has been
+% advised of the possibility of such damages.
+%
+%<*driver>
+\documentclass{ltxdoc}
+\setlength{\parindent}{0pt}
+\setlength{\textwidth}{5.5in}
+\setlength{\textheight}{8.5in}
+\setlength{\parskip}{\smallskipamount}
+\usepackage[ibycus,english]{babel}
+\usepackage[pagestyles]{titlesec}
+\newpagestyle {DRAMA@page} {
+
+ \sethead {}
+ {\large {\itshape The} \texttt{drama} {\itshape package}}
+ {\textup{\thepage}}
+ \setfoot {}
+ {Copyright \copyright\ Gianfranco Boggio--Togna 2006}
+ {}%
+ \setmarks {section}{subsection}
+}
+\MakeShortVerb{|}
+\AlsoImplementation
+\begin{document}
+\DocInput{drama.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \iftrue \CheckSum{2530} \fi
+%
+% \def\fileversion{0.9}
+% \def\filedate{2006/11/11}
+%
+\def\TEXNIKA {%
+ \expandafter
+ \ifx \csname l@polutonikogreek\endcsname \relax
+ \expandafter
+ \ifx \csname l@ibycus\endcsname \relax
+ $\tau\kern-.05em\epsilon\chi\nu\kern-.05em\iota
+ \kappa\kern.04em\acute\alpha$%
+ \else
+ \foreignlanguage{ibycus}{texnika'}%
+ \fi
+ \else
+ \foreignlanguage{polutonikogreek}{teqnik'a}%
+ \fi
+}
+\def \TXN@cmd#1{\texttt{\protect\bslash #1}}%
+%
+% \thispagestyle{empty}
+% \begin{centering}
+% {\large \textsc{Gianfranco Boggio\,--Togna}}\par
+% \vspace*{1in}
+% {\Huge \TEXNIKA}\par
+% \vspace*{.15in}
+% {\LARGE Typesetting for the Humanities}\par
+% \vspace*{.5in}
+% {\Large The \textbf{drama} package}\par
+% \vfill
+% {\Large Version 0.9}\par
+% \end{centering}
+% \newpage
+% \thispagestyle{empty}
+% \vspace{6ex}
+% \section*{Copyright notice}
+% \noindent Copyright \copyright\ Gianfranco Boggio--Togna 2006\par
+% Author's address: C.P. 14021, I-20140 Milano\\
+% Email: \textsl{gbt\kern .08em @\kern .1em acm.org}
+% \vspace{6ex}
+% \section*{License}
+% \noindent This program is distributed under the terms of the license
+% that appears at the start of the file \texttt{drama.dtx} (this file)
+% and in file \texttt{license.txt}
+%
+% This program consists of the files \texttt{drama.dtx} and
+% \texttt{technica.ins}
+%
+% \newpage
+% \pagenumbering{roman}
+% \tableofcontents
+% \newpage
+% \pagenumbering{arabic}
+% \pagestyle {DRAMA@page}
+%
+% \StopEventually{}
+% \newpage
+%
+% \section{External dependencies}
+%
+% \begin{macrocode}
+\def \TXN@temp {LaTeX2e}
+\def \TXN@temp@bis {2003/12/01}
+\@tempswafalse
+\ifx \fmtname \TXN@temp
+ \ifx \fmtversion \TXN@temp@bis
+ \else
+ \def \TXN@temp@bis {2005/12/01}
+ \ifx \fmtversion \TXN@temp@bis
+ \else
+ \@tempswatrue
+ \fi
+ \fi
+\else
+ \@tempswatrue
+\fi
+\if@tempswa
+ \PackageError {DRAMA}
+ {The Technica suite requires the LaTex\MessageBreak
+ release dated `2003/12/01' or `2005/12/01'}
+ {}
+ \def\recurse{(\recurse)}\recurse
+\fi
+%
+\ProvidesPackage {drama} [2006/11/11 v. 0.9 A package for typesetting drama]
+\RequirePackageWithOptions {TEXNIKA}
+% \end{macrocode}
+% \section{Initialization}
+% \begin{macrocode}
+\newbox \DRM@vbox
+\newbox \DRM@hbox
+% \end{macrocode}
+% Most internal variables are initialized to |\empty|, for easier testing.
+% \begin{macrocode}
+\def \DRM@persona@side {}
+\def \DRM@persona@flags {}
+\edef \DRM@persona@position {\TXN@o@PersonaNormal}
+\def \DRM@persona@field {}
+\def \DRM@FaciesPersonae {}
+\def \DRM@FormaPersonae {}
+\def \DRM@SpatiumAntePersonam {}
+\def \DRM@SpatiumSupraPersonam {}
+\def \DRM@SpatiumInfraPersonam {}
+\def \DRM@speech@lines {0}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@FaciesBracketSD {}
+\def \DRM@FormaBracketSD {}
+\def \DRM@SpatiumAnteBracketSD {}
+\def \DRM@SpatiumPostBracketSD {}
+\def \DRM@SpatiumSupraBracketSD {}
+\def \DRM@SpatiumInfraBracketSD {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@FaciesParenthesisSD {}
+\def \DRM@FormaParenthesisSD {}
+\def \DRM@SpatiumSupraParenthesisSD {}
+\def \DRM@SpatiumInfraParenthesisSD {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@resume@par {}
+% \end{macrocode}
+%
+% \section{Entering and leaving the domain}
+%
+% A switch used to avoid a spurious |\par| before the first speech.
+% \begin{macrocode}
+\newif \ifDRM@first@speech
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \Drama {\TXN@withinDramatrue \DRM@first@speechtrue}
+\let \drama = \Drama
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \endDrama {\TXN@withinDramafalse}
+\let \enddrama = \endDrama
+% \end{macrocode}
+% \section{Speech-headings}
+%
+%
+% True for the starred form of |\persona|.
+% \begin{macrocode}
+\newif \ifDRM@starred
+% \end{macrocode}
+% True if the |\persona| is followed by a b-SD.
+% \begin{macrocode}
+\newif \ifDRM@persona@bracketSD
+% \end{macrocode}
+% True if |\Facies \personae| contains |#2|.
+% \begin{macrocode}
+\newif \ifDRM@bracketSD@in@persona
+% \end{macrocode}
+% True is |\persona| is preceded by |\aparte|.
+% \begin{macrocode}
+\newif \ifDRM@aparte@persona
+% \end{macrocode}
+% True if b-SD starts a line (no |\StatiumAnte|).
+% \begin{macrocode}
+\newif \ifDRM@initial@bracketSD
+% \end{macrocode}
+% \subsection{The \TXN@cmd{persona} command}
+% \begin{macrocode}
+\newcommand {\persona}{%
+ \@ifstar {\DRM@starredtrue \DRM@persona@switch}
+ {\DRM@starredfalse \DRM@persona@switch}}
+\let \personae = \persona
+\let \personam = \persona
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@persona@switch {%
+ \ifx \empty \TXN@attribute@name
+ \expandafter \DRM@persona
+ \else
+ \def \TXN@subclass@name {persona}%
+ \def \TXN@subclass@number {}%
+ \def \TXN@temp {DRM}%
+ \expandafter \TXN@attribute@set
+ \fi
+}
+% \end{macrocode}
+% \subsection{Processing the \TXN@cmd{persona} command}
+% \begin{macrocode}
+\newcommand {\DRM@persona} [2][]{%
+%<debug> \TXN@trace \DRM@persona
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifTXN@withinDrama
+ \else
+ \ifDRM@starred
+ \else
+ \PackageError {DRAMA}
+ {\protect\persona\space may be used\MessageBreak
+ only within the `drama' domain}
+ {}%
+ \fi
+ \fi
+% \end{macrocode}
+% First define the abbreviation, if present.
+% \begin{macrocode}
+ \TXN@counter@a = \z@
+ \TXN@counter@b = \z@
+ \DRM@check@abbreviation #1\TXN@nil
+% \end{macrocode}
+% There is an abbreviation.
+% \begin{macrocode}
+ \ifnum \TXN@counter@a > \z@
+ \TXN@gdef {DRM@#1}{\persona{#2}}%
+ \fi
+ \ifDRM@starred
+% \end{macrocode}
+% If \textasteriskcentered-form, nothing else to do.
+% \begin{macrocode}
+ \else
+ \DRM@getPersona {#2}%
+ \expandafter \DRM@process@persona
+ \fi
+}
+% \end{macrocode}
+% Get the argument.
+% \begin{macrocode}
+\def \DRM@getPersona #1{%
+ \let \DRM@esc@esc = \\%
+ \def \\{\relax}%
+ \DRM@splitPersona #1\\\\%
+ \let \\= \DRM@esc@esc
+}
+% \end{macrocode}
+% Split the argument into the two sub-arguments.
+% \begin{macrocode}
+\def \DRM@splitPersona #1\\#2\\{%
+%<debug> \TXN@trace \DRM@splitPersona
+ \TXN@trim {#1}%
+ \ifDRM@aparte@persona
+ \DRM@aparte@personafalse
+ \ifx \DRM@FaciesAparte \relax
+ \edef \DRM@persona@first {\the\TXN@trimmed}%
+ \else
+ \edef \DRM@persona@first
+ {\noexpand\DRM@FaciesAparte\the\TXN@trimmed}%
+ \fi
+ \else
+ \edef \DRM@persona@first {\the\TXN@trimmed}%
+ \fi
+ \@ifmtarg{#2} {\relax} {\TXN@trim {#2}}%
+ \edef \DRM@persona@second {\the\TXN@trimmed}%
+}
+% \end{macrocode}
+% Check for an abbreviation in the optional parameter.
+% \begin{macrocode}
+\def \DRM@check@abbreviation #1{%
+ \ifx \TXN@nil #1\relax
+ \ifnum \TXN@counter@a > \tw@
+ \PackageError {DRAMA}
+ {The \protect\persona\space abbreviation has more than 2 digits}
+ {An abbreviation must be in the range 01-99}%
+ \fi
+ \ifnum \TXN@counter@b = \z@
+ \ifnum \TXN@counter@a > \z@
+ \PackageError{DRAMA}%
+ {The \protect\persona\space abbreviation cannot be zero}
+ {The control sequences \@backslashchar0 and \@backslashchar00
+ are reserved \MessageBreak (see the User Manual)}%
+ \fi
+ \fi
+ \else
+ \advance \TXN@counter@a by \@ne
+ \TXN@check@start@of@number {#1}%
+ \ifTXN@isdigit
+ \advance \TXN@counter@b by #1\relax
+ \else
+ \PackageError {DRAMA}%
+ {A \protect\persona\space abbreviation contains\MessageBreak
+ a character that is not a digit}
+ {An abbreviation must be a number in the range 01-99}%
+ \fi
+ \expandafter \DRM@check@abbreviation
+ \fi
+}
+% \end{macrocode}
+% \subsection{Setting the \TXN@cmd{persona} attributes}
+% \paragraph{Facies}
+% \begin{macrocode}
+\def \DRM@setFacies@persona #1{%
+ \let \DRM@esc@esc = \\%
+ \let \\= \relax
+ \DRM@splitFaciesPersonae #1\\\\%
+ \let \\= \DRM@esc@esc
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@splitFaciesPersonae #1\\#2\\{%
+ \def \DRM@FaciesPersonae@first ##1##2{%
+ \begingroup
+ \TXN@withinPersonatrue
+ \DRM@ifthenelse
+ #1%
+ \endgroup
+ }%
+ \@ifmtarg{#2}%
+ {\def \DRM@FaciesPersonae@second ##1##2{%
+ \begingroup
+ \DRM@ifthenelse
+ \ignorespaces
+ #1%
+ \endgroup
+ }%
+ }
+ {\def \DRM@FaciesPersonae@second ##1##2{%
+ \begingroup
+ \DRM@ifthenelse
+ \ignorespaces
+ #2%
+ \endgroup
+ }%
+ }%
+ \DRM@bracketSD@in@personafalse
+ \TXN@check@parm 2\DRM@FaciesPersonae@first\TXN@nil
+ \ifTXN@sw
+ \DRM@bracketSD@in@personatrue
+ \fi
+}
+% \end{macrocode}
+% \paragraph{Forma}
+% \begin{macrocode}
+\def \DRM@setForma@persona #1{%
+ \def \DRM@FormaPersonae {#1\relax}%
+}
+% \end{macrocode}
+% \paragraph{Locus}
+% \begin{macrocode}
+\def \DRM@setLocus@persona #1{%
+ \def \TXN@parameter {#1}%
+ \ifx \empty \TXN@parameter
+ \edef \DRM@persona@side {}%
+ \else
+ \TXN@counter = \z@
+ \def \TXN@entity@code {p}%
+ \TXN@setLocus {#1}%
+ \fi
+}
+% \end{macrocode}
+% \paragraph{Modus}
+% \begin{macrocode}
+\def \DRM@setModus@persona #1{%
+ \def \TXN@parameter {#1}%
+ \ifx \empty \TXN@parameter
+ \edef \DRM@persona@flags {}%
+ \edef \DRM@persona@field {}%
+ \else
+ \TXN@counter = \z@
+ \def \TXN@entity@code {p}%
+ \TXN@setModus {#1}%
+ \fi
+}
+% \end{macrocode}
+% \paragraph{Spacing}
+% \begin{macrocode}
+\def \DRM@setSpatiumAnte@persona #1{%
+ \TXN@build@spatium@horizontal {#1}%
+ \toks@ = \expandafter {\TXN@temp}%
+ \edef \DRM@SpatiumAntePersonam {\the\toks@}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@setSpatiumSupra@persona #1{%
+ \def \TXN@parameter {#1}%
+ \ifx \empty \TXN@parameter
+ \def \DRM@SpatiumSupraPersonam {}%
+ \else
+ \TXN@build@spatium@list {#1}%
+ \edef \DRM@SpatiumSupraPersonam {\TXN@L@spatium}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@setSpatiumInfra@persona #1{%
+ \def \TXN@parameter {#1}%
+ \ifx \empty \TXN@parameter
+ \def \DRM@SpatiumInfraPersonam {}%
+ \else
+ \TXN@build@spatium@list {#1}%
+ \edef \DRM@SpatiumInfraPersonam {\TXN@L@spatium}%
+ \fi
+}
+% \end{macrocode}
+% \subsection{Processing an abbreviation}
+%
+% |\nn| is associated with the \textbf{cs} |\DRM@nn|.
+% \begin{macrocode}
+\def \0{\DRM@persona@number 0}
+\def \1{\DRM@persona@number 1}
+\def \2{\DRM@persona@number 2}
+\def \3{\DRM@persona@number 3}
+\def \4{\DRM@persona@number 4}
+\def \5{\DRM@persona@number 5}
+\def \6{\DRM@persona@number 6}
+\def \7{\DRM@persona@number 7}
+\def \8{\DRM@persona@number 8}
+\def \9{\DRM@persona@number 9}
+% \end{macrocode}
+% |\0| and |\00| are reserved and are set to special values.
+% \begin{macrocode}
+\TXN@def {DRM@0}{\persona{\kern0cc}}
+\TXN@def {DRM@00}{\persona{\kern0dd}}
+\def \DRM@persona@zero {\kern0cc}
+\def \DRM@persona@zero@zero {\kern0dd}
+% \end{macrocode}
+% Get the first digit.
+% \begin{macrocode}
+\def \DRM@persona@number #1{%
+ \ifTXN@withinSD
+ \else
+ \ifTXN@withinPersona
+ \PackageError {DRAMA}
+ {You cannot use a \protect\persona\space abbreviation \MessageBreak
+ within the argument of \protect\persona}
+ {}%
+ \fi
+ \fi
+ \gdef \DRM@@ {#1}%
+ \futurelet \DRM@token \DRM@persona@number@bis
+}
+% \end{macrocode}
+% Check for a second digit.
+% \begin{macrocode}
+\def \DRM@persona@number@bis {%
+ \TXN@check@start@of@number {\DRM@token}%
+ \ifTXN@isdigit
+ \expandafter \DRM@persona@number@ter
+ \else
+ \expandafter \DRM@persona@number@quater
+ \fi
+}
+% \end{macrocode}
+% Attach the second digit.
+% \begin{macrocode}
+\def \DRM@persona@number@ter #1{%
+ \xdef \DRM@@ {\DRM@@#1}%
+ \DRM@persona@number@quater
+}
+% \end{macrocode}
+% Check whether the abbreviation exists.
+% \begin{macrocode}
+\def \DRM@persona@number@quater {%
+ \if \TXN@relax {DRM@\DRM@@}%
+ \PackageError {DRAMA}%
+ {The \protect\persona\space abbreviation is undefined}{}%
+ \else
+ \expandafter \DRM@persona@number@quinquies
+ \fi
+}
+% \end{macrocode}
+% Expand the abbreviation.
+% \begin{macrocode}
+\def \DRM@persona@number@quinquies{\@nameuse {DRM@\DRM@@}}
+% \end{macrocode}
+%
+% \subsection{Processing the speech-heading}
+% \begin{macrocode}
+\def \DRM@process@persona {%
+%<debug> \TXN@trace \DRM@process@persona
+ \def \DRM@options@SD {}%
+ \let \next = \DRM@process@persona@bis
+% \end{macrocode}
+% Within a SD, generate the second sub-argument.
+% \begin{macrocode}
+ \ifTXN@withinSD
+ \let \next = \relax
+ \DRM@FaciesPersonae@second \DRM@persona@second \DRM@persona@first
+ \else
+% \end{macrocode}
+% Within another |\persona|, generate the first sub-argument.
+% \begin{macrocode}
+ \ifTXN@withinPersona
+ \let \next = \relax
+ \DRM@persona@first
+ \else
+ \xdef \DRM@speech@lines {\ifTXN@withinVersus 1\else 2\fi}%
+ \ifhmode
+ \ifTXN@withinVersus
+% \end{macrocode}
+% Check for more than one |\persona| in the heading.
+% \begin{macrocode}
+ \ifnum \PTR@box@ind > \PTR@box@line
+ \if\TXN@num {PTR@box@type\number\PTR@box@line}
+ = \PTR@box@persona
+ \let \next = \DRM@process@persona@within@line
+ \fi
+ \fi
+ \else
+ \ifDRM@first@speech
+ \else
+ \par
+ \fi
+ \fi
+ \fi
+ \fi
+ \DRM@first@speechfalse
+ \fi
+ \next
+}
+% \end{macrocode}
+%
+% If no text has yet been found on the line, join the |\persona|
+% to the speech-heading; otherwise, generate the usual box for
+% a |\persona| but flag it as `text'.
+% \begin{macrocode}
+\def \DRM@process@persona@within@line {%
+ \xdef \TXN@gtemp {\DRM@persona@first}%
+ \xdef \TXN@gtemp@bis {\DRM@persona@second}%
+ \PTR@close@box \PTR@box@text \empty
+ \edef \DRM@persona@first {\TXN@gtemp}%
+ \edef \DRM@persona@second {\TXN@gtemp@bis}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifdim \wd\PTR@box@ind = \z@
+ \count@ = \PTR@box@ind
+ \advance \count@ by \m@ne
+ \setbox \count@ = \hbox {%
+ \unhbox \count@
+ \unhbox \PTR@box@ind \unskip
+ \DRM@FaciesPersonae@first {\DRM@persona@first}\empty
+ }%
+ \gdef \PTR@ignorespaces {\ignorespaces}%
+ \advance \PTR@box@ind by \m@ne
+ \else
+ \advance \PTR@box@ind by \@ne
+ \setbox \PTR@box@ind = \hbox {%
+ \DRM@SpatiumAntePersonam
+ \DRM@FaciesPersonae@first {\DRM@persona@first}\empty
+ }%
+ \TXN@edef {PTR@box@type\the\PTR@box@ind}{\PTR@box@text}%
+ \fi
+ \PTR@next@box
+}
+% \end{macrocode}
+% Record the position of the speech-heading.
+% \begin{macrocode}
+\def \DRM@process@persona@bis {%
+%<debug> \TXN@trace \DRM@process@persona@bis
+ \ifx \empty \DRM@persona@side
+ \edef \DRM@persona@position {\TXN@o@PersonaNormal}%
+ \else
+ \ifnum \DRM@persona@side = \TXN@centre \TXN@safe
+ \edef \DRM@persona@position {\TXN@o@PersonaCentre}%
+ \else
+ \edef \DRM@persona@position {\TXN@o@PersonaLeft}%
+ \fi
+ \fi
+ \futurelet \DRM@token \DRM@process@persona@checknonspace
+}
+% \end{macrocode}
+% First check for a comma immediately following the persona, and then
+% (if the |\Facies| |\personae| includes |#2|) for a SD starting
+% with |\[|
+% \begin{macrocode}
+\def \DRM@process@persona@checknonspace {%
+%<debug> \TXN@trace \DRM@process@persona@checknonspace
+ \ifx ,\DRM@token
+ \expandafter \DRM@process@persona@checknonspace@bis
+ \else
+ \expandafter \DRM@process@persona@checknonspace@ter
+ \fi
+}
+% \end{macrocode}
+% Attach the comma to the |\persona| string.
+% \begin{macrocode}
+\def \DRM@process@persona@checknonspace@bis #1{%
+ \edef \DRM@persona@first {\DRM@persona@first #1}%
+ \futurenonspacelet \DRM@token \DRM@process@persona@checkbracketSD
+}
+% \end{macrocode}
+% Fetch the next token.
+% \begin{macrocode}
+\def \DRM@process@persona@checknonspace@ter {%
+ \futurenonspacelet \DRM@token \DRM@process@persona@checkbracketSD
+}
+% \end{macrocode}
+%
+% Check for a b-SD.
+%
+% \begin{macrocode}
+\def \DRM@process@persona@checkbracketSD {%
+%<debug> \TXN@trace \DRM@process@persona@checkbracketSD
+% \end{macrocode}
+% If a b-SD follows, the |\persona| string will be processed after the
+% b-SD has been read.
+% \begin{macrocode}
+ \let \next = \DRM@process@persona@check@position
+ \DRM@initial@bracketSDfalse
+ \ifx \[\DRM@token
+ \ifDRM@bracketSD@in@persona
+ \setbox \z@ = \hbox {\DRM@persona@first}%
+ \ifdim \wd\z@ = \z@
+% \end{macrocode}
+% |\0| and |\00| get special treatment.
+% \begin{macrocode}
+ \global \TXN@blank@linefalse
+ \DRM@initial@bracketSDtrue
+ \else
+ \global \DRM@persona@bracketSDtrue
+ \let \next = \relax
+ \fi
+ \else
+ \DRM@initial@bracketSDtrue
+ \fi
+ \fi
+ \next
+}
+% \end{macrocode}
+%
+% Check for a special position of |\persona|. If it is |\centre|,
+% we can typeset the speech-heading here; it is |\left|, we can do
+% this only if we are not in the \textit{Versus} domain (the speech-heading
+% may end up at the start of a fragment of a split line).
+%
+% \begin{macrocode}
+\def \DRM@process@persona@check@position {%
+%<debug> \TXN@trace \DRM@process@persona@check@position
+ \ifTXN@withinVersus
+ \let \next = \DRM@start@speech@versus
+ \if \TXN@o@PersonaCentre \DRM@persona@position
+ \let \next = \DRM@process@persona@position@centre
+ \fi
+ \else
+ \let \next = \DRM@start@speech@prose
+ \if \TXN@o@PersonaLeft\DRM@persona@position
+ \DRM@process@persona@position@left
+ \else
+ \if \TXN@o@PersonaCentre\DRM@persona@position
+ \DRM@process@persona@position@centre
+ \fi
+ \fi
+ \fi
+ \next
+}
+% \end{macrocode}
+%
+% Special position: |\centre|.
+%
+% \begin{macrocode}
+\def \DRM@process@persona@position@centre {%
+%<debug> \TXN@trace \DRM@process@persona@position@centre
+ \skip@ = \DRM@persona@offset
+ \advance \skip@ by \skip@
+ \skip@@ = \z@skip
+ \ifdim \skip@ < \z@
+ \skip@@ = -\skip@
+ \skip@ = \z@skip
+ \fi
+ \setbox \DRM@hbox = \hbox to \TXN@measure {%
+ \hfill
+ \hskip \skip@
+ \DRM@FaciesPersonae@first {\DRM@persona@first}\empty
+ \hskip \skip@@
+ \hfill
+ }%
+ \ifTXN@withinVersus
+ \TXN@was@withinVersustrue
+ \global \PTR@par@startedfalse
+ \global \TXN@after@Spatiumtrue
+ \else
+ \TXN@was@withinVersusfalse
+ \fi
+ \if \TXN@option p\TXN@numbered@classes
+ \ifTXN@withinVersus
+ \TXN@exxxpandafter \prosa
+ \fi
+ \fi
+ \TXN@spatium@vertical \DRM@SpatiumSupraPersonam
+ \def \TXN@line@class {p}%
+ \if \TXN@option p\TXN@numbered@classes
+ \leavevmode \box \DRM@hbox \par
+ \else
+ \box \DRM@hbox
+ \fi
+ \def \TXN@line@class {}%
+ \TXN@spatium@vertical \DRM@SpatiumInfraPersonam
+ \if \TXN@option p\TXN@numbered@classes
+ \ifTXN@was@withinVersus
+ \TXN@exxxpandafter \endprosa
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% Special position: |\left|.
+%
+% \begin{macrocode}
+\def \DRM@process@persona@position@left {%
+%<debug> \TXN@trace \DRM@process@persona@position@left
+ \ifx \DRM@persona@first \DRM@persona@zero@zero
+ \else
+ \setbox \z@ = \vbox {%
+ \hbox to \TXN@measure {%
+ \DRM@FaciesPersonae@first {\DRM@persona@first} \empty
+ \hfil
+ }%
+ }%
+ \TXN@spatium@vertical \DRM@SpatiumSupraPersonam
+ \box \z@
+ \TXN@spatium@vertical \DRM@SpatiumInfraPersonam
+ \fi
+}
+% \end{macrocode}
+%
+% We are the start a speech within \textit{Versus}. Fill a box
+% with the speech-heading and continue fetching text from the line.
+%
+% \begin{macrocode}
+\def \DRM@start@speech@versus {%
+%<debug> \TXN@trace \DRM@start@speech@versus
+ \ifx \DRM@persona@first \DRM@persona@zero@zero
+ \gdef \DRM@speech@lines {2}%
+ \else
+ \ifx \DRM@persona@first \DRM@persona@zero
+ \gdef \DRM@speech@lines {1}%
+ \else
+ \expandafter
+ \let \expandafter \DRM@save@textus@zero
+ \csname TXN@textus[\TXN@theTextus]Facies\endcsname
+ \expandafter
+ \let \csname TXN@textus[\TXN@theTextus]Facies\endcsname = \relax
+ \PTR@start@box
+ \DRM@FaciesPersonae@first {\DRM@persona@first} \empty
+ \PTR@close@box \PTR@box@persona \DRM@persona@position
+ \expandafter
+ \let \csname TXN@textus[\TXN@theTextus]Facies\endcsname
+ = \DRM@save@textus@zero
+ \ifx \empty \DRM@persona@field
+ \else
+ \DRM@persona@inside@field
+ \fi
+ \expandafter \PTR@next@box
+ \fi
+ \fi
+}
+% \end{macrocode}
+% The |\persona| box is unpacked and re-packed inside the field.
+% \begin{macrocode}
+\def \DRM@persona@inside@field {%
+%<debug> \TXN@trace \DRM@persona@inside@field
+ \dimen@ = \DRM@persona@field
+ \advance \dimen@ by -\wd\PTR@box@ind
+ \ifdim \dimen@ > \z@
+ \dimen@@ = \dimen@
+ \divide \dimen@@ by \tw@
+ \def \TXN@glue@left {}%
+ \def \TXN@glue@right {}%
+ \if \TXN@option \TXN@o@RangedLeft \DRM@persona@flags
+ \edef \TXN@glue@right {\kern \the\dimen@@\relax}%
+ \if \TXN@option \TXN@o@RangedRight \DRM@persona@flags
+ \edef \TXN@glue@left {\kern \the\dimen@@\relax}%
+ \else
+ \edef \TXN@glue@right {\kern \the\dimen@\relax}%
+ \fi
+ \else
+ \edef \TXN@glue@left {\kern \dimen@\relax}%
+ \fi
+ \setbox \PTR@box@ind = \hbox {%
+ \TXN@glue@left \unhbox \PTR@box@ind \TXN@glue@right}%
+ \fi
+}
+% \end{macrocode}
+%
+% We are at the start of a speech outside \textit{Versus}. Typeset
+% the speech-heading (possibly packing it inside a field) and
+% set the formatting parameters for the speech.
+%
+% \begin{macrocode}
+\def \DRM@start@speech@prose {%
+%<debug> \TXN@trace \DRM@start@speech@prose
+ \ifx \empty \DRM@persona@side
+ \TXN@spatium@vertical \DRM@SpatiumSupraPersonam
+ \def \TXN@glue@left {}%
+ \def \TXN@glue@right {}%
+ \ifx \empty \DRM@persona@field
+ \setbox \DRM@hbox = \hbox \bgroup
+ \else
+ \if \TXN@option \TXN@o@RangedRight \DRM@persona@flags
+ \def \TXN@glue@left {\hfil}%
+ \fi
+ \if \TXN@option \TXN@o@RangedLeft \DRM@persona@flags
+ \def \TXN@glue@right {\hfil}%
+ \fi
+ \setbox \DRM@hbox = \hbox to \DRM@persona@field \bgroup
+ \fi
+ \TXN@glue@left
+ \setbox \z@ = \hbox {\DRM@persona@first}%
+ \ifdim \wd\z@ = \z@
+ \else
+ \def \TXN@parm@i {\DRM@persona@first}%
+ \DRM@FaciesPersonae@first \TXN@parm@i \empty
+ \fi
+ \TXN@glue@right
+ \egroup
+ \fi
+ \everypar = {}%
+ \DRM@FormaPersonae
+ \ifx \DRM@persona@first \DRM@persona@zero@zero
+ \DRM@set@resume@par
+ \DRM@resume@par
+ \else
+ \leavevmode
+ \DRM@set@resume@par
+ \fi
+ \ifx \empty \DRM@persona@field \unhbox \else \box \fi \DRM@hbox
+ \everypar = {\DRM@resume@par}%
+ \ignorespaces
+}
+% \end{macrocode}
+% A speech may be interrupted (for instance, by a SD) and, on
+% resumption, we must set the appropriate formatting parameters.
+% \begin{macrocode}
+\def \DRM@set@resume@par {%
+ \def \DRM@resume@par {}%
+ \ifdim \parindent > \z@
+ \parindent = \z@
+ \else
+ \ifnum \hangafter > \z@
+ \edef \DRM@resume@par {\hangindent = \the\hangindent \hangafter = \z@}%
+ \fi
+ \ifnum \hangafter < \z@
+ \edef \DRM@resume@par {\hangindent = \z@ \hangafter = \z@}%
+ \fi
+ \fi
+ \ifdim \leftskip = \z@
+ \else
+ \edef \DRM@resume@par {\leftskip \the\leftskip \DRM@resume@par}%
+ \fi
+ \ifdim \rightskip = \z@
+ \else
+ \edef \DRM@resume@par {\rightskip \the\rightskip \DRM@resume@par}%
+ \fi
+ \ifx \DRM@persona@first \DRM@persona@zero@zero
+ \ifnum \hangafter > \z@
+ \hangafter = \z@
+ \fi
+ \ifnum \hangafter < \z@
+ \hangafter = \z@
+ \hangindent = \z@
+ \fi
+ \ifdim \parindent > \z@
+ \parindent = \z@
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \subsection{Processing the \TXN@cmd{aparte} command}
+% \begin{macrocode}
+\newcommand {\aparte} {%
+ \ifx \empty \TXN@attribute@name
+ \expandafter \DRM@aparte
+ \else
+ \def \TXN@subclass@name {aparte}%
+ \def \TXN@subclass@number {}%
+ \def \TXN@temp {DRM}%
+ \expandafter \TXN@attribute@set
+ \fi
+}
+% \end{macrocode}
+%
+% We just set a switch, which is tested in |\DRM@splitPersona|.
+%
+% \begin{macrocode}
+\def \DRM@aparte {\DRM@aparte@personatrue}
+\def \DRM@setFacies@aparte #1{%
+ \def \DRM@FaciesAparte {#1\relax}%
+}
+% \end{macrocode}
+%
+% \section{Bracketed stage directions (b-SD)}
+% \subsection{Processing a b-SD}
+%
+% A b-SD is saved in this token register because it may have to be
+% typeset again.
+%
+% \begin{macrocode}
+\newtoks \DRM@toks@SD
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \[{\DRM@inner@bracketSD}%
+\def \]{}
+\def \DRM@inner@bracketSD {%
+ \ifx \empty \TXN@attribute@name
+ \expandafter \DRM@bracketSD
+ \else
+ \def \TXN@subclass@name {bracketSD}%
+ \def \TXN@subclass@number {}%
+ \def \TXN@temp {DRM}%
+ \expandafter \TXN@attribute@set
+ \fi
+}
+% \end{macrocode}
+%
+% Check for options.
+%
+% \begin{macrocode}
+\def \DRM@bracketSD {%
+%<debug> \TXN@trace \DRM@bracketSD
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifTXN@drive@out
+ \global \TXN@drive@outfalse
+ \endgroup
+ \fi
+% \end{macrocode}
+% If we are within |\versus|, close the current box, if any, and
+% restore the usual meaning of CR while the argument is read.
+% \begin{macrocode}
+ \ifTXN@withinVersus
+ \DRM@bracketSD@versus
+ \fi
+% \end{macrocode}
+% Redefine the delimiters in order to trap errors.
+% \begin{macrocode}
+ \outer \def \[{\relax}%
+ \outer \def \({\relax}%
+ \outer \def \){\relax}%
+ \edef \DRM@opening@delimiter@line {\the\inputlineno}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \def \DRM@delimiter {]}%
+ \let \DRM@cs = \DRM@bracketSD@bis
+ \DRM@check@options
+}
+% \end{macrocode}
+% The test is placed in a macro because |\ifPTR@par@started| may be undefined
+% and cause an error when TeX is skipping over conditional text.
+% \begin{macrocode}
+\def \DRM@bracketSD@versus {%
+ \ifPTR@par@started
+ \egroup
+ \ifdim \wd\PTR@box@ind > \z@
+ \advance \PTR@box@ind by \@ne
+ \fi
+ \fi
+ \TXN@normalCR
+}
+% \end{macrocode}
+% On return from checking the options (if any) we come here.
+% \begin{macrocode}
+\def \DRM@bracketSD@bis {\DRM@bracketSDSD}
+\long \def \DRM@bracketSDSD #1\]{%
+%<debug> \TXN@trace \DRM@bracketSDSD
+% \end{macrocode}
+% First, re-insert any tokens gobbled up while searching for options.
+% \begin{macrocode}
+ \DRM@toks@SD = \expandafter {\the\DRM@toks@SD#1}%
+ \edef \DRM@options@SD {[\DRM@options@SD\DRM@optionsBracketSD}%
+ \if \TXN@option n\DRM@options@SD
+ \if \TXN@option t\DRM@options@SD
+ \else
+ \edef \DRM@options@SD {t\DRM@options@SD}%
+ \fi
+ \fi
+ \ifDRM@initial@bracketSD
+ \DRM@initial@bracketSDfalse
+ \edef \DRM@options@SD {a\DRM@options@SD}%
+ \fi
+ \def \[{\DRM@inner@bracketSD}%
+ \def \({\DRM@inner@parenthesisSD}%
+ \def \){\DRM@standalone@post}%
+% \end{macrocode}
+% Restore the normal environment.
+% \begin{macrocode}
+ \let \next = \relax
+ \ifTXN@withinVersus
+ \TXN@activeCR
+ \fi
+% \end{macrocode}
+% Check the b-SD type.
+% \begin{macrocode}
+ \ifDRM@persona@bracketSD
+ \let \next = \DRM@process@persona@and@bracketSD
+ \else
+ \let \next = \DRM@process@normal@bracketSD
+ \ifTXN@withinVersus
+ \else
+ \ifvmode
+ \if \TXN@option \TXN@o@EmbeddedSD \DRM@options@SD
+ \else
+ \let \next = \DRM@process@standalone@bracketSD
+ \fi
+ \fi
+ \fi
+ \fi
+ \next
+}
+% \end{macrocode}
+% A b-SD appearing immediately after |\persona|.
+% \begin{macrocode}
+\def \DRM@process@persona@and@bracketSD {%
+%<debug> \TXN@trace \DRM@process@persona@and@bracketSD
+ \edef \DRM@options@SD {\TXN@o@EmbeddedSD\TXN@o@InitialSD\DRM@options@SD}%
+ \if \TXN@o@PersonaLeft \DRM@persona@position
+ \edef \DRM@options@SD {\TXN@o@PersonaLeft\DRM@options@SD}%
+ \fi
+ \if \TXN@o@PersonaCentre\DRM@persona@position
+ \edef \DRM@options@SD {\TXN@o@PersonaCentre\DRM@options@SD}%
+ \fi
+ \global \DRM@persona@bracketSDfalse
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \setbox \z@ = \hbox {\DRM@persona@first}%
+ \ifdim \wd \z@ = \z@
+ \def \TXN@parm@i {}%
+ \def \TXN@parm@ii {\DRM@FaciesBracketSD{\the\DRM@toks@SD}}%
+ \else
+ \def \TXN@parm@i {\DRM@persona@first}%
+ \edef \TXN@temp {\the\DRM@toks@SD}%
+ \ifx \empty \TXN@temp
+ \def \TXN@parm@ii {}%
+ \else
+ \if \TXN@option \TXN@o@NoSpatiumAnte \DRM@options@SD
+ \def \TXN@parm@ii {\DRM@FaciesBracketSD{\the\DRM@toks@SD}}%
+ \else
+ \def \TXN@parm@ii {\DRM@SpatiumAnteBracketSD%
+ \DRM@FaciesBracketSD{\the\DRM@toks@SD}}%
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \let \next = \DRM@process@persona@and@bracketSD@normal
+ \ifTXN@withinVersus
+ \if \TXN@o@PersonaCentre \DRM@persona@position
+ \let \next = \DRM@process@persona@and@bracketSD@special
+ \fi
+ \else
+ \if \TXN@o@PersonaNormal \DRM@persona@position
+ \else
+ \let \next = \DRM@process@persona@and@bracketSD@special
+ \fi
+ \fi
+ \next
+}
+% \end{macrocode}
+% A b-SD appearing immediately after |\persona|, with the default
+% speech-heading style.
+% \begin{macrocode}
+\def \DRM@process@persona@and@bracketSD@normal {%
+ \ifTXN@withinVersus
+ \PTR@start@box
+ \else
+ \endgraf
+ \DRM@FormaPersonae
+ \ifx \DRM@persona@first \DRM@persona@zero@zero
+ \DRM@set@resume@par
+ \DRM@resume@par
+ \fi
+% \DRM@SpatiumAntePersonam
+ \fi
+ \begingroup
+ \def \\{}%
+ \DRM@FaciesPersonae@first {\TXN@parm@i}{\TXN@parm@ii}%
+ \endgroup
+ \ifTXN@withinVersus
+ \PTR@close@box \PTR@box@persona@bracketSD \DRM@options@SD
+ \TXN@edef {PTR@box@toks\the\PTR@box@ind}{\the\DRM@toks@SD}%
+ \def \DRM@options@SD {}%
+ \gdef \PTR@ignorespaces {\ignorespaces}%
+ \expandafter \PTR@next@box
+ \else
+ \def \DRM@options@SD {}%
+ \expandafter \DRM@process@persona@and@bracketSD@resume
+ \fi
+}
+% \end{macrocode}
+%
+% A b-SD appearing immediately after |\persona|, with a special
+% speech-heading style.
+% \begin{macrocode}
+\def \DRM@process@persona@and@bracketSD@special {%
+ \def \TXN@entity@code {p}%
+ \DRM@standalone@pre
+ \if \TXN@o@PersonaCentre \DRM@persona@position
+ \ifdim \DRM@persona@offset = \z@
+ \else
+ \dimen@ = \DRM@persona@offset
+ \advance \leftskip by 2\dimen@
+ \fi
+ \fi
+ \DRM@FaciesPersonae@first \TXN@parm@i \TXN@parm@ii
+ \DRM@standalone@post
+ \def \DRM@options@SD {}%
+ \ifTXN@withinVersus
+ \else
+ \gdef \PTR@ignorespaces {\ignorespaces}%
+ \expandafter \DRM@process@persona@and@bracketSD@resume
+ \fi
+}
+\def \DRM@process@persona@and@bracketSD@resume {%
+ \DRM@set@resume@par
+ \everypar = {\DRM@resume@par}%
+ \ignorespaces
+}
+% \end{macrocode}
+% A detached b-SD: use the same code as for a p-SD.
+% \begin{macrocode}
+\def \DRM@process@standalone@bracketSD {%
+%<debug> \TXN@trace \DRM@process@standalone@bracketSD
+ \edef \DRM@options@SD {\TXN@o@DetachedSD\DRM@options@SD}%
+ \def \TXN@entity@code {[}%
+ \DRM@standalone@pre
+ \DRM@FaciesBracketSD{\the\DRM@toks@SD}%
+ \DRM@standalone@post
+ \def \DRM@options@SD {}%
+}
+% \end{macrocode}
+% A normal bracket, occurring within the speech.
+%
+% \begin{macrocode}
+\def \DRM@process@normal@bracketSD {%
+%<debug> \TXN@trace \DRM@process@normal@bracketSD
+ \ifTXN@withinVersus
+ \ifTXN@blank@line
+ \if \TXN@option \TXN@o@EmbeddedSD \DRM@options@SD
+ \else
+ \edef \DRM@options@SD {\TXN@o@DetachedSD\DRM@options@SD}%
+ \fi
+ \else
+ \if \TXN@option \TXN@o@DetachedSD \DRM@options@SD
+ \global \TXN@blank@linetrue
+ \else
+ \edef \DRM@options@SD {\TXN@o@EmbeddedSD\DRM@options@SD}%
+ \fi
+ \fi
+ \PTR@start@box
+ \else
+ \leavevmode
+ \edef \DRM@options@SD {\TXN@o@EmbeddedSD\DRM@options@SD}%
+ \begingroup
+ \if \TXN@option \TXN@o@RightSD \DRM@options@SD
+% \end{macrocode}
+% A b-SD that is to be `rangedright' in prose needs a special trick
+% to place it at the end of the final line of the paragraph.
+% The trick is straight from the \textit{The \TeX{}book} (page 106).
+% Here is the first part:
+% \begin{macrocode}
+ \unskip \nobreak \hfil \penalty50 \DRM@SpatiumAnteBracketSD
+ \hbox {}\nobreak \hfil
+ \else
+ \if \TXN@option \TXN@o@NoSpatiumAnte \DRM@options@SD
+ \else
+ \ifx \empty \DRM@persona@field
+ \unskip \DRM@SpatiumAnteBracketSD
+ \else
+ \if \TXN@option \TXN@o@FieldAutoWidth \DRM@options@SD
+ \else
+ \unskip \DRM@SpatiumAnteBracketSD
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \def \\{}%
+ \DRM@FaciesBracketSD {\the\DRM@toks@SD}%
+ \ifTXN@withinVersus
+ \PTR@close@box \PTR@box@bracketSD \DRM@options@SD
+ \TXN@edef {PTR@box@toks\the\PTR@box@ind}{\the\DRM@toks@SD}%
+ \gdef \PTR@ignorespaces {\ignorespaces}%
+ \def \DRM@options@SD {}%
+ \expandafter \PTR@next@box
+ \else
+ \if \TXN@option \TXN@o@NoSpatiumPost \DRM@options@SD
+ \else
+ \if \TXN@option \TXN@o@RightSD \DRM@options@SD
+% \end{macrocode}
+% The second part of the trick for a `rangedright' b-SD.
+% \begin{macrocode}
+ \parfillskip= \z@skip
+ \finalhyphendemerits = \z@
+ \par
+ \else
+ \DRM@SpatiumPostBracketSD
+ \fi
+ \fi
+ \endgroup
+ \def \DRM@options@SD {}%
+ \expandafter \ignorespaces
+ \fi
+}
+% \end{macrocode}
+% \subsection{Setting the b-SD attributes}
+% \paragraph{Facies}
+% \begin{macrocode}
+\def \DRM@setFacies@bracketSD #1{%
+ \def \DRM@FaciesBracketSD ##1{%
+ \begingroup
+ \TXN@withinSDtrue
+ \DRM@ifthenelse
+ #1\relax
+ \endgroup
+ }%
+}
+% \end{macrocode}
+% \paragraph{Forma}
+% \begin{macrocode}
+\def \DRM@setForma@bracketSD #1{%
+ \def \TXN@temp ##1{#1}%
+ \TXN@check@parm 1\TXN@temp
+ \ifTXN@sw
+ \PackageError {DRAMA}
+ {You cannot use a parameter within \MessageBreak
+ the argument of \protect\Forma\protect\[}%
+ {See the User Manual}%
+ \fi
+ \def \DRM@FormaBracketSD {%
+ \global \TXN@centrefinalfalse
+ #1\relax
+ }%
+}
+% \end{macrocode}
+% \paragraph{Modus}
+% \begin{macrocode}
+\def \DRM@optionsBracketSD {}
+\def \DRM@setModus@bracketSD #1{%
+ \gdef \TXN@gtemp {}%
+ \begingroup
+ \def \options ##1{\xdef\TXN@gtemp{##1\TXN@gtemp}}%
+ \let \option = \options
+ \let \linenumbers = \TXN@setModus@numbered
+ \TXN@toks@a = {}%
+ #1\relax
+ \xdef\TXN@gtemp{\TXN@gtemp\the\TXN@toks@a}%
+ \endgroup
+ \edef \DRM@optionsBracketSD {\TXN@gtemp}%
+}
+% \end{macrocode}
+% \paragraph{Spacing}
+% \begin{macrocode}
+\def \DRM@setSpatiumAnte@bracketSD #1{%
+%<debug> \TXN@trace \DRM@setSpatiumAnte@bracketSD
+ \TXN@build@spatium@horizontal {#1}%
+ \toks@ = \expandafter {\TXN@temp}%
+ \edef \DRM@SpatiumAnteBracketSD {\the\toks@}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@setSpatiumPost@bracketSD #1{%
+%<debug> \TXN@trace \DRM@setSpatiumPost@bracketSD
+ \TXN@build@spatium@horizontal {#1}%
+ \toks@ = \expandafter {\TXN@temp}%
+ \edef \DRM@SpatiumPostBracketSD {\the\toks@}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@setSpatiumSupra@bracketSD #1{%
+ \def \TXN@parameter {#1}%
+ \ifx \empty \TXN@parameter
+ \def \DRM@SpatiumSupraBracketSD {}%
+ \else
+ \TXN@build@spatium@list {#1}%
+ \edef \DRM@SpatiumSupraBracketSD {\TXN@L@spatium}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@setSpatiumInfra@bracketSD #1{%
+ \def \TXN@parameter {#1}%
+ \ifx \empty \TXN@parameter
+ \def \DRM@SpatiumInfraBracketSD {}%
+ \else
+ \TXN@build@spatium@list {#1}%
+ \edef \DRM@SpatiumInfraBracketSD {\TXN@L@spatium}%
+ \fi
+}
+% \end{macrocode}
+%
+% \section{Parenthesized stage directions (p-SD)}
+% \subsection{Processing a p-SD}
+% \begin{macrocode}
+\def \({\DRM@inner@parenthesisSD}
+\def \){}
+% \end{macrocode}
+% \begin{macrocode}
+\def \DRM@inner@parenthesisSD {%
+ \ifx \empty \TXN@attribute@name
+ \expandafter \DRM@parenthesisSD
+ \else
+ \def \TXN@subclass@name {parenthesisSD}%
+ \def \TXN@subclass@number {}%
+ \def \TXN@temp {DRM}%
+ \expandafter \TXN@attribute@set
+ \fi
+}
+% \end{macrocode}
+% \subsection{Setting the p-SD attributes}
+% \paragraph{Facies}
+% \begin{macrocode}
+\def \DRM@setFacies@parenthesisSD #1{%
+ \def \TXN@temp ##1{#1}%
+ \TXN@check@parm 1\TXN@temp
+ \ifTXN@sw
+ \PackageError {DRAMA}%
+ {You cannot use a parameter within \MessageBreak
+ the argument of \protect\Facies\space\protect\(}%
+ {See the User Manual}%
+ \fi
+ \def \DRM@FaciesParenthesisSD {%
+ \TXN@withinSDtrue
+ \DRM@ifthenelse
+ #1\relax
+ }%
+}
+% \end{macrocode}
+% \paragraph{Forma}
+% \begin{macrocode}
+\def \DRM@setForma@parenthesisSD #1{%
+ \def \DRM@FormaParenthesisSD {%
+ \TXN@withinSDtrue
+ \global \TXN@centrefinalfalse
+ \DRM@ifthenelse
+ #1\relax
+ }%
+}
+% \end{macrocode}
+% \paragraph{Modus}
+% \begin{macrocode}
+\def \DRM@optionsParenthesisSD {}
+\def \DRM@setModus@parenthesisSD #1{%
+ \gdef \TXN@gtemp {}%
+ \begingroup
+ \def \options ##1{\xdef\TXN@gtemp{##1\TXN@gtemp}}%
+ \let \option = \options
+ \TXN@toks@a = {}%
+ #1\relax
+ \xdef\TXN@gtemp{\TXN@gtemp\the\TXN@toks@a}%
+ \endgroup
+ \edef \DRM@optionsParenthesisSD {\TXN@gtemp}%
+}
+% \end{macrocode}
+% \paragraph{Spacing}
+% \begin{macrocode}
+\def \DRM@setSpatiumSupra@parenthesisSD #1{%
+ \def \TXN@parameter {#1}%
+ \ifx \empty \TXN@parameter
+ \def \DRM@SpatiumSupraParenthesisSD {}%
+ \else
+ \TXN@build@spatium@list {#1}%
+ \edef \DRM@SpatiumSupraParenthesisSD {\TXN@L@spatium}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@setSpatiumInfra@parenthesisSD #1{%
+ \def \TXN@parameter {#1}%
+ \ifx \empty \TXN@parameter
+ \def \DRM@SpatiumInfraParenthesisSD {}%
+ \else
+ \TXN@build@spatium@list {#1}%
+ \edef \DRM@SpatiumInfraParenthesisSD {\TXN@L@spatium}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@parenthesisSD {%
+%<debug> \TXN@trace \DRM@parenthesisSD
+ \endgraf
+ \def \DRM@delimiter {)}%
+ \let \DRM@cs = \DRM@parenthesisSD@bis
+ \DRM@check@options
+}
+% \end{macrocode}
+% On return from checking the options (if any) we come here.
+% \begin{macrocode}
+\def \DRM@parenthesisSD@bis {%
+%<debug> \TXN@trace \DRM@parenthesisSD@bis
+ \edef \DRM@options@SD {(\DRM@options@SD\DRM@optionsParenthesisSD}%
+ \if \TXN@option n\DRM@options@SD
+ \if \TXN@option t\DRM@options@SD
+ \else
+ \edef \DRM@options@SD {t\DRM@options@SD}%
+ \fi
+ \fi
+ \def \TXN@entity@code {(}%
+ \DRM@standalone@pre
+ \edef \DRM@opening@delimiter@line {\the\inputlineno}%
+ \def \[{\DRM@missing@delimiter}%
+ \def \({\DRM@missing@delimiter}%
+% \end{macrocode}
+% We re-inject any tokens that may have been gobbled while
+% loking for options.
+% \begin{macrocode}
+ \strut \hskip \z@
+ \expandafter \ignorespaces \the\DRM@toks@SD
+}
+% \end{macrocode}
+% The text of the SD is processed directly (it cannot be read as
+% a parameter as there is no a priori limit on its length).
+% \begin{macrocode}
+ \def \){\DRM@standalone@post}
+% \end{macrocode}
+% The SD delimiters are not properly nested.
+% \begin{macrocode}
+\def \DRM@missing@delimiter {%
+ \PackageError {DRAMA}
+ {No matching \protect\) found for the \protect\(\space
+ command on line \number \DRM@opening@delimiter@line}%
+ {You probably forgot to type \protect\)\space
+ at the end of the SD}%
+}
+% \end{macrocode}
+%
+% \section{Common code for both forms of stage directions}
+%
+% \subsection{Getting the options (if any).}
+%
+% On entry: |\DRM@delimiter| is the closing character ] or );
+% |\DRM@cs| is the control sequence to be invoked after checking.
+%
+% On exit: |\DRM@options@SD|: the options;
+% |\DRM@toks@SD|: contains any tokens read while looking
+% for (non-existent) options, which must be re-injected into the input.
+% \begin{macrocode}
+\def \DRM@check@options {%
+ \DRM@toks@SD = {}%
+ \def \DRM@options@SD {}%
+ \count@ = \z@
+ \DRM@check@options@bis
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@check@options@bis {%
+ \futurelet \TXN@token \DRM@check@options@ter}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@check@options@ter {%
+ \let \next = \DRM@cs
+ \expandafter
+ \ifx \DRM@delimiter \TXN@token
+ \DRM@toks@SD = {}%
+ \let \next = \DRM@check@options@quinquies
+ \else
+ \ifx \TXN@token \relax
+ \def \DRM@options@SD {}%
+ \else
+ \ifcat a\TXN@token\TXN@safe
+ \advance \count@ by \@ne
+ \ifnum \count@ > \sixt@@n
+ \def \DRM@options@SD {}%
+ \else
+ \let \next = \DRM@check@options@quater
+ \fi
+ \else
+ \def \DRM@options@SD {}%
+ \fi
+ \fi
+ \fi
+ \next
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@check@options@quater #1{%
+ \edef \DRM@options@SD {\DRM@options@SD#1}%
+ \DRM@toks@SD = \expandafter {\the\DRM@toks@SD#1}%
+ \DRM@check@options@bis
+}
+\def \DRM@check@options@quinquies #1{\DRM@cs}
+% \end{macrocode}
+%
+% \subsection{Making the options available to the user}
+% \begin{macrocode}
+\def \DRM@ifthenelse {\DRM@set@options}
+\def \DRM@isopt #1{%
+ \if \TXN@empty {DRM@optSD@#1}%
+ \z@ = \z@
+ \else
+ \z@ = \@ne
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@set@options {%
+ \let \DRM@save@isopt = \isopt
+ \let \isopt = \DRM@isopt
+ \expandafter \DRM@set@option@bis \DRM@options@SD \TXN@nil
+}
+\def \DRM@set@option@bis #1{%
+ \ifx \TXN@nil #1\relax
+ \else
+ \TXN@def {DRM@optSD@#1}{}%
+ \expandafter \DRM@set@option@bis
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \DRM@reset@options {%
+ \let \isopt = \DRM@save@isopt
+ \expandafter \DRM@reset@option@bis \DRM@options@SD \TXN@nil
+}
+\def \DRM@reset@option@bis #1{%
+ \ifx \TXN@nil #1\relax
+ \else
+ \TXN@def {DRM@optSD@#1}{\relax}%
+ \expandafter \DRM@reset@option@bis
+ \fi
+}
+% \end{macrocode}
+%
+% \subsection{Typesetting a detached SD (also used for a speech)}
+% \begin{macrocode}
+\newif \ifDRM@suspended@prosa
+\newif \ifDRM@first@paragraph
+\newif \ifDRM@not@first@indent
+\newif \ifTXN@was@lineating
+\newtoks \DRM@save@everypar
+% \end{macrocode}
+% The code preceding the text.
+% \begin{macrocode}
+\def \DRM@standalone@pre {%
+%<debug> \TXN@trace \DRM@standalone@pre
+ \global \DRM@save@everypar = \everypar
+ \TXN@was@lineatingfalse
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifTXN@withinVersus
+ \TXN@was@withinVersustrue
+ \if \TXN@option \TXN@entity@code\TXN@numbered@classes
+ \global \PTR@par@startedfalse
+ \prosa
+ \else
+ \PTR@par@startedfalse
+ \endVersus
+ \ifTXNl@lineating
+ \TXN@was@lineatingtrue
+ \TXNl@lineate \relax
+ \fi
+ \fi
+ \else
+ \TXN@was@withinVersusfalse
+ \ifTXNl@lineating
+ \TXN@was@lineatingtrue
+ \TXNl@lineate \relax
+ \fi
+ \dimen@ = \baselineskip
+ \advance \dimen@ by -\prevdepth
+ \advance \dimen@ by -\ht\strutbox
+ \vskip \dimen@
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \if p\TXN@entity@code
+ \def \TXN@entity {Personam}%
+ \else
+ \if [\TXN@entity@code
+ \def \TXN@entity {BracketSD}%
+ \else
+ \def \TXN@entity {ParenthesisSD}%
+ \fi
+ \fi
+ \def \[{\DRM@inner@bracketSD}%
+ \def \({\DRM@inner@parenthesisSD}%
+% \end{macrocode}
+% Set SpatiumSupra
+% \begin{macrocode}
+ \if \TXN@option \TXN@o@NoSpatiumSupra \DRM@options@SD
+ \else
+ \expandafter
+ \TXN@spatium@vertical \csname DRM@SpatiumSupra\TXN@entity\endcsname
+ \fi
+% \end{macrocode}
+% Determine the paragraph shape
+% \begin{macrocode}
+ \begingroup
+ \let \DRM@Forma = \relax
+ \TXN@nostyletrue
+ \if \TXN@option \TXN@o@Justified \DRM@options@SD
+ \else
+ \if \TXN@option \TXN@o@RangedRight \DRM@options@SD
+ \let \DRM@Forma = \rangedright
+ \else
+ \if \TXN@option \TXN@o@RangedLeft \DRM@options@SD
+ \let \DRM@Forma = \rangedleft
+ \else
+ \if \TXN@option \TXN@o@Centred \DRM@options@SD
+ \let \DRM@Forma = \centered
+ \else
+ \if \TXN@option \TXN@o@CentredFinal \DRM@options@SD
+ \let \DRM@Forma = \centeredfinal
+ \else
+ \TXN@nostylefalse
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \if p\TXN@entity@code
+ \else
+ \@nameuse {DRM@Forma\TXN@entity}%
+ \fi
+ \TXN@nostylefalse
+ \DRM@Forma
+ \edef \TXN@line@class {\TXN@entity@code}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifTXN@centrefinal
+ \global \setbox \DRM@vbox = \vbox \bgroup
+ \let \\= \TXN@esc@esc@break@noop
+ \else
+ \let \\= \TXN@esc@esc@break
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \hsize = \TXN@measure
+ \parindent = \z@
+ \everypar = {}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \if [\TXN@entity@code
+ \ifTXN@was@withinVersus
+ \PTR@get@speech@indent \empty
+ \TXN@assign \dimen@ = {TXN@textus[\TXN@theTextus]offset@\TXN@folio}%
+ \global \advance \PTR@speech@indent by \dimen@
+ \advance \leftskip by \PTR@speech@indent
+ \if \TXN@option \TXN@o@FullWidth \DRM@options@SD
+ \else
+ \TXN@assign \dimen@ = {TXN@textus[\TXN@theTextus]shift}%
+ \advance \leftskip by \dimen@
+ \fi
+ \fi
+ \fi
+ \if (\TXN@entity@code
+ \if \TXN@option \TXN@o@FullWidth \DRM@options@SD
+ \skip@ = \leftskip
+ \dimen@ = \skip@
+ \advance \skip@ by -\dimen@
+ \leftskip = \skip@
+ \skip@ = \rightskip
+ \dimen@ = \skip@
+ \advance \skip@ by -\dimen@
+ \rightskip = \skip@
+ \hsize = \textwidth
+ \fi
+ \fi
+ \if (\TXN@entity@code
+ \DRM@FaciesParenthesisSD
+ \fi
+ \if \TXN@option \TXN@o@NoHangindent \DRM@options@SD
+ \hangindent = \z@
+ \hangafter = \@ne
+ \fi
+ \if \TXN@option \TXN@o@NoFirstIndent \DRM@options@SD
+ \global \DRM@not@first@indenttrue
+ \else
+ \global \DRM@not@first@indentfalse
+ \fi
+ \TXN@leftskip = \leftskip
+ \TXN@rightskip = \rightskip
+ \TXN@hangindent = \hangindent
+ \TXN@hangafter = \hangafter sp \TXN@safe
+% \end{macrocode}
+% Allow |\textus| objects (typically act/scene) to be attached to
+% p-SD, even if not numbered.
+% \begin{macrocode}
+ \if \TXN@option \TXN@entity@code\TXN@numbered@classes
+ \else
+ \if (\TXN@entity@code
+ \setbox \TXN@marginalia = \null
+ \TXN@SimpleList \TXN@line@fields \z@
+ \edef \TXN@temp {\z@,\z@}%
+ \TXN@SimpleList@append \TXN@line@fields \TXN@temp
+ \TXN@attach@textus {\z@}%
+ \ifdim \wd\TXN@object@textus > \z@
+ \box \TXN@marginalia
+ {\par}% in braces to preserve the paragraph shape
+ \vskip -\baselineskip
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \global \DRM@first@paragraphtrue
+ \everypar = {%
+ \prevgraf = \the\prevgraf
+ \leftskip = \TXN@leftskip
+ \rightskip = \TXN@rightskip
+ \hangindent = \TXN@hangindent
+ \hangafter = \ifDRM@first@paragraph \TXN@hangafter\else \z@\fi
+ \ifDRM@first@paragraph
+ \ifDRM@not@first@indent
+ \setbox\z@ = \lastbox
+ \fi
+ \fi
+ \global \DRM@first@paragraphfalse
+ }%
+ \widowpenalty = \z@
+ \clubpenalty = \z@
+ \strut
+}
+% \end{macrocode}
+% The code following the text.
+% \begin{macrocode}
+\def \DRM@standalone@post {%
+%<debug> \TXN@trace \DRM@standalone@post
+ \global \TXN@baselineskip = \baselineskip
+ \strut
+ \xdef \TXN@badness {\the\badness}%
+ \par
+ \xdef \TXN@prevgraf {\the\prevgraf}%
+ \ifnum \TXN@badness < \badness
+ \xdef \TXN@badness {\the\badness}%
+ \fi
+ \ifTXN@centrefinal
+ \egroup
+ \fi
+ \endgroup
+ \ifnum \TXN@badness < \@M
+ \ifTXN@centrefinal
+ \edef \TXN@line@class {\TXN@entity@code}
+ \global \TXN@centrefinalfalse
+ \TXN@dim@a = \wd\DRM@vbox
+ \loop
+ \ifvbox \DRM@vbox
+ \setbox \tw@ = \vbox{%
+ \vbadness = \@M
+ \splittopskip = \z@
+ \global \setbox \@ne = \vsplit \DRM@vbox to \TXN@baselineskip
+ \global \setbox \DRM@vbox = \box \DRM@vbox
+ \unvbox \@ne \global \setbox \@ne = \lastbox
+ }%
+ \setbox \DRM@hbox = \box \@ne
+ \TXN@sw@false
+ \ifvbox \DRM@vbox
+ \ifnum \TXN@prevgraf = \tw@
+ \TXN@sw@true
+ \fi
+ \else
+ \TXN@sw@true
+ \fi
+ \ifTXN@sw
+ \setbox \z@ = \hbox {\unhbox \DRM@hbox \unskip \unskip \unpenalty}%
+ \dimen@ = \TXN@dim@a
+ \advance \dimen@ by -\leftskip
+ \advance \dimen@ by -\rightskip
+ \advance \dimen@ by -\wd\z@
+ \divide \dimen@ by \tw@
+ \dimen@@ = \dimen@
+ \advance \dimen@@ by -\leftskip
+ \advance \dimen@ by -\rightskip
+ \setbox \DRM@hbox = \hbox {\kern \dimen@@ \box \z@ \kern \dimen@}%
+ \fi
+ \leavevmode \box \DRM@hbox \par
+ \repeat
+ \fi
+ \else
+ \def \TXN@temp {speech}%
+ \if [\TXN@entity@code
+ \def \TXN@temp {b-SD}%
+ \else
+ \def \TXN@temp {p-SD}%
+ \fi
+ \TXN@Warning* {The \TXN@temp\space cannot be typeset properly}%
+ \fi
+ \def \TXN@line@class{}%
+ \TXN@sw@true
+ \if p\TXN@entity@code
+ \else
+ \if \TXN@option \TXN@o@NoSpatiumInfra \DRM@options@SD
+ \TXN@sw@false
+ \fi
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifTXN@sw
+ \expandafter
+ \TXN@spatium@vertical \csname DRM@SpatiumInfra\TXN@entity\endcsname
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \if (\TXN@entity@code
+ \DRM@reset@options
+ \def \DRM@options@SD {}%
+ \fi
+% \end{macrocode}
+% Restore the initial conditions
+% \begin{macrocode}
+ \everypar = \DRM@save@everypar
+ \ifTXN@was@lineating
+ \TXNl@lineate \TXN@process@line
+ \fi
+ \ifTXN@was@withinVersus
+ \endgraf
+ \global \TXN@after@Spatiumtrue
+ \if [\TXN@entity@code
+ \endgraf
+ \fi
+ \if \TXN@option \TXN@entity@code\TXN@numbered@classes
+ \TXN@exxxpandafter \endprosa
+ \else
+ \TXN@exxxpandafter \versus
+ \fi
+ \fi
+}
+% \end{macrocode}
+%% \Finale
+%
+\endinput