% \CheckSum{860} % % \iffalse meta-comment % % Copyright (C) 2007-2012 % Ekkart Kleinod (ekleinod@edgesoft.de) % -------------------------------------------------------------------------- % % 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 any later version. % The latest version of this license is in\\ % \url{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 Ekkart Kleinod. % % Some code for providing multilanguage documentation was % used from the pst-pdf package by Rolf Niepraschk and Hubert Gaesslein. % \fi % % \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 \~} % % \changes{v0.1}{2007/01/16}{Initial version.} % \changes{v0.2}{2007/01/17}{new convenience commands, LPPL, bugfixes: missing babel package, ifthen-placement, loc, author markup} % \changes{v0.3}{2007/01/22}{english documentation, replaced command changed with command replaced} % \changes{v0.4}{2007/01/24}{pdfcolmk for improved markup, introduced author-ids, first CTAN version} % \changes{v0.5}{2007/08/26}{reimplementation without array package, UTF-8, grayed text, change pf command arguments} % \changes{v0.5.1}{2007/08/27}{deleted text is striked out again using package ulem, greying didn't work} % \changes{v0.5.2}{2007/10/10}{package options for ulem and xcolor} % \changes{v0.5.3}{2010/11/22}{use class options (final, draft) as well} % \changes{v0.5.4}{2011/04/25}{extract user documentation; default language changed to English; script for removal of commands} % \changes{v0.6.0}{2012/01/11}{redefined user interface for setting options, markup, authors; newly structured documentation} % \changes{v1.0.0}{2012/04/25}{key-value-interface for change commands; special characters in list of changes} % \GetFileInfo{changes.dtx} % \RecordChanges % %^^A -------------------------------------------------------------------------- % % \maketitle % % \tableofcontents % \cleardoublepage % % \ifENGLISH % \input{userdoc/changes.en} % \fi % \ifGERMAN % \input{userdoc/changes.de} % \fi % %^^A -- source code % % \StopEventually % % \selectlanguage{english} % % \section{The documented sourcecode} % % The sourcecode is documented in English only. % This is intended, please do not provide translations for the text below, just corrections or improvements. % % \begin{macrocode} %<*changes> % \end{macrocode} % % \subsection{Package information and options} % % Set needed \LaTeX-format to \LaTeXe{}, provide name, date, version. % Type some information to the console. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{changes} [2012/04/25 v1.0.0 changes-Paket] \typeout{*** changes-Paket 2012/04/25 v1.0.0 ***} % \end{macrocode} % % Package \chpackage{xkeyval} provides options with key-value-pairs. % \begin{macrocode} \RequirePackage{xkeyval} % \end{macrocode} % % Package \chpackage{xifthen} provides improved \texttt{if} as well as a \texttt{while}-loop. % \begin{macrocode} \RequirePackage{xifthen} % \end{macrocode} % % \subsubsection{Package options} % % Option \choption{draft}, \emph{default} is \texttt{true}. % \begin{macrocode} \newboolean{Changes@optiondraft} \setboolean{Changes@optiondraft}{true} \DeclareOptionX{draft}{ \setboolean{Changes@optiondraft}{true} \typeout{changes-option '\CurrentOption'} } % \end{macrocode} % % Option \choption{final}, sets \choption{draft} to \texttt{false}. % \begin{macrocode} \DeclareOptionX{final}{ \setboolean{Changes@optiondraft}{false} \typeout{changes-option '\CurrentOption'} } % \end{macrocode} % % Declare storage for markup options, they are set by the markup option but can be changed with the more special options, therefore they have to be declared at this place. % \begin{macrocode} \newcommand{\Changes@optionaddedmarkup}{none} \newcommand{\Changes@optiondeletedmarkup}{sout} % \end{macrocode} % % Option \choption{markup}, sets markup options accordingly. % \begin{macrocode} \newcommand{\Changes@optionmarkup}{default} \DeclareOptionX{markup}{ \ifthenelse{\equal{\@empty}{#1}} {} { \ifthenelse{ \equal{#1}{default}\or \equal{#1}{underlined}\or \equal{#1}{bfit}\or \equal{#1}{nocolor} } {\renewcommand{\Changes@optionmarkup}{#1}} {\PackageWarning{changes}{markup '#1' unknown, using '\Changes@optionmarkup'}} } \ifthenelse{\equal{\Changes@optionmarkup}{default}} { \renewcommand{\Changes@optionaddedmarkup}{none} \renewcommand{\Changes@optiondeletedmarkup}{sout} } {} \ifthenelse{\equal{\Changes@optionmarkup}{underlined}} { \renewcommand{\Changes@optionaddedmarkup}{uline} \renewcommand{\Changes@optiondeletedmarkup}{sout} } {} \ifthenelse{\equal{\Changes@optionmarkup}{bfit}} { \renewcommand{\Changes@optionaddedmarkup}{bf} \renewcommand{\Changes@optiondeletedmarkup}{it} } {} \ifthenelse{\equal{\Changes@optionmarkup}{nocolor}} { \renewcommand{\Changes@optionaddedmarkup}{uline} \renewcommand{\Changes@optiondeletedmarkup}{sout} } {} \typeout{changes-option 'markup=\Changes@optionmarkup'} } % \end{macrocode} % % Option \choption{addedmarkup}, stored or set to default value ``\texttt{none}''. % \begin{macrocode} \DeclareOptionX{addedmarkup}{ \ifthenelse{\equal{\@empty}{#1}} {} { \ifthenelse{ \equal{#1}{none}\or \equal{#1}{uline}\or \equal{#1}{uuline}\or \equal{#1}{uwave}\or \equal{#1}{dashuline}\or \equal{#1}{dotuline}\or \equal{#1}{sout}\or \equal{#1}{xout}\or \equal{#1}{bf}\or \equal{#1}{it}\or \equal{#1}{sl}\or \equal{#1}{em} } {\renewcommand{\Changes@optionaddedmarkup}{#1}} {\PackageWarning{changes}{addedmarkup '#1' unknown, using '\Changes@optionaddedmarkup'}} } \typeout{changes-option 'addedmarkup=\Changes@optionaddedmarkup'} } % \end{macrocode} % % Option \choption{deletedmarkup}, stored or set to default value ``\texttt{striked}''. % \begin{macrocode} \DeclareOptionX{deletedmarkup}{ \ifthenelse{\equal{\@empty}{#1}} {} { \ifthenelse{ \equal{#1}{none}\or \equal{#1}{uline}\or \equal{#1}{uuline}\or \equal{#1}{uwave}\or \equal{#1}{dashuline}\or \equal{#1}{dotuline}\or \equal{#1}{sout}\or \equal{#1}{xout}\or \equal{#1}{bf}\or \equal{#1}{it}\or \equal{#1}{sl}\or \equal{#1}{em} } {\renewcommand{\Changes@optiondeletedmarkup}{#1}} {\PackageWarning{changes}{deletedmarkup '#1' unknown, using '\Changes@optiondeletedmarkup'}} } \typeout{changes-option 'deletedmarkup=\Changes@optiondeletedmarkup'} } % \end{macrocode} % % Declare storage for authormarkup option and store option value or set to default value ``\texttt{superscript}''. % \begin{macrocode} \newcommand{\Changes@optionauthormarkup}{superscript} \DeclareOptionX{authormarkup}{ \ifthenelse{\equal{\@empty}{#1}} {} { \ifthenelse{ \equal{#1}{superscript}\or \equal{#1}{subscript}\or \equal{#1}{brackets}\or \equal{#1}{footnote} } {\renewcommand{\Changes@optionauthormarkup}{#1}} {\PackageWarning{changes}{authormarkup '#1' unknown, using '\Changes@optionauthormarkup'}} } \typeout{changes-option 'authormarkup=\Changes@optionauthormarkup'} } % \end{macrocode} % % Declare storage for authormarkupposition option and store option value or set to default value ``\texttt{right}''. % \begin{macrocode} \newcommand{\Changes@optionauthormarkupposition}{right} \DeclareOptionX{authormarkupposition}{ \ifthenelse{\equal{\@empty}{#1}} {} { \ifthenelse{ \equal{#1}{right}\or \equal{#1}{left} } {\renewcommand{\Changes@optionauthormarkupposition}{#1}} {\PackageWarning{changes}{authormarkupposition '#1' unknown, using '\Changes@optionauthormarkupposition'}} } \typeout{changes-option 'authormarkupposition=\Changes@optionauthormarkupposition'} } % \end{macrocode} % % Declare storage for authormarkuptext option and store option value or set to default value ``\texttt{id}''. % \begin{macrocode} \newcommand{\Changes@optionauthormarkuptext}{id} \DeclareOptionX{authormarkuptext}{ \ifthenelse{\equal{\@empty}{#1}} {} { \ifthenelse{ \equal{#1}{id}\or \equal{#1}{name} } {\renewcommand{\Changes@optionauthormarkuptext}{#1}} {\PackageWarning{changes}{authormarkuptext '#1' unknown, using '\Changes@optionauthormarkuptext'}} } \typeout{changes-option 'authormarkuptext=\Changes@optionauthormarkuptext'} } % \end{macrocode} % % % % Options for package \chpackage{ulem} are directly passed to the package. % \begin{macrocode} \DeclareOptionX{ulem}{ \typeout{ulem-option '#1', passed to package ulem} \PassOptionsToPackage{#1}{ulem} } % \end{macrocode} % % Options for package \chpackage{xcolor} are directly passed to the package. % \begin{macrocode} \DeclareOptionX{xcolor}{ \typeout{xcolor-option '#1', passed to package xcolor} \PassOptionsToPackage{#1}{xcolor} } % \end{macrocode} % % Unknown options generate a package warning. % \begin{macrocode} \DeclareOptionX*{ \PackageWarning{changes}{Unknown option '\CurrentOption'} } % \end{macrocode} % % \subsubsection{Command options} % % All options for commands (e.g. \chcommand{definechangesauthor}) have to be declared before option processing. % % \minisec{\chcommand{definechangesauthor}} % % Declare available options of the command, define value storage. % \begin{macrocode} \DeclareOptionX{name}{\def\Changes@definechangesauthor@name{#1}} \DeclareOptionX{color}{\def\Changes@definechangesauthor@color{#1}} % \end{macrocode} % % Set the default values of the options. % \begin{macrocode} \presetkeys{Changes@definechangesauthor}{ name=\@empty, color=black }{} % \end{macrocode} % % \minisec{\chcommand{added}} % % Declare available options of the command, define value storage. % \begin{macrocode} \DeclareOptionX{id}{\def\Changes@added@id{#1}} \DeclareOptionX{remark}{\def\Changes@added@remark{#1}} % \end{macrocode} % % Set the default values of the options. % \begin{macrocode} \presetkeys{Changes@added}{ id=\@empty, remark=\@empty }{} % \end{macrocode} % % \minisec{\chcommand{deleted}} % % Declare available options of the command, define value storage. % \begin{macrocode} \DeclareOptionX{id}{\def\Changes@deleted@id{#1}} \DeclareOptionX{remark}{\def\Changes@deleted@remark{#1}} % \end{macrocode} % % Set the default values of the options. % \begin{macrocode} \presetkeys{Changes@deleted}{ id=\@empty, remark=\@empty }{} % \end{macrocode} % % \minisec{\chcommand{replaced}} % % Declare available options of the command, define value storage. % \begin{macrocode} \DeclareOptionX{id}{\def\Changes@replaced@id{#1}} \DeclareOptionX{remark}{\def\Changes@replaced@remark{#1}} % \end{macrocode} % % Set the default values of the options. % \begin{macrocode} \presetkeys{Changes@replaced}{ id=\@empty, remark=\@empty }{} % \end{macrocode} % % \subsubsection{Option processing} % % Process the options. % \begin{macrocode} \ProcessOptionsX*\relax % \end{macrocode} % % \subsection{Packages} % % Package \chpackage{xcolor} provides colored text. % Package \chpackage{pdfcolmk} solves the problem of colored text and page breaks (has to be loaded after \chpackage{xcolor}). % \begin{macrocode} \newboolean{Changes@colored} \setboolean{Changes@colored}{true} \ifthenelse{\equal{\Changes@optionmarkup}{nocolor}} {\setboolean{Changes@colored}{false}} {} \ifthenelse{\boolean{Changes@colored}} { \RequirePackage{xcolor} \RequirePackage{pdfcolmk} } {} % \end{macrocode} % % Package \chpackage{ulem} provides commands for striking out text. % \begin{macrocode} \ifthenelse{ \equal{\Changes@optionaddedmarkup}{uline}\or \equal{\Changes@optionaddedmarkup}{uuline}\or \equal{\Changes@optionaddedmarkup}{uwave}\or \equal{\Changes@optionaddedmarkup}{dashuline}\or \equal{\Changes@optionaddedmarkup}{dotuline}\or \equal{\Changes@optionaddedmarkup}{sout}\or \equal{\Changes@optionaddedmarkup}{xout}\or \equal{\Changes@optiondeletedmarkup}{uline}\or \equal{\Changes@optiondeletedmarkup}{uuline}\or \equal{\Changes@optiondeletedmarkup}{uwave}\or \equal{\Changes@optiondeletedmarkup}{dashuline}\or \equal{\Changes@optiondeletedmarkup}{dotuline}\or \equal{\Changes@optiondeletedmarkup}{sout}\or \equal{\Changes@optiondeletedmarkup}{xout} } {\RequirePackage[normalem,normalbf]{ulem}} {} % \end{macrocode} % % \subsection{Language dependent texts} % % Declaration of language dependent names and identifiers. % The check for \chcommand{addto} is a check for the \chpackage{babel} package. % If the babel package is not loaded, the default language is English, in order to use another language, the user has to redefine the variables. % \begin{macrocode} \ifthenelse{\isundefined{\addto}} { \def\listchangesname{Changes} \def\changesaddname{Added} \def\changesdeletename{Deleted} \def\changesreplacename{Replaced} \def\changesauthorname{Author} \def\changesanonymousname{anonymous} \def\changesnoloc{List of changes is available after the next \LaTeX\ run.} }{ \addto\captionsngerman{\def\listchangesname{\"Anderungen}} \addto\captionsngerman{\def\changesaddname{Eingef\"ugt}} \addto\captionsngerman{\def\changesdeletename{Gel\"oscht}} \addto\captionsngerman{\def\changesreplacename{Ersetzt}} \addto\captionsngerman{\def\changesauthorname{Autor}} \addto\captionsngerman{\def\changesanonymousname{Anonym}} \addto\captionsngerman{\def\changesnoloc{\"Anderungsliste nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}} \addto\captionsgerman{\def\listchangesname{\"Anderungen}} \addto\captionsgerman{\def\changesaddname{Eingef\"ugt}} \addto\captionsgerman{\def\changesdeletename{Gel\"oscht}} \addto\captionsgerman{\def\changesreplacename{Ersetzt}} \addto\captionsgerman{\def\changesauthorname{Autor}} \addto\captionsgerman{\def\changesanonymousname{Anonym}} \addto\captionsgerman{\def\changesnoloc{\"Anderungsliste nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}} \addto\captionsenglish{\def\listchangesname{Changes}} \addto\captionsenglish{\def\changesaddname{Added}} \addto\captionsenglish{\def\changesdeletename{Deleted}} \addto\captionsenglish{\def\changesreplacename{Replaced}} \addto\captionsenglish{\def\changesauthorname{Author}} \addto\captionsenglish{\def\changesanonymousname{anonymous}} \addto\captionsenglish{\def\changesnoloc{List of changes is available after the next \LaTeX\ run.}} \addto\captionsitalian{\def\listchangesname{Modifiche}} \addto\captionsitalian{\def\changesaddname{Aggiunte}} \addto\captionsitalian{\def\changesdeletename{Cancellazioni}} \addto\captionsitalian{\def\changesreplacename{Sostituzioni}} \addto\captionsitalian{\def\changesauthorname{Autore}} \addto\captionsitalian{\def\changesanonymousname{anonimo}} \addto\captionsitalian{\def\changesnoloc{La lista delle modifiche sar\`a disponibile alla prossima esecuzione di \LaTeX.}} } % \end{macrocode} % % \subsection{File extension} % % \begin{macro}{\Changes@extension} % Store file extension in variable, set default to \texttt{loc}. % \begin{macrocode} \newcommand{\Changes@extension}{loc} % \end{macrocode} % \end{macro} % % \begin{macro}{\setlocextension} % Set a new file extension. % Argument: new extension. % \begin{macrocode} \newcommand{\setlocextension}[1]{ \renewcommand{\Changes@extension}{#1} } % \end{macrocode} % \end{macro} % % % \subsection{Authors} % % \subsubsection{Author management} % % Author counter. % \begin{macrocode} \newcounter{Changes@AuthorCount} \setcounter{Changes@AuthorCount}{0} \newcounter{Changes@Author} % \end{macrocode} % % \begin{macro}{\definechangesauthor} % Define a new author. % Mandatory argument: author's id. % Optional arguments (key-value): author's name (default: empty) and author's color (default: black). % % Store id, name and color using named variables. % Define counter and color per author. % \begin{macrocode} \newcommand*\definechangesauthor[2][]{% % \end{macrocode} % % Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. % \begin{macrocode} \setkeys{Changes@definechangesauthor}{#1} % \end{macrocode} % % Increment author counter, later needed for \emph{while} loop of authors. % \begin{macrocode} \stepcounter{Changes@AuthorCount} % \end{macrocode} % % Store the id in a name with the given counter/index. % All other storage refers to the id. % \begin{macrocode} \@namedef{Changes@AuthorID\theChanges@AuthorCount}{#2} % \end{macrocode} % % Store the author's definition in according variables/colors, create change counters. % \begin{macrocode} \expandafter \let\csname Changes@AuthorName#2\endcsname=\Changes@definechangesauthor@name \newcounter{Changes@AddCount#2} \newcounter{Changes@DeleteCount#2} \newcounter{Changes@ReplaceCount#2} \ifthenelse{\boolean{Changes@colored}} { \expandafter \let\csname Changes@AuthorColor#2\endcsname=\Changes@definechangesauthor@color \colorlet{Changes@Color#2}{\@nameuse{Changes@AuthorColor#2}} } {} } % \end{macrocode} % \end{macro} % % Define default-author (anonymous) with empty id and blue color. % \begin{macrocode} \definechangesauthor[color=blue]{\@empty} % \end{macrocode} % % % \subsubsection{Author markup} % % \begin{macro}{\Changes@Markup@Author} % Store markup for authors. % \begin{macrocode} \newcommand{\Changes@Markup@Author}[1]{% \ifthenelse{\equal{\Changes@optionauthormarkup}{superscript}}{\textsuperscript{#1}}{}% \ifthenelse{\equal{\Changes@optionauthormarkup}{subscript}}{\textsubscript{#1}}{}% \ifthenelse{\equal{\Changes@optionauthormarkup}{brackets}}{(#1)}{}% \ifthenelse{\equal{\Changes@optionauthormarkup}{footnote}}{\footnote{#1}}{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\setauthormarkup} % Set markup for authors. % \begin{macrocode} \newcommand{\setauthormarkup}[1]{ \renewcommand{\Changes@Markup@Author}[1]{#1} } % \end{macrocode} % \end{macro} % % \begin{macro}{\textsubscript} % Define the command \chcommand{textsubscript} in case the author markup \choption{subscript} is used and the command \chcommand{textsubscript} is not defined yet. % \chcommand{textsubscript} is the antagonist of \chcommand{textsuperscript} which is predefined in \LaTeX. % The code is taken from \LaTeX-FAQ 8.5.17. % \begin{macrocode} \ifthenelse{\isundefined{\textsubscript}} { \DeclareRobustCommand*\textsubscript[1]{\@textsubscript{\selectfont#1}} \newcommand{\@textsubscript}[1]{{\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}} }{} % \end{macrocode} % \end{macro} % % \begin{macro}{\setauthormarkupposition} % Set position for author markup text. % \begin{macrocode} \newcommand{\setauthormarkupposition}[1]{ \renewcommand{\Changes@optionauthormarkupposition}{#1} } % \end{macrocode} % \end{macro} % % \begin{macro}{\setauthormarkuptext} % Set author markup text to be displayed. % \begin{macrocode} \newcommand{\setauthormarkuptext}[1]{ \renewcommand{\Changes@optionauthormarkuptext}{#1} } % \end{macrocode} % \end{macro} % % \begin{macro}{\Changes@Remark} % Markup of remarks. % Default: in a footnote. % \begin{macrocode} \newcommand{\Changes@Remark}[2]{% \footnote{% \ifthenelse{\not\equal{#1}{\@empty}}% {#1: }% {}% #2% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\setremarkmarkup} % Redefining the remark markup. % Mandatory argument: markup definition. % \begin{macrocode} \newcommand{\setremarkmarkup}[1]{% \renewcommand{\Changes@Remark}[2]{#1}% } % \end{macrocode} % \end{macro} % % \subsection{Change management commands} % % \subsubsection{Text markup definition} % % Replaced text is always typeset as follows: \meta{added text}\meta{deleted text}. % Therefore no extra command for markup of replaced text is given. % % \begin{macro}{\Changes@Markup@Added} % Store markup for added text. % \begin{macrocode} \newcommand{\Changes@Markup@Added}[1]{% \ifthenelse{\equal{\Changes@optionaddedmarkup}{none}}{#1}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{uline}}{\uline{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{uuline}}{\uuline{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{uwave}}{\uwave{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{dashuline}}{\dashuline{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{dotuline}}{\dotuline{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{sout}}{\sout{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{xout}}{\xout{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{bf}}{\textbf{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{it}}{\textit{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{sl}}{\textsl{#1}}{}% \ifthenelse{\equal{\Changes@optionaddedmarkup}{em}}{\emph{#1}}{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\setaddedmarkup} % Set markup for added text. % \begin{macrocode} \newcommand{\setaddedmarkup}[1]{ \renewcommand{\Changes@Markup@Added}[1]{#1} } % \end{macrocode} % \end{macro} % % \begin{macro}{\Changes@Markup@Deleted} % Store markup for deleted text. % \begin{macrocode} \newcommand{\Changes@Markup@Deleted}[1]{% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{none}}{#1}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uline}}{\uline{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uuline}}{\uuline{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uwave}}{\uwave{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{dashuline}}{\dashuline{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{dotuline}}{\dotuline{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{sout}}{\sout{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{xout}}{\xout{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{bf}}{\textbf{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{it}}{\textit{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{sl}}{\textsl{#1}}{}% \ifthenelse{\equal{\Changes@optiondeletedmarkup}{em}}{\emph{#1}}{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\setdeletedmarkup} % Set markup for deleted text. % \begin{macrocode} \newcommand{\setdeletedmarkup}[1]{ \renewcommand{\Changes@Markup@Deleted}[1]{#1} } % \end{macrocode} % \end{macro} % % % \subsubsection{Change management command definition} % % \begin{macro}{\Changes@output} % Output command for the changed text. % This command has the following arguments: % \begin{enumerate} % \item changed text (including markup) % \item unchanged text % \item author's id % \item remark % \end{enumerate} % Define boolean for author test. % \begin{macrocode} \newboolean{Changes@WrongID} \newcommand{\Changes@output}[4]{% % \end{macrocode} % Output changed text if option \choption{draft} is set, otherwise output unchanged text. % \begin{macrocode} \ifthenelse{\boolean{Changes@optiondraft}}% {% % \end{macrocode} % Check if the author exists, error message otherwise. % I have the feeling that this code is optimizable. % \begin{macrocode} \setboolean{Changes@WrongID}{true}% \setcounter{Changes@Author}{0}% \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{% \stepcounter{Changes@Author}% \ifthenelse{\equal{#3}{\@nameuse{Changes@AuthorID\theChanges@Author}}}% {\setboolean{Changes@WrongID}{false}}% {}% }% \ifthenelse{\boolean{Changes@WrongID}}% {\PackageError{changes}% {Undefined changes author: #3}% {You have to define the author #3 with e.g.: \definechangesauthor{#3}}}% {}% % \end{macrocode} % Save author text for output. % \begin{macrocode} \ifthenelse{\equal{\Changes@optionauthormarkuptext}{id}}% {\@namedef{Changes@AuthorText}{#3}}% {}% \ifthenelse{\equal{\Changes@optionauthormarkuptext}{name}}% {\@namedef{Changes@AuthorText}{\@nameuse{Changes@AuthorName#3}}}% {}% {% % \end{macrocode} % Change color, if colored text is used. % \begin{macrocode} \ifthenelse{\boolean{Changes@colored}}% {\color{Changes@Color#3}}% {}% % \end{macrocode} % Output author text if author's id is given and text should appear left of changes. % \begin{macrocode} \ifthenelse{\equal{\Changes@optionauthormarkupposition}{left} \and \not\equal{#3}{\@empty}}% {\Changes@Markup@Author{\@nameuse{Changes@AuthorText}}}% {}% % \end{macrocode} % Output changed text. % \begin{macrocode} {#1}% % \end{macrocode} % Output author text if author's id is given and text should appear right of changes. % \begin{macrocode} \ifthenelse{\equal{\Changes@optionauthormarkupposition}{right} \and \not\equal{#3}{\@empty}}% {\Changes@Markup@Author{\@nameuse{Changes@AuthorText}}}% {}% % \end{macrocode} % Output remark if a remark is given. % \begin{macrocode} \ifthenelse{\not\equal{#4}{\@empty}}% {\Changes@Remark{#3}{#4}}% {}% }% }% % \end{macrocode} % Output unchanged text (option \choption{final} was set). % \begin{macrocode} {#2}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\added} % The command formats text as new text. % % Mandatory argument: added text. % Optional argument (key-value): author's id, remark % \begin{macrocode} \newcommand{\added}[2][\@empty]{% % \end{macrocode} % Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. % \begin{macrocode} \setkeys{Changes@added}{#1}% \Changes@output {\Changes@Markup@Added{#2}} {#2} {\Changes@added@id} {\Changes@added@remark}% \stepcounter{Changes@AddCount\Changes@added@id}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\deleted} % The command formats text as deleted text. % % The definition of the empty text for unchanged text is taken from a tip from \texttt{de.comp.text.tex}. % It solves the problem of additional space caused by an empty command. % % Mandatory argument: deleted text. % Optional argument (key-value): author's id, remark % \begin{macrocode} \newcommand{\deleted}[2][\@empty]{% % \end{macrocode} % Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. % \begin{macrocode} \setkeys{Changes@deleted}{#1}% \Changes@output {\Changes@Markup@Deleted{#2}} {\@bsphack \expandafter \@esphack} {\Changes@deleted@id} {\Changes@deleted@remark}% \stepcounter{Changes@DeleteCount\Changes@deleted@id}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\replaced} % The command formats text as replaced text. % % Mandatory arguments: new text and old text. % Optional argument (key-value): author's id, remark % \begin{macrocode} \newcommand{\replaced}[3][\@empty]{% % \end{macrocode} % Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. % \begin{macrocode} \setkeys{Changes@replaced}{#1}% \Changes@output {{\Changes@Markup@Added{#2}}{\Changes@Markup@Deleted{#3}}} {#2} {\Changes@replaced@id} {\Changes@replaced@remark}% \stepcounter{Changes@ReplaceCount\Changes@replaced@id}% } % \end{macrocode} % \end{macro} % % \subsection{List of changes} % % \begin{macro}{\changes@chopline} % Auxiliary command for reading the content of the loc-files. % The content is read line by line. % One line is parsed with this macro, the order of entries is: id, color, name, added, deleted, replaced. % The contents have to be separated by a semicolon. % \begin{macrocode} \def\changes@chopline#1;#2;#3;#4;#5;#6 \\{ \def\Changes@InID{#1} \def\Changes@InColor{#2} \def\Changes@InName{#3} \def\Changes@InAdded{#4} \def\Changes@InDeleted{#5} \def\Changes@InReplaced{#6} } % \end{macrocode} % \end{macro} % % \begin{macro}{\listofchanges} % This command outputs the list of changes, separated by authors. % The values are read from the loc-file, if it exists. % If no loc-file exists, an according message is generated. % \begin{macrocode} \newcommand{\listofchanges}{% \ifthenelse{\boolean{Changes@optiondraft}} { \section*{\listchangesname} \IfFileExists{\jobname.\Changes@extension} { \newboolean{Changes@MoreLines} \setboolean{Changes@MoreLines}{true} \newread\Changes@InFile \openin\Changes@InFile = \jobname.\Changes@extension \whiledo{\boolean{Changes@MoreLines}}{ \read\Changes@InFile to \Changes@Line \ifeof\Changes@InFile \setboolean{Changes@MoreLines}{false} \else \expandafter\changes@chopline\Changes@Line\\ \begin{tabbing} mm\=mmmmmm\=\kill { \ifthenelse{\boolean{Changes@colored}} {\color{\Changes@InColor}} {} \ifthenelse{\equal{\Changes@InID}{\@empty}} {\changesauthorname: \changesanonymousname} { \changesauthorname: \Changes@InID \ifthenelse{\equal{\Changes@InName}{\@empty}} {} { (\Changes@InName)} } }\\ \>\changesaddname:\>\Changes@InAdded\\ \>\changesdeletename:\>\Changes@InDeleted\\ \>\changesreplacename:\>\Changes@InReplaced\\ \end{tabbing} \fi } \closein\Changes@InFile }{ \emph{\changesnoloc} \PackageWarning{changes}{LaTeX rerun needed for list of changes} } }{} } % \end{macrocode} % \end{macro} % % At the end of the document: write the list of changes in the loc-file, therefore open file, write values, close file. % Changes are written as \LaTeX-formatted text, so they can simply be read via \chcommand{input}. % % The order of entries is: id, color, name, added, deleted, replaced. % The contents have to be separated by a semicolon. % \begin{macrocode} \AtEndDocument{ % \end{macrocode} % Open output file. % \begin{macrocode} \newwrite\Changes@OutFile \immediate\openout\Changes@OutFile = \jobname.\Changes@extension % \end{macrocode} % Redefine expandable of \chcommand{protect} in order to write correct special characters. % Store original definition for resetting \chcommand{protect}. % \begin{macrocode} \let\Changes@protect\protect \let\protect\@unexpandable@protect % \end{macrocode} % Output data for list of changes. % \begin{macrocode} \setcounter{Changes@Author}{0} \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{ \stepcounter{Changes@Author} \def\Changes@ID{\@nameuse{Changes@AuthorID\theChanges@Author}} \immediate\write\Changes@OutFile{\Changes@ID;% \@nameuse{Changes@AuthorColor\Changes@ID};% \@nameuse{Changes@AuthorName\Changes@ID};% \the\value{Changes@AddCount\Changes@ID};% \the\value{Changes@DeleteCount\Changes@ID};% \the\value{Changes@ReplaceCount\Changes@ID}} } % \end{macrocode} % Close output file. % \begin{macrocode} \immediate\closeout\Changes@OutFile % \end{macrocode} % Restore original definition of \chcommand{protect}. % \begin{macrocode} \let\protect\Changes@protect } % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \PrintChanges % \PrintIndex % %\Finale \endinput