diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/changes/changes.dtx |
Initial commit
Diffstat (limited to 'macros/latex/contrib/changes/changes.dtx')
-rw-r--r-- | macros/latex/contrib/changes/changes.dtx | 1849 |
1 files changed, 1849 insertions, 0 deletions
diff --git a/macros/latex/contrib/changes/changes.dtx b/macros/latex/contrib/changes/changes.dtx new file mode 100644 index 0000000000..1ca69d8a93 --- /dev/null +++ b/macros/latex/contrib/changes/changes.dtx @@ -0,0 +1,1849 @@ +% \CheckSum{1510} +% +% \iffalse meta-comment +% +% Copyright (C) 2007-2019 +% Ekkart Kleinod (ekleinod@edgesoft.de) +% -------------------------------------------------------------------------- +% +% This work may be distributed and/or modified under the +% conditions of the \LaTeX\ Project Public License, either version~1.3 +% of this license or any later version. +% The latest version of this license is in\\ +% \url{http://www.latex-project.org/lppl.txt}\\ +% and version~1.3 or later is part of all distributions of \LaTeX\ +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status "maintained". +% The current maintainer of this work is Ekkart Kleinod. +% +% Some code for providing multilanguage documentation was +% used from the pst-pdf package by Rolf Niepraschk and Hubert Gaesslein. +% \fi +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% \changes{v0.1}{2007/01/16}{Initial version.} +% \changes{v0.2}{2007/01/17}{new convenience commands, LPPL, bugfixes: missing babel package, ifthen-placement, loc, author markup} +% \changes{v0.3}{2007/01/22}{english documentation, replaced command changed with command replaced} +% \changes{v0.4}{2007/01/24}{pdfcolmk for improved markup, introduced author-ids, first CTAN version} +% \changes{v0.5}{2007/08/26}{reimplementation without array package, UTF-8, grayed text, change pf command arguments} +% \changes{v0.5.1}{2007/08/27}{deleted text is striked out again using package ulem, greying didn't work} +% \changes{v0.5.2}{2007/10/10}{package options for ulem and xcolor} +% \changes{v0.5.3}{2010/11/22}{use class options (final, draft) as well} +% \changes{v0.5.4}{2011/04/25}{extract user documentation; default language changed to English; script for removal of commands} +% \changes{v0.6.0}{2012/01/11}{redefined user interface for setting options, markup, authors; newly structured documentation} +% \changes{v1.0.0}{2012/04/25}{key-value-interface for change commands; special characters in list of changes} +% \changes{v2.0.0}{2013/06/30}{fixed problem with special characters in tabbing environment (loc), real list of changes, authormarkup} +% \changes{v2.0.1}{2013/08/10}{no changes in behavior or code; fixed problems with CTAN upload} +% \changes{v2.0.2}{2013/08/13}{again no changes in behavior or code; fixed CTAN upload - pdf files were corrupt; improved documentation} +% \changes{v2.0.3}{2014/10/15}{bugfix when using with amsart} +% \changes{v2.0.4}{2015/04/27}{unknown language does not lead to error: fallback English} +% \changes{v2.1.0}{2018/10/10}{fixed problems with final option and additional spaces/blanks, warning for wrong list style} +% \changes{v3.0.0}{2018/11/04}{commands for commenting and highlighting text, rewriting a lot of code, remark is now comment} +% \changes{v3.1.0}{2018/12/17}{new script for markup removal, improved user manual} +% \changes{v3.1.1}{2018/12/18}{bugfix: uneven dot fills in summaries} +% \changes{v3.1.2}{2019/01/26}{bugfix: problems with amsart class} +% \changes{v3.1.3}{2019/07/21}{bugfix: option clash for ulem and truncate; documentation of known problems and solutions} +% \GetFileInfo{changes.dtx} +% \RecordChanges +% +%^^A -------------------------------------------------------------------------- +% +% \maketitle +% +% \tableofcontents +% \cleardoublepage +% +% \ifENGLISH +% \input{userdoc/changes.en} +% \fi +% \ifGERMAN +% \input{userdoc/changes.de} +% \fi +% +%^^A -- source code +% +% \StopEventually +% +% \selectlanguage{english} +% +% \cleardoublepage +% \section{The documented sourcecode} +% +% The sourcecode is documented in English only. +% This is intended, please do not provide translations for the text below, just corrections or improvements. +% +% \begin{macrocode} +%<*changes> +% \end{macrocode} +% +% \subsection{Package information and options} +% +% Set needed \hologo{LaTeX}-format to \hologo{LaTeXe}, provide name, date, version. +% Type some information to the console. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{changes} +[2019/07/21 v3.1.3 changes package] +\typeout{*** changes package 2019/07/21 v3.1.3 ***} +% \end{macrocode} +% +% Package \chpackage{xkeyval} provides options with key-value-pairs. +% \begin{macrocode} +\RequirePackage{xkeyval} +% \end{macrocode} +% +% Package \chpackage{xifthen} provides improved \texttt{if} as well as a \texttt{while}-loop. +% \begin{macrocode} +\RequirePackage{xifthen} +% \end{macrocode} +% +% Package \chpackage{xstring} provides improved string test and handling methods. +% \begin{macrocode} +\RequirePackage{xstring} +% \end{macrocode} +% +% \subsubsection{Package options} +% +% Option \choption{draft}, \emph{default} is \texttt{true}. +% \begin{macrocode} +\newboolean{Changes@optiondraft} +\setboolean{Changes@optiondraft}{true} +\DeclareOptionX{draft}{ + \setboolean{Changes@optiondraft}{true} + \typeout{changes-option '\CurrentOption'} +} +% \end{macrocode} +% +% Option \choption{final}, sets \choption{draft} to \texttt{false}. +% \begin{macrocode} +\DeclareOptionX{final}{ + \setboolean{Changes@optiondraft}{false} + \typeout{changes-option '\CurrentOption'} +} +% \end{macrocode} +% +% Declare storage for markup options, they are set by the markup option but can be changed with the more special options, therefore they have to be declared at this place. +% Replacement markup is a combination of added and deleted markup, thus there is no special markup storage. +% \begin{macrocode} +\newcommand{\Changes@optionaddedmarkup}{colored} +\newcommand{\Changes@optiondeletedmarkup}{sout} +\newcommand{\Changes@optionhighlightmarkup}{background} +\newcommand{\Changes@optioncommentmarkup}{todo} +% \end{macrocode} +% +% Option \choption{markup}, sets markup options accordingly. +% \begin{macrocode} +\newcommand{\Changes@optionmarkup}{default} +\DeclareOptionX{markup}{ + \ifthenelse{\equal{\@empty}{#1}} + {} + { + \ifthenelse{ + \equal{#1}{default}\or + \equal{#1}{underlined}\or + \equal{#1}{bfit}\or + \equal{#1}{nocolor} + } + {\renewcommand{\Changes@optionmarkup}{#1}} + {\PackageWarning{changes}{markup '#1' unknown, using '\Changes@optionmarkup'}} + } + \ifthenelse{\equal{\Changes@optionmarkup}{default}} + { + % nothing to do + } + {} + \ifthenelse{\equal{\Changes@optionmarkup}{underlined}} + { + \renewcommand{\Changes@optionaddedmarkup}{uline} + \renewcommand{\Changes@optionhighlightmarkup}{uwave} + } + {} + \ifthenelse{\equal{\Changes@optionmarkup}{bfit}} + { + \renewcommand{\Changes@optionaddedmarkup}{bf} + \renewcommand{\Changes@optiondeletedmarkup}{it} + } + {} + \ifthenelse{\equal{\Changes@optionmarkup}{nocolor}} + { + \renewcommand{\Changes@optionaddedmarkup}{uline} + \renewcommand{\Changes@optionhighlightmarkup}{uwave} + } + {} + \typeout{changes-option 'markup=\Changes@optionmarkup'} +} +% \end{macrocode} +% +% Option \choption{addedmarkup}, stored or set to default value ``\texttt{colored}''. +% \begin{macrocode} +\DeclareOptionX{addedmarkup}{ + \ifthenelse{\equal{\@empty}{#1}} + {} + { + \ifthenelse{ + \equal{#1}{colored}\or + \equal{#1}{uline}\or + \equal{#1}{uuline}\or + \equal{#1}{uwave}\or + \equal{#1}{dashuline}\or + \equal{#1}{dotuline}\or + \equal{#1}{bf}\or + \equal{#1}{it}\or + \equal{#1}{sl}\or + \equal{#1}{em} + } + {\renewcommand{\Changes@optionaddedmarkup}{#1}} + {\PackageWarning{changes}{addedmarkup '#1' unknown, using '\Changes@optionaddedmarkup'}} + } + \typeout{changes-option 'addedmarkup=\Changes@optionaddedmarkup'} +} +% \end{macrocode} +% +% Option \choption{deletedmarkup}, stored or set to default value ``\texttt{sout}''. +% \begin{macrocode} +\DeclareOptionX{deletedmarkup}{ + \ifthenelse{\equal{\@empty}{#1}} + {} + { + \ifthenelse{ + \equal{#1}{sout}\or + \equal{#1}{colored}\or + \equal{#1}{uline}\or + \equal{#1}{uuline}\or + \equal{#1}{uwave}\or + \equal{#1}{dashuline}\or + \equal{#1}{dotuline}\or + \equal{#1}{xout}\or + \equal{#1}{bf}\or + \equal{#1}{it}\or + \equal{#1}{sl}\or + \equal{#1}{em} + } + {\renewcommand{\Changes@optiondeletedmarkup}{#1}} + {\PackageWarning{changes}{deletedmarkup '#1' unknown, using '\Changes@optiondeletedmarkup'}} + } + \typeout{changes-option 'deletedmarkup=\Changes@optiondeletedmarkup'} +} +% \end{macrocode} +% +% Option \choption{highlightmarkup}, stored or set to default value ``\texttt{background}''. +% \begin{macrocode} +\DeclareOptionX{highlightmarkup}{ + \ifthenelse{\equal{\@empty}{#1}} + {} + { + \ifthenelse{ + \equal{#1}{background}\or + \equal{#1}{uuline}\or + \equal{#1}{uwave} + } + {\renewcommand{\Changes@optionhighlightmarkup}{#1}} + {\PackageWarning{changes}{highlightmarkup '#1' unknown, using '\Changes@optionhighlightmarkup'}} + } + \typeout{changes-option 'highlightmarkup=\Changes@optionhighlightmarkup'} +} +% \end{macrocode} +% +% Option \choption{commentmarkup}, stored or set to default value ``\texttt{todo}''. +% \begin{macrocode} +\DeclareOptionX{commentmarkup}{ + \ifthenelse{\equal{\@empty}{#1}} + {} + { + \ifthenelse{ + \equal{#1}{todo}\or + \equal{#1}{margin}\or + \equal{#1}{footnote}\or + \equal{#1}{uwave} + } + {\renewcommand{\Changes@optioncommentmarkup}{#1}} + {\PackageWarning{changes}{commentmarkup '#1' unknown, using '\Changes@optioncommentmarkup'}} + } + \typeout{changes-option 'commentmarkup=\Changes@optioncommentmarkup'} +} +% \end{macrocode} +% +% Declare storage for authormarkup option and store option value or set to default value ``\texttt{superscript}''. +% \begin{macrocode} +\newcommand{\Changes@optionauthormarkup}{superscript} +\DeclareOptionX{authormarkup}{ + \ifthenelse{\equal{\@empty}{#1}} + {} + { + \ifthenelse{ + \equal{#1}{superscript}\or + \equal{#1}{subscript}\or + \equal{#1}{brackets}\or + \equal{#1}{footnote}\or + \equal{#1}{none} + } + {\renewcommand{\Changes@optionauthormarkup}{#1}} + {\PackageWarning{changes}{authormarkup '#1' unknown, using '\Changes@optionauthormarkup'}} + } + \typeout{changes-option 'authormarkup=\Changes@optionauthormarkup'} +} +% \end{macrocode} +% +% Declare storage for authormarkupposition option and store option value or set to default value ``\texttt{right}''. +% \begin{macrocode} +\newcommand{\Changes@optionauthormarkupposition}{right} +\DeclareOptionX{authormarkupposition}{ + \ifthenelse{\equal{\@empty}{#1}} + {} + { + \ifthenelse{ + \equal{#1}{right}\or + \equal{#1}{left} + } + {\renewcommand{\Changes@optionauthormarkupposition}{#1}} + {\PackageWarning{changes}{authormarkupposition '#1' unknown, using '\Changes@optionauthormarkupposition'}} + } + \typeout{changes-option 'authormarkupposition=\Changes@optionauthormarkupposition'} +} +% \end{macrocode} +% +% Declare storage for authormarkuptext option and store option value or set to default value ``\texttt{id}''. +% \begin{macrocode} +\newcommand{\Changes@optionauthormarkuptext}{id} +\DeclareOptionX{authormarkuptext}{ + \ifthenelse{\equal{\@empty}{#1}} + {} + { + \ifthenelse{ + \equal{#1}{id}\or + \equal{#1}{name} + } + {\renewcommand{\Changes@optionauthormarkuptext}{#1}} + {\PackageWarning{changes}{authormarkuptext '#1' unknown, using '\Changes@optionauthormarkuptext'}} + } + \typeout{changes-option 'authormarkuptext=\Changes@optionauthormarkuptext'} +} +% \end{macrocode} +% +% +% +% Options for package \chpackage{todonotes} are directly passed to the package. +% \begin{macrocode} +\DeclareOptionX{todonotes}{ + \typeout{todonotes-option '#1', passed to package todonotes} + \PassOptionsToPackage{#1}{todonotes} +} +% \end{macrocode} +% +% Options for package \chpackage{truncate} are directly passed to the package. +% \begin{macrocode} +\DeclareOptionX{truncate}{ + \typeout{truncate-option '#1', passed to package truncate} + \PassOptionsToPackage{#1}{truncate} +} +% \end{macrocode} +% +% Options for package \chpackage{ulem} are directly passed to the package. +% \begin{macrocode} +\DeclareOptionX{ulem}{ + \typeout{ulem-option '#1', passed to package ulem} + \PassOptionsToPackage{#1}{ulem} +} +% \end{macrocode} +% +% Options for package \chpackage{xcolor} are directly passed to the package. +% \begin{macrocode} +\DeclareOptionX{xcolor}{ + \typeout{xcolor-option '#1', passed to package xcolor} + \PassOptionsToPackage{#1}{xcolor} +} +% \end{macrocode} +% +% Unknown options generate a package warning. +% \begin{macrocode} +\DeclareOptionX*{ + \PackageWarning{changes}{Unknown option '\CurrentOption'} +} +% \end{macrocode} +% +% \subsubsection{Command options} +% +% All options for commands (e.g. \chcommand{definechangesauthor}) have to be declared before option processing. +% +% \minisec{\chcommand{definechangesauthor}} +% +% Declare available options of the command, define value storage. +% \begin{macrocode} +\DeclareOptionX<Changes@definechangesauthor>{name}{\def\Changes@definechangesauthor@name{#1}} +\DeclareOptionX<Changes@definechangesauthor>{color}{\def\Changes@definechangesauthor@color{#1}} +% \end{macrocode} +% +% Set the default values of the options. +% \begin{macrocode} +\presetkeys{Changes@definechangesauthor}{ + name=\@empty, + color=blue +}{} +% \end{macrocode} +% +% \minisec{\chcommand{added}} +% +% Declare available options of the command, define value storage. +% \begin{macrocode} +\DeclareOptionX<Changes@added>{id}{\def\Changes@added@id{#1}} +\DeclareOptionX<Changes@added>{remark}{\def\Changes@added@remark{#1}} +\DeclareOptionX<Changes@added>{comment}{\def\Changes@added@comment{#1}} +% \end{macrocode} +% +% Set the default values of the options. +% \begin{macrocode} +\presetkeys{Changes@added}{ + id=\@empty, + remark=\@empty, + comment=\@empty, +}{} +% \end{macrocode} +% +% \minisec{\chcommand{deleted}} +% +% Declare available options of the command, define value storage. +% \begin{macrocode} +\DeclareOptionX<Changes@deleted>{id}{\def\Changes@deleted@id{#1}} +\DeclareOptionX<Changes@deleted>{remark}{\def\Changes@deleted@remark{#1}} +\DeclareOptionX<Changes@deleted>{comment}{\def\Changes@deleted@comment{#1}} +% \end{macrocode} +% +% Set the default values of the options. +% \begin{macrocode} +\presetkeys{Changes@deleted}{ + id=\@empty, + remark=\@empty, + comment=\@empty, +}{} +% \end{macrocode} +% +% \minisec{\chcommand{replaced}} +% +% Declare available options of the command, define value storage. +% \begin{macrocode} +\DeclareOptionX<Changes@replaced>{id}{\def\Changes@replaced@id{#1}} +\DeclareOptionX<Changes@replaced>{remark}{\def\Changes@replaced@remark{#1}} +\DeclareOptionX<Changes@replaced>{comment}{\def\Changes@replaced@comment{#1}} +% \end{macrocode} +% +% Set the default values of the options. +% \begin{macrocode} +\presetkeys{Changes@replaced}{ + id=\@empty, + remark=\@empty, + comment=\@empty, +}{} +% \end{macrocode} +% +% \minisec{\chcommand{highlight}} +% +% Declare available options of the command, define value storage. +% \begin{macrocode} +\DeclareOptionX<Changes@highlight>{id}{\def\Changes@highlight@id{#1}} +\DeclareOptionX<Changes@highlight>{remark}{\def\Changes@highlight@remark{#1}} +\DeclareOptionX<Changes@highlight>{comment}{\def\Changes@highlight@comment{#1}} +% \end{macrocode} +% +% Set the default values of the options. +% \begin{macrocode} +\presetkeys{Changes@highlight}{ + id=\@empty, + remark=\@empty, + comment=\@empty, +}{} +% \end{macrocode} +% +% \minisec{\chcommand{comment}} +% +% Declare available options of the command, define value storage. +% \begin{macrocode} +\DeclareOptionX<Changes@comment>{id}{\def\Changes@comment@id{#1}} +% \end{macrocode} +% +% Set the default values of the options. +% \begin{macrocode} +\presetkeys{Changes@comment}{ + id=\@empty, +}{} +% \end{macrocode} +% +% \minisec{\chcommand{listofchanges}} +% +% Declare available options of the command, define value storage. +% \begin{macrocode} +\DeclareOptionX<Changes@loc>{style}{\def\Changes@loc@style{#1}} +\DeclareOptionX<Changes@loc>{title}{\def\Changes@loc@title{#1}} +\DeclareOptionX<Changes@loc>{show}{\def\Changes@loc@show{#1}} +% \end{macrocode} +% +% Set the default values of the options. +% \begin{macrocode} +\presetkeys{Changes@loc}{ + style=list, + title=\@empty, + show=all, +}{} +% \end{macrocode} +% +% \subsubsection{Package options} +% +% In order to avoid option clashes for options, state them here instead at the moment of requiring the package. +% Thanks for Markus Pahlow for pointing this out and providing the solution. +% \begin{macrocode} +\ExecuteOptionsX{ + ulem={normalem,normalbf}, + truncate={breakall,fit} +} +% \end{macrocode} +% +% \subsubsection{Option processing} +% +% Process the options. +% \begin{macrocode} +\ProcessOptionsX*\relax +% \end{macrocode} +% +% \subsection{Packages} +% +% \begin{macro}{\isColored} +% +% Check if text should be colored. +% \begin{macrocode} +\newtest{\isColored}{% + \not\equal{\Changes@optionmarkup}{nocolor}% +} +% \end{macrocode} +% \end{macro} +% +% Package \chpackage{xcolor} provides colored text. +% Package \chpackage{pdfcolmk} solves the problem of colored text and page breaks (has to be loaded after \chpackage{xcolor}). +% \begin{macrocode} +\ifthenelse{\isColored} + { + \RequirePackage{xcolor} + \RequirePackage{pdfcolmk} + } + {} +% \end{macrocode} +% +% Package \chpackage{ulem} provides commands for striking out text. +% Providing the needed package options via \chcommand{ExecuteOptionsX}. +% \begin{macrocode} +\ifthenelse{ + \equal{\Changes@optionaddedmarkup}{uline}\or + \equal{\Changes@optionaddedmarkup}{uuline}\or + \equal{\Changes@optionaddedmarkup}{uwave}\or + \equal{\Changes@optionaddedmarkup}{dashuline}\or + \equal{\Changes@optionaddedmarkup}{dotuline}\or + \equal{\Changes@optiondeletedmarkup}{uline}\or + \equal{\Changes@optiondeletedmarkup}{uuline}\or + \equal{\Changes@optiondeletedmarkup}{uwave}\or + \equal{\Changes@optiondeletedmarkup}{dashuline}\or + \equal{\Changes@optiondeletedmarkup}{dotuline}\or + \equal{\Changes@optiondeletedmarkup}{sout}\or + \equal{\Changes@optiondeletedmarkup}{xout}\or + \equal{\Changes@optioncommentmarkup}{uwave}\or + \equal{\Changes@optionhighlightmarkup}{uuline}\or + \equal{\Changes@optionhighlightmarkup}{uwave} +} + {\RequirePackage{ulem}} + {} +% \end{macrocode} +% +% Package \chpackage{todonotes} provides commands for todo notes in the margin. +% \begin{macrocode} +\ifthenelse{ + \equal{\Changes@optioncommentmarkup}{todo} +} + {\RequirePackage{todonotes}} + {} +% \end{macrocode} +% +% \subsection{Language dependent texts} +% +% If the \chpackage{babel} package is not loaded, the default language is English, in order to use another language, the user has to redefine the variables. +% If the \chpackage{babel} or the \chpackage{polyglossia} package is loaded, the default language is English too for undefined languages. +% \begin{macrocode} +\newcommand*\listofchangesname{List of changes} +\newcommand*\summaryofchangesname{Changes} +\newcommand*\compactsummaryofchangesname{Changes (compact)} +\newcommand*\changesaddname{Added} +\newcommand*\changesdeletename{Deleted} +\newcommand*\changesreplacename{Replaced} +\newcommand*\changeshighlightname{Highlighted} +\newcommand*\changescommentname{Commented} +\newcommand*\changesauthorname{Author} +\newcommand*\changesanonymousname{anonymous} +\newcommand*\changesnochanges{No changes.} +\newcommand*\changesnoloc{List of changes is available after the next \LaTeX\ run.} +\newcommand*\changesnosoc{Summary of changes is available after the next \LaTeX\ run.} +% \end{macrocode} +% +% The check for \chpackage{babel} or \chpackage{polyglossia}, define language dependent texts afterwards. +% \begin{macrocode} +\newboolean{Changes@langpackage} +\setboolean{Changes@langpackage}{false} +\@ifpackageloaded{babel} + {\setboolean{Changes@langpackage}{true}} + {} +\@ifpackageloaded{polyglossia} + {\setboolean{Changes@langpackage}{true}} + {} +\ifthenelse{\boolean{Changes@langpackage}} + { + \addto\captionsngerman{\def\listofchangesname{Liste der \"Anderungen}} + \addto\captionsngerman{\def\summaryofchangesname{\"Anderungen}} + \addto\captionsngerman{\def\compactsummaryofchangesname{\"Anderungen (kompakt)}} + \addto\captionsngerman{\def\changesaddname{Eingef\"ugt}} + \addto\captionsngerman{\def\changesdeletename{Gel\"oscht}} + \addto\captionsngerman{\def\changesreplacename{Ersetzt}} + \addto\captionsngerman{\def\changeshighlightname{Hervorgehoben}} + \addto\captionsngerman{\def\changescommentname{Kommentiert}} + \addto\captionsngerman{\def\changesauthorname{Autor}} + \addto\captionsngerman{\def\changesanonymousname{Anonym}} + \addto\captionsngerman{\def\changesnochanges{Keine \"Anderungen.}} + \addto\captionsngerman{\def\changesnoloc{Liste der \"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}} + \addto\captionsngerman{\def\changesnosoc{\"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}} + + \addto\captionsgerman{\def\listofchangesname{Liste der \"Anderungen}} + \addto\captionsgerman{\def\summaryofchangesname{\"Anderungen}} + \addto\captionsgerman{\def\compactsummaryofchangesname{\"Anderungen (kompakt)}} + \addto\captionsgerman{\def\changesaddname{Eingef\"ugt}} + \addto\captionsgerman{\def\changesdeletename{Gel\"oscht}} + \addto\captionsgerman{\def\changesreplacename{Ersetzt}} + \addto\captionsgerman{\def\changeshighlightname{Hervorgehoben}} + \addto\captionsgerman{\def\changescommentname{Kommentiert}} + \addto\captionsgerman{\def\changesauthorname{Autor}} + \addto\captionsgerman{\def\changesanonymousname{Anonym}} + \addto\captionsgerman{\def\changesnochanges{Keine \"Anderungen.}} + \addto\captionsgerman{\def\changesnoloc{Liste der \"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}} + \addto\captionsgerman{\def\changesnosoc{\"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}} + + \addto\captionsenglish{\def\listofchangesname{List of changes}} + \addto\captionsenglish{\def\summaryofchangesname{Changes}} + \addto\captionsenglish{\def\compactsummaryofchangesname{Changes (compact)}} + \addto\captionsenglish{\def\changesaddname{Added}} + \addto\captionsenglish{\def\changesdeletename{Deleted}} + \addto\captionsenglish{\def\changesreplacename{Replaced}} + \addto\captionsenglish{\def\changeshighlightname{Highlighted}} + \addto\captionsenglish{\def\changescommentname{Commented}} + \addto\captionsenglish{\def\changesauthorname{Author}} + \addto\captionsenglish{\def\changesanonymousname{anonymous}} + \addto\captionsenglish{\def\changesnochanges{No changes.}} + \addto\captionsenglish{\def\changesnoloc{List of changes is available after the next \LaTeX\ run.}} + \addto\captionsenglish{\def\changesnosoc{Summary of changes is available after the next \LaTeX\ run.}} + + \addto\captionsbritish{\def\listofchangesname{List of changes}} + \addto\captionsbritish{\def\summaryofchangesname{Changes}} + \addto\captionsbritish{\def\compactsummaryofchangesname{Changes (compact)}} + \addto\captionsbritish{\def\changesaddname{Added}} + \addto\captionsbritish{\def\changesdeletename{Deleted}} + \addto\captionsbritish{\def\changesreplacename{Replaced}} + \addto\captionsbritish{\def\changeshighlightname{Highlighted}} + \addto\captionsbritish{\def\changescommentname{Commented}} + \addto\captionsbritish{\def\changesauthorname{Author}} + \addto\captionsbritish{\def\changesanonymousname{anonymous}} + \addto\captionsbritish{\def\changesnochanges{No changes.}} + \addto\captionsbritish{\def\changesnoloc{List of changes is available after the next \LaTeX\ run.}} + \addto\captionsbritish{\def\changesnosoc{Summary of changes is available after the next \LaTeX\ run.}} + + \addto\captionsitalian{\def\listofchangesname{Lista delle modifiche}} + \addto\captionsitalian{\def\summaryofchangesname{Modifiche}} + \addto\captionsitalian{\def\compactsummaryofchangesname{Modifiche (coerente)}} % translation by me (EK), please provide correct translation + \addto\captionsitalian{\def\changesaddname{Aggiunte}} + \addto\captionsitalian{\def\changesdeletename{Cancellazioni}} + \addto\captionsitalian{\def\changesreplacename{Sostituzioni}} + \addto\captionsitalian{\def\changeshighlightname{Accentare}} % translation by me (EK), please provide correct translation + \addto\captionsitalian{\def\changescommentname{Commenti}} % translation by me (EK), please provide correct translation + \addto\captionsitalian{\def\changesauthorname{Autore}} + \addto\captionsitalian{\def\changesanonymousname{anonimo}} + \addto\captionsitalian{\def\changesnochanges{Nessuna modifica.}} % translation by me (EK), please provide correct translation + \addto\captionsitalian{\def\changesnoloc{La lista delle modifiche sar\`a disponibile alla prossima esecuzione di \LaTeX.}} + \addto\captionsitalian{\def\changesnosoc{Le modifiche sar\`a disponibile alla prossima esecuzione di \LaTeX.}} + } + {} +% \end{macrocode} +% +% \subsection{File extension} +% +% \begin{macro}{\Changes@extension} +% Store file extension in variable, set default to \texttt{soc} (summary of changes). +% \begin{macrocode} +\newcommand{\Changes@extension}{soc} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setsocextension} +% Set a new file extension. +% Argument: new extension. +% \begin{macrocode} +\newcommand{\setsocextension}[1]{ + \renewcommand{\Changes@extension}{#1} +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Authors} +% +% \subsubsection{Author management} +% +% Author counter. +% \begin{macrocode} +\newcounter{Changes@AuthorCount} +\setcounter{Changes@AuthorCount}{0} +\newcounter{Changes@Author} +% \end{macrocode} +% +% \begin{macro}{\definechangesauthor} +% Define a new author. +% Mandatory argument: author's id. +% Optional arguments (key-value): author's name (default: empty) and author's color (default: blue). +% +% Store id, name and color using named variables. +% Define counter and color per author. +% \begin{macrocode} +\newcommand*\definechangesauthor[2][]{ +% \end{macrocode} +% +% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. +% \begin{macrocode} + \setkeys{Changes@definechangesauthor}{#1} +% \end{macrocode} +% +% Increment author counter, later needed for \emph{while} loop of authors. +% \begin{macrocode} + \stepcounter{Changes@AuthorCount} +% \end{macrocode} +% +% Store the id in a name with the given counter/index. +% All other storage refers to the id. +% \begin{macrocode} + \@namedef{Changes@AuthorID\theChanges@AuthorCount}{#2} +% \end{macrocode} +% +% Store the author's definition in according variables/colors, create change counters. +% \begin{macrocode} + \expandafter\let\csname Changes@AuthorName#2\endcsname=\Changes@definechangesauthor@name + \expandafter\let\csname Changes@AuthorColor#2\endcsname=\Changes@definechangesauthor@color + \newcounter{Changes@addedCount#2} + \newcounter{Changes@deletedCount#2} + \newcounter{Changes@replacedCount#2} + \newcounter{Changes@highlightCount#2} + \newcounter{Changes@commentCount#2} +} +% \end{macrocode} +% \end{macro} +% +% Define default-author (anonymous) with empty id and default color. +% \begin{macrocode} +\definechangesauthor{\@empty} +% \end{macrocode} +% +% +% \subsubsection{Author markup} +% +% \begin{macro}{\Changes@Markup@author} +% Store markup for authors. +% \begin{macrocode} +\newcommand{\Changes@Markup@author}[1]{% + \ifthenelse{\equal{\Changes@optionauthormarkup}{superscript}}{\textsuperscript{#1}}{}% + \ifthenelse{\equal{\Changes@optionauthormarkup}{subscript}}{\textsubscript{#1}}{}% + \ifthenelse{\equal{\Changes@optionauthormarkup}{brackets}}{(#1)}{}% + \ifthenelse{\equal{\Changes@optionauthormarkup}{footnote}}{\footnote{#1}}{}% + \ifthenelse{\equal{\Changes@optionauthormarkup}{none}}{}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setauthormarkup} +% Set markup for authors. +% \begin{macrocode} +\newcommand{\setauthormarkup}[1]{ + \renewcommand{\Changes@Markup@author}[1]{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setauthormarkupposition} +% Set position for author markup text. +% \begin{macrocode} +\newcommand{\setauthormarkupposition}[1]{ + \renewcommand{\Changes@optionauthormarkupposition}{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setauthormarkuptext} +% Set author markup text to be displayed. +% \begin{macrocode} +\newcommand{\setauthormarkuptext}[1]{ + \renewcommand{\Changes@optionauthormarkuptext}{#1} +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Change management commands} +% +% \subsubsection{Text markup definition} +% +% Replaced text is always typeset as follows: \meta{added text}\meta{deleted text}. +% Therefore no extra command for markup of replaced text is given. +% +% \begin{macro}{\Changes@Markup@added} +% Store markup for added text. +% \begin{macrocode} +\newcommand{\Changes@Markup@added}[1]{% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{colored}}{#1}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{uline}}{\uline{#1}}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{uuline}}{\uuline{#1}}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{uwave}}{\uwave{#1}}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{dashuline}}{\dashuline{#1}}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{dotuline}}{\dotuline{#1}}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{bf}}{\textbf{#1}}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{it}}{\textit{#1}}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{sl}}{\textsl{#1}}{}% + \ifthenelse{\equal{\Changes@optionaddedmarkup}{em}}{\emph{#1}}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setaddedmarkup} +% Set markup for added text. +% \begin{macrocode} +\newcommand{\setaddedmarkup}[1]{ + \renewcommand{\Changes@Markup@added}[1]{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@Markup@deleted} +% Store markup for deleted text. +% \begin{macrocode} +\newcommand{\Changes@Markup@deleted}[1]{% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{sout}}{\sout{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{colored}}{#1}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uline}}{\uline{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uuline}}{\uuline{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uwave}}{\uwave{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{dashuline}}{\dashuline{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{dotuline}}{\dotuline{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{xout}}{\xout{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{bf}}{\textbf{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{it}}{\textit{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{sl}}{\textsl{#1}}{}% + \ifthenelse{\equal{\Changes@optiondeletedmarkup}{em}}{\emph{#1}}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setdeletedmarkup} +% Set markup for deleted text. +% \begin{macrocode} +\newcommand{\setdeletedmarkup}[1]{ + \renewcommand{\Changes@Markup@deleted}[1]{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@Markup@highlight} +% +% Store markup for highlighted text. +% \begin{macrocode} +\newcommand{\Changes@Markup@highlight}[1]{% + \ifthenelse{\equal{\Changes@optionhighlightmarkup}{background}}% + {% + \ifthenelse{\isColored}% + {\colorbox{authorcolor!30}{#1}}% + {#1}% + }{}% + \ifthenelse{\equal{\Changes@optionhighlightmarkup}{uuline}}{\uuline{#1}}{}% + \ifthenelse{\equal{\Changes@optionhighlightmarkup}{uwave}}{\uwave{#1}}{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sethighlightmarkup} +% Set markup for highlighted text. +% \begin{macrocode} +\newcommand{\sethighlightmarkup}[1]{ + \renewcommand{\Changes@Markup@highlight}[1]{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@Markup@comment} +% Store markup for comments. +% +% Parameters: +% \begin{enumerate} +% \item text +% \item author's id +% \item author's id/name output +% \end{enumerate} +% \begin{macrocode} +\newcommand{\Changes@Markup@comment}[3]{% +% \end{macrocode} +% +% This one is tricky, because the parameters depend on tests. +% If I use the tests inside the \chcommand{todo} command, they break because of the use of \chpackage{ifthenelse}. +% Thus I am implementing a slightly dirty working version, having in mind, that the code should be revisited in future releases. +% \begin{macrocode} + \ifthenelse{\equal{\Changes@optioncommentmarkup}{todo}}% + {% + \ifthenelse{\isColored}% + {% + \ifthenelse{\isAnonymous{#2}}% + {% + \todo[color=authorcolor!10, bordercolor=authorcolor, linecolor=authorcolor!70, nolist]{\textbf{[\arabic{authorcommentcount}]} #1}% + }{% + \todo[color=authorcolor!10, bordercolor=authorcolor, linecolor=authorcolor!70, nolist]{\textbf{[#3~\arabic{authorcommentcount}]} #1}% + }% + }{% + \ifthenelse{\isAnonymous{#2}}% + {% + \todo[color=black!0, bordercolor=black, linecolor=black!70, nolist]{\textbf{[\arabic{authorcommentcount}]} #1}% + }{% + \todo[color=black!0, bordercolor=black, linecolor=black!70, nolist]{\textbf{[#3~\arabic{authorcommentcount}]:} #1}% + }% + }% + }{}% +% \end{macrocode} +% +% Something a little more easy. +% \begin{macrocode} + \ifthenelse{\equal{\Changes@optioncommentmarkup}{margin}}% + {% + \marginpar{% + \ifthenelse{\isColored}% + {\leavevmode\color{authorcolor}}% + {}% + \ifthenelse{\isAnonymous{#2}}% + {\textbf{[\arabic{Changes@commentCount#2}]:} }% + {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }% + #1% + }% + }{}% + \ifthenelse{\equal{\Changes@optioncommentmarkup}{footnote}}% + {% + \footnote{% + \ifthenelse{\isAnonymous{#2}}% + {\textbf{[\arabic{Changes@commentCount#2}]:} }% + {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }% + #1% + }% + }{}% + \ifthenelse{\equal{\Changes@optioncommentmarkup}{uwave}}% + {% + {% + \ifthenelse{\isColored}% + {\color{authorcolor}}% + {}% + \allowbreak% + \uwave{% + \ifthenelse{\isAnonymous{#2}}% + {\textbf{[\arabic{Changes@commentCount#2}]:} }% + {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }% + #1% + }% + }% + }{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setcommentmarkup} +% Set markup for comments. +% \begin{macrocode} +\newcommand{\setcommentmarkup}[1]{ + \renewcommand{\Changes@Markup@comment}[3]{#1} +} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Change management command definition} +% +% \begin{macro}{\ifIsEmpty} +% +% Checks if text in \choption{\#1} is empty, executes \choption{\#2} if empty, \choption{\#3} otherwise. +% This is a shortcut for the \chcommand{ifthenelse} test, it basically eases the use of the test. +% +% \begin{macrocode} +\DeclareRobustCommand{\ifIsEmpty}[3]{% + \ifthenelse{\equal{#1}{} \or \equal{#1}{\@empty}}% + {#2}% + {#3}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\isAnonymous} +% +% Check if author id is empty, therefore the author is anonymous. +% This is a new test that can be tested using \chcommand{ifthenelse}. +% +% This test has the following arguments: +% \begin{enumerate} +% \item author's id +% \end{enumerate} +% +% \begin{macrocode} +\newtest{\isAnonymous}[1]{% + \equal{#1}{\@empty}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\isAuthorEmpty} +% +% Check if author is anonymous or position does not equal needed position, therefore the author text is empty. +% This is a new test that can be tested using \chcommand{ifthenelse}. +% +% This test could be removed if the test for empty \chcommand{Changes@output@author} would work. +% +% This test has the following arguments: +% \begin{enumerate} +% \item author's id +% \item position +% \end{enumerate} +% +% \begin{macrocode} +\newtest{\isAuthorEmpty}[2]{% + \isAnonymous{#1} \or \not\equal{\Changes@optionauthormarkupposition}{#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@check@author} +% +% Check if author id is valid. +% An empty id is valid by default. +% +% If the id is not valid, a package error is raised. +% I have the feeling that the code is optimizable. +% +% This command has the following arguments: +% \begin{enumerate} +% \item author's id +% \end{enumerate} +% +% \begin{macrocode} +\newboolean{Changes@WrongID} +\newcommand{\Changes@check@author}[1]{% + \ifIsEmpty{#1}% + {}% + {% + \setboolean{Changes@WrongID}{true}% + \setcounter{Changes@Author}{0}% + \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{% + \stepcounter{Changes@Author}% + \ifthenelse{\equal{#1}{\@nameuse{Changes@AuthorID\theChanges@Author}}}% + {\setboolean{Changes@WrongID}{false}}% + {}% + }% + \ifthenelse{\boolean{Changes@WrongID}}% + {\PackageError{changes}% + {Undefined changes author: #1}% + {You have to define the author #1 with e.g.: \definechangesauthor{#1}}}% + {}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@output@author} +% +% Output command for the author. +% +% This command has the following arguments: +% \begin{enumerate} +% \item author's id +% \item position to output the author to (left or right) +% \end{enumerate} +% +% \chcommand{DeclareRobustCommand} is used for not breaking the todo note definition. +% \begin{macrocode} +\DeclareRobustCommand{\Changes@output@author}[2]{% +% \end{macrocode} +% +% Output author text only if author's id is given and the position matches, otherwise output empty text. +% \begin{macrocode} + \ifthenelse{\isAuthorEmpty{#1}{#2}}% + {}% + {% + \ifthenelse{\equal{\Changes@optionauthormarkuptext}{id}}% + {% + #1% + }% + {}% + \ifthenelse{\equal{\Changes@optionauthormarkuptext}{name}}% + {% + \ifIsEmpty{\@nameuse{Changes@AuthorName#1}}% + {% + #1% + }{% + \@nameuse{Changes@AuthorName#1}% + }% + }% + {}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@set@color} +% +% Sets the author's color. +% +% This command has the following argument: +% \begin{enumerate} +% \item author's id +% \end{enumerate} +% +% \begin{macrocode} +\newcommand{\Changes@set@color}[1]{% + \ifthenelse{\isColored}% + {\colorlet{authorcolor}{\@nameuse{Changes@AuthorColor#1}}}% + {}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@set@commentcount} +% +% Sets the author's comment count. +% +% This command has the following argument: +% \begin{enumerate} +% \item author's id +% \end{enumerate} +% +% \begin{macrocode} +\newcounter{authorcommentcount} +\newcommand{\Changes@set@commentcount}[1]{% + \setcounter{authorcommentcount}{\value{Changes@commentCount#1}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@output} +% +% Output command for the changed text. +% +% This command has the following arguments: +% \begin{enumerate} +% \item change id (added, deleted, replaced, highlight, comment) +% \item author's id +% \item final text +% \item deleted/replaced text +% \item comment +% \item change type name for list of changes +% \item text for list of changes +% \end{enumerate} +% \begin{macrocode} +\newcommand{\Changes@output}[7]{% +% \end{macrocode} +% +% Output changed text if option \choption{draft} is set, otherwise output unchanged text. +% \begin{macrocode} + \ifthenelse{\boolean{Changes@optiondraft}}% + {% +% \end{macrocode} +% +% Check if author's id is valid and set author's color. +% \begin{macrocode} + \Changes@check@author{#2}% + \Changes@set@color{#2}% +% \end{macrocode} +% +% Start output. +% \begin{macrocode} + {% +% \end{macrocode} +% +% Output for change commands: added, deleted, replaced, highlight. +% +% I think this code is not elegant but it gets the work done for now. +% \begin{macrocode} + \ifthenelse{% + \equal{#1}{added}\or% + \equal{#1}{deleted}\or% + \equal{#1}{replaced}\or% + \equal{#1}{highlight}% + }% + {% +% \end{macrocode} +% +% Author text for left positioning (only without comment). +% \begin{macrocode} + \ifIsEmpty{#5}% + {% + \ifthenelse{\isAuthorEmpty{#2}{left}}% + {}% + {{% + \ifthenelse{\isColored}% + {\color{authorcolor}}% + {}% + \Changes@Markup@author{\Changes@output@author{#2}{left}}% + }}% + }{}% +% \end{macrocode} +% +% Changed/highlighted text. +% \begin{macrocode} + {% + \ifthenelse{\not\equal{#1}{highlight}}% + {% + \ifthenelse{\isColored}% + {\color{authorcolor}}% + {}% + }{}% + \ifthenelse{\equal{#1}{added}}{\Changes@Markup@added{#3}}{}% + \ifthenelse{\equal{#1}{deleted}}{\Changes@Markup@deleted{#4}}{}% + \ifthenelse{\equal{#1}{replaced}}{{\Changes@Markup@added{#3}}\allowbreak\Changes@Markup@deleted{#4}}{}% + \ifthenelse{\equal{#1}{highlight}}{\Changes@Markup@highlight{#3}}{}% + }% +% \end{macrocode} +% +% Author text for right positioning (only without comment). +% \begin{macrocode} + \ifIsEmpty{#5}% + {% + \ifthenelse{\isAuthorEmpty{#2}{right}}% + {}% + {{% + \ifthenelse{\isColored}% + {\color{authorcolor}}% + {}% + \Changes@Markup@author{\Changes@output@author{#2}{right}}% + }}% + }{}% +% \end{macrocode} +% +% Update counters. +% \begin{macrocode} + \stepcounter{Changes@#1Count#2}% + }{}% +% \end{macrocode} +% +% Comments. +% \begin{macrocode} + \ifIsEmpty{#5}% + {}% + {% + \stepcounter{Changes@commentCount#2}% + \Changes@set@commentcount{#2}% + \Changes@Markup@comment% + {#5}% + {#2}% + {\Changes@output@author{#2}{left}\Changes@output@author{#2}{right}}% + }% + }% +% \end{macrocode} +% Store line for list of changes. +% \begin{macrocode} + \ifIsEmpty{#2}% + {\def\Changes@locid{}}% + {\def\Changes@locid{~(#2)}}% + \addtocontents{loc}{\protect\ChangesListline{#1}{#6\Changes@locid}{#7}{\thepage}}% + }% +% \end{macrocode} +% +% Output unchanged text (option \choption{final} was set). +% \begin{macrocode} + {% + \ifIsEmpty{#3}% + {\@bsphack\@esphack}% + {#3}% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\added} +% The command formats text as new text. +% +% Mandatory argument: added text. +% Optional argument (key-value): author's id, comment, remark (deprecated) +% \begin{macrocode} +\newcommand{\added}[2][\@empty]{% +% \end{macrocode} +% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. +% \begin{macrocode} + \setkeys{Changes@added}{#1}% +% \end{macrocode} +% Check for use of deprecated \choption{remark} option. +% \begin{macrocode} + \ifIsEmpty{\Changes@added@remark}% + {}% + {% + \ifIsEmpty{\Changes@added@comment}% + {% + \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}% + \let\Changes@added@comment\Changes@added@remark% + }% + {% + \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}% + }% + }% +% \end{macrocode} +% End of check for use of deprecated \choption{remark} option. +% \begin{macrocode} + \Changes@output% + {added}% + {\Changes@added@id}% + {#2}% + {}% + {\Changes@added@comment}% + {\changesaddname}% + {#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\deleted} +% The command formats text as deleted text. +% +% The definition of the empty text for unchanged text is provided by Frank Mittelbach, slightly modified by me. +% It solves the problem of additional space caused by an empty command (e.g. when using the \choption{final} option). +% Before that, there was a slightly erroneous version from \texttt{de.comp.text.tex} (issue \#2). +% +% Mandatory argument: deleted text. +% Optional argument (key-value): author's id, comment, remark (deprecated) +% \begin{macrocode} +\newcommand{\deleted}[2][\@empty]{% +% \end{macrocode} +% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. +% \begin{macrocode} + \setkeys{Changes@deleted}{#1}% +% \end{macrocode} +% Check for use of deprecated \choption{remark} option. +% \begin{macrocode} + \ifIsEmpty{\Changes@deleted@remark}% + {}% + {% + \ifIsEmpty{\Changes@deleted@comment}% + {% + \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}% + \let\Changes@deleted@comment\Changes@deleted@remark% + }% + {% + \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}% + }% + }% +% \end{macrocode} +% End of check for use of deprecated \choption{remark} option. +% \begin{macrocode} + \Changes@output% + {deleted}% + {\Changes@deleted@id}% + {}% + {#2}% + {\Changes@deleted@comment}% + {\changesdeletename}% + {#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\replaced} +% The command formats text as replaced text. +% +% Mandatory arguments: new text and old text. +% Optional argument (key-value): author's id, comment, remark (deprecated) +% \begin{macrocode} +\newcommand{\replaced}[3][\@empty]{% +% \end{macrocode} +% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. +% \begin{macrocode} + \setkeys{Changes@replaced}{#1}% +% \end{macrocode} +% Check for use of deprecated \choption{remark} option. +% \begin{macrocode} + \ifIsEmpty{\Changes@replaced@remark}% + {}% + {% + \ifIsEmpty{\Changes@replaced@comment}% + {% + \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}% + \let\Changes@replaced@comment\Changes@replaced@remark% + }% + {% + \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}% + }% + }% +% \end{macrocode} +% End of check for use of deprecated \choption{remark} option. +% \begin{macrocode} + \Changes@output% + {replaced}% + {\Changes@replaced@id}% + {#2}% + {#3}% + {\Changes@replaced@comment}% + {\changesreplacename}% + {#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\highlight} +% The command formats text as highlighted text. +% +% Mandatory argument: highlighted text. +% Optional argument (key-value): author's id, comment, remark (deprecated) +% \begin{macrocode} +\newcommand{\highlight}[2][\@empty]{% +% \end{macrocode} +% +% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. +% \begin{macrocode} + \setkeys{Changes@highlight}{#1}% +% \end{macrocode} +% Check for use of deprecated \choption{remark} option. +% \begin{macrocode} + \ifIsEmpty{\Changes@highlight@remark}% + {}% + {% + \ifIsEmpty{\Changes@highlight@comment}% + {% + \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}% + \let\Changes@highlight@comment\Changes@highlight@remark% + }% + {% + \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}% + }% + }% +% \end{macrocode} +% End of check for use of deprecated \choption{remark} option. +% \begin{macrocode} + \Changes@output% + {highlight}% + {\Changes@highlight@id}% + {#2}% + {}% + {\Changes@highlight@comment}% + {\changeshighlightname}% + {#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\comment} +% The command formats text as comment. +% +% Mandatory argument: comment text. +% Optional argument (key-value): author's id +% \begin{macrocode} +\newcommand{\comment}[2][\@empty]{% +% \end{macrocode} +% +% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. +% \begin{macrocode} + \setkeys{Changes@comment}{#1}% + \Changes@output% + {comment}% + {\Changes@comment@id}% + {}% + {}% + {#2}% + {\changescommentname}% + {#2}% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{List of changes} +% +% The list of changes truncates text, therefore the \chpackage{truncate} package is used. +% (Using fit and redefining the marker: suggestion and code by Frank Mittelbach) +% Providing the needed package options via \chcommand{ExecuteOptionsX}. +% \begin{macrocode} +\RequirePackage{truncate} +\renewcommand\TruncateMarker{ [\dots\negthinspace]\ } +% \end{macrocode} +% +% \begin{macro}{\changes@chopline} +% Auxiliary command for reading the content of the loc-files. +% The content is read line by line. +% One line is parsed with this macro, the order of entries is: id, color, name, added, deleted, replaced, highlighted, comment. +% The contents have to be separated by a semicolon. +% \begin{macrocode} +\def\changes@chopline#1;#2;#3;#4;#5;#6;#7;#8 \\{% + \def\Changes@InID{#1}% + \def\Changes@InColor{#2}% + \def\Changes@InName{#3}% + \def\Changes@InAdded{#4}% + \def\Changes@InDeleted{#5}% + \def\Changes@InReplaced{#6}% + \def\Changes@InHighlight{#7}% + \def\Changes@InComment{#8}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ChangesListline} +% +% Output of a list line. +% +% This command has the following arguments: +% \begin{enumerate} +% \item change type (added, ...) +% \item text +% \item page +% \end{enumerate} +% +% \begin{macrocode} +\newcommand{\ChangesListline}[4]{% + \IfSubStr{\Changes@loc@show}{#1}{% + \@ifundefined{@dotsep}% + {\def\@dotsep{4.5}}{}% + \@dottedtocline{1}{0px}{2em}{#2: \truncate{\Changes@truncate@width}{#3}}{#4}% + }{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@truncate@width} +% +% Length for the width of the truncation. +% +% Default: two third of the text width +% +% \begin{macrocode} +\newlength{\Changes@truncate@width} +\setlength{\Changes@truncate@width}{.6\textwidth} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\settruncatewidth} +% +% Set the width of the truncation. +% Argument: new width. +% \begin{macrocode} +\newcommand{\settruncatewidth}[1]{ + \setlength{\Changes@truncate@width}{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@summary@width} +% +% Length for the width of the change summary. +% +% Default: one third of the text width +% +% \begin{macrocode} +\newlength{\Changes@summary@width} +\setlength{\Changes@summary@width}{.3\textwidth} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setsummarywidth} +% +% Set the width of the change summary. +% Argument: new width. +% \begin{macrocode} +\newcommand{\setsummarywidth}[1]{ + \setlength{\Changes@summary@width}{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setsummarytowidth} +% +% Set the width of the change summary to width of given text. +% Argument: text. +% \begin{macrocode} +\newcommand{\setsummarytowidth}[1]{ + \settowidth{\Changes@summary@width}{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@summaryline} +% +% Auxiliary command for output of a summary line. +% +% This command has the following arguments: +% \begin{enumerate} +% \item change type (added, ...) +% \item number of items +% \item name of items +% \item line delimiter +% \end{enumerate} +% +% \begin{macrocode} +\newcommand{\Changes@summaryline}[4]{% + \IfSubStr{\Changes@loc@show}{#1}{% + \ifthenelse{\not\equal{\Changes@loc@style}{compactsummary} \or #2 > 0}% + {% + \parbox{\Changes@summary@width}{#3~\let\cleaders\leaders\dotfill~#2}#4% + }{}% + }{}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\listofchanges} +% +% This command outputs the list of changes. +% Options: \choption{style} and \choption{title}. +% +% The following styles are available: +% \begin{description} +% \item [\choption{list}] prints the list of changes like a list of figures +% \item [\choption{summary}] prints the number of changes grouped by author +% \item [\choption{compactsummary}] same as \choption{summary} but entries with count 0 are omitted +% \end{description} +% +% For the list, the values are read from the auxiliary file. +% +% For the summary, the values are read from the loc-file, if it exists. +% If no loc-file exists, an according message is generated. +% +% Some definitions that have to reside outside the command in order to use the command multiple times. +% \begin{macrocode} +\newboolean{Changes@MoreLines} +\newboolean{Changes@ShowOK} +% \end{macrocode} +% The definition of \chcommand{listofchanges}. +% \begin{macrocode} +\newcommand{\listofchanges}[1][\@empty]{% + \setkeys{Changes@loc}{#1}% +% \end{macrocode} +% All work is done only in draft mode. +% \begin{macrocode} + \ifthenelse{\boolean{Changes@optiondraft}}% + {% +% \end{macrocode} +% +% Check if style is known, otherwise use \choption{list} by default. +% \begin{macrocode} + \ifIsEmpty{\Changes@loc@style}% + {\def\Changes@loc@style{list}}% + {% + \ifthenelse{% + \equal{\Changes@loc@style}{list}\or% + \equal{\Changes@loc@style}{summary}\or% + \equal{\Changes@loc@style}{compactsummary}% + }% + {}% + {% + \PackageWarning{changes}{Wrong style for list of changes: '\Changes@loc@style', using 'list' instead.}% + \def\Changes@loc@style{list}% + }% + }% +% \end{macrocode} +% +% Check if show-value is known, otherwise use \choption{all} by default. +% \begin{macrocode} + \ifIsEmpty{\Changes@loc@show}% + {\def\Changes@loc@show{all}}% + {% +% \end{macrocode} +% +% This check is complicated, because the \chcommand{isin} test of \chpackage{xifthen} does not work with macros. +% On the other hand I could not define a new text using the \chcommand{IfSubStr} macro of \chpackage{xstring}, +% \begin{macrocode} + \setboolean{Changes@ShowOK}{false}% + \ifthenelse{\equal{\Changes@loc@show}{all}}{\setboolean{Changes@ShowOK}{true}}{}% + \IfSubStr{\Changes@loc@show}{added}{\setboolean{Changes@ShowOK}{true}}{}% + \IfSubStr{\Changes@loc@show}{deleted}{\setboolean{Changes@ShowOK}{true}}{}% + \IfSubStr{\Changes@loc@show}{replaced}{\setboolean{Changes@ShowOK}{true}}{}% + \IfSubStr{\Changes@loc@show}{highlight}{\setboolean{Changes@ShowOK}{true}}{}% + \IfSubStr{\Changes@loc@show}{comment}{\setboolean{Changes@ShowOK}{true}}{}% + \ifthenelse{\boolean{Changes@ShowOK}}% + {}% + {% + \PackageWarning{changes}{Wrong show-value for list of changes: '\Changes@loc@show', using 'all' instead.}% + \def\Changes@loc@show{all}% + }% + }% + \ifthenelse{\equal{\Changes@loc@show}{all}}% + {% + \def\Changes@loc@show{added|deleted|replaced|highlight|comment}% + }{}% +% \end{macrocode} +% +% Print heading. +% \begin{macrocode} + \def\Changes@heading{\Changes@loc@title} + \ifIsEmpty{\Changes@loc@title}% + {% + \ifthenelse{\equal{\Changes@loc@style}{list}}% + {\def\Changes@heading{\listofchangesname}}{}% + \ifthenelse{\equal{\Changes@loc@style}{summary}}% + {\def\Changes@heading{\summaryofchangesname}}{}% + \ifthenelse{\equal{\Changes@loc@style}{compactsummary}}% + {\def\Changes@heading{\compactsummaryofchangesname}}{}% + }{}% + \section*{\Changes@heading} +% \end{macrocode} +% +% Print list. +% \begin{macrocode} + \ifthenelse{\equal{\Changes@loc@style}{list}}% + {% + \IfFileExists{\jobname.loc}% + {% + \setboolean{Changes@MoreLines}{true}% + \newread\Changes@InFile% + \openin\Changes@InFile = \jobname.loc% + \whiledo{\boolean{Changes@MoreLines}}{% + \read\Changes@InFile to \Changes@Line% + \ifeof\Changes@InFile% + \setboolean{Changes@MoreLines}{false}% + \else% + \Changes@Line% + \fi% + }% + \closein\Changes@InFile% + }{% + \emph{\changesnoloc}% + \PackageWarning{changes}{LaTeX rerun needed for list of changes}% + }% + }{}% +% \end{macrocode} +% Print summary or compact summary. +% \begin{macrocode} + \ifthenelse{\equal{\Changes@loc@style}{summary} \or \equal{\Changes@loc@style}{compactsummary}}% + {% + \IfFileExists{\jobname.\Changes@extension}% + {% + \setboolean{Changes@MoreLines}{true}% + \newread\Changes@InFile% + \openin\Changes@InFile = \jobname.\Changes@extension% + \whiledo{\boolean{Changes@MoreLines}}{% + \read\Changes@InFile to \Changes@Line% + \ifeof\Changes@InFile% + \setboolean{Changes@MoreLines}{false}% + \else% + \expandafter\changes@chopline\Changes@Line\\% + \textbf{% + \ifthenelse{\isColored}% + {\color{\Changes@InColor}}% + {}% + \ifthenelse{\equal{\Changes@InID}{\@empty}}% + {\changesauthorname: \changesanonymousname}% + {% + \changesauthorname: \Changes@InID% + \ifthenelse{\equal{\Changes@InName}{\@empty}}% + {}% + { (\Changes@InName)}% + }% + }\\% + \ifthenelse{% + \Changes@InAdded > 0 \or% + \Changes@InDeleted > 0 \or% + \Changes@InReplaced > 0 \or% + \Changes@InHighlight > 0 \or% + \Changes@InComment > 0% + }% + {% + \Changes@summaryline{added}{\Changes@InAdded}{\changesaddname}{\\}% + \Changes@summaryline{deleted}{\Changes@InDeleted}{\changesdeletename}{\\}% + \Changes@summaryline{replaced}{\Changes@InReplaced}{\changesreplacename}{\\}% + \Changes@summaryline{highlight}{\Changes@InHighlight}{\changeshighlightname}{\\}% + \Changes@summaryline{comment}{\Changes@InComment}{\changescommentname}{\\[1ex]}% + }% + {% + \parbox{\Changes@summary@width}{\changesnochanges}\\[1ex]% + }% + \fi% + }% + \closein\Changes@InFile% + }{% + \emph{\changesnosoc}% + \PackageWarning{changes}{LaTeX rerun needed for summary of changes}% + }% + }{}% +% \end{macrocode} +% In final mode print nothing. +% \begin{macrocode} + }{}% +} +% \end{macrocode} +% \end{macro} +% +% At the end of the document: write the list of changes in the loc-file, therefore open file, write values, close file. +% Changes are written as \hologo{LaTeX}-formatted text, so they can simply be read via \chcommand{input}. +% +% The order of entries is: id, color, name, added, deleted, replaced, comment, highlight. +% The contents have to be separated by a semicolon. +% \begin{macrocode} +\AtEndDocument{% +% \end{macrocode} +% Open output file. +% \begin{macrocode} + \newwrite\Changes@OutFile + \immediate\openout\Changes@OutFile = \jobname.\Changes@extension +% \end{macrocode} +% Redefine expandable of \chcommand{protect} in order to write correct special characters. +% Store original definition for resetting \chcommand{protect}. +% \begin{macrocode} + \let\Changes@protect\protect + \let\protect\@unexpandable@protect +% \end{macrocode} +% Output data for list of changes. +% \begin{macrocode} + \setcounter{Changes@Author}{0} + \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{% + \stepcounter{Changes@Author}% + \def\Changes@ID{\@nameuse{Changes@AuthorID\theChanges@Author}}% + \immediate\write\Changes@OutFile{\Changes@ID;% + \@nameuse{Changes@AuthorColor\Changes@ID};% + \@nameuse{Changes@AuthorName\Changes@ID};% + \the\value{Changes@addedCount\Changes@ID};% + \the\value{Changes@deletedCount\Changes@ID};% + \the\value{Changes@replacedCount\Changes@ID};% + \the\value{Changes@highlightCount\Changes@ID};% + \the\value{Changes@commentCount\Changes@ID}}% + }% +% \end{macrocode} +% Close output file. +% \begin{macrocode} + \immediate\closeout\Changes@OutFile +% \end{macrocode} +% Restore original definition of \chcommand{protect}. +% \begin{macrocode} + \let\protect\Changes@protect +% \end{macrocode} +% +% Write content of listofchanges to file. +% \begin{macrocode} + \if@filesw + \@ifundefined{tf@loc}{% + \expandafter\newwrite\csname tf@loc\endcsname + \immediate\openout \csname tf@loc\endcsname \jobname.loc\relax + }{}% + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +%</changes> +% \end{macrocode} +% +% \PrintChanges +% \PrintIndex +% +%\Finale +\endinput |