% \CheckSum{1509}
%
% \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}
% \changes{v3.2.0}{2019/10/28}{Merge changes script (pyMergeChanges): Support nested brackets}
% \changes{v3.2.1}{2019/11/17}{removed obsolete package pdfcolmk}
% \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/11/17 v3.2.1 changes package]
\typeout{*** changes package 2019/11/17 v3.2.1 ***}
%    \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.
%    \begin{macrocode}
\ifthenelse{\isColored}
	{
		\RequirePackage{xcolor}
	}
	{}
%    \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
