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