% \iffalse meta-comment % Copyright 2010-2019 Louis Paternault % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Louis Paternault % % This work consists of the files thalie.dtx and thalie.ins % and the derived file thalie.sty. % \fi % % \iffalse %<*driver> \ProvidesFile{thalie.dtx} % % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{thalie} %<*package> [2019/02/24 v0.10a A package to typeset drama plays] % % %<*driver> \documentclass{ltxdoc} \EnableCrossrefs \CodelineIndex \RecordChanges \usepackage{array} \usepackage{enumerate} \usepackage{multirow} \usepackage{hyperref} \usepackage{thalie} \usepackage{showexpl} \usepackage{listings} \usepackage{xcolor} \usepackage{manfnt} \lstset{ language=[LaTeX]TeX, numbers=left, numberstyle=\tiny, backgroundcolor=\color{yellow!20}, basicstyle=\small\color{black}\ttfamily, keywordstyle=\color{blue!80}\sffamily, commentstyle=\color{olive}, stringstyle=\color{red}, } \usepackage[english]{babel} \begin{document} \DocInput{thalie.dtx} \end{document} % % \fi % % \CheckSum{0} % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \GetFileInfo{thalie.dtx} % % \DoNotIndex{\@backslashchar, \@ifnextchar, \protect\`} % \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ ,\!,\(,\),\,} % \DoNotIndex{\addcontentsline, \addto, \ae, \AND, \arabic, \abovedisplayshortskip, \abovedisplayskip, \addtolength} % \DoNotIndex{\begin, \bfseries, \boolean, \baselineskip, \belowdisplayskip, \belowdisplayshortskip, \boolfalse, \booltrue} % \DoNotIndex{\captionsenglish, \captionsfrench, \center, \centering, \ClassError, \cleardoublepage, \csname, \csundef} % \DoNotIndex{\def, \defcharcommand@with, \defcharcommand@without, \dimen, \dimexpr} % \DoNotIndex{\emph, \end, \endcsname, \equal, \expandafter, \endlist, \endmath, \endminipage} % \DoNotIndex{\framebox, \fi} % \DoNotIndex{\gappto, \gdef, \global, \GetTranslation} % \DoNotIndex{\hspace} % \DoNotIndex{\@ifpackageloaded, \indent, \if@xspace, \ifbool, \ifboolexpr, \ifcsundef, \ifcsdef, \ifdef, \ifdefempty, \ifdefstring, \ifstrempty, \ifstrequal, \ifundef, \ignorespacesafterend, \item} % \DoNotIndex{\LARGE, \Large, \left, \leftskip, \leftmargin, \list, \linewidth, \LoadDictionaryFor, \LoadDictionary} % \DoNotIndex{\medskip, \MakeUppercase, \markboth, \markright, \MakeLowercase, \math, \minipage} % \DoNotIndex{ % \@actlevel, % \@actstyle, % \@clearpage, % \@cmd, % \@definecharactercommand, % \@desc, % \@displaytitle, % \@drama, % \@dramatis@clear, % \@empty@, % \@grouplength, % \@groupname, % \@interludelevel, % \@label, % \@maybexspace, % \@ne, % \@playlevel, % \@playstyle, % \@scenelevel, % \@scenestyle, % \@short, % \@spaceaftergroup, % \@speaks, % \@verseadjust, % } % \DoNotIndex{\newcommand, \newcounter, \newenvironment, \noindent, \noexpand, \NOT, \newif, \newlength, \newline, \nopagebreak} % \DoNotIndex{\OR} % \DoNotIndex{\par, \pgfkeys, \ProcessPgfPackageOptions, \protect, \protected@xappto, \parindent, \parskip, \predisplaysize, \prevgraf, \providebool} % \DoNotIndex{\quad} % \DoNotIndex{\refstepcounter, \renewcommand, \RequirePackage, \right, \Roman, \relax, \rightmargin} % \DoNotIndex{\section, \setboolean, \setlength, \sffamily, \smallskip} % \DoNotIndex{\tabularnewline, \textrm, \textsc, \textwidth, \thispagestyle, \textbf, \the, \tmp} % \DoNotIndex{\undef} % \DoNotIndex{\vspace, \vskip} % \DoNotIndex{\WithSuffix} % \DoNotIndex{\xappto, \xspace, \xdef} % \DoNotIndex{\z@} % % \newcommand{\bbackslash}{\symbol{92}} % \newcommand{\danger}{\marginpar[\hfill\dbend]{\dbend\hfill}} % % \title{The \textsf{thalie} package\thanks{ % This document corresponds to \textsf{thalie}~\fileversion, dated \filedate. % Home page, bug requests, etc. at \url{http://framagit.org/spalax/thalie} % }\\A package to typeset drama plays} % \author{Louis Paternault\\ \texttt{spalax+ctan(at)gresille(dot)org}} % % \maketitle % % \begin{abstract} % This package is meant to typeset drama plays using \LaTeX{}. It provides % commands to introduce characters' lines, to render stage direction, to divide % a play into acts and scenes, to automatically build the dramatis person\ae{}, % etc. % \end{abstract} % % \setcounter{tocdepth}{2} % \tableofcontents % % \section{Introduction} % This document introduces the \textsf{thalie} package, used to typeset drama % plays. % % \subsection{Other classes and packages} % This package is far from being the only one that can be used to render drama % plays. If you do not like my work, you can use one of the following ones (and % I guess there exists others): % |drama| \cite{drama}, % |dramatist| \cite{dramatist}, % |play| \cite{play}, % |screenplay| \cite{screenplay}, % |sides| \cite{sides}. % % I began to write this package in 2010, and now, at the end of 2012, I must % admit that I wonder why I started this\ldots There are already several such % packages in % \textsc{ctan}\footnote{\url{http://www.ctan.org/topic/drama-script}}, and the % |dramatist| package seems really nice (I borrowed some ideas and copied some % code from it). There are actually a few improvements in my package compared % to |dramatist|: in my package, plays, acts and scenes appear in the table of % contents; it is possible to include several plays in a single document; there % are more options when building the dramatis person\ae{}; headers and footers % are taken into account, etc. But these improvements are small; it might have % been smarter to contribute to |dramatist| instead of starting my own package. % The good part is that I have a package that fits my needs, and I learned how % to write a \LaTeX{} package. % % Oh, yes! I know why I started this: I am a geek\ldots % % \subsection{License} % This work may be distributed and/or modified under the % conditions of the \LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % % Further information can be found in the |.dtx| file used to build this % document. % % In short (but this paragraph has no legal value), you can use this package % freely to render your drama plays, and modify it almost freely. Nevertheless, % if you like my work, you can invite me to the performance of the play you % typeset using my package\footnote{You will not take a big risk, since there % is little chance I travel half the world to see a play. But if by chance I % can attend it, it would make me really happy.}. % % \subsection{Acknowledgements} % I borrowed ideas and lines of code from the \LaTeX{} packages % |drama|\cite{drama} and |dramatist|\cite{dramatist}. % % I used the following guides to package my package: \emph{How to Package Your % \LaTeX{} Package} \cite{dtxtut}, and \emph{\LaTeXe{} for class and package % writers} \cite{clsguide}. % % \subsection{Examples} % % Most of the examples are taken from Edmond Rostand's \emph{Cyrano de Bergerac} % \cite{cyrano} or from William Shakespeare's \emph{A Midsummer Night's Dream} % \cite{midsummer}. The snippets of \emph{Cyrano de Bergerac} are from the % original (French) version of this play, roughly translated by myself (which % means that they must be of poor quality). % % \subsection{Overview} % Installation instruction are given in section \ref{sec:install}. % Documentation about how to use this package is given in section % \ref{sec:usage}. In particular, section \ref{sec:sectioning} explains how to % use acts and scenes, sections \ref{sec:dramatis} and \ref{sec:characters} explains how to define % characters, and use these definitions to introduce characters' lines, and % section \ref{sec:directions} describes commands used to render stage % directions. At last, specific instruction about how to use this package with % a language other than English (or a non-latin alphabet) are given in section % \ref{sec:i18n}. Examples are given in section \ref{sec:examples}. % % Implementation is given in section \ref{sec:implementation}. % % \section{Download and Install} % \label{sec:install} % % % \subsection{\textsc{Gnu}/Linux Distribution} % % If applicable, the easiest way to get |thalie| working is by installing it by your distribution package. With Debian (and Ubuntu, and surely other distributions that inherit from Debian), simply run: % % \begin{quote} % |sudo apt-get install texlive-humanities| % \end{quote} % % \subsection{\LaTeX{} distribution} % % This package is included both in \TeX{}Live and MiK\TeX{}. It can be installed by their respective package managers. % % \subsection{Manual installation} % % \begin{itemize} % \item Download the lastest archive : % \begin{description} % \item[Stable version] \url{http://mirrors.ctan.org/install/macros/latex/contrib/thalie.tds.zip} % \item[Development version] \url{https://framagit.org/spalax/thalie/repository/archive.zip?ref=master} % \end{description} % \item Unzip the archive. % \item If you got the archive from CTAN (stable version), move file \texttt{tex/latex/thalie/thalie.sty} in a \LaTeX{} path. % \item If you got the development version, |cd| to the main archive directory, and run |latex thalie.ins| to build |thalie.sty|. Move this file into a \LaTeX{} path. % \end{itemize} % % \section{Usage} % \label{sec:usage} % % \subsection{Localization} % \changes{v0.9a}{2017/04/22}{Add section \emph{Localization}.} % % By default, commands \lstinline|\act|, \lstinline|\scene|, etc. use English words, but they are % translated to the current language used by |babel| or % |polyglossia|\footnote{Given that someone provided the translation. Right % now, the only available languages are English, French, and German.}. More information % is given in section \ref{sec:l10n}. % % \subsection{Package options} % \label{sec:options} % % Package options are summed up in table \ref{table:packageoptions}. % % Note that any package option can be redefined anywhere in the document. This % makes it possible to have several plays collected in a single document, while % applying different styles or options to each play. See section % \ref{sec:redefine} for more detail. % % \begin{table} % \centering % \begin{tabular}{c|c|c} % Name & Available options & Default \tabularnewline % \hline % \hline % |characterstyle| & |bold| |margin| |center| |simple| |arden| & |simple| \tabularnewline % & |imprimerie-verse| |imprimerie-prose| & \tabularnewline % \hline % |playstyle| & \multirow{3}{*}{|center| |bigcenter| |box| |custom|} & |box| \tabularnewline % |actstyle| & & |bigcenter| \tabularnewline % |scenestyle| & & |center| \tabularnewline % \hline % |playlevel| & \multirow{3}{*}{|part| |chapter| |section| \ldots |subparagraph|} & |chapter| \tabularnewline % |actlevel| & & |section| \tabularnewline % |scenelevel| & & |subsection| \tabularnewline % \hline % |interludelevel| & |play| |act| |scene| & |act| \tabularnewline % \hline % |xspace| & |true| |false| & |true|\tabularnewline % \end{tabular} % \caption{Package options summary} % \label{table:packageoptions} % \end{table} % % \subsubsection{Space following character commands} % \changes{v0.7}{2015/12/28}{New package option \texttt{xspace}.} % As commands introducing characters' lines and displaying characters' names % may be frequently used, it might be tempting to omit the following \lstinline|{}| For % instance, one might prefer to write: % \iffalse %<*example> % \fi % \begin{lstlisting} \cyrano Indeed, \cyranoname is my name! \end{lstlisting} % \iffalse % % \fi % instead of: % \iffalse %<*example> % \fi % \begin{lstlisting} \cyrano{} Indeed, \cyranoname{} is my name! \end{lstlisting} % \iffalse % % \fi % % If package option |xspace| is set (e.g. |xspace=true|), space is automatically % added after those commands if necessary\footnote{This is done with % the |$\backslash$xspace| command (from the |xspace| package), hence the name.}; % otherwise, it is not. % % For historical reasons, the option |xspace| default is |true|, but this might % change in some later non-backward compatible version. % % \subsubsection{Style} % The way characters' lines are displayed, as well as play, act and scene % titles, can be set when loading the options. % To set character style, use option |characterstyle=|\meta{style}. Available % styles, and indication to use a custom one, are described in section % \ref{sec:lines}. % % Several play, act and scene title styles are defined. Choose it using options % |playstyle|=\meta{style}, |actstyle|=\meta{style} and % |scenestyle|=\meta{style}. Description of available styles, and how to define % your own one, are described in section \ref{sec:sectionstyles}. % % \subsubsection{Sectioning levels} % If you use a table of contents, or if you also use ``usual'' sectioning % commands (\lstinline|\chapter|, \lstinline|\section| and so on), the relative importance of % plays, acts and scenes is important. You can set this using options % |playlevel=|\meta{level}, |actlevel=|\meta{level} and % |scenelevel=|\meta{level}. The argument is the name of the corresponding % sectioning level, i.e. one of |part|, |chapter|, |section|, |subsection|, % |subsubsection|, |paragraph| and |subparagraph|. % % Setting the interlude level is slightly different. While setting it using % |interludelevel=|\meta{level}, instead of choosing one of \LaTeX{} vanilla % sectioning levels as the level, you may choose |play|, |act| or |scene|. It % defines if an interlude is at the same level as a play, an act or a scene. % % \subsubsection{Redefining options} % \label{sec:redefine} % \DescribeMacro{\setthalieoptions} % % Packages options can be reset in the document body using command % \lstinline|\setthalieoptions|\marg{package options}. Its only argument has the same % syntax as the package options. % % For instance, if you are writing a collections of plays, some in prose, some in verses, you might want to write something like the following. % % \iffalse %<*example> % \fi % \begin{lstlisting} \documentclass{book} ... \usepackage{thalie} ... \begin{document} ... \play{First play} \setthalieoptions{characterstyle=imprimerie-verse} ... \play{Second play} \setthalieoptions{characterstyle=impriemie-prose} ... \end{document} \end{lstlisting} % \iffalse % % \fi % % \subsection{Sectioning} % \label{sec:sectioning} % Here begin the parts explicitly relating to drama. % \subsubsection{Levels} % \DescribeMacro{\play} % \DescribeMacro{\play*} % \DescribeMacro{\act} % \DescribeMacro{\act*} % \DescribeMacro{\scene} % \DescribeMacro{\scene*} % To introduce a new play, act or scene, use commands \lstinline|\play|, \lstinline|\act| and % \lstinline|\scene|. Their behaviour is as close as the ``usual'' sectioning commands % (\lstinline|\chapter|, \lstinline|\section| and so on) as possible, i.e.: % \begin{itemize} % \item Their signature is \lstinline|\play|\oarg{short title}\marg{longtitle} (the % optional short title is the one used in the table of content, and in headers % and footers). % \item A starred version (\lstinline|\play*|, \lstinline|\act*| and \lstinline|\scene*|) is provided, which % inserts a play (or act, or scene) which is not numbered, and does not insert % any line in the table of content. % \item Headers and footers are changed (more information in section \ref{sec:header}). % \end{itemize} % % Both commands \lstinline|\act| and \lstinline|\scene| (and their starred versions) are designed to % deal with empty titles. Indeed, it is common not to give any name to acts and % scenes. % % By default, a play is as deep (regarding to the table of contents) as a % chapter, an act as a section, and a scene as a subsection. But this can be % set using package options |playlevel|, |actlevel| and |scenelevel| (see % packages options, page \pageref{sec:options}). That way, you can use in your % document plays, acts and scenes as well as chapters, sections and so on. It % can be useful if you want a foreword, and appendix, etc. % % It is not compulsory to use all three commands \lstinline|\play|, \lstinline|\act| and \lstinline|\scene|. % The rule of thumb is: if only one element exists, skip the corresponding % command: if your document has a single play, you should ignore \lstinline|\play|; if % your document has several single act plays, set % |playlevel=section,scenelevel=subsection| and ignore \lstinline|\act|; etc. % % \DescribeMacro{\interlude} % \DescribeMacro{\interlude*} % You may want to use interludes, which are acts or scenes which are not % numbered, but which should appear in the table of content. Command % \lstinline|\interlude|\oarg{short title}\marg{long title} has this purpose. % % You may choose the sectioning level an interlude is equivalent to in the % package options. If your interludes are acts, use |interludelevel=act|; if % they are scenes, use |interludelevel=scene|. % % \DescribeMacro{\curtain} % At last, to mark the end of an act or of the play, you can use command % \lstinline|\curtain|, which prints the word \lstinline|\GetTranslation{Curtain}| in the middle of its % own line. % % \subsubsection{Title styles} % \label{sec:sectionstyles} % Several styles are available to render play, act and scene titles. Choose % them using package options |playstyle|, |actstyle| and |scenestyle|. Default % is |playstyle=box|, |actstyle=bigcenter|, |scenestyle=center|. % % \paragraph{Custom titles} % Unfortunately, as play, act and scene titles are not considered (by \LaTeX{}) % as usual sections, package % |titlesec|\footnote{\url{http://www.ctan.org/pkg/titlesec}} cannot be used to % use alternative section titles. Here is the way to set your own one. % % \begin{figure}[p] % \centering % \iffalse %<*example> % \fi % \begin{lstlisting} \newcommand\customact[2]{ \begin{center} \textsc{\GetTranslation{Act} #1} #2 \end{center} } \WithSuffix\newcommand\customact*[1]{ \begin{center} #1 \end{center} } \end{lstlisting} % \iffalse % % \fi % \caption{Example of custom act definition} % \label{fig:custom} % \end{figure} % % \DescribeMacro{\customplay} % \DescribeMacro{\customact} % \DescribeMacro{\customscene} % When loading the package, use |custom| as the style of the title you want to % customize (e.g. |actstyle=custom|). Then, commands % \lstinline|\customact|\marg{counter}\marg{title} and \lstinline|\customact*|\marg{title} will be % called by this package to render titles. You \emph{must} define them. Figure % \ref{fig:custom} gives the example of the definition of the |center| style. % % The first argument of \lstinline|\customact| is the label of the act being printed % (that is, \lstinline|\theact| for an act, \lstinline|\theplay| for a play, etc.), its second % argument is its title. Command \lstinline|\customact*| only has one argument, which is % the act title. % % \subsubsection{Labels and counters} % % \DescribeMacro{\theplay} % \DescribeMacro{\theact} % \DescribeMacro{\thescene} % Using the same tools as \lstinline|\chapter|, \lstinline|\section| and so on, it is possible to % define the way counters of plays, acts and scenes are displayed. You can do % this by redefining \lstinline|\theplay|, \lstinline|\theact| and \lstinline|\thescene|. For example, to % have acts numbered using letters, use \lstinline|\renewcommand{\theact}{\Alph{act}}|. % % \subsubsection{Headers and footers} % \label{sec:header} % % \DescribeMacro{\playmark} % \DescribeMacro{\actmark} % \DescribeMacro{\scenemark} % Once again, similar tools as those used by \lstinline|\section| are provided to deal % with headers and footers. When introducing, a new play, act or % scene, % respectively, commands \lstinline|\playmark|\marg{label}, \lstinline|\actmark|\marg{label} and % \lstinline|\scenemark|\marg{label} are called, so that titles can be used in headers % and footers. If the default behaviour does not suit you (which should be the % case if you did not choose the default option for |playlevel|, |actlevel| or % |scenelevel|), you can redefine them. % % Examples are given in section \ref{sec:examples:headers}. % % \subsection{Dramatis person\ae} % \label{sec:dramatis} % This part explains how to build and display the dramatis person\ae{}. % % Definition of characters is done in document body. % As it is possible to have several plays in a single documents (for a % collection of plays or sketches), it is possible to define several % dramatis person\ae{}. A new one disables the character commands % defined by the previous one. % % \DescribeEnv{dramatis} % Definition of characters is done inside the |dramatis| environment. If the % |hidden| option is given, the dramatis person\ae{} is not printed (its % only purpose is then to define the character commands). % % \begin{quote} % \lstinline|\begin{dramatis}|\oarg{hidden} % \end{quote} % % Then, several commands are available to define characters, and organize % character definitions. % % \DescribeMacro{\characterspace} % Command \lstinline|\characterspace| put some vertical space into the dramatis % person\ae{}. % % \subsubsection{Character definition} % \paragraph{Basic definition} % \label{paragraph:basiccharacter} % % \begin{figure}[p] % \centering % \iffalse %<*example> % \fi % \begin{LTXexample}[pos=b] \begin{dramatis} \character[cmd={cyrano}, drama={Cyrano de Bergerac}]{Cyrano} \character[cmd={lebret}]{Le Bret} \character[cmd={bellerose}]{Bellerose} \end{dramatis} \bigskip \lebret[to \cyranoname, holding his arm] Let's talk ! \cyrano Wait for the crowd to leave. \did{To \bellerosename} Can I stay? % \end{LTXexample} % \iffalse % % \fi % \caption{Example of character definition} % \label{fig:character_example} % \end{figure} % % \DescribeMacro{\character} % To define a character, use command \lstinline|\character|. % \begin{quote}% % \lstinline|\character|\oarg{\emph{cmd=}command,\emph{drama=}dramatis,\emph{desc=}description}\marg{name}% % \end{quote} % The mandatory argument is the name of the character, as it will appear in each of this character's line. It is later possible to redefine it using command \lstinline|\setcharactername| (see part \ref{setcharactername}). Optional arguments are: % \begin{description} % \item[desc] is a description of your character, appearing in the dramatis person\ae{}; % \item[cmd] is the name of the command that will be used to introduce this character's lines in the remaining part of your document; % \item[drama] is the name of your character, as it will appear in the dramatis person\ae{}. The name of the character (mandatory argument) is used as a default value. % \end{description} % % If \emph{cmd} is defined, this command creates two new commands: |\|\meta{cmd} % and |\|\meta{cmd}|name|. The % first one is used to introduce a character's line. The second one prints the % character's name. An error is raised if a command with any of these two names % already exists. % % An example of the use of this command is given in figure % \ref{fig:character_example}. % % \paragraph{Special character definition} % % Although optional arguments are not mandatory, not defining them, or leaving the mandatory argument blank, have special meaning. The combination are summed up in table \ref{table:character}. % % \begin{table} % \centering % \begin{tabular}{cc||c|c|c|c|} % \multicolumn{2}{c||}{} & \multicolumn{2}{c|}{empty \meta{name}} & \multicolumn{2}{c|}{\meta{name}} \\ % \multicolumn{2}{c||}{} & no \meta{cmd} & \meta{cmd} & no \meta{cmd} & \meta{cmd} \\ % \hline % \hline % \multirow{4}{*}{no \meta{drama}} & \multirow{2}{*}{no \meta{desc}} & & & silent\textsuperscript{\ref{character:silent}} & default\textsuperscript{\ref{character:default}} \\ % & & & & & hidden\textsuperscript{\ref{character:hidden}}\\ % \cline{2-6} % & \multirow{2}{*}{ \meta{desc}} & description & & silent\textsuperscript{\ref{character:silent}} & default\textsuperscript{\ref{character:default}} \\ % & & only\textsuperscript{\ref{character:description}} & & & \\ % \hline % \multirow{2}{*}{ \meta{drama}} & no \meta{desc} & silent\textsuperscript{\ref{character:silent}} & & & default\textsuperscript{\ref{character:default}} \\ % \cline{2-6} % & \meta{desc} & silent\textsuperscript{\ref{character:silent}} & & & default\textsuperscript{\ref{character:default}} \\ % \hline % \end{tabular} % % An empty cell means that the corresponding combination is forbidden. The superscript number refers to the list of special character definitions (page \pageref{specialcharaclist}). % \caption{(Not) defining arguments in character definition} % \label{table:character} % \end{table} % % \label{specialcharaclist} % \begin{enumerate}[(i)] % \item \label{character:default} \textbf{Default definition (\meta{name} and \meta{cmd} are given; \meta{desc} and \meta{drama} may be omitted):} The character is defined as described in \ref{paragraph:basiccharacter}. If \meta{description} is omitted, no description appear in the dramatis person\ae{}; if no \meta{drama} is given, character in the dramatis person\ae{} has the same name as it will have in the document. % Example: % \iffalse %<*example> % \fi % \begin{lstlisting} \character[ drama={A ghost}, desc={the king's ghost}, cmd={ghost}, ]{The ghost} \end{lstlisting} % \iffalse % % \fi % \item \label{character:description} \textbf{Description only (everything omitted but \meta{desc}):} A description is inserted in the dramatis person\ae{}. Useful to add characters such as \emph{The kings' armies}. % Example: % \iffalse %<*example> % \fi % \begin{lstlisting} \character[desc={The kings' armies}]{} \end{lstlisting} % \iffalse % % \fi % \item \label{character:hidden} \textbf{Hidden character (\meta{drama} is empty (defined, but empty), \meta{cmd} and \meta{name} are defined, \meta{desc} is omitted)} Definition of a character that does not appear in the dramatis person\ae{}. % Example: % \iffalse %<*example> % \fi % \begin{lstlisting} \character[drama={}, cmd={postman}]{The postman} \end{lstlisting} % \iffalse % % \fi % \item \label{character:silent} \textbf{Silent character (one of \meta{name} or \meta{drama} is defined; \meta{desc} may be omitted; \meta{cmd} is omitted):} The character only appear in the dramatis person\ae{}. It will not be used elsewhere in the document. An optional description may also appear in the dramatis person\ae{}. % Example: % \iffalse %<*example> % \fi % \begin{lstlisting} \character{A priest} \end{lstlisting} % \iffalse % % \fi % \end{enumerate} % % \paragraph{Group of characters} % \DescribeEnv{charactergroup} % It is possible to group several characters' definition if they have the same % description. This is done with environment % |charactergroup|\oarg{width}\marg{description}. The optional argument sets % the group width (on the left of the brace). % See an example on figure \ref{fig:charactergroup}. % % \begin{figure}[p] % \centering % \iffalse %<*example> % \fi % \begin{LTXexample}[pos=b] \begin{dramatis} \begin{charactergroup}[2.5cm]{Officers} \character[desc={a soldier}]{Marcellus} \character[desc={a soldier}]{Bernardo} \end{charactergroup} \end{dramatis} % \end{LTXexample} % \iffalse % % \fi % \caption[Defining a group of characters]{Defining a group of characters} % \label{fig:charactergroup} % \end{figure} % % The effect of this code will be, in the dramatis person\ae{}, to have a % nice brace mapping the three characters to their common description. % % The behaviour of nested |charactergroup| environments is % undefined\footnote{It might work; it might not. It might work now, but stop % working in the future; it might not work now, but work by accident in the % future. Etc.}. % % \subsubsection{Customize style of dramatis person\ae} % \DescribeEnv{dramatisenv} % \DescribeMacro{\dramatischaracter} % \DescribeMacro{\dramatischaractername} % \DescribeMacro{\dramatischaracterdescription} % % A default style is used to display the dramatis person\ae, but is it made to % be customized. % The following commands can be redefined to make dramatis person\ae look % different. They do nothing apart from displaying text (no internal % definition, etc.). % % \begin{itemize} % \item |dramatisenv|: This environment wraps the dramatis person\ae. % \item \lstinline|\dramatischaracter|\marg{name}\marg{description} Renders the character name and description. It should take care of cases where name or descsription (but not both) is missing. % \item \lstinline|\dramatischaractername|\marg{name} Renders the character name. % \item \lstinline|\dramatischaracterdescription|\marg{description} Renders the character description. % \item Environment |charactergroup|\oarg{width}\marg{description} Renders a group of characters. % \item \lstinline|\characterspace| Adds a vertical character space. % \end{itemize} % Figure \ref{fig:dramatisconversion} illustrates how those commands are used. % % \begin{figure}[p] % \iffalse %<*example> % \fi \begin{lstlisting} \begin{dramatis} \character{The queen} \character[desc={the queen's husband.}]{The king} \begin{charactergroup}{Lords and ladies} \character{Lord Foo} \character[desc={Lord Foo's sister.}]{Lady Bar} \character[desc={Lord and Lady Baz.}]{} \end{charactergroup} \characterspace \character[desc={Several servants}]{} \end{dramatis} \end{lstlisting} % \iffalse % % \fi % % To display the dramatis person\ae{} above, the commands below are called. % % \iffalse %<*example> % \fi \begin{lstlisting} \begin{dramatisenv} \dramatischaracter{The queen}{} \dramatischaracter{The king}{the queen's husband.} \begin{charactergroup}{Lords and ladies} \dramatischaracter{Lord Foo}{} \dramatischaracter{Lady Bar}{Lord Foo's sister.} \dramatischaracter{}{Lord and Lady Baz.} \end{charactergroup} \characterspace \dramatischaracter{}{Several servants} \end{dramatisenv} \end{lstlisting} % \iffalse % % \fi % % And command \lstinline|\dramatischaracter|\marg{Name}\marg{Description} is defined as something like the following code (excepted that parts taking care of cases where there is no character name or description is omitted here). % \iffalse %<*example> % \fi \begin{lstlisting} \newcommand{\dramatischaracter}[2]{ % \dramatischaractername{#1}, \dramatischaracterdescription{#2}\\ } \end{lstlisting} % \iffalse % % \fi % \caption{Commands used to display the dramatis person\ae.} % \label{fig:dramatisconversion} % \end{figure} % % For example, to render character names in small caps, one would define : % % \iffalse %<*example> % \fi \begin{lstlisting}[numbers=none] \renewcommand{\dramatischaractername}[1]{\textsc{#1}} \end{lstlisting} % \iffalse % % \fi % % Or to make dramatis % person\ae{} include a title, one can define : % \iffalse %<*example> % \fi \begin{lstlisting}[numbers=none] \renewenvironment{dramatisenv}{% \list{}{\rightmargin1cm\leftmargin2cm}\item[] \act*{Dramatis person\ae}% }{% \endlist% } \end{lstlisting} % \iffalse % % \fi % % \subsection{Characters} % \label{sec:characters} % This part explains how to define characters, and introduce character's lines. % % It has been explained that definition of a character in the dramatis % person\ae{} (previous subsection) also creates commands used to introduce % lines of characters. For instance, defining a character using % \lstinline|\character[cmd=cyrano]{Cyrano}| means than Cyrano's lines can now be % introduced using the following code. % \iffalse %<*example> % \fi \begin{lstlisting} \cyrano No! It's a bit short, young man\ldots \end{lstlisting} % \iffalse % % \fi % This would display the name \emph{Cyrano} using the current character style, then % his line. % % \subsubsection{Custom characters} % % \paragraph{Disposable character} % \DescribeMacro{\disposablecharacter} % One can need to define characters that are used only once (or a few times). % Command \lstinline|\disposablecharacter| is here to help. % \begin{quote}\lstinline|\disposablecharacter|\oarg{directions}\marg{name}\end{quote} % This command, used in the body, introduces a line for character |name|, with optional stage % directions. It is rendered the same way regular characters are rendered, but % nothing is added to the dramatis person\ae{}. It is used in figure % \ref{fig:setcharactername_example}. % % This command is also useful to introduce lines of characters in non standard % ways, for instance if several characters speak at once. See examples in % section \ref{sec:examples:characterslines}. % % \subsubsection{Changing character's name} % \label{setcharactername} % \DescribeMacro{\setcharactername} % % \begin{figure}[p] % On the first scenes of Cyrano de Bergerac, the main character (Cyrano) is % somewhere in a crowd, and only appears as \emph{a voice}. He appears as % Cyrano in the following verses. % % \centering % \iffalse %<*example> % \fi % \begin{LTXexample}[pos=b] \begin{dramatis}[hidden] \character[desc={Cyrano de Bergerac}, cmd=cyrano]{The voice} \character[cmd=montfleury]{Montfleury} \end{dramatis} \cyrano Leave! \disposablecharacter{The crowd} Oh! \montfleury[losing his voice] ``Happy he who far away from court\ldots'' \setcharactername{cyrano}{Cyrano} \cyrano[emerging from the crowd, standing up on a chair {[}\ldots{]} with a terrible nose] Ah! I am getting angry!\ldots % \end{LTXexample} % \iffalse % % \fi % \caption{Example of changing the name of a character} % \label{fig:setcharactername_example} % \end{figure} % % It is possible to change the name that appears to introduce character's lines % within the text. This can be used, for example, when a character is first % refered to as \emph{A voice}, until we learn his real identity, which is % \emph{Cyrano}. An example is given in figure % \ref{fig:setcharactername_example}. % \begin{quote}\lstinline|\setcharactername|\marg{command}\marg{name}\end{quote} % % This command takes two mandatory arguments. The first one, |command|, is the % command used to introduce this character's line. The second one is the name % to display for this character. % % \subsubsection{Lines} % \label{sec:lines} % To introduce characters' lines, use the commands defined in the character % definition (see the \lstinline|\character| command, or the example in figure % \ref{fig:character_example}). % % \paragraph{Choose style} % \changes{v0.6}{2014/06/25}{New character styles \texttt{imprimerie-verse}, \texttt{imprimerie-prose} and \texttt{arden}.} % Several styles are available, to typeset character's name and lines in % different ways. Change the style by loading package using option % |characterstyle=|\marg{style} (available styles are |bold|, |center|, % |margin|, |simple|, |imprimerie-verse|, |imprimerie-prose|). A few notes: % \begin{itemize} % \item Default style is |simple|. % \item |imprimerie-verse| and |imprimerie-prose| styles are French % \emph{de facto} standards for typesetting drama plays, respectively in verse % and in prose, as defined by the \emph{Imprimerie nationale} % \cite{imprimerienationale}. % \item |arden| tries to mimick typesetting of the Arden Shakespeare series. % \item |bold| needs a sans serif font to be defined (it should be done by % default with latin alphabets, but must be done by hand with languages using % non latin characters (greek, hindi, etc.)). % \end{itemize} % % \paragraph{Customize style} % \DescribeMacro{\speakswithoutdirection} % \DescribeMacro{\speakswithdirection} % If available styles does not fit your need, you can also define your own one. % To do so, you can redefine the following commands. % \begin{quote} % \lstinline|\speakswithoutdirection|\marg{name}\\ % \lstinline|\speakswithdirection|\marg{name}\marg{direction} % \end{quote} % The first one (\lstinline|\speakswithoutdirection|) is invoked to display a character's name % to introduce its line. It takes one argument, which is the character's line. % The second one (\lstinline|\speakswithdirection|) is also invoked to display a character's % name to introduce its line, but it takes a second argument, which is stage % directions to be printed together with character's name. % % See also section \ref{sec:directions} to see other ways to print stage % directions. % % \subsection{Stage directions} % \label{sec:directions} % Let us begin with a warning: since we could not figure out a nice command % name made from ``stage directions'', we used the French word % \emph{(didascalie)} to build up command names. % % \DescribeMacro{\did} % \DescribeEnv{dida} % We define two ways to render stage directions: a short one, that is printed % inline, and a long one, printed in its own paragraph. They act a bit like % \lstinline|$\formula$| and \lstinline|\[\formula\]| for formulas. % The first way is the command \lstinline|\did|\marg{directions}. The second way is the % environment |dida|. % % \DescribeMacro{\onstage} % Some stage directions are displayed centered under the scene or act % definition (I often see it in classical drama, where the list of characters % appearing in each scene is displayed that way). Command % \lstinline|\onstage|\marg{directions} can be used to display such information. % % \DescribeMacro{\pause} % As we often need to mark pauses in theater, we created the command \lstinline|\pause|, % which is a shortcut for \lstinline|\did{\GetTranslation{Pause}}|. % % \subsection{Splitting verses} % % When writing verses, it is sometimes useful to split a verse between two % characters: the first character starts it in its line, and the second one % finishes it in a second line. Visually, the start of the second line is % vertically aligned to the end of the first line. % % \begin{figure}[p] % \centering % \iffalse %<*example> % \fi % \begin{dramatis}[hidden] % \character[cmd={hermia}]{Hermia} % \character[cmd={theseus}]{Theseus} % \end{dramatis} % \begin{LTXexample}[pos=b] \adjustverse{-7em} \hermia So is Lysander.\pauseverse \theseus \resumeverse In himself he is. % \end{LTXexample} % \iffalse % % \fi % \caption{Example of commands to split verse} % \label{fig:splitverse} % \end{figure} % % \begin{figure}[p] % \centering % \iffalse %<*example> % \fi % \begin{dramatis}[hidden] % \character[cmd={hermia}]{Hermia} % \character[cmd={theseus}]{Theseus} % \end{dramatis} % \begin{LTXexample}[pos=b] \hermia So is Lysander. \theseus \phantom{So is Lysander.} In himself he is. % \end{LTXexample} % \iffalse % % \fi % \caption{Example of commands to split verse (using the \texttt{\bbackslash{}phantom} command)} % \label{fig:splitverse-phantom} % \end{figure} % % \danger % Warning: I do not understand the code behind this feature. I copied-pasted code by David Carlisle\footnote{Originally written as an answer to a StackExchange question: see \url{https://tex.stackexchange.com/a/107727}.} without understanding it. There are probably bugs, but I won't be able to solve them. % This feature can also be implemented using the \lstinline|\phantom| command (see figure \ref{fig:splitverse-phantom} for an example, page \pageref{fig:splitverse-phantom}). % It is far less user-friendly, but it also less error prone. Choose wisely… % % \DescribeMacro{\pauseverse} % \DescribeMacro{\resumeverse} % \DescribeMacro{\adjustverse} % % Command \lstinline|\pauseverse| is used at the end of the verse to be continued, % while command \lstinline|\resumeverse| is used at the beginning of the continuing % verse. % Let us face it: these commands are kind of a hack, and sometimes, the lines % are not aligned the way one would expect them to. To correct this, command % \lstinline|\adjustverse|\marg{length} can be used to add an extra (possibly negative) % space when calling \lstinline|\resumeverse|, to get a correct alignment. % See figure \ref{fig:splitverse}, page \pageref{fig:splitverse}, for an % example of those three commands. % % When writing a play in verse, one can use a lot of those commands, which can % be tedious because of their long names. So, defining ``shortcuts'' of those % commands can be handy, as in the following example. % % \iffalse %<*example> % \fi % \begin{lstlisting} \newcommand{\pv}{\pauseverse} \newcommand{\rv}{\resumeverse} \end{lstlisting} % \iffalse % % \fi % % This is not done by default, because short command names are a scare ressource % in \LaTeX, so, defining these commands by default might conflict with other % packages, while most of |thalie| users will not use them. % % \section{Localization and Internationalization} % \label{sec:i18n} % % \subsection{Localization} % \label{sec:l10n} % % \changes{v0.9a}{2017/04/22}{Use package |translations| for localization.} % % Language cannot be defined directly in this package. Instead, the language % currently used by |babel| or |polyglossia| is used to translate the following % words (with or without capital letter, singular or plural): \emph{play}, % \emph{act}, \emph{scene}, \emph{interlude}, \emph{pause}, \emph{curtain}. % % If the option for your language does not exist\footnote{You can also send me % the translation for your language, to improve this package.}, or if you want % to change the default words used here, you can set your own translation % using command \lstinline|\DeclareTranslation| (see the |translations| package for more % information). For instance use % \lstinline|\DeclareTranslation{Spanish}{Curtain}{Tel\`on}| for Spanish\footnote{I may % be wrong: I cannot speak Spanish.}. % % See section \ref{sec:languages} for the list of supported languages. % % \subsubsection{Common translations} % \DescribeMacro{\playname} % \DescribeMacro{\actname} % \DescribeMacro{\scenename} % \DescribeMacro{\interludename} % \DescribeMacro{\pausename} % \DescribeMacro{\curtainname} % % Commands defined here are shorter versions of strings commonly translated. % % For instance, \lstinline|\playname| is a shortcut for \lstinline|\GetTranslation{Play}|, % \lstinline|\actname| is a shortcut for \lstinline|\GetTranslation{Act}|, and so on. % % \subsection{Non-latin alphabets} % % This package should work with languages using non-latin alphabets (greek, % hindi, etc.). However, here are a few remarks. % % \begin{itemize} % \item The |bold| character style (see section \ref{sec:lines}) can only be used if a sans serif font has been defined. For instance, for hindi, you might write in the preamble: \lstinline|\newfontfamily\hindifontsf{Noto Sans Devanagari}|. % \end{itemize} % % \subsection{Language specific comments} % \label{sec:languages} % % \changes{v0.10a}{2019/02/24}{New translation: German (thanks Ekkart Kleinod).} % % The following languages are available: % % \begin{itemize} % \item English, % \item French, % \item German. % \end{itemize} % % \subsubsection{English} % % \begin{itemize} % \item The |arden| character style tries to mimick the typestting of the Arden Shakespeare series. % \end{itemize} % % \subsubsection{French} % % \begin{itemize} % \item The |imprimerie-verse| and |imprimerie-prose| character styles implements the French \emph{de facto} standards for typesetting drama plays, respectively in verse and in prose, as defined by the \emph{Imprimerie nationale} \cite{imprimerienationale}. % \item The same book (\cite{imprimerienationale}) states that act numbers should be typeset in capital roman numerals (which is done by default with |thalie|), and that scene numbers should be typeset in small capital roman numerals, which is \emph{not} the default, but can be achieved by adding the following line in the preamble: \lstinline|\renewcommand{\thescene}{\textsc{\roman{scene}}}|. % \end{itemize} % % \subsubsection{Other languages} % % I do not know anything related to other languages. If you have interesting advice for those languages that you would like to share (preferably with a reference to a reliable source), I would be happy to add them to this list! % % \section{Examples} % \label{sec:examples} % \changes{v0.9a}{2017/04/22}{Add section \emph{Examples}.} % % \subsection{Characters' lines} % \label{sec:examples:characterslines} % % \subsubsection{Introduce lines of several characters at the same time.} % % Since \lstinline|\disposablecharacter| can display arbitrary text using the style of % character names, it can be used to render a custom text when two characters % are speaking together. % % \iffalse %<*example> % \fi % \begin{LTXexample}[pos=b, preset={ \begin{dramatis}[hidden] \character[cmd=alice]{Alice} \character[cmd=bob]{Bob} \character[cmd=eve]{Eve} \end{dramatis} }] \alice Let's open it. \disposablecharacter{\bobname and \evename} No! % \end{LTXexample} % \iffalse % % \fi % % \subsubsection{Add a footnote on a character name} % % Adding a footnote on the character name introducing its line cannot be done on the character command defined by the dramatis person\ae. Instead, the \lstinline|\disposablecharacter| command can be used instead. % \iffalse %<*example> % \fi % \begin{lstlisting} \disposablecharacter{\alicename\footnote{An interesting note.}} Hello, world! \end{lstlisting} % \iffalse % % \fi % % \subsubsection{Add a footnote in a stage direction} % % Footnote must be protected to be included in stage directions. % \iffalse %<*example> % \fi % \begin{lstlisting} \cyrano[clapping his hands\protect\footnote{An interesting footnote.}] One! \end{lstlisting} % \iffalse % % \fi % % \subsection{Headers and footers} % \label{sec:examples:headers} % % By default, with the |article| class, the header of the left page contains % the play name, and the header of the right page contains the act number. % % \subsubsection{Act number on left, scene number on right} % % \iffalse %<*example> % \fi % \begin{lstlisting} \renewcommand{\actmark}[1]{% {\markboth{\MakeUppercase{\GetTranslation{Act}}\ \theact\ #1}{}}% } \renewcommand{\scenemark}[1]{% {\markright{\MakeUppercase{\GetTranslation{Scene}}\ \thescene\ #1}}% } \end{lstlisting} % \iffalse % % \fi % % \subsubsection{Play name of left, act and scene name on right} % % \iffalse %<*example> % \fi % \begin{lstlisting} \usepackage{fancyhdr} \pagestyle{fancy} \fancyhf{} \fancyhead[RO]{% \textit{\MakeUppercase{% \GetTranslation{Act} \theact{}, % \GetTranslation{Scene} \thescene% }}% } \fancyhead[LE]{\leftmark} \end{lstlisting} % \iffalse % % \fi % % \section{Implementation} % \label{sec:implementation} % % \subsection{Required packages} % Loading some packages. % \begin{macrocode} % Options \RequirePackage{pgfkeys} % Chapters, sections, etc \RequirePackage{etoolbox} \RequirePackage{suffix} % Dramatis person\ae{} is written using a table. \RequirePackage{tabularx} % Handling spaces after having introduced characters' lines. \RequirePackage{xspace} % \end{macrocode} % % \subsection{Localization} % % Use |translations|. Translations are defined in the |dicts/thalie-.trsl| files. % \begin{macrocode} \RequirePackage{translations} \LoadDictionary{thalie} \LoadDictionaryFor{fallback}{thalie} % \end{macrocode} % % \subsection{Obsolete localization commands} % % \begin{macro}{\playname} % \begin{macro}{\actname} % \begin{macro}{\scenename} % \begin{macro}{\interludename} % \begin{macro}{\curtainname} % \begin{macro}{\pausename} % Shorter versions of commonly translated strings. % \begin{macrocode} \newcommand{\playname}{\GetTranslation{Play}} \newcommand{\actname}{\GetTranslation{Act}} \newcommand{\scenename}{\GetTranslation{Scene}} \newcommand{\interludename}{\GetTranslation{Interlude}} \newcommand{\curtainname}{\GetTranslation{Curtain}} \newcommand{\pausename}{\GetTranslation{Pause}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Sectioning} % \subsubsection{Headears, footers, counters, etc.} % \begin{macro}{playmark} % \begin{macro}{actmark} % \begin{macro}{scenemark} % Define commands \lstinline|\playmark|, \lstinline|\actmark| and \lstinline|\scenemark|, which are involved % in headers and footers definition. % \begin{macrocode} \newcommand{\playmark}[1]{% \markboth{\MakeUppercase{#1}}{}% } \newcommand{\actmark}[1]{% \markright{\MakeUppercase{% \GetTranslation{Act}\ \theact% \ifdefempty{#1}{}{: #1}% }}% } \newcommand{\scenemark}[1]{% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{theplay} % \begin{macro}{theact} % \begin{macro}{thescene} % Defines counters for plays, acts and scenes, and the associated labels % (\lstinline|\theplay|, \lstinline|\theact|, \lstinline|\thescene|). % \begin{macrocode} \newcounter{play} \renewcommand{\theplay}{\arabic{play}} \newcounter{act}[play] \renewcommand{\theact}{\Roman{act}} \newcounter{scene}[act] \renewcommand{\thescene}{\arabic{scene}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{Styles} % Style difinition. Command \lstinline|\@displaytitle| is later used by commands % \lstinline|\play|, \lstinline|\act| and \lstinline|\scene| (and their starred version) to typeset the % title. % \begin{macrocode} \newcommand{\@displaytitle}[3]{ % Arguments: % - Style % - Label (none = not in toc) % - Title \ifdefstring{#1}{center}{ \begin{center} \textsc{#2} #3 \end{center} }{\ifdefstring{#1}{bigcenter}{ \begin{center} \Large \textsc{#2} #3 \end{center} }{\ifdefstring{#1}{box}{ \begin{center} \framebox{\begin{minipage}{0.7\textwidth} \begin{center} \Large \bfseries \vspace{0.5em} #2 \ifboolexpr{test{\ifstrempty{#3}} or test{\ifstrempty{#2}}}{}{---} #3 \vspace{0.5em} \end{center} \end{minipage}} \end{center} \vspace{1em} }{}}} } % \end{macrocode} % % \subsubsection{Sectioning commands} % % Some general commands to handle clearing pages, and table of contents. % \begin{macrocode} \newcommand\@clearpage[1]{% % Clear page if necessary \ifboolexpr{test{\ifdefstring{#1}{part}} or test{\ifdefstring{#1}{chapter}}}{ \cleardoublepage \thispagestyle{empty} }{} } % \end{macrocode} % % \begin{macro}{\play} % \begin{macro}{\play*} % Define sectioning commands to introduce plays. As for \lstinline|\section| (and % other) sectioning command, the starred version does the same, excepted that % nothing is written in the table of content. % \begin{macrocode} \newcommand{\play}[2][]{% \refstepcounter{play} \ifstrempty{#1}{ \def\@short{#2} }{ \def\@short{#1} } \@clearpage{\@playlevel} \playmark{\@short} \addcontentsline{toc}{\@playlevel}{\@short} \ifdefstring{\@playstyle}{custom}{ \customplay{\theplay}{#2} }{ \@displaytitle{\@playstyle}{}{#2} } } \WithSuffix\newcommand\play*[1]{% \@clearpage{\@playlevel} \ifdefstring{\@playstyle}{custom}{ \customplay*{#1} }{ \@displaytitle{\@playstyle}{}{#1} } } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\act} % \begin{macro}{\act*} % Define commands to introduce acts. % \begin{macrocode} \newcommand{\act}[2][]{% \refstepcounter{act} \ifstrempty{#1}{ \def\@short{#2} }{ \def\@short{#1} } \ifdefempty{\@short}{ \def\@label{\GetTranslation{Act} \theact{}} }{ \def\@label{\GetTranslation{Act} \theact{}\xspace: } } \@clearpage{\@actlevel} \actmark{\@short} \addcontentsline{toc}{\@actlevel}{\@label\@short} \ifdefstring{\@actstyle}{custom}{ \customact{\theact}{#2} }{ \@displaytitle{\@actstyle}{\GetTranslation{Act} \theact}{#2} } } \WithSuffix\newcommand\act*[1]{% \@clearpage{\@actlevel} \ifdefstring{\@actstyle}{custom}{ \customact*{#1} }{ \@displaytitle{\@actstyle}{}{#1} } } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\scene} % \begin{macro}{\scene*} % Define commands to introduce scenes. % \begin{macrocode} \newcommand{\scene}[2][]{% \refstepcounter{scene} \ifstrempty{#1}{ \def\@short{#2} }{ \def\@short{#1} } \ifdefempty{\@short}{ \def\@label{\GetTranslation{Scene} \thescene{}} }{ \def\@label{\GetTranslation{Scene} \thescene{}\xspace: } } \@clearpage{\@scenelevel} \scenemark{\@short} \addcontentsline{toc}{\@scenelevel}{\@label\@short} \ifdefstring{\@scenestyle}{custom}{ \customscene{\thescene}{#2} }{ \@displaytitle{\@scenestyle}{\GetTranslation{Scene} \thescene}{#2} } } \WithSuffix\newcommand\scene*[1]{% \@clearpage{\@scenelevel} \ifdefstring{\@scenestyle}{custom}{ \customscene*{#1} }{ \@displaytitle{\@scenestyle}{}{#1} } } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\interlude} % \begin{macro}{\interlude*} % Define commands to introduce interludes. % \begin{macrocode} \newcommand{\interlude}[2][]{% \ifstrempty{#1}{ \def\@short{#2} }{ \def\@short{#1} } \ifdefempty{\@short}{ \def\@label{\GetTranslation{Interlude}} }{ \def\@label{\GetTranslation{Interlude}\xspace: } } \ifdefstring{\@interludelevel}{play}{ \@clearpage{\@playlevel} \playmark{\@short} \addcontentsline{toc}{\@playlevel}{\@label\@short} \@displaytitle{\@playstyle}{\GetTranslation{Interlude}}{#2} }{\ifdefstring{\@interludelevel}{act}{ \@clearpage{\@actlevel} \actmark{\@short} \addcontentsline{toc}{\@actlevel}{\@label\@short} \@displaytitle{\@actstyle}{\GetTranslation{Interlude}}{#2} }{% \@interludelevel is scene \@clearpage{\@scenelevel} \scenemark{\@short} \addcontentsline{toc}{\@scenelevel}{\@label\@short} \@displaytitle{\@scenestyle}{\GetTranslation{Interlude}}{#2} }} } \WithSuffix\newcommand\interlude*[1]{% \ifdefstring{\@interludelevel}{play}{ \@clearpage{\@playlevel} \@displaytitle{\@playstyle}{\GetTranslation{Interlude}}{#1} }{\ifdefstring{\@interludelevel}{act}{ \@clearpage{\@actlevel} \@displaytitle{\@actstyle}{\GetTranslation{Interlude}}{#1} }{% \@interludelevel is scene \@clearpage{\@scenelevel} \@displaytitle{\@scenestyle}{\GetTranslation{Interlude}}{#1} }} } % \end{macrocode} % \end{macro} % \end{macro} % % \subsubsection{Curtain} % % \begin{macro}{\curtain} % Used to mark the end of an act. Prints ``curtain'' centered in its own line. % \begin{macrocode} % Curtain \newcommand\curtain{ \begin{center} \Large\textsc{\GetTranslation{Curtain}} \end{center} } % \end{macrocode} % \end{macro} % % \subsection{Characters} % % \subsubsection{Spacing} % Add (or not) an |$\backslash$xspace| command at the end of character names, % depending on the |xspace| package option. % \begin{macrocode} \newcommand{\@maybexspace}{% \if@xspace% \xspace% \fi% } % \end{macrocode} % % \subsubsection{Characters' line} % Define the command \lstinline|\@speaks|, wich introduce a character's line. It % is not meant to be used by user, but will be used by further commands. It % takes two arguments: the character's name, and optionally, a stage direction. % \begin{macrocode} \newcommand{\@speaks}[2][]{% \ifstrempty{#1}{% \speakswithoutdirection{#2}% }{% \speakswithdirection{#2}{#1}% }\@maybexspace% } % \end{macrocode} % % \begin{macro}{\speakswithdirection} % \begin{macro}{\speakswithoutdirection} % Definition of styles for introducing characters' lines. These % commands can be overloaded by user. % \begin{macrocode} \newenvironment{@smallcenter} {\par\smallskip\centering} {\par\nopagebreak\ignorespacesafterend} \providecommand{\speakswithdirection}{} \providecommand{\speakswithoutdirection}{} \newcommand{\@setcharacterstyle}[1]{ \ifstrequal{#1}{bold}{% % Bold style \renewcommand\speakswithdirection[2]{% \noindent% {\bfseries\sffamily ##1} \emph{(##2)}\xspace:% } \renewcommand\speakswithoutdirection[1]{% \noindent% {\bfseries\sffamily ##1\xspace:}% }% }{}% \ifstrequal{#1}{center}{% % Center style \renewcommand\speakswithdirection[2]{% \begin{center}% \textsc{##1},\\\emph{##2}% \end{center}% \par\ignorespacesafterend% }% \renewcommand\speakswithoutdirection[1]{% \begin{center}% \textsc{##1}% \end{center}% \par\ignorespacesafterend% }% }{}% \ifstrequal{#1}{imprimerie-verse}{% % Style for verse plays defined by the French Imprimerie nationale \renewcommand\speakswithdirection[2]{% \begin{@smallcenter}% \textsc{##1}, \emph{##2}% \end{@smallcenter}% }% \renewcommand\speakswithoutdirection[1]{% \begin{@smallcenter}% \textsc{##1}% \end{@smallcenter}% }% }{}% \ifstrequal{#1}{imprimerie-prose}{% % Style for prose plays defined by the French Imprimerie nationale \renewcommand\speakswithdirection[2]{% \noindent\hspace*{-\parindent}\textsc{##1}, \emph{##2}\xspace:% }% \renewcommand\speakswithoutdirection[1]{% \noindent\hspace*{-\parindent}\textsc{##1}\xspace:% }% }{}% \ifstrequal{#1}{arden}{% \renewcommand\speakswithdirection[2]{% \noindent\hspace*{-\parindent}\textsc{\MakeLowercase{##1}} [\emph{##2}]\quad% }% \renewcommand\speakswithoutdirection[1]{% \noindent\hspace*{-\parindent}\textsc{\MakeLowercase{##1}}\quad% }% }{}% \ifstrequal{#1}{simple}{% % Simple style \renewcommand\speakswithdirection[2]{% \indent\textsc{##1}, \emph{##2}\xspace:% }% \renewcommand\speakswithoutdirection[1]{% \indent\textsc{##1}\xspace:% }% }{}% \ifstrequal{#1}{margin}{% % Margin style \setlength{\leftskip}{3cm} \renewcommand\speakswithdirection[2]{% \hspace{-3cm} ##1 ##2 } \renewcommand\speakswithoutdirection[1]{% \hspace{-3cm} ##1 }% }{}% } % \end{macrocode} % \end{macro} % \end{macro} % % \subsubsection{Dramatis person\ae{}} % \begin{environment}{dramatis} % In this environment are defined characters. % \begin{macrocode} \newcommand{\@dramatis@clear}{} \newcommand{\@empty@}{} \providebool{@dramatis@hidden} \newenvironment{dramatis}[1][]{ \@dramatis@clear{} \undef{\@dramatis@clear} \ifstrequal{#1}{hidden}{ \booltrue{@dramatis@hidden} }{\ifstrempty{#1}{ \boolfalse{@dramatis@hidden} \dramatisenv }{ \ClassError{thalie}{% Environment dramatis does not accept option #1.% }{ } } } }{% \notbool{@dramatis@hidden}{% \enddramatisenv }{}% } % \end{macrocode} % \end{environment} % % \begin{environment}{dramatisenv} % \changes{v0.9a}{2017/04/22}{It is now possible to customize style of dramatis person\ae.} % \begin{macro}{\dramatischaracter} % \begin{macro}{\dramatischaractername} % \begin{macro}{\dramatischaracterdescription} % \begin{macro}{\characterspace} % \begin{environment}{charactergroup} % \changes{v0.6}{2013/11/02}{Groups of characters are now aligned with other caracters.} % Customizable commands to build dramatis person\ae. % \begin{macrocode} % Environment used to *display* dramatis personae. \newenvironment{dramatisenv}{% \list{}{\rightmargin1cm\leftmargin2cm}\item[] }{% \endlist% } % Display character name \newcommand{\dramatischaractername}[1]{\textbf{#1}} % Display character description \newcommand{\dramatischaracterdescription}[1]{#1} % Adds a vertical space \newcommand{\characterspace}{ % \notbool{@dramatis@hidden}{% \smallskip\newline % }{} % } % Display dramatis personae name and description \newcommand{\dramatischaracter}[2]{ % \hspace*{-1cm} % \ifboolexpr{(not test {\ifdefempty{#1}}) and test {\ifdefempty{#2}}}{% \dramatischaractername{#1} % }{}% \ifboolexpr{ test{\ifdefempty{#1}} and not test{\ifdefempty{#2}}}{% \dramatischaracterdescription{#2} % }{}% \ifboolexpr{ (not test{\ifdefempty{#1}}) and (not test{\ifdefempty{#2}})}{% \dramatischaractername{#1}, \dramatischaracterdescription{#2} % }{}% \newline % } % Environment to manage groups of characters \newlength{\@spaceaftergroup} \newenvironment{charactergroup}[2][5cm]{% \notbool{@dramatis@hidden}{% \gdef\@groupname{#2} % \gdef\@grouplength{#1} % \hspace*{-1.3pt}\math\left. % \minipage[c]{#1} % \vspace*{2pt} % }{}% }{% \notbool{@dramatis@hidden}{% \vspace*{-8pt} % \endminipage % \right\} \endmath % % \setlength{\@spaceaftergroup}{\linewidth} \addtolength\@spaceaftergroup{-\@grouplength} \addtolength\@spaceaftergroup{-20pt} \begin{minipage}[c]{\@spaceaftergroup} \@groupname % \end{minipage} \newline % }{}% } % \end{macrocode} % \end{environment} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{environment} % % \subsubsection{Character definitions} % \begin{macro}{\setcharactername} % Set (or change) the name used to introduce the lines of a character. % \begin{macrocode} % The tough part of this code is to deal with optional argument. \newcommand{\setcharactername}[2]{% \expandafter\gdef\csname#1name\endcsname{% #2\@maybexspace% }% \expandafter\gdef\csname#1\endcsname{% \@ifnextchar[{% \defcharcommand@with{#2}% }{% \defcharcommand@without{#2}% }% }% \xappto{\@dramatis@clear}{% \global\noexpand\csundef{#1}% \global\noexpand\csundef{#1name}% }% } % \end{macrocode} % \end{macro} % % Define the command used to introduce a character's line. It takes two % arguments: the first one is the name of the command to define, and the second % one is the name of the character corresponding to this command. % \begin{macrocode} \newcommand{\@definecharactercommand}[2]{% \ifcsdef{#1}{% \ClassError{thalie}{% A command named \@backslashchar#1 already exists. We cannot define a new one.% }{% Choose another command name to introduce character #2's lines.% }% }{% }% \ifcsdef{#1name}{% \ClassError{thalie}{% A command named \@backslashchar#1name already exists. We cannot define a new one.% }{% Choose another command name to introduce character #2's lines, such that when a new command is defined by adding "name" to it, it does not conflict with an existing one. }% }{% }% \setcharactername{#1}{#2}% } \def\defcharcommand@with#1[#2]{\@speaks[#2]{#1}} \def\defcharcommand@without#1{\@speaks{#1}} % \end{macrocode} % % \begin{macro}{\character} % Define a character: put it in the dramatis person\ae{}, and define % corresponding commands. % \begin{macrocode} \pgfkeys{ % Character definition /THALIE/CHARACTER/.is family, /THALIE/CHARACTER, cmd/.value required, cmd/.store in=\@cmd, drama/.value required, drama/.store in=\@drama, desc/.value required, desc/.store in=\@desc, } \newcommand{\character}[2][]{ \undef{\@drama} \undef{\@cmd} \undef{\@desc} \pgfkeys{/THALIE/CHARACTER, #1}% % Forbidden combinations \ifboolexpr{ ( test{\ifdef{\@cmd}} and test{\ifstrempty{#2}} ) or ( test{\ifstrempty{#2}} and test{\ifundef{\@cmd}} and test{\ifundef{\@desc}} and test{\ifundef{\@drama}} ) or ( test{\ifundef{\@cmd}} and (not test{\ifstrempty{#2}}) and test{\ifdef{\@drama}} ) }{ \ClassError{thalie}{Invalid character definition.}{All combination of omitted arguments are not allowed. See the documentation for more information} }{} % Defining character command \ifboolexpr{ test{\ifdef{\@cmd}} and (not test{\ifstrempty{#2}}) }{% \@definecharactercommand{\@cmd}{#2} }{}% \notbool{@dramatis@hidden}{% \ifboolexpr{ (not test{\ifstrempty{#2}}) and test{\ifdef{\@cmd}} and test{\ifdef{\@drama}} and test{\ifundef{\@desc}}}{% \ifdefempty{\@drama}{% % Hidden character. Nothing added to dramatis personae }{% % Populating dramatis personae \dramatischaracter{\@drama}{\@empty@} }% }{% % Populating dramatis personae \ifcsundef{@desc}{\gdef\@desc{}}{}% \ifcsundef{@drama}{\gdef\@drama{#2}}{}% \dramatischaracter{\@drama}{\@desc} }% }{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\disposablecharacter} % Disposable character (character used only a few times, defined on-the-fly, % that does not appear in the dramatis person\ae{}). % \begin{macrocode} \newcommand{\disposablecharacter}[2][]{% \@speaks[#1]{#2}% } % \end{macrocode} % \end{macro} % % \subsection{Stage directions} % \begin{macro}{\onstage} % Centered stage direction. % \begin{macrocode} \newcommand{\onstage}[1]{{\centering \emph{#1}\par\medskip}} % \end{macrocode} % \end{macro} % % \begin{macro}{\did} % Inline stage directions. % \begin{macrocode} \newcommand{\did}[1]{\emph{(#1)} } % \end{macrocode} % \end{macro} % % \begin{environment}{dida} % Bigger stage directions, in its own paragraph. % \begin{macrocode} \newenvironment{dida}{% \begin{quote} \begin{em} }{% \end{em} \end{quote} } % \end{macrocode} % \end{environment} % % \begin{macro}{\pause} % Shortcut for \lstinline|\did{\GetTranslation{Pause}}|. % \begin{macrocode} \newcommand\pause{\did{\GetTranslation{Pause}}} % \end{macrocode} % \end{macro} % \subsection{Splitting verses} % \begin{macro}{\pauseverse} % \changes{v0.7}{2015/12/28}{New commands \texttt{\bbackslash{}pauseverse}, \texttt{\bbackslash{}resumeverse}, \texttt{\bbackslash{}adjustverse}.} % \begin{macro}{\resumeverse} % \begin{macro}{\adjustverse} % Commands to split a verse between several characters. % \begin{macrocode} % Thanks to Timothy Li for his question, and David Carlisle for his answer: % https://tex.stackexchange.com/questions/107726/107727#107727 \newlength{\@verseadjust} \setlength{\@verseadjust}{0pt} \newcommand{\adjustverse}[1]{\setlength{\@verseadjust}{#1}} \newcommand{\pauseverse}{{\abovedisplayshortskip\z@\abovedisplayskip\z@ \belowdisplayshortskip\z@\belowdisplayskip\z@ $$\global\dimen\@ne\predisplaysize \xdef\tmp{% \predisplaysize\the\predisplaysize \prevgraf\the\prevgraf\relax}% $$\vskip\dimexpr-\parskip-\baselineskip\relax}\tmp } \newcommand{\resumeverse}{% \hspace{\@verseadjust}\hspace{\the\dimen\@ne} } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Package options} % Manage package options. % \begin{macrocode} \RequirePackage{pgfopts} \pgfkeys{ % Character style /THALIE/.cd, characterstyle/.value required, characterstyle/.default=simple, characterstyle/.is choice, characterstyle/bold/.code=\@setcharacterstyle{bold}, characterstyle/center/.code=\@setcharacterstyle{center}, characterstyle/margin/.code=\@setcharacterstyle{margin}, characterstyle/simple/.code=\@setcharacterstyle{simple}, characterstyle/arden/.code=\@setcharacterstyle{arden}, characterstyle/imprimerie-verse/.code=\@setcharacterstyle{imprimerie-verse}, characterstyle/imprimerie-prose/.code=\@setcharacterstyle{imprimerie-prose}, characterstyle, } \pgfkeys{ % play style /THALIE/.cd, playstyle/.value required, playstyle/.default=box, playstyle/.is choice, playstyle/center/.code=\def\@playstyle{center}, playstyle/bigcenter/.code=\def\@playstyle{bigcenter}, playstyle/box/.code=\def\@playstyle{box}, playstyle/custom/.code=\def\@playstyle{custom}, playstyle, } \pgfkeys{ % act style /THALIE/.cd, actstyle/.value required, actstyle/.default=bigcenter, actstyle/.is choice, actstyle/center/.code=\def\@actstyle{center}, actstyle/bigcenter/.code=\def\@actstyle{bigcenter}, actstyle/box/.code=\def\@actstyle{box}, actstyle/custom/.code=\def\@actstyle{custom}, actstyle, } \pgfkeys{ % scene style /THALIE/.cd, scenestyle/.value required, scenestyle/.default=center, scenestyle/.is choice, scenestyle/center/.code=\def\@scenestyle{center}, scenestyle/bigcenter/.code=\def\@scenestyle{bigcenter}, scenestyle/box/.code=\def\@scenestyle{box}, scenestyle/custom/.code=\def\@scenestyle{custom}, scenestyle, } \pgfkeys{ % play level /THALIE/.cd, playlevel/.value required, playlevel/.default=chapter, playlevel/.store in=\@playlevel, playlevel, } \pgfkeys{ % act level /THALIE/.cd, actlevel/.value required, actlevel/.default=section, actlevel/.store in=\@actlevel, actlevel, } \pgfkeys{ % scene level /THALIE/.cd, scenelevel/.value required, scenelevel/.default=subsection, scenelevel/.store in=\@scenelevel, scenelevel, } \pgfkeys{ % interlude level /THALIE/.cd, interludelevel/.value required, interludelevel/.default=act, interludelevel/.is choice, interludelevel/play/.code=\def\@interludelevel{play}, interludelevel/act/.code=\def\@interludelevel{act}, interludelevel/scene/.code=\def\@interludelevel{scene}, interludelevel, } \newif\if@xspace \pgfkeys{ % xspace option /THALIE/.cd, xspace/.value required, xspace/.is if=@xspace, xspace/.default=true, xspace, } \ProcessPgfPackageOptions{/THALIE} % \end{macrocode} % % \begin{macro}{\setthalieoptions} % \changes{v0.9a}{2017/04/22}{Add command \texttt{\bbackslash{}setthalieoptions}.} % Redefine package options. % \begin{macrocode} \newcommand{\setthalieoptions}[1]{% \pgfkeys{/THALIE/.cd, #1}% } % \end{macrocode} % \end{macro} % % \changes{v0.5}{2013/06/08}{First published version.} % % \addcontentsline{toc}{section}{Change History} % \PrintChanges % % \begin{thebibliography}{9} % \addcontentsline{toc}{section}{References} % \bibitem{imprimerienationale} % {Imprimerie nationale}, % \emph{Lexique des r\`egles typographiques en usage \`a l'Imprimerie nationale}, % 2002, % ISBN : 978-2-7433-0482-9 % \bibitem{cyrano} % {Edmond Rostand}, % \emph{Cyrano de Bergerac}, % 1897 % \bibitem{midsummer} % {William Shakespeare}, % \emph{A Midsummer Night's Dream}, % 1600 % \bibitem{dtxtut} % {Scott Pakin}, % \emph{How to Package Your \LaTeX{} Package --- Tutorial on writing .dtx and .ins files}, % 2004, % \url{http://www.ctan.org/pkg/dtxtut/} % \bibitem{clsguide} % {The \LaTeX{} Team}, % \emph{\LaTeXe{} for class and package writers}, % 2006, % \url{http://www.ctan.org/pkg/clsguide} % \bibitem{drama} % {Matt Swift}, % \emph{drama --- Production-style stage script in LaTeX}, % 2001, % \url{http://www.ctan.org/pkg/drama} % \bibitem{dramatist} % {Massimiliano Dominici}, % \emph{dramatist --- Typeset dramas, both in verse and in prose}, % 2005, % \url{http://www.ctan.org/pkg/dramatist} % \bibitem{play} % {James Kilfiger}, % \emph{play --- Typeset drama using \LaTeX{}}, % 2001, % \url{http://www.ctan.org/pkg/play} % \bibitem{screenplay} % {John Pate}, % \emph{screenplay --- A class file to typeset screen­plays}, % 2012, % \url{http://www.ctan.org/pkg/screenplay} % \bibitem{sides} % {Wing L Mui}, % \emph{sides --- A LaTeX class for typesetting stage plays}, % 2005, % \url{http://www.ctan.org/pkg/sides} % \end{thebibliography} % % \StopEventually{% % \addcontentsline{toc}{section}{Index} % \PrintIndex % } % \Finale \endinput