summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/changes/changes.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/changes/changes.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/changes/changes.dtx')
-rw-r--r--macros/latex/contrib/changes/changes.dtx1849
1 files changed, 1849 insertions, 0 deletions
diff --git a/macros/latex/contrib/changes/changes.dtx b/macros/latex/contrib/changes/changes.dtx
new file mode 100644
index 0000000000..1ca69d8a93
--- /dev/null
+++ b/macros/latex/contrib/changes/changes.dtx
@@ -0,0 +1,1849 @@
+% \CheckSum{1510}
+%
+% \iffalse meta-comment
+%
+% Copyright (C) 2007-2019
+% 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}
+% \changes{v2.0.0}{2013/06/30}{fixed problem with special characters in tabbing environment (loc), real list of changes, authormarkup}
+% \changes{v2.0.1}{2013/08/10}{no changes in behavior or code; fixed problems with CTAN upload}
+% \changes{v2.0.2}{2013/08/13}{again no changes in behavior or code; fixed CTAN upload - pdf files were corrupt; improved documentation}
+% \changes{v2.0.3}{2014/10/15}{bugfix when using with amsart}
+% \changes{v2.0.4}{2015/04/27}{unknown language does not lead to error: fallback English}
+% \changes{v2.1.0}{2018/10/10}{fixed problems with final option and additional spaces/blanks, warning for wrong list style}
+% \changes{v3.0.0}{2018/11/04}{commands for commenting and highlighting text, rewriting a lot of code, remark is now comment}
+% \changes{v3.1.0}{2018/12/17}{new script for markup removal, improved user manual}
+% \changes{v3.1.1}{2018/12/18}{bugfix: uneven dot fills in summaries}
+% \changes{v3.1.2}{2019/01/26}{bugfix: problems with amsart class}
+% \changes{v3.1.3}{2019/07/21}{bugfix: option clash for ulem and truncate; documentation of known problems and solutions}
+% \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}
+%
+% \cleardoublepage
+% \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 \hologo{LaTeX}-format to \hologo{LaTeXe}, provide name, date, version.
+% Type some information to the console.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{changes}
+[2019/07/21 v3.1.3 changes package]
+\typeout{*** changes package 2019/07/21 v3.1.3 ***}
+% \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}
+%
+% Package \chpackage{xstring} provides improved string test and handling methods.
+% \begin{macrocode}
+\RequirePackage{xstring}
+% \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.
+% Replacement markup is a combination of added and deleted markup, thus there is no special markup storage.
+% \begin{macrocode}
+\newcommand{\Changes@optionaddedmarkup}{colored}
+\newcommand{\Changes@optiondeletedmarkup}{sout}
+\newcommand{\Changes@optionhighlightmarkup}{background}
+\newcommand{\Changes@optioncommentmarkup}{todo}
+% \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}}
+ {
+ % nothing to do
+ }
+ {}
+ \ifthenelse{\equal{\Changes@optionmarkup}{underlined}}
+ {
+ \renewcommand{\Changes@optionaddedmarkup}{uline}
+ \renewcommand{\Changes@optionhighlightmarkup}{uwave}
+ }
+ {}
+ \ifthenelse{\equal{\Changes@optionmarkup}{bfit}}
+ {
+ \renewcommand{\Changes@optionaddedmarkup}{bf}
+ \renewcommand{\Changes@optiondeletedmarkup}{it}
+ }
+ {}
+ \ifthenelse{\equal{\Changes@optionmarkup}{nocolor}}
+ {
+ \renewcommand{\Changes@optionaddedmarkup}{uline}
+ \renewcommand{\Changes@optionhighlightmarkup}{uwave}
+ }
+ {}
+ \typeout{changes-option 'markup=\Changes@optionmarkup'}
+}
+% \end{macrocode}
+%
+% Option \choption{addedmarkup}, stored or set to default value ``\texttt{colored}''.
+% \begin{macrocode}
+\DeclareOptionX{addedmarkup}{
+ \ifthenelse{\equal{\@empty}{#1}}
+ {}
+ {
+ \ifthenelse{
+ \equal{#1}{colored}\or
+ \equal{#1}{uline}\or
+ \equal{#1}{uuline}\or
+ \equal{#1}{uwave}\or
+ \equal{#1}{dashuline}\or
+ \equal{#1}{dotuline}\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{sout}''.
+% \begin{macrocode}
+\DeclareOptionX{deletedmarkup}{
+ \ifthenelse{\equal{\@empty}{#1}}
+ {}
+ {
+ \ifthenelse{
+ \equal{#1}{sout}\or
+ \equal{#1}{colored}\or
+ \equal{#1}{uline}\or
+ \equal{#1}{uuline}\or
+ \equal{#1}{uwave}\or
+ \equal{#1}{dashuline}\or
+ \equal{#1}{dotuline}\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}
+%
+% Option \choption{highlightmarkup}, stored or set to default value ``\texttt{background}''.
+% \begin{macrocode}
+\DeclareOptionX{highlightmarkup}{
+ \ifthenelse{\equal{\@empty}{#1}}
+ {}
+ {
+ \ifthenelse{
+ \equal{#1}{background}\or
+ \equal{#1}{uuline}\or
+ \equal{#1}{uwave}
+ }
+ {\renewcommand{\Changes@optionhighlightmarkup}{#1}}
+ {\PackageWarning{changes}{highlightmarkup '#1' unknown, using '\Changes@optionhighlightmarkup'}}
+ }
+ \typeout{changes-option 'highlightmarkup=\Changes@optionhighlightmarkup'}
+}
+% \end{macrocode}
+%
+% Option \choption{commentmarkup}, stored or set to default value ``\texttt{todo}''.
+% \begin{macrocode}
+\DeclareOptionX{commentmarkup}{
+ \ifthenelse{\equal{\@empty}{#1}}
+ {}
+ {
+ \ifthenelse{
+ \equal{#1}{todo}\or
+ \equal{#1}{margin}\or
+ \equal{#1}{footnote}\or
+ \equal{#1}{uwave}
+ }
+ {\renewcommand{\Changes@optioncommentmarkup}{#1}}
+ {\PackageWarning{changes}{commentmarkup '#1' unknown, using '\Changes@optioncommentmarkup'}}
+ }
+ \typeout{changes-option 'commentmarkup=\Changes@optioncommentmarkup'}
+}
+% \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}\or
+ \equal{#1}{none}
+ }
+ {\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{todonotes} are directly passed to the package.
+% \begin{macrocode}
+\DeclareOptionX{todonotes}{
+ \typeout{todonotes-option '#1', passed to package todonotes}
+ \PassOptionsToPackage{#1}{todonotes}
+}
+% \end{macrocode}
+%
+% Options for package \chpackage{truncate} are directly passed to the package.
+% \begin{macrocode}
+\DeclareOptionX{truncate}{
+ \typeout{truncate-option '#1', passed to package truncate}
+ \PassOptionsToPackage{#1}{truncate}
+}
+% \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<Changes@definechangesauthor>{name}{\def\Changes@definechangesauthor@name{#1}}
+\DeclareOptionX<Changes@definechangesauthor>{color}{\def\Changes@definechangesauthor@color{#1}}
+% \end{macrocode}
+%
+% Set the default values of the options.
+% \begin{macrocode}
+\presetkeys{Changes@definechangesauthor}{
+ name=\@empty,
+ color=blue
+}{}
+% \end{macrocode}
+%
+% \minisec{\chcommand{added}}
+%
+% Declare available options of the command, define value storage.
+% \begin{macrocode}
+\DeclareOptionX<Changes@added>{id}{\def\Changes@added@id{#1}}
+\DeclareOptionX<Changes@added>{remark}{\def\Changes@added@remark{#1}}
+\DeclareOptionX<Changes@added>{comment}{\def\Changes@added@comment{#1}}
+% \end{macrocode}
+%
+% Set the default values of the options.
+% \begin{macrocode}
+\presetkeys{Changes@added}{
+ id=\@empty,
+ remark=\@empty,
+ comment=\@empty,
+}{}
+% \end{macrocode}
+%
+% \minisec{\chcommand{deleted}}
+%
+% Declare available options of the command, define value storage.
+% \begin{macrocode}
+\DeclareOptionX<Changes@deleted>{id}{\def\Changes@deleted@id{#1}}
+\DeclareOptionX<Changes@deleted>{remark}{\def\Changes@deleted@remark{#1}}
+\DeclareOptionX<Changes@deleted>{comment}{\def\Changes@deleted@comment{#1}}
+% \end{macrocode}
+%
+% Set the default values of the options.
+% \begin{macrocode}
+\presetkeys{Changes@deleted}{
+ id=\@empty,
+ remark=\@empty,
+ comment=\@empty,
+}{}
+% \end{macrocode}
+%
+% \minisec{\chcommand{replaced}}
+%
+% Declare available options of the command, define value storage.
+% \begin{macrocode}
+\DeclareOptionX<Changes@replaced>{id}{\def\Changes@replaced@id{#1}}
+\DeclareOptionX<Changes@replaced>{remark}{\def\Changes@replaced@remark{#1}}
+\DeclareOptionX<Changes@replaced>{comment}{\def\Changes@replaced@comment{#1}}
+% \end{macrocode}
+%
+% Set the default values of the options.
+% \begin{macrocode}
+\presetkeys{Changes@replaced}{
+ id=\@empty,
+ remark=\@empty,
+ comment=\@empty,
+}{}
+% \end{macrocode}
+%
+% \minisec{\chcommand{highlight}}
+%
+% Declare available options of the command, define value storage.
+% \begin{macrocode}
+\DeclareOptionX<Changes@highlight>{id}{\def\Changes@highlight@id{#1}}
+\DeclareOptionX<Changes@highlight>{remark}{\def\Changes@highlight@remark{#1}}
+\DeclareOptionX<Changes@highlight>{comment}{\def\Changes@highlight@comment{#1}}
+% \end{macrocode}
+%
+% Set the default values of the options.
+% \begin{macrocode}
+\presetkeys{Changes@highlight}{
+ id=\@empty,
+ remark=\@empty,
+ comment=\@empty,
+}{}
+% \end{macrocode}
+%
+% \minisec{\chcommand{comment}}
+%
+% Declare available options of the command, define value storage.
+% \begin{macrocode}
+\DeclareOptionX<Changes@comment>{id}{\def\Changes@comment@id{#1}}
+% \end{macrocode}
+%
+% Set the default values of the options.
+% \begin{macrocode}
+\presetkeys{Changes@comment}{
+ id=\@empty,
+}{}
+% \end{macrocode}
+%
+% \minisec{\chcommand{listofchanges}}
+%
+% Declare available options of the command, define value storage.
+% \begin{macrocode}
+\DeclareOptionX<Changes@loc>{style}{\def\Changes@loc@style{#1}}
+\DeclareOptionX<Changes@loc>{title}{\def\Changes@loc@title{#1}}
+\DeclareOptionX<Changes@loc>{show}{\def\Changes@loc@show{#1}}
+% \end{macrocode}
+%
+% Set the default values of the options.
+% \begin{macrocode}
+\presetkeys{Changes@loc}{
+ style=list,
+ title=\@empty,
+ show=all,
+}{}
+% \end{macrocode}
+%
+% \subsubsection{Package options}
+%
+% In order to avoid option clashes for options, state them here instead at the moment of requiring the package.
+% Thanks for Markus Pahlow for pointing this out and providing the solution.
+% \begin{macrocode}
+\ExecuteOptionsX{
+ ulem={normalem,normalbf},
+ truncate={breakall,fit}
+}
+% \end{macrocode}
+%
+% \subsubsection{Option processing}
+%
+% Process the options.
+% \begin{macrocode}
+\ProcessOptionsX*\relax
+% \end{macrocode}
+%
+% \subsection{Packages}
+%
+% \begin{macro}{\isColored}
+%
+% Check if text should be colored.
+% \begin{macrocode}
+\newtest{\isColored}{%
+ \not\equal{\Changes@optionmarkup}{nocolor}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% 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}
+\ifthenelse{\isColored}
+ {
+ \RequirePackage{xcolor}
+ \RequirePackage{pdfcolmk}
+ }
+ {}
+% \end{macrocode}
+%
+% Package \chpackage{ulem} provides commands for striking out text.
+% Providing the needed package options via \chcommand{ExecuteOptionsX}.
+% \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@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}\or
+ \equal{\Changes@optioncommentmarkup}{uwave}\or
+ \equal{\Changes@optionhighlightmarkup}{uuline}\or
+ \equal{\Changes@optionhighlightmarkup}{uwave}
+}
+ {\RequirePackage{ulem}}
+ {}
+% \end{macrocode}
+%
+% Package \chpackage{todonotes} provides commands for todo notes in the margin.
+% \begin{macrocode}
+\ifthenelse{
+ \equal{\Changes@optioncommentmarkup}{todo}
+}
+ {\RequirePackage{todonotes}}
+ {}
+% \end{macrocode}
+%
+% \subsection{Language dependent texts}
+%
+% If the \chpackage{babel} package is not loaded, the default language is English, in order to use another language, the user has to redefine the variables.
+% If the \chpackage{babel} or the \chpackage{polyglossia} package is loaded, the default language is English too for undefined languages.
+% \begin{macrocode}
+\newcommand*\listofchangesname{List of changes}
+\newcommand*\summaryofchangesname{Changes}
+\newcommand*\compactsummaryofchangesname{Changes (compact)}
+\newcommand*\changesaddname{Added}
+\newcommand*\changesdeletename{Deleted}
+\newcommand*\changesreplacename{Replaced}
+\newcommand*\changeshighlightname{Highlighted}
+\newcommand*\changescommentname{Commented}
+\newcommand*\changesauthorname{Author}
+\newcommand*\changesanonymousname{anonymous}
+\newcommand*\changesnochanges{No changes.}
+\newcommand*\changesnoloc{List of changes is available after the next \LaTeX\ run.}
+\newcommand*\changesnosoc{Summary of changes is available after the next \LaTeX\ run.}
+% \end{macrocode}
+%
+% The check for \chpackage{babel} or \chpackage{polyglossia}, define language dependent texts afterwards.
+% \begin{macrocode}
+\newboolean{Changes@langpackage}
+\setboolean{Changes@langpackage}{false}
+\@ifpackageloaded{babel}
+ {\setboolean{Changes@langpackage}{true}}
+ {}
+\@ifpackageloaded{polyglossia}
+ {\setboolean{Changes@langpackage}{true}}
+ {}
+\ifthenelse{\boolean{Changes@langpackage}}
+ {
+ \addto\captionsngerman{\def\listofchangesname{Liste der \"Anderungen}}
+ \addto\captionsngerman{\def\summaryofchangesname{\"Anderungen}}
+ \addto\captionsngerman{\def\compactsummaryofchangesname{\"Anderungen (kompakt)}}
+ \addto\captionsngerman{\def\changesaddname{Eingef\"ugt}}
+ \addto\captionsngerman{\def\changesdeletename{Gel\"oscht}}
+ \addto\captionsngerman{\def\changesreplacename{Ersetzt}}
+ \addto\captionsngerman{\def\changeshighlightname{Hervorgehoben}}
+ \addto\captionsngerman{\def\changescommentname{Kommentiert}}
+ \addto\captionsngerman{\def\changesauthorname{Autor}}
+ \addto\captionsngerman{\def\changesanonymousname{Anonym}}
+ \addto\captionsngerman{\def\changesnochanges{Keine \"Anderungen.}}
+ \addto\captionsngerman{\def\changesnoloc{Liste der \"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}}
+ \addto\captionsngerman{\def\changesnosoc{\"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}}
+
+ \addto\captionsgerman{\def\listofchangesname{Liste der \"Anderungen}}
+ \addto\captionsgerman{\def\summaryofchangesname{\"Anderungen}}
+ \addto\captionsgerman{\def\compactsummaryofchangesname{\"Anderungen (kompakt)}}
+ \addto\captionsgerman{\def\changesaddname{Eingef\"ugt}}
+ \addto\captionsgerman{\def\changesdeletename{Gel\"oscht}}
+ \addto\captionsgerman{\def\changesreplacename{Ersetzt}}
+ \addto\captionsgerman{\def\changeshighlightname{Hervorgehoben}}
+ \addto\captionsgerman{\def\changescommentname{Kommentiert}}
+ \addto\captionsgerman{\def\changesauthorname{Autor}}
+ \addto\captionsgerman{\def\changesanonymousname{Anonym}}
+ \addto\captionsgerman{\def\changesnochanges{Keine \"Anderungen.}}
+ \addto\captionsgerman{\def\changesnoloc{Liste der \"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}}
+ \addto\captionsgerman{\def\changesnosoc{\"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}}
+
+ \addto\captionsenglish{\def\listofchangesname{List of changes}}
+ \addto\captionsenglish{\def\summaryofchangesname{Changes}}
+ \addto\captionsenglish{\def\compactsummaryofchangesname{Changes (compact)}}
+ \addto\captionsenglish{\def\changesaddname{Added}}
+ \addto\captionsenglish{\def\changesdeletename{Deleted}}
+ \addto\captionsenglish{\def\changesreplacename{Replaced}}
+ \addto\captionsenglish{\def\changeshighlightname{Highlighted}}
+ \addto\captionsenglish{\def\changescommentname{Commented}}
+ \addto\captionsenglish{\def\changesauthorname{Author}}
+ \addto\captionsenglish{\def\changesanonymousname{anonymous}}
+ \addto\captionsenglish{\def\changesnochanges{No changes.}}
+ \addto\captionsenglish{\def\changesnoloc{List of changes is available after the next \LaTeX\ run.}}
+ \addto\captionsenglish{\def\changesnosoc{Summary of changes is available after the next \LaTeX\ run.}}
+
+ \addto\captionsbritish{\def\listofchangesname{List of changes}}
+ \addto\captionsbritish{\def\summaryofchangesname{Changes}}
+ \addto\captionsbritish{\def\compactsummaryofchangesname{Changes (compact)}}
+ \addto\captionsbritish{\def\changesaddname{Added}}
+ \addto\captionsbritish{\def\changesdeletename{Deleted}}
+ \addto\captionsbritish{\def\changesreplacename{Replaced}}
+ \addto\captionsbritish{\def\changeshighlightname{Highlighted}}
+ \addto\captionsbritish{\def\changescommentname{Commented}}
+ \addto\captionsbritish{\def\changesauthorname{Author}}
+ \addto\captionsbritish{\def\changesanonymousname{anonymous}}
+ \addto\captionsbritish{\def\changesnochanges{No changes.}}
+ \addto\captionsbritish{\def\changesnoloc{List of changes is available after the next \LaTeX\ run.}}
+ \addto\captionsbritish{\def\changesnosoc{Summary of changes is available after the next \LaTeX\ run.}}
+
+ \addto\captionsitalian{\def\listofchangesname{Lista delle modifiche}}
+ \addto\captionsitalian{\def\summaryofchangesname{Modifiche}}
+ \addto\captionsitalian{\def\compactsummaryofchangesname{Modifiche (coerente)}} % translation by me (EK), please provide correct translation
+ \addto\captionsitalian{\def\changesaddname{Aggiunte}}
+ \addto\captionsitalian{\def\changesdeletename{Cancellazioni}}
+ \addto\captionsitalian{\def\changesreplacename{Sostituzioni}}
+ \addto\captionsitalian{\def\changeshighlightname{Accentare}} % translation by me (EK), please provide correct translation
+ \addto\captionsitalian{\def\changescommentname{Commenti}} % translation by me (EK), please provide correct translation
+ \addto\captionsitalian{\def\changesauthorname{Autore}}
+ \addto\captionsitalian{\def\changesanonymousname{anonimo}}
+ \addto\captionsitalian{\def\changesnochanges{Nessuna modifica.}} % translation by me (EK), please provide correct translation
+ \addto\captionsitalian{\def\changesnoloc{La lista delle modifiche sar\`a disponibile alla prossima esecuzione di \LaTeX.}}
+ \addto\captionsitalian{\def\changesnosoc{Le 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{soc} (summary of changes).
+% \begin{macrocode}
+\newcommand{\Changes@extension}{soc}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setsocextension}
+% Set a new file extension.
+% Argument: new extension.
+% \begin{macrocode}
+\newcommand{\setsocextension}[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: blue).
+%
+% 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
+ \expandafter\let\csname Changes@AuthorColor#2\endcsname=\Changes@definechangesauthor@color
+ \newcounter{Changes@addedCount#2}
+ \newcounter{Changes@deletedCount#2}
+ \newcounter{Changes@replacedCount#2}
+ \newcounter{Changes@highlightCount#2}
+ \newcounter{Changes@commentCount#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Define default-author (anonymous) with empty id and default color.
+% \begin{macrocode}
+\definechangesauthor{\@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}}{}%
+ \ifthenelse{\equal{\Changes@optionauthormarkup}{none}}{}{}%
+}
+% \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}{\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}
+%
+% \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}{colored}}{#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}{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}{sout}}{\sout{#1}}{}%
+ \ifthenelse{\equal{\Changes@optiondeletedmarkup}{colored}}{#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}{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}
+%
+% \begin{macro}{\Changes@Markup@highlight}
+%
+% Store markup for highlighted text.
+% \begin{macrocode}
+\newcommand{\Changes@Markup@highlight}[1]{%
+ \ifthenelse{\equal{\Changes@optionhighlightmarkup}{background}}%
+ {%
+ \ifthenelse{\isColored}%
+ {\colorbox{authorcolor!30}{#1}}%
+ {#1}%
+ }{}%
+ \ifthenelse{\equal{\Changes@optionhighlightmarkup}{uuline}}{\uuline{#1}}{}%
+ \ifthenelse{\equal{\Changes@optionhighlightmarkup}{uwave}}{\uwave{#1}}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sethighlightmarkup}
+% Set markup for highlighted text.
+% \begin{macrocode}
+\newcommand{\sethighlightmarkup}[1]{
+ \renewcommand{\Changes@Markup@highlight}[1]{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@Markup@comment}
+% Store markup for comments.
+%
+% Parameters:
+% \begin{enumerate}
+% \item text
+% \item author's id
+% \item author's id/name output
+% \end{enumerate}
+% \begin{macrocode}
+\newcommand{\Changes@Markup@comment}[3]{%
+% \end{macrocode}
+%
+% This one is tricky, because the parameters depend on tests.
+% If I use the tests inside the \chcommand{todo} command, they break because of the use of \chpackage{ifthenelse}.
+% Thus I am implementing a slightly dirty working version, having in mind, that the code should be revisited in future releases.
+% \begin{macrocode}
+ \ifthenelse{\equal{\Changes@optioncommentmarkup}{todo}}%
+ {%
+ \ifthenelse{\isColored}%
+ {%
+ \ifthenelse{\isAnonymous{#2}}%
+ {%
+ \todo[color=authorcolor!10, bordercolor=authorcolor, linecolor=authorcolor!70, nolist]{\textbf{[\arabic{authorcommentcount}]} #1}%
+ }{%
+ \todo[color=authorcolor!10, bordercolor=authorcolor, linecolor=authorcolor!70, nolist]{\textbf{[#3~\arabic{authorcommentcount}]} #1}%
+ }%
+ }{%
+ \ifthenelse{\isAnonymous{#2}}%
+ {%
+ \todo[color=black!0, bordercolor=black, linecolor=black!70, nolist]{\textbf{[\arabic{authorcommentcount}]} #1}%
+ }{%
+ \todo[color=black!0, bordercolor=black, linecolor=black!70, nolist]{\textbf{[#3~\arabic{authorcommentcount}]:} #1}%
+ }%
+ }%
+ }{}%
+% \end{macrocode}
+%
+% Something a little more easy.
+% \begin{macrocode}
+ \ifthenelse{\equal{\Changes@optioncommentmarkup}{margin}}%
+ {%
+ \marginpar{%
+ \ifthenelse{\isColored}%
+ {\leavevmode\color{authorcolor}}%
+ {}%
+ \ifthenelse{\isAnonymous{#2}}%
+ {\textbf{[\arabic{Changes@commentCount#2}]:} }%
+ {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
+ #1%
+ }%
+ }{}%
+ \ifthenelse{\equal{\Changes@optioncommentmarkup}{footnote}}%
+ {%
+ \footnote{%
+ \ifthenelse{\isAnonymous{#2}}%
+ {\textbf{[\arabic{Changes@commentCount#2}]:} }%
+ {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
+ #1%
+ }%
+ }{}%
+ \ifthenelse{\equal{\Changes@optioncommentmarkup}{uwave}}%
+ {%
+ {%
+ \ifthenelse{\isColored}%
+ {\color{authorcolor}}%
+ {}%
+ \allowbreak%
+ \uwave{%
+ \ifthenelse{\isAnonymous{#2}}%
+ {\textbf{[\arabic{Changes@commentCount#2}]:} }%
+ {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
+ #1%
+ }%
+ }%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setcommentmarkup}
+% Set markup for comments.
+% \begin{macrocode}
+\newcommand{\setcommentmarkup}[1]{
+ \renewcommand{\Changes@Markup@comment}[3]{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Change management command definition}
+%
+% \begin{macro}{\ifIsEmpty}
+%
+% Checks if text in \choption{\#1} is empty, executes \choption{\#2} if empty, \choption{\#3} otherwise.
+% This is a shortcut for the \chcommand{ifthenelse} test, it basically eases the use of the test.
+%
+% \begin{macrocode}
+\DeclareRobustCommand{\ifIsEmpty}[3]{%
+ \ifthenelse{\equal{#1}{} \or \equal{#1}{\@empty}}%
+ {#2}%
+ {#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\isAnonymous}
+%
+% Check if author id is empty, therefore the author is anonymous.
+% This is a new test that can be tested using \chcommand{ifthenelse}.
+%
+% This test has the following arguments:
+% \begin{enumerate}
+% \item author's id
+% \end{enumerate}
+%
+% \begin{macrocode}
+\newtest{\isAnonymous}[1]{%
+ \equal{#1}{\@empty}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\isAuthorEmpty}
+%
+% Check if author is anonymous or position does not equal needed position, therefore the author text is empty.
+% This is a new test that can be tested using \chcommand{ifthenelse}.
+%
+% This test could be removed if the test for empty \chcommand{Changes@output@author} would work.
+%
+% This test has the following arguments:
+% \begin{enumerate}
+% \item author's id
+% \item position
+% \end{enumerate}
+%
+% \begin{macrocode}
+\newtest{\isAuthorEmpty}[2]{%
+ \isAnonymous{#1} \or \not\equal{\Changes@optionauthormarkupposition}{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@check@author}
+%
+% Check if author id is valid.
+% An empty id is valid by default.
+%
+% If the id is not valid, a package error is raised.
+% I have the feeling that the code is optimizable.
+%
+% This command has the following arguments:
+% \begin{enumerate}
+% \item author's id
+% \end{enumerate}
+%
+% \begin{macrocode}
+\newboolean{Changes@WrongID}
+\newcommand{\Changes@check@author}[1]{%
+ \ifIsEmpty{#1}%
+ {}%
+ {%
+ \setboolean{Changes@WrongID}{true}%
+ \setcounter{Changes@Author}{0}%
+ \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{%
+ \stepcounter{Changes@Author}%
+ \ifthenelse{\equal{#1}{\@nameuse{Changes@AuthorID\theChanges@Author}}}%
+ {\setboolean{Changes@WrongID}{false}}%
+ {}%
+ }%
+ \ifthenelse{\boolean{Changes@WrongID}}%
+ {\PackageError{changes}%
+ {Undefined changes author: #1}%
+ {You have to define the author #1 with e.g.: \definechangesauthor{#1}}}%
+ {}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@output@author}
+%
+% Output command for the author.
+%
+% This command has the following arguments:
+% \begin{enumerate}
+% \item author's id
+% \item position to output the author to (left or right)
+% \end{enumerate}
+%
+% \chcommand{DeclareRobustCommand} is used for not breaking the todo note definition.
+% \begin{macrocode}
+\DeclareRobustCommand{\Changes@output@author}[2]{%
+% \end{macrocode}
+%
+% Output author text only if author's id is given and the position matches, otherwise output empty text.
+% \begin{macrocode}
+ \ifthenelse{\isAuthorEmpty{#1}{#2}}%
+ {}%
+ {%
+ \ifthenelse{\equal{\Changes@optionauthormarkuptext}{id}}%
+ {%
+ #1%
+ }%
+ {}%
+ \ifthenelse{\equal{\Changes@optionauthormarkuptext}{name}}%
+ {%
+ \ifIsEmpty{\@nameuse{Changes@AuthorName#1}}%
+ {%
+ #1%
+ }{%
+ \@nameuse{Changes@AuthorName#1}%
+ }%
+ }%
+ {}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@set@color}
+%
+% Sets the author's color.
+%
+% This command has the following argument:
+% \begin{enumerate}
+% \item author's id
+% \end{enumerate}
+%
+% \begin{macrocode}
+\newcommand{\Changes@set@color}[1]{%
+ \ifthenelse{\isColored}%
+ {\colorlet{authorcolor}{\@nameuse{Changes@AuthorColor#1}}}%
+ {}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@set@commentcount}
+%
+% Sets the author's comment count.
+%
+% This command has the following argument:
+% \begin{enumerate}
+% \item author's id
+% \end{enumerate}
+%
+% \begin{macrocode}
+\newcounter{authorcommentcount}
+\newcommand{\Changes@set@commentcount}[1]{%
+ \setcounter{authorcommentcount}{\value{Changes@commentCount#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@output}
+%
+% Output command for the changed text.
+%
+% This command has the following arguments:
+% \begin{enumerate}
+% \item change id (added, deleted, replaced, highlight, comment)
+% \item author's id
+% \item final text
+% \item deleted/replaced text
+% \item comment
+% \item change type name for list of changes
+% \item text for list of changes
+% \end{enumerate}
+% \begin{macrocode}
+\newcommand{\Changes@output}[7]{%
+% \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 author's id is valid and set author's color.
+% \begin{macrocode}
+ \Changes@check@author{#2}%
+ \Changes@set@color{#2}%
+% \end{macrocode}
+%
+% Start output.
+% \begin{macrocode}
+ {%
+% \end{macrocode}
+%
+% Output for change commands: added, deleted, replaced, highlight.
+%
+% I think this code is not elegant but it gets the work done for now.
+% \begin{macrocode}
+ \ifthenelse{%
+ \equal{#1}{added}\or%
+ \equal{#1}{deleted}\or%
+ \equal{#1}{replaced}\or%
+ \equal{#1}{highlight}%
+ }%
+ {%
+% \end{macrocode}
+%
+% Author text for left positioning (only without comment).
+% \begin{macrocode}
+ \ifIsEmpty{#5}%
+ {%
+ \ifthenelse{\isAuthorEmpty{#2}{left}}%
+ {}%
+ {{%
+ \ifthenelse{\isColored}%
+ {\color{authorcolor}}%
+ {}%
+ \Changes@Markup@author{\Changes@output@author{#2}{left}}%
+ }}%
+ }{}%
+% \end{macrocode}
+%
+% Changed/highlighted text.
+% \begin{macrocode}
+ {%
+ \ifthenelse{\not\equal{#1}{highlight}}%
+ {%
+ \ifthenelse{\isColored}%
+ {\color{authorcolor}}%
+ {}%
+ }{}%
+ \ifthenelse{\equal{#1}{added}}{\Changes@Markup@added{#3}}{}%
+ \ifthenelse{\equal{#1}{deleted}}{\Changes@Markup@deleted{#4}}{}%
+ \ifthenelse{\equal{#1}{replaced}}{{\Changes@Markup@added{#3}}\allowbreak\Changes@Markup@deleted{#4}}{}%
+ \ifthenelse{\equal{#1}{highlight}}{\Changes@Markup@highlight{#3}}{}%
+ }%
+% \end{macrocode}
+%
+% Author text for right positioning (only without comment).
+% \begin{macrocode}
+ \ifIsEmpty{#5}%
+ {%
+ \ifthenelse{\isAuthorEmpty{#2}{right}}%
+ {}%
+ {{%
+ \ifthenelse{\isColored}%
+ {\color{authorcolor}}%
+ {}%
+ \Changes@Markup@author{\Changes@output@author{#2}{right}}%
+ }}%
+ }{}%
+% \end{macrocode}
+%
+% Update counters.
+% \begin{macrocode}
+ \stepcounter{Changes@#1Count#2}%
+ }{}%
+% \end{macrocode}
+%
+% Comments.
+% \begin{macrocode}
+ \ifIsEmpty{#5}%
+ {}%
+ {%
+ \stepcounter{Changes@commentCount#2}%
+ \Changes@set@commentcount{#2}%
+ \Changes@Markup@comment%
+ {#5}%
+ {#2}%
+ {\Changes@output@author{#2}{left}\Changes@output@author{#2}{right}}%
+ }%
+ }%
+% \end{macrocode}
+% Store line for list of changes.
+% \begin{macrocode}
+ \ifIsEmpty{#2}%
+ {\def\Changes@locid{}}%
+ {\def\Changes@locid{~(#2)}}%
+ \addtocontents{loc}{\protect\ChangesListline{#1}{#6\Changes@locid}{#7}{\thepage}}%
+ }%
+% \end{macrocode}
+%
+% Output unchanged text (option \choption{final} was set).
+% \begin{macrocode}
+ {%
+ \ifIsEmpty{#3}%
+ {\@bsphack\@esphack}%
+ {#3}%
+ }%
+}
+% \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, comment, remark (deprecated)
+% \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}%
+% \end{macrocode}
+% Check for use of deprecated \choption{remark} option.
+% \begin{macrocode}
+ \ifIsEmpty{\Changes@added@remark}%
+ {}%
+ {%
+ \ifIsEmpty{\Changes@added@comment}%
+ {%
+ \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}%
+ \let\Changes@added@comment\Changes@added@remark%
+ }%
+ {%
+ \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}%
+ }%
+ }%
+% \end{macrocode}
+% End of check for use of deprecated \choption{remark} option.
+% \begin{macrocode}
+ \Changes@output%
+ {added}%
+ {\Changes@added@id}%
+ {#2}%
+ {}%
+ {\Changes@added@comment}%
+ {\changesaddname}%
+ {#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\deleted}
+% The command formats text as deleted text.
+%
+% The definition of the empty text for unchanged text is provided by Frank Mittelbach, slightly modified by me.
+% It solves the problem of additional space caused by an empty command (e.g. when using the \choption{final} option).
+% Before that, there was a slightly erroneous version from \texttt{de.comp.text.tex} (issue \#2).
+%
+% Mandatory argument: deleted text.
+% Optional argument (key-value): author's id, comment, remark (deprecated)
+% \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}%
+% \end{macrocode}
+% Check for use of deprecated \choption{remark} option.
+% \begin{macrocode}
+ \ifIsEmpty{\Changes@deleted@remark}%
+ {}%
+ {%
+ \ifIsEmpty{\Changes@deleted@comment}%
+ {%
+ \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}%
+ \let\Changes@deleted@comment\Changes@deleted@remark%
+ }%
+ {%
+ \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}%
+ }%
+ }%
+% \end{macrocode}
+% End of check for use of deprecated \choption{remark} option.
+% \begin{macrocode}
+ \Changes@output%
+ {deleted}%
+ {\Changes@deleted@id}%
+ {}%
+ {#2}%
+ {\Changes@deleted@comment}%
+ {\changesdeletename}%
+ {#2}%
+}
+% \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, comment, remark (deprecated)
+% \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}%
+% \end{macrocode}
+% Check for use of deprecated \choption{remark} option.
+% \begin{macrocode}
+ \ifIsEmpty{\Changes@replaced@remark}%
+ {}%
+ {%
+ \ifIsEmpty{\Changes@replaced@comment}%
+ {%
+ \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}%
+ \let\Changes@replaced@comment\Changes@replaced@remark%
+ }%
+ {%
+ \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}%
+ }%
+ }%
+% \end{macrocode}
+% End of check for use of deprecated \choption{remark} option.
+% \begin{macrocode}
+ \Changes@output%
+ {replaced}%
+ {\Changes@replaced@id}%
+ {#2}%
+ {#3}%
+ {\Changes@replaced@comment}%
+ {\changesreplacename}%
+ {#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\highlight}
+% The command formats text as highlighted text.
+%
+% Mandatory argument: highlighted text.
+% Optional argument (key-value): author's id, comment, remark (deprecated)
+% \begin{macrocode}
+\newcommand{\highlight}[2][\@empty]{%
+% \end{macrocode}
+%
+% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
+% \begin{macrocode}
+ \setkeys{Changes@highlight}{#1}%
+% \end{macrocode}
+% Check for use of deprecated \choption{remark} option.
+% \begin{macrocode}
+ \ifIsEmpty{\Changes@highlight@remark}%
+ {}%
+ {%
+ \ifIsEmpty{\Changes@highlight@comment}%
+ {%
+ \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}%
+ \let\Changes@highlight@comment\Changes@highlight@remark%
+ }%
+ {%
+ \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}%
+ }%
+ }%
+% \end{macrocode}
+% End of check for use of deprecated \choption{remark} option.
+% \begin{macrocode}
+ \Changes@output%
+ {highlight}%
+ {\Changes@highlight@id}%
+ {#2}%
+ {}%
+ {\Changes@highlight@comment}%
+ {\changeshighlightname}%
+ {#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\comment}
+% The command formats text as comment.
+%
+% Mandatory argument: comment text.
+% Optional argument (key-value): author's id
+% \begin{macrocode}
+\newcommand{\comment}[2][\@empty]{%
+% \end{macrocode}
+%
+% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
+% \begin{macrocode}
+ \setkeys{Changes@comment}{#1}%
+ \Changes@output%
+ {comment}%
+ {\Changes@comment@id}%
+ {}%
+ {}%
+ {#2}%
+ {\changescommentname}%
+ {#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{List of changes}
+%
+% The list of changes truncates text, therefore the \chpackage{truncate} package is used.
+% (Using fit and redefining the marker: suggestion and code by Frank Mittelbach)
+% Providing the needed package options via \chcommand{ExecuteOptionsX}.
+% \begin{macrocode}
+\RequirePackage{truncate}
+\renewcommand\TruncateMarker{ [\dots\negthinspace]\ }
+% \end{macrocode}
+%
+% \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, highlighted, comment.
+% The contents have to be separated by a semicolon.
+% \begin{macrocode}
+\def\changes@chopline#1;#2;#3;#4;#5;#6;#7;#8 \\{%
+ \def\Changes@InID{#1}%
+ \def\Changes@InColor{#2}%
+ \def\Changes@InName{#3}%
+ \def\Changes@InAdded{#4}%
+ \def\Changes@InDeleted{#5}%
+ \def\Changes@InReplaced{#6}%
+ \def\Changes@InHighlight{#7}%
+ \def\Changes@InComment{#8}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChangesListline}
+%
+% Output of a list line.
+%
+% This command has the following arguments:
+% \begin{enumerate}
+% \item change type (added, ...)
+% \item text
+% \item page
+% \end{enumerate}
+%
+% \begin{macrocode}
+\newcommand{\ChangesListline}[4]{%
+ \IfSubStr{\Changes@loc@show}{#1}{%
+ \@ifundefined{@dotsep}%
+ {\def\@dotsep{4.5}}{}%
+ \@dottedtocline{1}{0px}{2em}{#2: \truncate{\Changes@truncate@width}{#3}}{#4}%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@truncate@width}
+%
+% Length for the width of the truncation.
+%
+% Default: two third of the text width
+%
+% \begin{macrocode}
+\newlength{\Changes@truncate@width}
+\setlength{\Changes@truncate@width}{.6\textwidth}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\settruncatewidth}
+%
+% Set the width of the truncation.
+% Argument: new width.
+% \begin{macrocode}
+\newcommand{\settruncatewidth}[1]{
+ \setlength{\Changes@truncate@width}{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@summary@width}
+%
+% Length for the width of the change summary.
+%
+% Default: one third of the text width
+%
+% \begin{macrocode}
+\newlength{\Changes@summary@width}
+\setlength{\Changes@summary@width}{.3\textwidth}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setsummarywidth}
+%
+% Set the width of the change summary.
+% Argument: new width.
+% \begin{macrocode}
+\newcommand{\setsummarywidth}[1]{
+ \setlength{\Changes@summary@width}{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setsummarytowidth}
+%
+% Set the width of the change summary to width of given text.
+% Argument: text.
+% \begin{macrocode}
+\newcommand{\setsummarytowidth}[1]{
+ \settowidth{\Changes@summary@width}{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@summaryline}
+%
+% Auxiliary command for output of a summary line.
+%
+% This command has the following arguments:
+% \begin{enumerate}
+% \item change type (added, ...)
+% \item number of items
+% \item name of items
+% \item line delimiter
+% \end{enumerate}
+%
+% \begin{macrocode}
+\newcommand{\Changes@summaryline}[4]{%
+ \IfSubStr{\Changes@loc@show}{#1}{%
+ \ifthenelse{\not\equal{\Changes@loc@style}{compactsummary} \or #2 > 0}%
+ {%
+ \parbox{\Changes@summary@width}{#3~\let\cleaders\leaders\dotfill~#2}#4%
+ }{}%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\listofchanges}
+%
+% This command outputs the list of changes.
+% Options: \choption{style} and \choption{title}.
+%
+% The following styles are available:
+% \begin{description}
+% \item [\choption{list}] prints the list of changes like a list of figures
+% \item [\choption{summary}] prints the number of changes grouped by author
+% \item [\choption{compactsummary}] same as \choption{summary} but entries with count 0 are omitted
+% \end{description}
+%
+% For the list, the values are read from the auxiliary file.
+%
+% For the summary, the values are read from the loc-file, if it exists.
+% If no loc-file exists, an according message is generated.
+%
+% Some definitions that have to reside outside the command in order to use the command multiple times.
+% \begin{macrocode}
+\newboolean{Changes@MoreLines}
+\newboolean{Changes@ShowOK}
+% \end{macrocode}
+% The definition of \chcommand{listofchanges}.
+% \begin{macrocode}
+\newcommand{\listofchanges}[1][\@empty]{%
+ \setkeys{Changes@loc}{#1}%
+% \end{macrocode}
+% All work is done only in draft mode.
+% \begin{macrocode}
+ \ifthenelse{\boolean{Changes@optiondraft}}%
+ {%
+% \end{macrocode}
+%
+% Check if style is known, otherwise use \choption{list} by default.
+% \begin{macrocode}
+ \ifIsEmpty{\Changes@loc@style}%
+ {\def\Changes@loc@style{list}}%
+ {%
+ \ifthenelse{%
+ \equal{\Changes@loc@style}{list}\or%
+ \equal{\Changes@loc@style}{summary}\or%
+ \equal{\Changes@loc@style}{compactsummary}%
+ }%
+ {}%
+ {%
+ \PackageWarning{changes}{Wrong style for list of changes: '\Changes@loc@style', using 'list' instead.}%
+ \def\Changes@loc@style{list}%
+ }%
+ }%
+% \end{macrocode}
+%
+% Check if show-value is known, otherwise use \choption{all} by default.
+% \begin{macrocode}
+ \ifIsEmpty{\Changes@loc@show}%
+ {\def\Changes@loc@show{all}}%
+ {%
+% \end{macrocode}
+%
+% This check is complicated, because the \chcommand{isin} test of \chpackage{xifthen} does not work with macros.
+% On the other hand I could not define a new text using the \chcommand{IfSubStr} macro of \chpackage{xstring},
+% \begin{macrocode}
+ \setboolean{Changes@ShowOK}{false}%
+ \ifthenelse{\equal{\Changes@loc@show}{all}}{\setboolean{Changes@ShowOK}{true}}{}%
+ \IfSubStr{\Changes@loc@show}{added}{\setboolean{Changes@ShowOK}{true}}{}%
+ \IfSubStr{\Changes@loc@show}{deleted}{\setboolean{Changes@ShowOK}{true}}{}%
+ \IfSubStr{\Changes@loc@show}{replaced}{\setboolean{Changes@ShowOK}{true}}{}%
+ \IfSubStr{\Changes@loc@show}{highlight}{\setboolean{Changes@ShowOK}{true}}{}%
+ \IfSubStr{\Changes@loc@show}{comment}{\setboolean{Changes@ShowOK}{true}}{}%
+ \ifthenelse{\boolean{Changes@ShowOK}}%
+ {}%
+ {%
+ \PackageWarning{changes}{Wrong show-value for list of changes: '\Changes@loc@show', using 'all' instead.}%
+ \def\Changes@loc@show{all}%
+ }%
+ }%
+ \ifthenelse{\equal{\Changes@loc@show}{all}}%
+ {%
+ \def\Changes@loc@show{added|deleted|replaced|highlight|comment}%
+ }{}%
+% \end{macrocode}
+%
+% Print heading.
+% \begin{macrocode}
+ \def\Changes@heading{\Changes@loc@title}
+ \ifIsEmpty{\Changes@loc@title}%
+ {%
+ \ifthenelse{\equal{\Changes@loc@style}{list}}%
+ {\def\Changes@heading{\listofchangesname}}{}%
+ \ifthenelse{\equal{\Changes@loc@style}{summary}}%
+ {\def\Changes@heading{\summaryofchangesname}}{}%
+ \ifthenelse{\equal{\Changes@loc@style}{compactsummary}}%
+ {\def\Changes@heading{\compactsummaryofchangesname}}{}%
+ }{}%
+ \section*{\Changes@heading}
+% \end{macrocode}
+%
+% Print list.
+% \begin{macrocode}
+ \ifthenelse{\equal{\Changes@loc@style}{list}}%
+ {%
+ \IfFileExists{\jobname.loc}%
+ {%
+ \setboolean{Changes@MoreLines}{true}%
+ \newread\Changes@InFile%
+ \openin\Changes@InFile = \jobname.loc%
+ \whiledo{\boolean{Changes@MoreLines}}{%
+ \read\Changes@InFile to \Changes@Line%
+ \ifeof\Changes@InFile%
+ \setboolean{Changes@MoreLines}{false}%
+ \else%
+ \Changes@Line%
+ \fi%
+ }%
+ \closein\Changes@InFile%
+ }{%
+ \emph{\changesnoloc}%
+ \PackageWarning{changes}{LaTeX rerun needed for list of changes}%
+ }%
+ }{}%
+% \end{macrocode}
+% Print summary or compact summary.
+% \begin{macrocode}
+ \ifthenelse{\equal{\Changes@loc@style}{summary} \or \equal{\Changes@loc@style}{compactsummary}}%
+ {%
+ \IfFileExists{\jobname.\Changes@extension}%
+ {%
+ \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\\%
+ \textbf{%
+ \ifthenelse{\isColored}%
+ {\color{\Changes@InColor}}%
+ {}%
+ \ifthenelse{\equal{\Changes@InID}{\@empty}}%
+ {\changesauthorname: \changesanonymousname}%
+ {%
+ \changesauthorname: \Changes@InID%
+ \ifthenelse{\equal{\Changes@InName}{\@empty}}%
+ {}%
+ { (\Changes@InName)}%
+ }%
+ }\\%
+ \ifthenelse{%
+ \Changes@InAdded > 0 \or%
+ \Changes@InDeleted > 0 \or%
+ \Changes@InReplaced > 0 \or%
+ \Changes@InHighlight > 0 \or%
+ \Changes@InComment > 0%
+ }%
+ {%
+ \Changes@summaryline{added}{\Changes@InAdded}{\changesaddname}{\\}%
+ \Changes@summaryline{deleted}{\Changes@InDeleted}{\changesdeletename}{\\}%
+ \Changes@summaryline{replaced}{\Changes@InReplaced}{\changesreplacename}{\\}%
+ \Changes@summaryline{highlight}{\Changes@InHighlight}{\changeshighlightname}{\\}%
+ \Changes@summaryline{comment}{\Changes@InComment}{\changescommentname}{\\[1ex]}%
+ }%
+ {%
+ \parbox{\Changes@summary@width}{\changesnochanges}\\[1ex]%
+ }%
+ \fi%
+ }%
+ \closein\Changes@InFile%
+ }{%
+ \emph{\changesnosoc}%
+ \PackageWarning{changes}{LaTeX rerun needed for summary of changes}%
+ }%
+ }{}%
+% \end{macrocode}
+% In final mode print nothing.
+% \begin{macrocode}
+ }{}%
+}
+% \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 \hologo{LaTeX}-formatted text, so they can simply be read via \chcommand{input}.
+%
+% The order of entries is: id, color, name, added, deleted, replaced, comment, highlight.
+% 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@addedCount\Changes@ID};%
+ \the\value{Changes@deletedCount\Changes@ID};%
+ \the\value{Changes@replacedCount\Changes@ID};%
+ \the\value{Changes@highlightCount\Changes@ID};%
+ \the\value{Changes@commentCount\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}
+%
+% Write content of listofchanges to file.
+% \begin{macrocode}
+ \if@filesw
+ \@ifundefined{tf@loc}{%
+ \expandafter\newwrite\csname tf@loc\endcsname
+ \immediate\openout \csname tf@loc\endcsname \jobname.loc\relax
+ }{}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</changes>
+% \end{macrocode}
+%
+% \PrintChanges
+% \PrintIndex
+%
+%\Finale
+\endinput