% \CheckSum{966}
%
% \iffalse meta-comment
%
%  Copyright (C) 2007-2013
%  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}
% \GetFileInfo{changes.dtx}
% \RecordChanges
%
%^^A --------------------------------------------------------------------------
%
% \maketitle
%
% \tableofcontents
% \cleardoublepage
%
% \ifENGLISH
% 	\input{userdoc/changes.en}
% \fi
% \ifGERMAN
% 	\input{userdoc/changes.de}
% \fi
%
%^^A -- source code
%
% \StopEventually
%
% \selectlanguage{english}
%
% \section{The documented sourcecode}
%
% The sourcecode is documented in English only.
% This is intended, please do not provide translations for the text below, just corrections or improvements.
%
%    \begin{macrocode}
%<*changes>
%    \end{macrocode}
%
% \subsection{Package information and options}
%
% Set needed \LaTeX-format to \LaTeXe{}, provide name, date, version.
% Type some information to the console.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{changes}
[2014/10/15 v2.0.3 changes package]
\typeout{*** changes package 2014/10/15 v2.0.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}
%
% \subsubsection{Package options}
%
% Option \choption{draft}, \emph{default} is \texttt{true}.
%    \begin{macrocode}
\newboolean{Changes@optiondraft}
\setboolean{Changes@optiondraft}{true}
\DeclareOptionX{draft}{
	\setboolean{Changes@optiondraft}{true}
	\typeout{changes-option '\CurrentOption'}
}
%    \end{macrocode}
%
% Option \choption{final}, sets \choption{draft} to \texttt{false}.
%    \begin{macrocode}
\DeclareOptionX{final}{
	\setboolean{Changes@optiondraft}{false}
	\typeout{changes-option '\CurrentOption'}
}
%    \end{macrocode}
%
% Declare storage for markup options, they are set by the markup option but can be changed with the more special options, therefore they have to be declared at this place.
%    \begin{macrocode}
\newcommand{\Changes@optionaddedmarkup}{none}
\newcommand{\Changes@optiondeletedmarkup}{sout}
%    \end{macrocode}
%
% Option \choption{markup}, sets markup options accordingly.
%    \begin{macrocode}
\newcommand{\Changes@optionmarkup}{default}
\DeclareOptionX{markup}{
	\ifthenelse{\equal{\@empty}{#1}}
		{}
		{
			\ifthenelse{
				\equal{#1}{default}\or
				\equal{#1}{underlined}\or
				\equal{#1}{bfit}\or
				\equal{#1}{nocolor}
			}
				{\renewcommand{\Changes@optionmarkup}{#1}}
				{\PackageWarning{changes}{markup '#1' unknown, using '\Changes@optionmarkup'}}
		}
	\ifthenelse{\equal{\Changes@optionmarkup}{default}}
		{
			\renewcommand{\Changes@optionaddedmarkup}{none}
			\renewcommand{\Changes@optiondeletedmarkup}{sout}
		}
		{}
	\ifthenelse{\equal{\Changes@optionmarkup}{underlined}}
		{
			\renewcommand{\Changes@optionaddedmarkup}{uline}
			\renewcommand{\Changes@optiondeletedmarkup}{sout}
		}
		{}
	\ifthenelse{\equal{\Changes@optionmarkup}{bfit}}
		{
			\renewcommand{\Changes@optionaddedmarkup}{bf}
			\renewcommand{\Changes@optiondeletedmarkup}{it}
		}
		{}
	\ifthenelse{\equal{\Changes@optionmarkup}{nocolor}}
		{
			\renewcommand{\Changes@optionaddedmarkup}{uline}
			\renewcommand{\Changes@optiondeletedmarkup}{sout}
		}
		{}
	\typeout{changes-option 'markup=\Changes@optionmarkup'}
}
%    \end{macrocode}
%
% Option \choption{addedmarkup}, stored or set to default value ``\texttt{none}''.
%    \begin{macrocode}
\DeclareOptionX{addedmarkup}{
	\ifthenelse{\equal{\@empty}{#1}}
		{}
		{
			\ifthenelse{
				\equal{#1}{none}\or
				\equal{#1}{uline}\or
				\equal{#1}{uuline}\or
				\equal{#1}{uwave}\or
				\equal{#1}{dashuline}\or
				\equal{#1}{dotuline}\or
				\equal{#1}{sout}\or
				\equal{#1}{xout}\or
				\equal{#1}{bf}\or
				\equal{#1}{it}\or
				\equal{#1}{sl}\or
				\equal{#1}{em}
			}
				{\renewcommand{\Changes@optionaddedmarkup}{#1}}
				{\PackageWarning{changes}{addedmarkup '#1' unknown, using '\Changes@optionaddedmarkup'}}
		}
	\typeout{changes-option 'addedmarkup=\Changes@optionaddedmarkup'}
}
%    \end{macrocode}
%
% Option \choption{deletedmarkup}, stored or set to default value ``\texttt{striked}''.
%    \begin{macrocode}
\DeclareOptionX{deletedmarkup}{
	\ifthenelse{\equal{\@empty}{#1}}
		{}
		{
			\ifthenelse{
				\equal{#1}{none}\or
				\equal{#1}{uline}\or
				\equal{#1}{uuline}\or
				\equal{#1}{uwave}\or
				\equal{#1}{dashuline}\or
				\equal{#1}{dotuline}\or
				\equal{#1}{sout}\or
				\equal{#1}{xout}\or
				\equal{#1}{bf}\or
				\equal{#1}{it}\or
				\equal{#1}{sl}\or
				\equal{#1}{em}
			}
				{\renewcommand{\Changes@optiondeletedmarkup}{#1}}
				{\PackageWarning{changes}{deletedmarkup '#1' unknown, using '\Changes@optiondeletedmarkup'}}
		}
	\typeout{changes-option 'deletedmarkup=\Changes@optiondeletedmarkup'}
}
%    \end{macrocode}
%
% Declare storage for authormarkup option and store option value or set to default value ``\texttt{superscript}''.
%    \begin{macrocode}
\newcommand{\Changes@optionauthormarkup}{superscript}
\DeclareOptionX{authormarkup}{
	\ifthenelse{\equal{\@empty}{#1}}
		{}
		{
			\ifthenelse{
				\equal{#1}{superscript}\or
				\equal{#1}{subscript}\or
				\equal{#1}{brackets}\or
				\equal{#1}{footnote}\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{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=black
}{}
%    \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}}
%    \end{macrocode}
%
% Set the default values of the options.
%    \begin{macrocode}
\presetkeys{Changes@added}{
	id=\@empty,
	remark=\@empty
}{}
%    \end{macrocode}
%
% \minisec{\chcommand{deleted}}
%
% Declare available options of the command, define value storage.
%    \begin{macrocode}
\DeclareOptionX<Changes@deleted>{id}{\def\Changes@deleted@id{#1}}
\DeclareOptionX<Changes@deleted>{remark}{\def\Changes@deleted@remark{#1}}
%    \end{macrocode}
%
% Set the default values of the options.
%    \begin{macrocode}
\presetkeys{Changes@deleted}{
	id=\@empty,
	remark=\@empty
}{}
%    \end{macrocode}
%
% \minisec{\chcommand{replaced}}
%
% Declare available options of the command, define value storage.
%    \begin{macrocode}
\DeclareOptionX<Changes@replaced>{id}{\def\Changes@replaced@id{#1}}
\DeclareOptionX<Changes@replaced>{remark}{\def\Changes@replaced@remark{#1}}
%    \end{macrocode}
%
% Set the default values of the options.
%    \begin{macrocode}
\presetkeys{Changes@replaced}{
	id=\@empty,
	remark=\@empty
}{}
%    \end{macrocode}
%
% \minisec{\chcommand{listofchanges}}
%
% Declare available options of the command, define value storage.
%    \begin{macrocode}
\DeclareOptionX<Changes@loc>{style}{\def\Changes@loc@style{#1}}
%    \end{macrocode}
%
% Set the default values of the options.
%    \begin{macrocode}
\presetkeys{Changes@loc}{
	style=list
}{}
%    \end{macrocode}
%
% \subsubsection{Option processing}
%
% Process the options.
%    \begin{macrocode}
\ProcessOptionsX*\relax
%    \end{macrocode}
%
% \subsection{Packages}
%
% Package \chpackage{xcolor} provides colored text.
% Package \chpackage{pdfcolmk} solves the problem of colored text and page breaks (has to be loaded after \chpackage{xcolor}).
%    \begin{macrocode}
\newboolean{Changes@colored}
\setboolean{Changes@colored}{true}
\ifthenelse{\equal{\Changes@optionmarkup}{nocolor}}
	{\setboolean{Changes@colored}{false}}
	{}
\ifthenelse{\boolean{Changes@colored}}
	{
		\RequirePackage{xcolor}
		\RequirePackage{pdfcolmk}
	}
	{}
%    \end{macrocode}
%
% Package \chpackage{ulem} provides commands for striking out text.
%    \begin{macrocode}
\ifthenelse{
	\equal{\Changes@optionaddedmarkup}{uline}\or
	\equal{\Changes@optionaddedmarkup}{uuline}\or
	\equal{\Changes@optionaddedmarkup}{uwave}\or
	\equal{\Changes@optionaddedmarkup}{dashuline}\or
	\equal{\Changes@optionaddedmarkup}{dotuline}\or
	\equal{\Changes@optionaddedmarkup}{sout}\or
	\equal{\Changes@optionaddedmarkup}{xout}\or
	\equal{\Changes@optiondeletedmarkup}{uline}\or
	\equal{\Changes@optiondeletedmarkup}{uuline}\or
	\equal{\Changes@optiondeletedmarkup}{uwave}\or
	\equal{\Changes@optiondeletedmarkup}{dashuline}\or
	\equal{\Changes@optiondeletedmarkup}{dotuline}\or
	\equal{\Changes@optiondeletedmarkup}{sout}\or
	\equal{\Changes@optiondeletedmarkup}{xout}
}
	{\RequirePackage[normalem,normalbf]{ulem}}
	{}
%    \end{macrocode}
%
% \subsection{Language dependent texts}
%
% Declaration of language dependent names and identifiers.
% The check for \chcommand{addto} is a check for the \chpackage{babel} package.
% If the babel package is not loaded, the default language is English, in order to use another language, the user has to redefine the variables.
%    \begin{macrocode}
\ifthenelse{\isundefined{\addto}}
	{
		\def\listofchangesname{List of changes}
		\def\summaryofchangesname{Changes}
		\def\changesaddname{Added}
		\def\changesdeletename{Deleted}
		\def\changesreplacename{Replaced}
		\def\changesauthorname{Author}
		\def\changesanonymousname{anonymous}
		\def\changesnoloc{List of changes is available after the next \LaTeX\ run.}
		\def\changesnosoc{Summary of changes is available after the next \LaTeX\ run.}
	}{
		\addto\captionsngerman{\def\listofchangesname{Liste der \"Anderungen}}
		\addto\captionsngerman{\def\summaryofchangesname{\"Anderungen}}
		\addto\captionsngerman{\def\changesaddname{Eingef\"ugt}}
		\addto\captionsngerman{\def\changesdeletename{Gel\"oscht}}
		\addto\captionsngerman{\def\changesreplacename{Ersetzt}}
		\addto\captionsngerman{\def\changesauthorname{Autor}}
		\addto\captionsngerman{\def\changesanonymousname{Anonym}}
		\addto\captionsngerman{\def\changesnoloc{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\changesaddname{Eingef\"ugt}}
		\addto\captionsgerman{\def\changesdeletename{Gel\"oscht}}
		\addto\captionsgerman{\def\changesreplacename{Ersetzt}}
		\addto\captionsgerman{\def\changesauthorname{Autor}}
		\addto\captionsgerman{\def\changesanonymousname{Anonym}}
		\addto\captionsgerman{\def\changesnoloc{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\changesaddname{Added}}
		\addto\captionsenglish{\def\changesdeletename{Deleted}}
		\addto\captionsenglish{\def\changesreplacename{Replaced}}
		\addto\captionsenglish{\def\changesauthorname{Author}}
		\addto\captionsenglish{\def\changesanonymousname{anonymous}}
		\addto\captionsenglish{\def\changesnoloc{List of changes is available after the next \LaTeX\ run.}}
		\addto\captionsenglish{\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\changesaddname{Aggiunte}}
		\addto\captionsitalian{\def\changesdeletename{Cancellazioni}}
		\addto\captionsitalian{\def\changesreplacename{Sostituzioni}}
		\addto\captionsitalian{\def\changesauthorname{Autore}}
		\addto\captionsitalian{\def\changesanonymousname{anonimo}}
		\addto\captionsitalian{\def\changesnoloc{La lista delle modifiche sar\`a disponibile alla prossima esecuzione di \LaTeX.}}
		\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: black).
%
%  Store id, name and color using named variables.
%  Define counter and color per author.
%    \begin{macrocode}
\newcommand*\definechangesauthor[2][]{%
%    \end{macrocode}
%
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
%    \begin{macrocode}
	\setkeys{Changes@definechangesauthor}{#1}
%    \end{macrocode}
%
% Increment author counter, later needed for \emph{while} loop of authors.
%    \begin{macrocode}
	\stepcounter{Changes@AuthorCount}
%    \end{macrocode}
%
% Store the id in a name with the given counter/index.
% All other storage refers to the id.
%    \begin{macrocode}
	\@namedef{Changes@AuthorID\theChanges@AuthorCount}{#2}
%    \end{macrocode}
%
% Store the author's definition in according variables/colors, create change counters.
%    \begin{macrocode}
	\expandafter
	\let\csname Changes@AuthorName#2\endcsname=\Changes@definechangesauthor@name
	\newcounter{Changes@AddCount#2}
	\newcounter{Changes@DeleteCount#2}
	\newcounter{Changes@ReplaceCount#2}
	\ifthenelse{\boolean{Changes@colored}}
		{
			\expandafter
			\let\csname Changes@AuthorColor#2\endcsname=\Changes@definechangesauthor@color
			\colorlet{Changes@Color#2}{\@nameuse{Changes@AuthorColor#2}}
		}
		{}
}
%    \end{macrocode}
% \end{macro}
%
% Define default-author (anonymous) with empty id and blue color.
%    \begin{macrocode}
\definechangesauthor[color=blue]{\@empty}
%    \end{macrocode}
%
%
% \subsubsection{Author markup}
%
% \begin{macro}{\Changes@Markup@Author}
% Store markup for authors.
%    \begin{macrocode}
\newcommand{\Changes@Markup@Author}[1]{%
	\ifthenelse{\equal{\Changes@optionauthormarkup}{superscript}}{\textsuperscript{#1}}{}%
	\ifthenelse{\equal{\Changes@optionauthormarkup}{subscript}}{\textsubscript{#1}}{}%
	\ifthenelse{\equal{\Changes@optionauthormarkup}{brackets}}{(#1)}{}%
	\ifthenelse{\equal{\Changes@optionauthormarkup}{footnote}}{\footnote{#1}}{}%
	\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}{\textsubscript}
% Define the command \chcommand{textsubscript} in case the author markup \choption{subscript} is used and the command \chcommand{textsubscript} is not defined yet.
% \chcommand{textsubscript} is the antagonist of \chcommand{textsuperscript} which is predefined in \LaTeX.
% The code is taken from \LaTeX-FAQ 8.5.17.
%    \begin{macrocode}
\ifthenelse{\isundefined{\textsubscript}}
	{
		\DeclareRobustCommand*\textsubscript[1]{\@textsubscript{\selectfont#1}}
		\newcommand{\@textsubscript}[1]{{\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}
	}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setauthormarkupposition}
% Set position for author markup text.
%    \begin{macrocode}
\newcommand{\setauthormarkupposition}[1]{
	\renewcommand{\Changes@optionauthormarkupposition}{#1}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setauthormarkuptext}
% Set author markup text to be displayed.
%    \begin{macrocode}
\newcommand{\setauthormarkuptext}[1]{
	\renewcommand{\Changes@optionauthormarkuptext}{#1}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\Changes@Remark}
%  Markup of remarks.
%  Default: in a footnote.
%    \begin{macrocode}
\newcommand{\Changes@Remark}[2]{%
	\footnote{%
		\ifthenelse{\not\equal{#1}{\@empty}}%
			{#1: }%
			{}%
		#2%
	}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setremarkmarkup}
%  Redefining the remark markup.
%  Mandatory argument: markup definition.
%    \begin{macrocode}
\newcommand{\setremarkmarkup}[1]{%
	\renewcommand{\Changes@Remark}[2]{#1}%
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Change management commands}
%
% \subsubsection{Text markup definition}
%
% Replaced text is always typeset as follows: \meta{added text}\meta{deleted text}.
% Therefore no extra command for markup of replaced text is given.
%
% \begin{macro}{\Changes@Markup@Added}
% Store markup for added text.
%    \begin{macrocode}
\newcommand{\Changes@Markup@Added}[1]{%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{none}}{#1}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{uline}}{\uline{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{uuline}}{\uuline{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{uwave}}{\uwave{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{dashuline}}{\dashuline{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{dotuline}}{\dotuline{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{sout}}{\sout{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{xout}}{\xout{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{bf}}{\textbf{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{it}}{\textit{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{sl}}{\textsl{#1}}{}%
	\ifthenelse{\equal{\Changes@optionaddedmarkup}{em}}{\emph{#1}}{}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setaddedmarkup}
% Set markup for added text.
%    \begin{macrocode}
\newcommand{\setaddedmarkup}[1]{
	\renewcommand{\Changes@Markup@Added}[1]{#1}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\Changes@Markup@Deleted}
% Store markup for deleted text.
%    \begin{macrocode}
\newcommand{\Changes@Markup@Deleted}[1]{%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{none}}{#1}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{uline}}{\uline{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{uuline}}{\uuline{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{uwave}}{\uwave{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{dashuline}}{\dashuline{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{dotuline}}{\dotuline{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{sout}}{\sout{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{xout}}{\xout{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{bf}}{\textbf{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{it}}{\textit{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{sl}}{\textsl{#1}}{}%
	\ifthenelse{\equal{\Changes@optiondeletedmarkup}{em}}{\emph{#1}}{}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setdeletedmarkup}
% Set markup for deleted text.
%    \begin{macrocode}
\newcommand{\setdeletedmarkup}[1]{
	\renewcommand{\Changes@Markup@Deleted}[1]{#1}
}
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{Change management command definition}
%
% \begin{macro}{\Changes@output}
% Output command for the changed text.
% This command has the following arguments:
% \begin{enumerate}
%		\item changed text (including markup)
%		\item unchanged text
%		\item author's id
%		\item remark
%		\item text for list of changes
%		\item change type for list of changes
% \end{enumerate}
% Define boolean for author test.
%    \begin{macrocode}
\newboolean{Changes@WrongID}
\newcommand{\Changes@output}[6]{%
%    \end{macrocode}
%	Output changed text if option \choption{draft} is set, otherwise output unchanged text.
%    \begin{macrocode}
	\ifthenelse{\boolean{Changes@optiondraft}}%
		{%
%    \end{macrocode}
%	Check if the author exists, error message otherwise.
% I have the feeling that this code is optimizable.
%    \begin{macrocode}
			\setboolean{Changes@WrongID}{true}%
			\setcounter{Changes@Author}{0}%
			\whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{%
				\stepcounter{Changes@Author}%
				\ifthenelse{\equal{#3}{\@nameuse{Changes@AuthorID\theChanges@Author}}}%
					{\setboolean{Changes@WrongID}{false}}%
					{}%
			}%
			\ifthenelse{\boolean{Changes@WrongID}}%
				{\PackageError{changes}%
					{Undefined changes author: #3}%
					{You have to define the author #3 with e.g.: \definechangesauthor{#3}}}%
				{}%
%    \end{macrocode}
%	Save author text for output.
%    \begin{macrocode}
			\ifthenelse{\equal{\Changes@optionauthormarkuptext}{id}}%
				{\@namedef{Changes@AuthorText}{#3}}%
				{}%
			\ifthenelse{\equal{\Changes@optionauthormarkuptext}{name}}%
				{\@namedef{Changes@AuthorText}{\@nameuse{Changes@AuthorName#3}}}%
				{}%
			{%
%    \end{macrocode}
%	Change color, if colored text is used.
%    \begin{macrocode}
				\ifthenelse{\boolean{Changes@colored}}%
					{\color{Changes@Color#3}}%
					{}%
%    \end{macrocode}
%	Output author text if author's id is given and text should appear left of changes.
%    \begin{macrocode}
				\ifthenelse{\equal{\Changes@optionauthormarkupposition}{left} \and \not\equal{#3}{\@empty}}%
					{\Changes@Markup@Author{\@nameuse{Changes@AuthorText}}}%
					{}%
%    \end{macrocode}
%	Output changed text.
%    \begin{macrocode}
				{#1}%
%    \end{macrocode}
%	Output author text if author's id is given and text should appear right of changes.
%    \begin{macrocode}
				\ifthenelse{\equal{\Changes@optionauthormarkupposition}{right} \and \not\equal{#3}{\@empty}}%
					{\Changes@Markup@Author{\@nameuse{Changes@AuthorText}}}%
					{}%
%    \end{macrocode}
%	Output remark if a remark is given.
%    \begin{macrocode}
				\ifthenelse{\not\equal{#4}{\@empty}}%
					{\Changes@Remark{#3}{#4}}%
					{}%
			}%
%    \end{macrocode}
%	Store line for list of changes.
%    \begin{macrocode}
			\ifthenelse{\equal{\@empty}{#3}}%
				{\def\Changes@locid{}}%
				{\def\Changes@locid{~(#3)}}%
			\addcontentsline{loc}{subsection}{#6\Changes@locid: \truncate{.3\textwidth}{#5}}%
		}%
%    \end{macrocode}
%	Output unchanged text (option \choption{final} was set).
%    \begin{macrocode}
		{#2}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\added}
%  The command formats text as new text.
%
%  Mandatory argument: added text.
%  Optional argument (key-value): author's id, remark
%    \begin{macrocode}
\newcommand{\added}[2][\@empty]{%
%    \end{macrocode}
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
%    \begin{macrocode}
	\setkeys{Changes@added}{#1}%
	\Changes@output%
		{\Changes@Markup@Added{#2}}%
		{#2}%
		{\Changes@added@id}%
		{\Changes@added@remark}%
		{#2}%
		{\changesaddname}%
	\stepcounter{Changes@AddCount\Changes@added@id}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\deleted}
%  The command formats text as deleted text.
%
%  The definition of the empty text for unchanged text is taken from a tip from \texttt{de.comp.text.tex}.
%  It solves the problem of additional space caused by an empty command.
%
%  Mandatory argument: deleted text.
%  Optional argument (key-value): author's id, remark
%    \begin{macrocode}
\newcommand{\deleted}[2][\@empty]{%
%    \end{macrocode}
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
%    \begin{macrocode}
	\setkeys{Changes@deleted}{#1}%
	\Changes@output%
		{\Changes@Markup@Deleted{#2}}%
		{\@bsphack \expandafter \@esphack}%
		{\Changes@deleted@id}%
		{\Changes@deleted@remark}%
		{#2}%
		{\changesdeletename}%
	\stepcounter{Changes@DeleteCount\Changes@deleted@id}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\replaced}
%  The command formats text as replaced text.
%
%  Mandatory arguments: new text and old text.
%  Optional argument (key-value): author's id, remark
%    \begin{macrocode}
\newcommand{\replaced}[3][\@empty]{%
%    \end{macrocode}
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
%    \begin{macrocode}
	\setkeys{Changes@replaced}{#1}%
	\Changes@output
		{{\Changes@Markup@Added{#2}}{\Changes@Markup@Deleted{#3}}}
		{#2}
		{\Changes@replaced@id}
		{\Changes@replaced@remark}%
		{#2}%
		{\changesreplacename}%
	\stepcounter{Changes@ReplaceCount\Changes@replaced@id}%
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{List of changes}
%
% The list of changes truncates text, therefore the \chpackage{truncate} package is used.
%    \begin{macrocode}
\RequirePackage[breakall]{truncate}
%    \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.
%  The contents have to be separated by a semicolon.
%    \begin{macrocode}
\def\changes@chopline#1;#2;#3;#4;#5;#6 \\{
	\def\Changes@InID{#1}
	\def\Changes@InColor{#2}
	\def\Changes@InName{#3}
	\def\Changes@InAdded{#4}
	\def\Changes@InDeleted{#5}
	\def\Changes@InReplaced{#6}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\listofchanges}
%		This command outputs the list of changes.
%
% 	Two styles are available: \choption{list} (default) and \choption{summary}.
% 	\choption{list} prints the list of changes lika a list of figures.
% 	\choption{summary} prints a summary of changes separated by authors.
%
% 	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.
%	In further versions: compute length of bounding box für summary.
%    \begin{macrocode}
\newlength{\Changes@Len@summ}
\setlength{\Changes@Len@summ}{.2\textwidth}
\newboolean{Changes@MoreLines}
%    \end{macrocode}
% The definition of \chcommand{listofchanges}.
%    \begin{macrocode}
\newcommand{\listofchanges}[1][style=list]{%
	\setkeys{Changes@loc}{#1}%
	\ifthenelse{\equal{\@empty}{\Changes@loc@style}}
		{\def\Changes@loc@style{list}}
		{
			\ifthenelse{
				\equal{\Changes@loc@style}{list}\or
				\equal{\Changes@loc@style}{summary}
			}
				{}
				{\def\Changes@loc@style{list}}
		}
%    \end{macrocode}
%	Print list.
%    \begin{macrocode}
	\ifthenelse{\equal{\Changes@loc@style}{list}}
		{
			\section*{\listofchangesname}
			\IfFileExists{\jobname.loc}
				{}{
					\emph{\changesnoloc}
					\PackageWarning{changes}{LaTeX rerun needed for list of changes}
				}
			\@starttoc{loc}{}
		}
%    \end{macrocode}
%	Print summary, but only in draft mode.
%    \begin{macrocode}
		{
			\ifthenelse{\boolean{Changes@optiondraft}}
				{
					\section*{\summaryofchangesname}
					\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{\boolean{Changes@colored}}
											{\color{\Changes@InColor}}
											{}
										\ifthenelse{\equal{\Changes@InID}{\@empty}}
											{\changesauthorname: \changesanonymousname}
											{%
												\changesauthorname: \Changes@InID
												\ifthenelse{\equal{\Changes@InName}{\@empty}}
													{}
													{ (\Changes@InName)}
											}
									}\\
									\parbox{\Changes@Len@summ}{\changesaddname~\dotfill~\Changes@InAdded}\\
									\parbox{\Changes@Len@summ}{\changesdeletename~\dotfill~\Changes@InDeleted}\\
									\parbox{\Changes@Len@summ}{\changesreplacename~\dotfill~\Changes@InReplaced}\\[1ex]
								\fi
							}
							\closein\Changes@InFile
						}{%
							\emph{\changesnosoc}
							\PackageWarning{changes}{LaTeX rerun needed for summary of changes}
						}
				}{}
		}
}
%    \end{macrocode}
% \end{macro}
%
%  At the end of the document: write the list of changes in the loc-file, therefore open file, write values, close file.
%  Changes are written as \LaTeX-formatted text, so they can simply be read via \chcommand{input}.
%
%  The order of entries is: id, color, name, added, deleted, replaced.
%  The contents have to be separated by a semicolon.
%    \begin{macrocode}
\AtEndDocument{
%    \end{macrocode}
% Open output file.
%    \begin{macrocode}
	\newwrite\Changes@OutFile
	\immediate\openout\Changes@OutFile = \jobname.\Changes@extension
%    \end{macrocode}
% Redefine expandable of \chcommand{protect} in order to write correct special characters.
% Store original definition for resetting \chcommand{protect}.
%    \begin{macrocode}
	\let\Changes@protect\protect
	\let\protect\@unexpandable@protect
%    \end{macrocode}
% Output data for list of changes.
%    \begin{macrocode}
	\setcounter{Changes@Author}{0}
	\whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{
		\stepcounter{Changes@Author}
		\def\Changes@ID{\@nameuse{Changes@AuthorID\theChanges@Author}}
		\immediate\write\Changes@OutFile{\Changes@ID;%
			\@nameuse{Changes@AuthorColor\Changes@ID};%
			\@nameuse{Changes@AuthorName\Changes@ID};%
			\the\value{Changes@AddCount\Changes@ID};%
			\the\value{Changes@DeleteCount\Changes@ID};%
			\the\value{Changes@ReplaceCount\Changes@ID}}
	}
%    \end{macrocode}
% Close output file.
%    \begin{macrocode}
	\immediate\closeout\Changes@OutFile
%    \end{macrocode}
% Restore original definition of \chcommand{protect}.
%    \begin{macrocode}
	\let\protect\Changes@protect
}
%    \end{macrocode}
%
%    \begin{macrocode}
%</changes>
%    \end{macrocode}
%
% \PrintChanges
% \PrintIndex
%
%\Finale
\endinput

