% \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} % % % \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][]{% % \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\\{% % \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 {% % \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 {% % \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 {% % \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 {% % \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 {% % \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 {% % \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 {% % \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 {% % \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 {% % \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 {% % \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 {% % \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\]{% % \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 {% % \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 {% % \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 {% % \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{% % \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{% % \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 {% % \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 {% % \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 {% % \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 {% % \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