From aa0b340189383ff3014db4eaec3aeb58687d6207 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 28 Jun 2013 22:24:44 +0000 Subject: thalie (9jun13) git-svn-id: svn://tug.org/texlive/trunk@31018 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/thalie/README | 15 + Master/texmf-dist/doc/latex/thalie/thalie.pdf | Bin 0 -> 369598 bytes Master/texmf-dist/source/latex/thalie/thalie.dtx | 1520 ++++++++++++++++++++++ Master/texmf-dist/source/latex/thalie/thalie.ins | 59 + Master/texmf-dist/tex/latex/thalie/thalie.sty | 537 ++++++++ Master/tlpkg/bin/tlpkg-ctan-check | 2 +- Master/tlpkg/tlpsrc/collection-humanities.tlpsrc | 1 + Master/tlpkg/tlpsrc/thalie.tlpsrc | 0 8 files changed, 2133 insertions(+), 1 deletion(-) create mode 100644 Master/texmf-dist/doc/latex/thalie/README create mode 100644 Master/texmf-dist/doc/latex/thalie/thalie.pdf create mode 100644 Master/texmf-dist/source/latex/thalie/thalie.dtx create mode 100644 Master/texmf-dist/source/latex/thalie/thalie.ins create mode 100644 Master/texmf-dist/tex/latex/thalie/thalie.sty create mode 100644 Master/tlpkg/tlpsrc/thalie.tlpsrc (limited to 'Master') diff --git a/Master/texmf-dist/doc/latex/thalie/README b/Master/texmf-dist/doc/latex/thalie/README new file mode 100644 index 00000000000..5524b4e2949 --- /dev/null +++ b/Master/texmf-dist/doc/latex/thalie/README @@ -0,0 +1,15 @@ +A package providing tools to typeset drama plays. It defines commands to +introduce characters' lines, to render stage direction, to divide a play into +acts and scenes, to automatically build the dramatis personae, etc. + +LICENSE + +Copyright 2010-2013 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. diff --git a/Master/texmf-dist/doc/latex/thalie/thalie.pdf b/Master/texmf-dist/doc/latex/thalie/thalie.pdf new file mode 100644 index 00000000000..ee38544e993 Binary files /dev/null and b/Master/texmf-dist/doc/latex/thalie/thalie.pdf differ diff --git a/Master/texmf-dist/source/latex/thalie/thalie.dtx b/Master/texmf-dist/source/latex/thalie/thalie.dtx new file mode 100644 index 00000000000..06a3d2d8d12 --- /dev/null +++ b/Master/texmf-dist/source/latex/thalie/thalie.dtx @@ -0,0 +1,1520 @@ +% \iffalse meta-comment +% Copyright 2010-2013 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> + [2013/06/08 v0.5 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[francais,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, \@ifundefined, \\, \protect\`, \(, \)} +% \DoNotIndex{\addcontentsline, \addto, \ae, \AND, \arabic} +% \DoNotIndex{\begin, \bfseries, \boolean} +% \DoNotIndex{\captionsenglish, \captionsfrench, \center, \centering, \ClassError, \cleardoublepage, \csname, \csundef} +% \DoNotIndex{\def, \defcharcommand@with, \defcharcommand@without} +% \DoNotIndex{\emph, \end, \endcsname, \equal, \expandafter} +% \DoNotIndex{\framebox} +% \DoNotIndex{\gappto, \gdef, \global} +% \DoNotIndex{\hspace} +% \DoNotIndex{\ifthenelse, \@ifpackageloaded, \indent, \isundefined} +% \DoNotIndex{\LARGE, \Large, \left, \leftskip} +% \DoNotIndex{\medskip, \MakeUppercase, \markboth, \markright} +% \DoNotIndex{ +% \@actlevel, +% \@actstyle, +% \@character, +% \@characterstyle, +% \@clearpage, +% \@definecharactercommand, +% \@displaytitle, +% \@dramatis@clear, +% \@dramatis@hook, +% \@groupname, +% \@interludelevel, +% \@label, +% \@playlevel, +% \@playstyle, +% \@scenelevel, +% \@scenestyle, +% \@short, +% \@speaks, +% } +% \DoNotIndex{\newcommand, \newcounter, \newenvironment, \noindent, \noexpand, \NOT} +% \DoNotIndex{\OR} +% \DoNotIndex{\par, \pgfkeys, \ProcessPgfPackageOptions, \protect, \provideboolean, \protected@xappto} +% \DoNotIndex{\refstepcounter, \renewcommand, \RequirePackage, \right, \Roman} +% \DoNotIndex{\section, \setboolean, \setlength, \sffamily} +% \DoNotIndex{\tabularnewline, \textrm, \textsc, \textwidth, \thispagestyle} +% \DoNotIndex{\undef} +% \DoNotIndex{\vspace} +% \DoNotIndex{\WithSuffix} +% \DoNotIndex{\xappto, \xspace} +% +% \title{The \textsf{thalie} package\thanks{This document +% corresponds to \textsf{thalie}~\fileversion, +% dated \filedate.}\\A package to typeset drama plays} +% \author{Louis Paternault\\ \texttt{spalax(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 one (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 +% content; 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 accounts, 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 exactly\footnote{Well, not +% exactly: see the wish list page \pageref{sec:wishlist}. But I do not think +% |dramatist| can do this either.} 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 send me smiles, cakes or poetry, or, better, the +% text of the plays you write using my package\footnote{Seriously, it would +% make me \emph{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{Overview} +% Documentation about how to use this package is given in section +% \ref{sec:usage}. In particular, section \ref{sec:sectionning} explains how to +% use acts and scenes, section \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. +% +% Implementation is given in section \ref{sec:implementation}. +% +% \section{Usage} +% \label{sec:usage} +% +% \subsection{Localization} +% \DescribeMacro{\playname} +% \DescribeMacro{\actname} +% \DescribeMacro{\scenename} +% \DescribeMacro{\interludename} +% \DescribeMacro{\pausename} +% \DescribeMacro{\curtainname} +% Language cannot be defined directly in this package. Instead, the language +% currently used by the |babel| package (i.e. the language returned by +% |babel|'s |\languagename| command) is used to display names. +% +% Package |babel|, and its languages you want to use, must be loaded +% \emph{before} this package, otherwise localization will not be available. +% +% The effect of choosing a language or another is to translate some words. The +% corresponding commands, and the word they correspond to, are listed in table +% \ref{table:l10n}. +% +% \begin{table} +% \centering +% \begin{tabular}{ccc} +% \hline +% Command & Result (in English) & Result (in French) \\ +% \hline +% |\playname| & Play & Pi\`ece \\ +% |\actname| & Act & Acte \\ +% |\scenename| & Scene & Sc\`ene \\ +% |\interludename| & Interlude & Interm\`ede \\ +% |\pausename| & Pause & Pause \\ +% |\curtainname| & Curtain & Rideau \\ +% \hline +% \end{tabular} +% \caption{Localization commands} +% \label{table:l10n} +% \end{table} +% +% If the option for your language does not exists\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 redefine the commands listed +% in table \ref{table:l10n}. For instance use +% |\renewcommand{\curtainname}{Tel\`on}| for Spanish (if I am not wrong). +% +% \subsection{Package options} +% \label{sec:options} +% +% \subsubsection{Summary} +% +% Package options are summed up in table \ref{table:packageoptions}. +% +% \begin{table} +% \centering +% \begin{tabular}{c|c|c} +% Name & Available options & Default \tabularnewline +% \hline +% \hline +% |characterstyle| & |bold| |margin| |center| |simple| & |simple| \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 +% \end{tabular} +% \caption{Package options summary} +% \label{table:packageoptions} +% \end{table} +% +% \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{Sectionning levels} +% If you use a table of contents, or if you also use ``usual'' sectionning +% commands (|\chapter|, |\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 +% sectionning 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 +% sectionning levels as the level, you may choose |play|, |act| or |scene|. It +% defines if an interlude is as the same level as a play, an act or a scene. +% +% \subsection{Sectionning} +% \label{sec:sectionning} +% Here begin the parts explicitely relative 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 |\play|, |\act| and +% |\scene|. Their behaviour is as close as the ``usual'' sectionning commands +% (|\chapter|, |\section| and so on) as possible, i.e.: +% \begin{itemize} +% \item Their signature is |\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 (|\play*|, |\act*| and |\scene*|) is provided, which +% 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 |\act| and |\scene| (and their starred version) 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 |\play|, |\act| and |\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 |\play|; if +% your document has several single act plays, set +% |playlevel=section,scenelevel=subsection| and ignore |\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 +% |\interlude|\oarg{short title}\marg{long title} has this purpose. +% +% You may choose the sectionning level an inturlude 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 +% |\curtain|, which prints the word |\curtainname| 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{verbatim} +\newcommand\customact[2]{ + \begin{center} + \textsc{#1} + + #2 + \end{center} +} +\WithSuffix\newcommand\customact*[1]{\customact{}{#1}} +% \end{verbatim} +% \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 +% |\customact|\marg{counter}\marg{title} and |\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 |\customact| is the label of the act being printed +% (that is, |\theact| for an act, |\theplay| for a play, etc.), its second +% argument is its title. Command |\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 |\chapter|, |\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 |\theplay|, |\theact| and |\thescene|. For example, to +% have acts numbered using letters, use |\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 |\section| are provided to deal +% with headers and footers. When introducing, respectively, a new play, act or +% scene, commands |\playmark|\marg{label}, |\actmark|\marg{label} and +% |\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. +% +% \subsection{Characters} +% \label{sec:characters} +% This part explains how to define characters, introduce character's lines, and +% build and display the dramatis person\ae{}. +% +% \subsubsection{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{center} +% |\begin{dramatis}|\oarg{hidden} +% \end{center} +% Then, several commands are available to define characters, and organize +% character definitions. +% +% \DescribeMacro{\characterspace} +% Command |\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} +\begin{dramatis} +\character[desc={a nurse}, + cmd={liz}]{Liz} +\character[desc={Liz's father}, + cmd={father}, drama={A sailor} + ]{The sailor} +\end{dramatis} + +\bigskip + +\liz Hello, I'm \lizname! + +\father Hello. + +\liz[to herself] Go away... +% \end{LTXexample} +% \iffalse +% +% \fi +% \caption{Example of character definition} +% \label{fig:character_example} +% \end{figure} +% +% \DescribeMacro{\character} +% To define a character, use command |\character|. +% \begin{center}% +% |\character|\oarg{\emph{cmd=}command,\emph{drama=}dramatis,\emph{desc=}description}\marg{name}% +% \end{center} +% 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 |\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\up{\ref{character:silent}} & default\up{\ref{character:default}} \\ +% & & & & & hidden\up{\ref{character:hidden}}\\ +% \cline{2-6} +% & \multirow{2}{*}{ \meta{desc}} & description & & silent\up{\ref{character:silent}} & default\up{\ref{character:default}} \\ +% & & only\up{\ref{character:description}} & & & \\ +% \hline +% \multirow{2}{*}{ \meta{drama}} & no \meta{desc} & silent\up{\ref{character:silent}} & & & default\up{\ref{character:default}} \\ +% \cline{2-6} +% & \meta{desc} & silent\up{\ref{character:silent}} & & & default\up{\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:\\|\character[drama={A ghost}, desc={the king's ghost},|\\ +% | cmd={ghost}]{The ghost}| +% \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:\\|\character[desc={The kings' armies}]{}| +% \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:\\|\character[drama={}, cmd={postman}]{The postman}| +% \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:\\|\character{A priest}| +% \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|\marg{description}. For example, one can use code of figure +% \ref{fig:charactergroup} to define the three sons of another character. +% +% \begin{figure}[p] +% \centering +% \iffalse +%<*example> +% \fi +% \begin{LTXexample} +\begin{dramatis} +\begin{charactergroup}{John's sons} + \character[desc={a baby}, cmd=jack]{Jack} + \character[cmd=paul]{Paul} + \character[cmd=peter]{Peter} +\end{charactergroup} +\end{dramatis} +% \end{LTXexample} +% \iffalse +% +% \fi +% \caption{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. +% +% \paragraph{Disposable character} +% \DescribeMacro{\disposablecharacter} +% One can need to define characters that are used only once (or a few times). +% Command |\disposablecharacter| is here to help. +% \begin{center}|\disposablecharacter|\oarg{directions}\marg{name}\end{center} +% 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{}. +% +% \subsubsection{Changing character's name} +% \label{setcharactername} +% \DescribeMacro{\setcharactername} +% +% \begin{figure}[p] +% \centering +% \iffalse +%<*example> +% \fi +% \begin{LTXexample} +\begin{dramatis}[hidden] + \character[desc={Liz's father}, cmd=father]{The sailor} + \character[desc={a nurse}, cmd=liz]{Liz} +\end{dramatis} + +\father Time to get back to my ship. + +\liz Wait! Why did you help me? + +\father Because you are my daughter. +\setcharactername{father}{Liz's father} + +\liz Mom said you abandonned us. + +\father She lied. +% \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 +% reffered as \emph{A sailor}, until we learn his real identity, which is +% \emph{Liz's father}. An example is given in figure +% \ref{fig:setcharactername_example}. +% \begin{center}|\setcharactername|\marg{command}\marg{name}\end{center} +% +% 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 |\character| command, or the example in figure +% \ref{fig:character_example}). +% +% \paragraph{Choose style} +% 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| and |simple|). +% Note that |center| and |simple| 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}. Default style +% is |simple|. +% +% \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} +% |\speakswithoutdirection|\marg{name}\\ +% |\speakswithdirection|\marg{name}\marg{direction} +% \end{quote} +% The first one (|\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 (|\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 +% |$\formula$| and |\[\formula\]| for formulas. +% The first way is the command |\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 +% |\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 |\pause|, +% which is a shortcut for |\did{\pausename}|. +% +% \section{Implementation} +% \label{sec:implementation} +% +% \subsection{Required packages} +% Loading some packages. +% \begin{macrocode} +\RequirePackage{ifthen} +% Chapters, sections, etc +\RequirePackage{etoolbox} +\RequirePackage{suffix} +% Dramatis person\ae{} is written using a table. Package "longtable" is used to be +% able to write it on several pages. +\RequirePackage{longtable} +% Handling spaces after having introduces characters' lines. +\RequirePackage{xspace} +% \end{macrocode} +% +% \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=\def\@characterstyle{bold}, + characterstyle/center/.code=\def\@characterstyle{center}, + characterstyle/margin/.code=\def\@characterstyle{margin}, + characterstyle/simple/.code=\def\@characterstyle{simple}, + 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, +} + +\ProcessPgfPackageOptions{/THALIE} +% \end{macrocode} +% +% \subsection{Localization} +% \begin{macro}{\playname} +% \begin{macro}{\actname} +% \begin{macro}{\scenename} +% \begin{macro}{\interludename} +% \begin{macro}{\curtainname} +% \begin{macro}{\pausename} +% Definition of the commands used for localization. The \emph{only} way to +% choose the language to use is by loading the |babel| package before loading +% this one. +% \begin{macrocode} +\newcommand{\playname}{Play} +\newcommand{\actname}{Act} +\newcommand{\scenename}{Scene} +\newcommand{\interludename}{Interlude} +\newcommand{\curtainname}{Curtain} +\newcommand{\pausename}{Pause} +\@ifpackageloaded{babel}{ + \addto\captionsfrench{% + \renewcommand{\playname}{Pi\`ece} + \renewcommand{\actname}{Acte} + \renewcommand{\scenename}{Sc\`ene} + \renewcommand{\interludename}{Interm\`ede} + \renewcommand{\curtainname}{Rideau} + \renewcommand{\pausename}{Pause} + } + \addto\captionsenglish{% + % Useless: these are the default... + } +}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Sectionning} +% \subsubsection{Headears, footers, counters, etc.} +% \begin{macro}{playmark} +% \begin{macro}{actmark} +% \begin{macro}{scenemark} +% Define commands |\playmark|, |\actmark| and |\scenemark|, which are involved +% in headers and footers definition. +% \begin{macrocode} +\newcommand{\playmark}[1]{% + \markboth{\MakeUppercase{#1}}{}% +} +\newcommand{\actmark}[1]{% + \markright{\MakeUppercase{#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 +% (|\theplay|, |\theact|, |\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 |\@displaytitle| is later used by commands +% |\play|, |\act| and |\scene| (and their starred version) to typeset the +% title. +% \begin{macrocode} +\newcommand{\@displaytitle}[3]{ + % Arguments: + % - Style + % - Label (none = not in toc) + % - Title + \ifthenelse{\equal{#1}{center}}{ + \begin{center} + \textsc{#2} + + #3 + \end{center} + }{\ifthenelse{\equal{#1}{bigcenter}}{ + \begin{center} + \Large + \textsc{#2} + + #3 + \end{center} + }{\ifthenelse{\equal{#1}{box}}{ + \begin{center} + \framebox{\begin{minipage}{0.7\textwidth} + \begin{center} + \Large \bfseries + \vspace{0.5em} + + #2 + \ifthenelse{\equal{#3}{} \OR \equal{#2}{}}{}{---} + #3 + + \vspace{0.5em} + \end{center} + \end{minipage}} + \end{center} + \vspace{1em} + }{}}} +} +% \end{macrocode} +% +% \subsubsection{Sectionning commands} +% +% Some general commands to handle clearing pages, and table of contents. +% \begin{macrocode} +\newcommand\@clearpage[1]{% + % Clear page if necessary + \ifthenelse{\equal{#1}{part} \OR \equal{#1}{chapter}}{ + \cleardoublepage + \thispagestyle{empty} + }{} +} + +% \end{macrocode} +% +% \begin{macro}{\play} +% \begin{macro}{\play*} +% Define sectionning commands to introduce plays. As for |\section| (and +% other) sectionning command, the starred version does the same, excepted that +% nothing is written in the table of content. +% \begin{macrocode} +\newcommand{\play}[2][]{% + \refstepcounter{play} + \ifthenelse{\equal{#1}{}}{ + \def\@short{#2} + }{ + \def\@short{#1} + } + \@clearpage{\@playlevel} + \playmark{\@short} + \addcontentsline{toc}{\@playlevel}{\@short} + \ifthenelse{\equal{\@playstyle}{custom}}{ + \customplay{\theplay}{#2} + }{ + \@displaytitle{\@playstyle}{}{#2} + } +} +\WithSuffix\newcommand\play*[1]{% + \@clearpage{\@playlevel} + \ifthenelse{\equal{\@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} + \ifthenelse{\equal{#1}{}}{ + \def\@short{#2} + }{ + \def\@short{#1} + } + \ifthenelse{\equal{\@short}{}}{ + \def\@label{\actname{} \theact{}} + }{ + \def\@label{\actname{} \theact{}: } + } + \@clearpage{\@actlevel} + \actmark{\@label\@short} + \addcontentsline{toc}{\@actlevel}{\@label\@short} + \ifthenelse{\equal{\@actstyle}{custom}}{ + \customact{\theact}{#2} + }{ + \@displaytitle{\@actstyle}{\actname{} \theact}{#2} + } +} +\WithSuffix\newcommand\act*[1]{% + \@clearpage{\@actlevel} + \ifthenelse{\equal{\@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} + \ifthenelse{\equal{#1}{}}{ + \def\@short{#2} + }{ + \def\@short{#1} + } + \ifthenelse{\equal{\@short}{}}{ + \def\@label{\scenename{} \thescene{}} + }{ + \def\@label{\scenename{} \thescene{}: } + } + \@clearpage{\@scenelevel} + \scenemark{\@label\@short} + \addcontentsline{toc}{\@scenelevel}{\@label\@short} + \ifthenelse{\equal{\@scenestyle}{custom}}{ + \customscene{\thescene}{#2} + }{ + \@displaytitle{\@scenestyle}{\scenename{} \thescene}{#2} + } +} +\WithSuffix\newcommand\scene*[1]{% + \@clearpage{\@scenelevel} + \ifthenelse{\equal{\@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][]{% + \ifthenelse{\equal{#1}{}}{ + \def\@short{#2} + }{ + \def\@short{#1} + } + \ifthenelse{\equal{\@short}{}}{ + \def\@label{\interludename{}} + }{ + \def\@label{\interludename{}: } + } + \ifthenelse{\equal{\@interludelevel}{play}}{ + \@clearpage{\@playlevel} + \playmark{\@label\@short} + \addcontentsline{toc}{\@playlevel}{\@label\@short} + \@displaytitle{\@playstyle}{\interludename}{#2} + }{\ifthenelse{\equal{\@interludelevel}{act}}{ + \@clearpage{\@actlevel} + \actmark{\@label\@short} + \addcontentsline{toc}{\@actlevel}{\@label\@short} + \@displaytitle{\@actstyle}{\interludename}{#2} + }{% \@interludelevel is scene + \@clearpage{\@scenelevel} + \scenemark{\@label\@short} + \addcontentsline{toc}{\@scenelevel}{\@label\@short} + \@displaytitle{\@scenestyle}{\interludename}{#2} + }} +} +\WithSuffix\newcommand\interlude*[1]{% + \ifthenelse{\equal{\@interludelevel}{play}}{ + \@clearpage{\@playlevel} + \@displaytitle{\@playstyle}{\interludename}{#1} + }{\ifthenelse{\equal{\@interludelevel}{act}}{ + \@clearpage{\@actlevel} + \@displaytitle{\@actstyle}{\interludename}{#1} + }{% \@interludelevel is scene + \@clearpage{\@scenelevel} + \@displaytitle{\@scenestyle}{\interludename}{#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} + \sffamily\LARGE\bfseries \textsc{\curtainname} + \end{center} +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Characters} +% +% \subsubsection{Characters' line} +% +% Define the command |\@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][]{% + \ifthenelse{\equal{#1}{}}{% + \speakswithoutdirection{#2}% + }{% + \speakswithdirection{#2}{#1}% + }\xspace% +} +% \end{macrocode} +% +% \begin{macro}{\speakswithdirection} +% \begin{macro}{\speakswithoutdirection} +% Definition of styles for introducing characters' lines. These +% commands can be overloaded by user. +% \begin{macrocode} +\ifthenelse{\equal{\@characterstyle}{bold}}{% + % Bold style + \newcommand\speakswithdirection[2]{% + \noindent% + {\bfseries\sffamily #1} \did{#2}{\bfseries\sffamily :}% + } + \newcommand\speakswithoutdirection[1]{% + \noindent% + {\bfseries\sffamily #1 :}% + }% +}{}% +\ifthenelse{\equal{\@characterstyle}{center}}{% + % Center style + \newcommand\speakswithdirection[2]{% + \begin{center}% + \textsc{#1},\\\emph{#2}% + \end{center}% + }% + \newcommand\speakswithoutdirection[1]{% + \begin{center}% + \textsc{#1}% + \end{center}% + }% +}{}% +\ifthenelse{\equal{\@characterstyle}{simple}}{% + % Simple style + \newcommand\speakswithdirection[2]{% + \medskip% + \indent\textsc{#1}, \emph{#2} :% + }% + \newcommand\speakswithoutdirection[1]{% + \medskip% + \indent\textsc{#1} :% + }% +}{}% +\ifthenelse{\equal{\@characterstyle}{margin}}{% + % Margin style + \setlength{\leftskip}{3cm} + \newcommand\speakswithdirection[2]{% + \hspace{-3cm} #1 #2 + } + \newcommand\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}{} +\provideboolean{@dramatis@hidden} +\newenvironment{dramatis}[1][]{ + \@dramatis@clear{} + \undef{\@dramatis@clear} + \undef{\@dramatis@hook} + \newcommand{\@dramatis@hook}{} + \ifthenelse{\equal{#1}{hidden}}{ + \setboolean{@dramatis@hidden}{true} + }{\ifthenelse{\equal{#1}{}}{ + \setboolean{@dramatis@hidden}{false} + \gappto{\@dramatis@hook}{\begin{longtable}{l}} + }{ + \ClassError{thalie}{% + Environment dramatis does not accept option #1.% + }{ + } + } + } +}{% + \ifthenelse{\boolean{@dramatis@hidden}}{% + }{% + \gappto{\@dramatis@hook}{\end{longtable}} + \@dramatis@hook{}% + } +} +% \end{macrocode} +% \end{environment} +% +% Generic character output +% \begin{macrocode} +\newcommand{\@character}[2]{% + \ifthenelse{\( \equal{#1}{} \) \AND \( \equal{#2}{} \)}{% + ~% + }{}% + \ifthenelse{\( \NOT \equal{#1}{} \) \AND \( \equal{#2}{} \)}{% + #1% + }{}% + \ifthenelse{\( \equal{#1}{} \) \AND \( \NOT \equal{#2}{} \)}{% + #2% + }{}% + \ifthenelse{\( \NOT \equal{#1}{} \) \AND \( \NOT \equal{#2}{} \)}{% + #1, #2% + }{}% + \tabularnewline +} +% \end{macrocode} +% +% \begin{macro}{\characterspace} +% Add space in the dramatis person\ae{}. +% \begin{macrocode} +\newcommand{\characterspace}{% + \gappto{\@dramatis@hook}{\@character{}{~}} +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{charactergroup} +% Gathers definition of characters that share the same description. +% \begin{macrocode} +\newenvironment{charactergroup}[1]{% + \gdef\@groupname{#1} + \gappto{\@dramatis@hook}{ + \begin{math}\left. + \begin{tabular}{ll} + } +}{% + \gappto{\@dramatis@hook}{ + \end{tabular} + \right\} \end{math} + } + \protected@xappto{\@dramatis@hook}{\@groupname} + \gappto{\@dramatis@hook}{\tabularnewline} +} +% \end{macrocode} +% \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\xspace% + }% + \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]{% + \@ifundefined{#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.% + }% + }% + \@ifundefined{#1name}{% + }{% + \ClassError{thalie}{% + A command named \@backslashchar#1name already exists. We cannont 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 + /CHARACTER/.is family, /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{/CHARACTER, #1}% + % Forbidden combinations + \ifthenelse{ + \( \( \NOT \isundefined{\@cmd} \) \AND \equal{#2}{} \) \OR + \( \equal{#2}{} \AND \isundefined{\@cmd} \AND \isundefined{\@desc} \AND \isundefined{\@drama} \) \OR + \( \isundefined{\@cmd} \AND \( \NOT \equal{#2}{} \) \AND \( \NOT \isundefined{\@drama} \) \) + }{ + \ClassError{thalie}{Invalid character definition.}{All combination of omitted arguments are not allowed. See the documentation for more information} + }{ + % Defining character command + \ifthenelse{\( \NOT \isundefined{\@cmd} \) \AND \( \NOT \equal{#2}{} \)}{ + \@definecharactercommand{\@cmd}{#2} + }{ + } + \ifthenelse{ + \( \NOT \equal{#2}{} \) \AND \( \NOT \isundefined{\@cmd} \) \AND \( \NOT \isundefined{\@drama} \) \AND \isundefined{\@desc} + }{ + \ifthenelse{\equal{\@drama}{}}{ + % Hidden character. Nothing added to dramatis personae + }{ + % Populating dramatis personae + \protected@xappto{\@dramatis@hook}{\noexpand\@character{\@drama}{}} + } + }{ + % Populating dramatis personae + \@ifundefined{@desc}{\def\@desc{}}{} + \@ifundefined{@drama}{\def\@drama{#2}}{} + \protected@xappto{\@dramatis@hook}{\noexpand\@character{\@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}\\}} +% \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}{% + \medskip + \begin{quote} + \begin{em} + }{% + \end{em} + \end{quote} +} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\pause} +% Shortcut for |\did{\pausename}|. +% \begin{macrocode} +\newcommand\pause{\did{\pausename}} +% \end{macrocode} +% \end{macro} +% +% \changes{v0.5}{2013/06/08}{First published version.} +% +% \addcontentsline{toc}{section}{Change History} +% \PrintChanges +% +% \section*{Wish list} +% \label{sec:wishlist} +% \addcontentsline{toc}{section}{Wish list} +% +% \subsubsection*{Verse} +% I would like to be able to render drama plays in verse, where a verse can be +% continued on the next line if relevant (as shown on figure \ref{fig:verse}). +% But I could not find a way to do this, which would not be too complicated for +% the user, and which I am able to implement. +% +% \begin{figure} +% \centering +% \fbox{\begin{minipage}{1\linewidth} +% \small +% \begin{otherlanguage}{francais} +% \begin{dramatis}[hidden] +% \character[cmd=cyrano]{Cyrano} +% \character[cmd=vicomte]{Le vicomte} +% \end{dramatis} +% \renewcommand{\speakswithoutdirection}[1]{ +% \begin{center}% +% \textsc{#1}% +% \end{center}% +% } +% \renewcommand{\speakswithdirection}[2]{ +% \begin{center}% +% \textsc{#1},\\\emph{#2}% +% \end{center}% +% } +% \newlength{\currentverselength} +% \begin{verse} +% \vicomte +% Vous\ldots vous avez un nez\ldots heu\ldots un nez\ldots tr\`es grand. +% \settowidth{\currentverselength}{Vous\ldots vous avez un nez\ldots heu\ldots un nez\ldots tr\`es grand.} +% +% \cyrano[gravement] +% \hspace{\currentverselength} Tr\`es. +% +% \vicomte[riant] +% Ha ! +% \settowidth{\currentverselength}{Ha !} +% +% \cyrano[imperturbable] +% \hspace{\currentverselength} C'est tout ? \ldots +% \settowidth{\currentverselength}{\hspace{\currentverselength} C'est tout ? \ldots} +% +% \vicomte +% \hspace{\currentverselength} Mais\ldots +% \settowidth{\currentverselength}{\hspace{\currentverselength} Mais\ldots} +% +% \cyrano +% \hspace{\currentverselength} Ah ! non ! c'est un peu court, jeune homme !\\ +% On pouvait dire\ldots Oh ! Dieu ! \ldots bien des choses en somme\ldots\\ +% En variant le ton, --- par exemple, tenez :\\ +% Agressif : \og Moi, monsieur, si j'avais un tel nez,\\ +% Il faudrait sur-le-champ que je me l'amputasse ! \fg +% \end{verse} +% \end{otherlanguage} +% \end{minipage}} +% +% \medskip +% From \emph{Cyrano de Bergerac}, by Edmond Rostand (act I, scene 4). +% \caption{Wished verse rendering} +% \label{fig:verse} +% \end{figure} +% +% \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{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 diff --git a/Master/texmf-dist/source/latex/thalie/thalie.ins b/Master/texmf-dist/source/latex/thalie/thalie.ins new file mode 100644 index 00000000000..92fe0437e2a --- /dev/null +++ b/Master/texmf-dist/source/latex/thalie/thalie.ins @@ -0,0 +1,59 @@ +%% Copyright 2013 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. + +\input{docstrip} + +\keepsilent +\usedir{tex/latex/thalie} + +\preamble +Copyright 2013 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. +\endpreamble + +\generate{\file{thalie.sty}{\from{thalie.dtx}{package}}} + +\obeyspaces +\Msg{****************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the *} +\Msg{* following file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* thalie.sty *} +\Msg{* *} +\Msg{* To produce the documentation run the file *} +\Msg{* thalie.dtx through LaTeX. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{****************************************************} + +\endbatchfile diff --git a/Master/texmf-dist/tex/latex/thalie/thalie.sty b/Master/texmf-dist/tex/latex/thalie/thalie.sty new file mode 100644 index 00000000000..f746cd2bc96 --- /dev/null +++ b/Master/texmf-dist/tex/latex/thalie/thalie.sty @@ -0,0 +1,537 @@ +%% +%% This is file `thalie.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% thalie.dtx (with options: `package') +%% Copyright 2013 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. +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{thalie} + [2013/06/08 v0.5 A package to typeset drama plays] +\RequirePackage{ifthen} +\RequirePackage{etoolbox} +\RequirePackage{suffix} +\RequirePackage{longtable} +\RequirePackage{xspace} +\RequirePackage{pgfopts} + +\pgfkeys{ + % Character style + /THALIE/.cd, + characterstyle/.value required, + characterstyle/.default=simple, + characterstyle/.is choice, + characterstyle/bold/.code=\def\@characterstyle{bold}, + characterstyle/center/.code=\def\@characterstyle{center}, + characterstyle/margin/.code=\def\@characterstyle{margin}, + characterstyle/simple/.code=\def\@characterstyle{simple}, + 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, +} + +\ProcessPgfPackageOptions{/THALIE} +\newcommand{\playname}{Play} +\newcommand{\actname}{Act} +\newcommand{\scenename}{Scene} +\newcommand{\interludename}{Interlude} +\newcommand{\curtainname}{Curtain} +\newcommand{\pausename}{Pause} +\@ifpackageloaded{babel}{ + \addto\captionsfrench{% + \renewcommand{\playname}{Pi\`ece} + \renewcommand{\actname}{Acte} + \renewcommand{\scenename}{Sc\`ene} + \renewcommand{\interludename}{Interm\`ede} + \renewcommand{\curtainname}{Rideau} + \renewcommand{\pausename}{Pause} + } + \addto\captionsenglish{% + % Useless: these are the default... + } +}{} +\newcommand{\playmark}[1]{% + \markboth{\MakeUppercase{#1}}{}% +} +\newcommand{\actmark}[1]{% + \markright{\MakeUppercase{#1}}% +} +\newcommand{\scenemark}[1]{% +} +\newcounter{play} +\renewcommand{\theplay}{\arabic{play}} +\newcounter{act}[play] +\renewcommand{\theact}{\Roman{act}} +\newcounter{scene}[act] +\renewcommand{\thescene}{\arabic{scene}} +\newcommand{\@displaytitle}[3]{ + % Arguments: + % - Style + % - Label (none = not in toc) + % - Title + \ifthenelse{\equal{#1}{center}}{ + \begin{center} + \textsc{#2} + + #3 + \end{center} + }{\ifthenelse{\equal{#1}{bigcenter}}{ + \begin{center} + \Large + \textsc{#2} + + #3 + \end{center} + }{\ifthenelse{\equal{#1}{box}}{ + \begin{center} + \framebox{\begin{minipage}{0.7\textwidth} + \begin{center} + \Large \bfseries + \vspace{0.5em} + + #2 + \ifthenelse{\equal{#3}{} \OR \equal{#2}{}}{}{---} + #3 + + \vspace{0.5em} + \end{center} + \end{minipage}} + \end{center} + \vspace{1em} + }{}}} +} +\newcommand\@clearpage[1]{% + % Clear page if necessary + \ifthenelse{\equal{#1}{part} \OR \equal{#1}{chapter}}{ + \cleardoublepage + \thispagestyle{empty} + }{} +} + +\newcommand{\play}[2][]{% + \refstepcounter{play} + \ifthenelse{\equal{#1}{}}{ + \def\@short{#2} + }{ + \def\@short{#1} + } + \@clearpage{\@playlevel} + \playmark{\@short} + \addcontentsline{toc}{\@playlevel}{\@short} + \ifthenelse{\equal{\@playstyle}{custom}}{ + \customplay{\theplay}{#2} + }{ + \@displaytitle{\@playstyle}{}{#2} + } +} +\WithSuffix\newcommand\play*[1]{% + \@clearpage{\@playlevel} + \ifthenelse{\equal{\@playstyle}{custom}}{ + \customplay*{#1} + }{ + \@displaytitle{\@playstyle}{}{#1} + } +} +\newcommand{\act}[2][]{% + \refstepcounter{act} + \ifthenelse{\equal{#1}{}}{ + \def\@short{#2} + }{ + \def\@short{#1} + } + \ifthenelse{\equal{\@short}{}}{ + \def\@label{\actname{} \theact{}} + }{ + \def\@label{\actname{} \theact{}: } + } + \@clearpage{\@actlevel} + \actmark{\@label\@short} + \addcontentsline{toc}{\@actlevel}{\@label\@short} + \ifthenelse{\equal{\@actstyle}{custom}}{ + \customact{\theact}{#2} + }{ + \@displaytitle{\@actstyle}{\actname{} \theact}{#2} + } +} +\WithSuffix\newcommand\act*[1]{% + \@clearpage{\@actlevel} + \ifthenelse{\equal{\@actstyle}{custom}}{ + \customact*{#1} + }{ + \@displaytitle{\@actstyle}{}{#1} + } +} +\newcommand{\scene}[2][]{% + \refstepcounter{scene} + \ifthenelse{\equal{#1}{}}{ + \def\@short{#2} + }{ + \def\@short{#1} + } + \ifthenelse{\equal{\@short}{}}{ + \def\@label{\scenename{} \thescene{}} + }{ + \def\@label{\scenename{} \thescene{}: } + } + \@clearpage{\@scenelevel} + \scenemark{\@label\@short} + \addcontentsline{toc}{\@scenelevel}{\@label\@short} + \ifthenelse{\equal{\@scenestyle}{custom}}{ + \customscene{\thescene}{#2} + }{ + \@displaytitle{\@scenestyle}{\scenename{} \thescene}{#2} + } +} +\WithSuffix\newcommand\scene*[1]{% + \@clearpage{\@scenelevel} + \ifthenelse{\equal{\@scenestyle}{custom}}{ + \customscene*{#1} + }{ + \@displaytitle{\@scenestyle}{}{#1} + } +} +\newcommand{\interlude}[2][]{% + \ifthenelse{\equal{#1}{}}{ + \def\@short{#2} + }{ + \def\@short{#1} + } + \ifthenelse{\equal{\@short}{}}{ + \def\@label{\interludename{}} + }{ + \def\@label{\interludename{}: } + } + \ifthenelse{\equal{\@interludelevel}{play}}{ + \@clearpage{\@playlevel} + \playmark{\@label\@short} + \addcontentsline{toc}{\@playlevel}{\@label\@short} + \@displaytitle{\@playstyle}{\interludename}{#2} + }{\ifthenelse{\equal{\@interludelevel}{act}}{ + \@clearpage{\@actlevel} + \actmark{\@label\@short} + \addcontentsline{toc}{\@actlevel}{\@label\@short} + \@displaytitle{\@actstyle}{\interludename}{#2} + }{% \@interludelevel is scene + \@clearpage{\@scenelevel} + \scenemark{\@label\@short} + \addcontentsline{toc}{\@scenelevel}{\@label\@short} + \@displaytitle{\@scenestyle}{\interludename}{#2} + }} +} +\WithSuffix\newcommand\interlude*[1]{% + \ifthenelse{\equal{\@interludelevel}{play}}{ + \@clearpage{\@playlevel} + \@displaytitle{\@playstyle}{\interludename}{#1} + }{\ifthenelse{\equal{\@interludelevel}{act}}{ + \@clearpage{\@actlevel} + \@displaytitle{\@actstyle}{\interludename}{#1} + }{% \@interludelevel is scene + \@clearpage{\@scenelevel} + \@displaytitle{\@scenestyle}{\interludename}{#1} + }} +} +\newcommand\curtain{ + \begin{center} + \sffamily\LARGE\bfseries \textsc{\curtainname} + \end{center} +} +\newcommand{\@speaks}[2][]{% + \ifthenelse{\equal{#1}{}}{% + \speakswithoutdirection{#2}% + }{% + \speakswithdirection{#2}{#1}% + }\xspace% +} +\ifthenelse{\equal{\@characterstyle}{bold}}{% + % Bold style + \newcommand\speakswithdirection[2]{% + \noindent% + {\bfseries\sffamily #1} \did{#2}{\bfseries\sffamily :}% + } + \newcommand\speakswithoutdirection[1]{% + \noindent% + {\bfseries\sffamily #1 :}% + }% +}{}% +\ifthenelse{\equal{\@characterstyle}{center}}{% + % Center style + \newcommand\speakswithdirection[2]{% + \begin{center}% + \textsc{#1},\\\emph{#2}% + \end{center}% + }% + \newcommand\speakswithoutdirection[1]{% + \begin{center}% + \textsc{#1}% + \end{center}% + }% +}{}% +\ifthenelse{\equal{\@characterstyle}{simple}}{% + % Simple style + \newcommand\speakswithdirection[2]{% + \medskip% + \indent\textsc{#1}, \emph{#2} :% + }% + \newcommand\speakswithoutdirection[1]{% + \medskip% + \indent\textsc{#1} :% + }% +}{}% +\ifthenelse{\equal{\@characterstyle}{margin}}{% + % Margin style + \setlength{\leftskip}{3cm} + \newcommand\speakswithdirection[2]{% + \hspace{-3cm} #1 #2 + } + \newcommand\speakswithoutdirection[1]{% + \hspace{-3cm} #1 + }% +}{}% +\newcommand{\@dramatis@clear}{} +\provideboolean{@dramatis@hidden} +\newenvironment{dramatis}[1][]{ + \@dramatis@clear{} + \undef{\@dramatis@clear} + \undef{\@dramatis@hook} + \newcommand{\@dramatis@hook}{} + \ifthenelse{\equal{#1}{hidden}}{ + \setboolean{@dramatis@hidden}{true} + }{\ifthenelse{\equal{#1}{}}{ + \setboolean{@dramatis@hidden}{false} + \gappto{\@dramatis@hook}{\begin{longtable}{l}} + }{ + \ClassError{thalie}{% + Environment dramatis does not accept option #1.% + }{ + } + } + } +}{% + \ifthenelse{\boolean{@dramatis@hidden}}{% + }{% + \gappto{\@dramatis@hook}{\end{longtable}} + \@dramatis@hook{}% + } +} +\newcommand{\@character}[2]{% + \ifthenelse{\( \equal{#1}{} \) \AND \( \equal{#2}{} \)}{% + ~% + }{}% + \ifthenelse{\( \NOT \equal{#1}{} \) \AND \( \equal{#2}{} \)}{% + #1% + }{}% + \ifthenelse{\( \equal{#1}{} \) \AND \( \NOT \equal{#2}{} \)}{% + #2% + }{}% + \ifthenelse{\( \NOT \equal{#1}{} \) \AND \( \NOT \equal{#2}{} \)}{% + #1, #2% + }{}% + \tabularnewline +} +\newcommand{\characterspace}{% + \gappto{\@dramatis@hook}{\@character{}{~}} +} +\newenvironment{charactergroup}[1]{% + \gdef\@groupname{#1} + \gappto{\@dramatis@hook}{ + \begin{math}\left. + \begin{tabular}{ll} + } +}{% + \gappto{\@dramatis@hook}{ + \end{tabular} + \right\} \end{math} + } + \protected@xappto{\@dramatis@hook}{\@groupname} + \gappto{\@dramatis@hook}{\tabularnewline} +} +\newcommand{\setcharactername}[2]{% + \expandafter\gdef\csname#1name\endcsname{% + #2\xspace% + }% + \expandafter\gdef\csname#1\endcsname{% + \@ifnextchar[{% + \defcharcommand@with{#2}% + }{% + \defcharcommand@without{#2}% + }% + }% + \xappto{\@dramatis@clear}{% + \global\noexpand\csundef{#1}% + \global\noexpand\csundef{#1name}% + }% +} +\newcommand{\@definecharactercommand}[2]{% + \@ifundefined{#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.% + }% + }% + \@ifundefined{#1name}{% + }{% + \ClassError{thalie}{% + A command named \@backslashchar#1name already exists. We cannont 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}} +\pgfkeys{ + % Character definition + /CHARACTER/.is family, /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{/CHARACTER, #1}% + % Forbidden combinations + \ifthenelse{ + \( \( \NOT \isundefined{\@cmd} \) \AND \equal{#2}{} \) \OR + \( \equal{#2}{} \AND \isundefined{\@cmd} \AND \isundefined{\@desc} \AND \isundefined{\@drama} \) \OR + \( \isundefined{\@cmd} \AND \( \NOT \equal{#2}{} \) \AND \( \NOT \isundefined{\@drama} \) \) + }{ + \ClassError{thalie}{Invalid character definition.}{All combination of omitted arguments are not allowed. See the documentation for more information} + }{ + % Defining character command + \ifthenelse{\( \NOT \isundefined{\@cmd} \) \AND \( \NOT \equal{#2}{} \)}{ + \@definecharactercommand{\@cmd}{#2} + }{ + } + \ifthenelse{ + \( \NOT \equal{#2}{} \) \AND \( \NOT \isundefined{\@cmd} \) \AND \( \NOT \isundefined{\@drama} \) \AND \isundefined{\@desc} + }{ + \ifthenelse{\equal{\@drama}{}}{ + % Hidden character. Nothing added to dramatis personae + }{ + % Populating dramatis personae + \protected@xappto{\@dramatis@hook}{\noexpand\@character{\@drama}{}} + } + }{ + % Populating dramatis personae + \@ifundefined{@desc}{\def\@desc{}}{} + \@ifundefined{@drama}{\def\@drama{#2}}{} + \protected@xappto{\@dramatis@hook}{\noexpand\@character{\@drama}{\@desc}} + } + } +} +\newcommand{\disposablecharacter}[2][]{% + \@speaks[#1]{#2}% +} +\newcommand{\onstage}[1]{{\centering \emph{#1}\\}} +\newcommand{\did}[1]{\emph{(#1)} } +\newenvironment{dida}{% + \medskip + \begin{quote} + \begin{em} + }{% + \end{em} + \end{quote} +} +\newcommand\pause{\did{\pausename}} +\endinput +%% +%% End of file `thalie.sty'. diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 10005f7077b..75452c3dc35 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -448,7 +448,7 @@ my @TLP_working = qw( texliveonfly texloganalyser texlogos texmate texments texpower texshade textcase textfit textglos textgreek textmerg textopo textpath textpos - tfrupee theoremref thesis-titlepage-fhac + tfrupee thalie theoremref thesis-titlepage-fhac thinsp thmbox thmtools threadcol threeddice threeparttable threeparttablex thumb thumbpdf thumbs thumby thuthesis ticket diff --git a/Master/tlpkg/tlpsrc/collection-humanities.tlpsrc b/Master/tlpkg/tlpsrc/collection-humanities.tlpsrc index 8c44ef9cafc..5888543f2c3 100644 --- a/Master/tlpkg/tlpsrc/collection-humanities.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-humanities.tlpsrc @@ -45,6 +45,7 @@ depend screenplay depend sides depend stage depend textglos +depend thalie depend tree-dvips depend verse depend xyling diff --git a/Master/tlpkg/tlpsrc/thalie.tlpsrc b/Master/tlpkg/tlpsrc/thalie.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d -- cgit v1.2.3