diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/changes/changes.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/changes/changes.dtx | 1225 |
1 files changed, 595 insertions, 630 deletions
diff --git a/Master/texmf-dist/source/latex/changes/changes.dtx b/Master/texmf-dist/source/latex/changes/changes.dtx index 7a7fba693e2..8206f28c5ef 100644 --- a/Master/texmf-dist/source/latex/changes/changes.dtx +++ b/Master/texmf-dist/source/latex/changes/changes.dtx @@ -1,8 +1,8 @@ -% \CheckSum{1509} +% \CheckSum{1258} % % \iffalse meta-comment % -% Copyright (C) 2007-2019 +% Copyright (C) 2007-2021 % Ekkart Kleinod (ekleinod@edgesoft.de) % -------------------------------------------------------------------------- % @@ -62,6 +62,7 @@ % \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} +% \changes{v4.0.0}{2021/01/28}{new: convenience macros, setlocextension, option commandnameprefix, defaultcolor; removed: xifthen, remark} % \GetFileInfo{changes.dtx} % \RecordChanges % @@ -102,45 +103,113 @@ % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{changes} -[2020/06/16 v3.2.2 changes package] -\typeout{*** changes package 2020/06/16 v3.2.2 ***} +[2021/01/28 v4.0.0 changes package] +\typeout{*** changes package 2021/01/28 v4.0.0 ***} % \end{macrocode} % -% Package \chpackage{xkeyval} provides options with key-value-pairs. +% Package \docpackage{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. +% Package \docpackage{etoolbox} provides improved \emph{if}, \emph{bools} as well as a \emph{list} operations. +% todo % \begin{macrocode} -\RequirePackage{xifthen} +\RequirePackage{etoolbox} % \end{macrocode} % -% Package \chpackage{xstring} provides improved string test and handling methods. +% Package \docpackage{xstring} provides improved string test and handling methods. % \begin{macrocode} \RequirePackage{xstring} % \end{macrocode} % +% \begin{macro}{\IfIsInList} +% +% Helper macro: tests if one of the pipe separated values is in the second list of pipe separated values (boolean or). +% +% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests. +% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation. +% +% Declare list parsers. +% \begin{macrocode} +\DeclareListParser{\dopsvlist}{|} +\DeclareListParser*{\forpsvlist}{|} +% \end{macrocode} +% +% A temporary list and flag. +% \begin{macrocode} +\newcommand{\Changes@tmplist}{} +\newbool{Changes@inlist} +% \end{macrocode} +% +% Fill list with values, then check if one of the values of the first list is in the second one. +% \begin{macrocode} +\newrobustcmd{\IfIsInList}[4]{% + \renewcommand{\Changes@tmplist}{}% +% \end{macrocode} +% +% I could not get +% \doccommand{forpsvlist}\{\doccommand{listadd}\doccommand{Changes@tmplist}\}\{\#2\} +% to work if \#2 is a macro, so I used the code below. +% +% Thanks to Ulrike Fischer for the fix of the macro call of \doccommand{dopsvlist} with \doccommand{expandafter}. +% \begin{macrocode} + \renewcommand*{\do}[1]{% + \listadd{\Changes@tmplist}{##1}% + }% + \expandafter\dopsvlist\expandafter{#2}% +% \end{macrocode} +% End fo the workaround for \doccommand{forpsvlist}. +% \begin{macrocode} + \setbool{Changes@inlist}{false}% + \renewcommand*{\do}[1]{% + \ifinlist{##1}{\Changes@tmplist}% + {\setbool{Changes@inlist}{true}}% + {}% + }% + \expandafter\dopsvlist\expandafter{#1}% + \ifbool{Changes@inlist}% + {#3}% + {#4}% +} +% \end{macrocode} +% \end{macro} +% % \subsubsection{Package options} % -% Option \choption{draft}, \emph{default} is \texttt{true}. +% Option \docoption{draft}, \emph{default} is \emph{true}. % \begin{macrocode} -\newboolean{Changes@optiondraft} -\setboolean{Changes@optiondraft}{true} +\newbool{Changes@optiondraft} +\setbool{Changes@optiondraft}{true} \DeclareOptionX{draft}{ - \setboolean{Changes@optiondraft}{true} + \setbool{Changes@optiondraft}{true} \typeout{changes-option '\CurrentOption'} } % \end{macrocode} % -% Option \choption{final}, sets \choption{draft} to \texttt{false}. +% Option \docoption{final}, sets \docoption{draft} to \emph{false}. % \begin{macrocode} \DeclareOptionX{final}{ - \setboolean{Changes@optiondraft}{false} + \setbool{Changes@optiondraft}{false} \typeout{changes-option '\CurrentOption'} } % \end{macrocode} % +% Declare storage for authormarkup option and store option value or set to default value \emph{superscript}. +% \begin{macrocode} +\newcommand{\Changes@optioncommandnameprefix}{none} +\DeclareOptionX{commandnameprefix}{ + \ifblank{#1} + {} + { + \IfIsInList{#1}{none|always|ifneeded} + {\renewcommand{\Changes@optioncommandnameprefix}{#1}} + {\PackageWarning{changes}{commandnameprefix '#1' unknown, using '\Changes@optioncommandnameprefix'}} + } + \typeout{changes-option 'commandnameprefix=\Changes@optioncommandnameprefix'} +} +% \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} @@ -150,40 +219,35 @@ \newcommand{\Changes@optioncommentmarkup}{todo} % \end{macrocode} % -% Option \choption{markup}, sets markup options accordingly. +% Option \docoption{markup}, sets markup options accordingly. % \begin{macrocode} \newcommand{\Changes@optionmarkup}{default} \DeclareOptionX{markup}{ - \ifthenelse{\equal{\@empty}{#1}} + \ifblank{#1} {} { - \ifthenelse{ - \equal{#1}{default}\or - \equal{#1}{underlined}\or - \equal{#1}{bfit}\or - \equal{#1}{nocolor} - } + \IfIsInList{#1}{bfit|default|nocolor|underlined} {\renewcommand{\Changes@optionmarkup}{#1}} {\PackageWarning{changes}{markup '#1' unknown, using '\Changes@optionmarkup'}} } - \ifthenelse{\equal{\Changes@optionmarkup}{default}} + \IfStrEq{\Changes@optionmarkup}{default} { - % nothing to do + % nothing to do, included for symmetry and potential later use } {} - \ifthenelse{\equal{\Changes@optionmarkup}{underlined}} + \IfStrEq{\Changes@optionmarkup}{underlined} { \renewcommand{\Changes@optionaddedmarkup}{uline} \renewcommand{\Changes@optionhighlightmarkup}{uwave} } {} - \ifthenelse{\equal{\Changes@optionmarkup}{bfit}} + \IfStrEq{\Changes@optionmarkup}{bfit} { \renewcommand{\Changes@optionaddedmarkup}{bf} \renewcommand{\Changes@optiondeletedmarkup}{it} } {} - \ifthenelse{\equal{\Changes@optionmarkup}{nocolor}} + \IfStrEq{\Changes@optionmarkup}{nocolor} { \renewcommand{\Changes@optionaddedmarkup}{uline} \renewcommand{\Changes@optionhighlightmarkup}{uwave} @@ -193,24 +257,13 @@ } % \end{macrocode} % -% Option \choption{addedmarkup}, stored or set to default value ``\texttt{colored}''. +% Option \docoption{addedmarkup}, stored or set to default value \emph{colored}. % \begin{macrocode} \DeclareOptionX{addedmarkup}{ - \ifthenelse{\equal{\@empty}{#1}} + \ifblank{#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} - } + \IfIsInList{#1}{bf|colored|dashuline|dotuline|em|it|sl|uline|uuline|uwave} {\renewcommand{\Changes@optionaddedmarkup}{#1}} {\PackageWarning{changes}{addedmarkup '#1' unknown, using '\Changes@optionaddedmarkup'}} } @@ -218,26 +271,13 @@ } % \end{macrocode} % -% Option \choption{deletedmarkup}, stored or set to default value ``\texttt{sout}''. +% Option \docoption{deletedmarkup}, stored or set to default value \emph{sout}. % \begin{macrocode} \DeclareOptionX{deletedmarkup}{ - \ifthenelse{\equal{\@empty}{#1}} + \ifblank{#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} - } + \IfIsInList{#1}{bf|colored|dashuline|dotuline|em|it|sl|sout|uline|uuline|uwave|xout} {\renewcommand{\Changes@optiondeletedmarkup}{#1}} {\PackageWarning{changes}{deletedmarkup '#1' unknown, using '\Changes@optiondeletedmarkup'}} } @@ -245,17 +285,13 @@ } % \end{macrocode} % -% Option \choption{highlightmarkup}, stored or set to default value ``\texttt{background}''. +% Option \docoption{highlightmarkup}, stored or set to default value \emph{background}. % \begin{macrocode} \DeclareOptionX{highlightmarkup}{ - \ifthenelse{\equal{\@empty}{#1}} + \ifblank{#1} {} { - \ifthenelse{ - \equal{#1}{background}\or - \equal{#1}{uuline}\or - \equal{#1}{uwave} - } + \IfIsInList{#1}{background|uuline|uwave} {\renewcommand{\Changes@optionhighlightmarkup}{#1}} {\PackageWarning{changes}{highlightmarkup '#1' unknown, using '\Changes@optionhighlightmarkup'}} } @@ -263,18 +299,13 @@ } % \end{macrocode} % -% Option \choption{commentmarkup}, stored or set to default value ``\texttt{todo}''. +% Option \docoption{commentmarkup}, stored or set to default value \emph{todo}. % \begin{macrocode} \DeclareOptionX{commentmarkup}{ - \ifthenelse{\equal{\@empty}{#1}} + \ifblank{#1} {} { - \ifthenelse{ - \equal{#1}{todo}\or - \equal{#1}{margin}\or - \equal{#1}{footnote}\or - \equal{#1}{uwave} - } + \IfIsInList{#1}{footnote|margin|todo|uwave} {\renewcommand{\Changes@optioncommentmarkup}{#1}} {\PackageWarning{changes}{commentmarkup '#1' unknown, using '\Changes@optioncommentmarkup'}} } @@ -282,20 +313,14 @@ } % \end{macrocode} % -% Declare storage for authormarkup option and store option value or set to default value ``\texttt{superscript}''. +% Declare storage for authormarkup option and store option value or set to default value \emph{superscript}. % \begin{macrocode} \newcommand{\Changes@optionauthormarkup}{superscript} \DeclareOptionX{authormarkup}{ - \ifthenelse{\equal{\@empty}{#1}} + \ifblank{#1} {} { - \ifthenelse{ - \equal{#1}{superscript}\or - \equal{#1}{subscript}\or - \equal{#1}{brackets}\or - \equal{#1}{footnote}\or - \equal{#1}{none} - } + \IfIsInList{#1}{brackets|footnote|none|subscript|superscript} {\renewcommand{\Changes@optionauthormarkup}{#1}} {\PackageWarning{changes}{authormarkup '#1' unknown, using '\Changes@optionauthormarkup'}} } @@ -303,17 +328,14 @@ } % \end{macrocode} % -% Declare storage for authormarkupposition option and store option value or set to default value ``\texttt{right}''. +% Declare storage for authormarkupposition option and store option value or set to default value \emph{right}. % \begin{macrocode} \newcommand{\Changes@optionauthormarkupposition}{right} \DeclareOptionX{authormarkupposition}{ - \ifthenelse{\equal{\@empty}{#1}} + \ifblank{#1} {} { - \ifthenelse{ - \equal{#1}{right}\or - \equal{#1}{left} - } + \IfIsInList{#1}{left|right} {\renewcommand{\Changes@optionauthormarkupposition}{#1}} {\PackageWarning{changes}{authormarkupposition '#1' unknown, using '\Changes@optionauthormarkupposition'}} } @@ -321,17 +343,14 @@ } % \end{macrocode} % -% Declare storage for authormarkuptext option and store option value or set to default value ``\texttt{id}''. +% Declare storage for authormarkuptext option and store option value or set to default value \emph{id}. % \begin{macrocode} \newcommand{\Changes@optionauthormarkuptext}{id} \DeclareOptionX{authormarkuptext}{ - \ifthenelse{\equal{\@empty}{#1}} + \ifblank{#1} {} { - \ifthenelse{ - \equal{#1}{id}\or - \equal{#1}{name} - } + \IfIsInList{#1}{id|name} {\renewcommand{\Changes@optionauthormarkuptext}{#1}} {\PackageWarning{changes}{authormarkuptext '#1' unknown, using '\Changes@optionauthormarkuptext'}} } @@ -339,9 +358,21 @@ } % \end{macrocode} % +% Store default author color.. +% \begin{macrocode} +\newcommand{\Changes@optiondefaultcolor}{blue} +\DeclareOptionX{defaultcolor}{ + \ifblank{#1} + {} + { + \renewcommand{\Changes@optiondefaultcolor}{#1} + } + \typeout{changes-option 'defaultcolor=\Changes@optiondefaultcolor'} +} +% \end{macrocode} % % -% Options for package \chpackage{todonotes} are directly passed to the package. +% Options for package \docpackage{todonotes} are directly passed to the package. % \begin{macrocode} \DeclareOptionX{todonotes}{ \typeout{todonotes-option '#1', passed to package todonotes} @@ -349,7 +380,7 @@ } % \end{macrocode} % -% Options for package \chpackage{truncate} are directly passed to the package. +% Options for package \docpackage{truncate} are directly passed to the package. % \begin{macrocode} \DeclareOptionX{truncate}{ \typeout{truncate-option '#1', passed to package truncate} @@ -357,7 +388,7 @@ } % \end{macrocode} % -% Options for package \chpackage{ulem} are directly passed to the package. +% Options for package \docpackage{ulem} are directly passed to the package. % \begin{macrocode} \DeclareOptionX{ulem}{ \typeout{ulem-option '#1', passed to package ulem} @@ -365,7 +396,7 @@ } % \end{macrocode} % -% Options for package \chpackage{xcolor} are directly passed to the package. +% Options for package \docpackage{xcolor} are directly passed to the package. % \begin{macrocode} \DeclareOptionX{xcolor}{ \typeout{xcolor-option '#1', passed to package xcolor} @@ -382,9 +413,9 @@ % % \subsubsection{Command options} % -% All options for commands (e.g. \chcommand{definechangesauthor}) have to be declared before option processing. +% All options for commands (e.g. \doccommand{definechangesauthor}) have to be declared before option processing. % -% \minisec{\chcommand{definechangesauthor}} +% \minisec{\doccommand{definechangesauthor}} % % Declare available options of the command, define value storage. % \begin{macrocode} @@ -396,16 +427,15 @@ % \begin{macrocode} \presetkeys{Changes@definechangesauthor}{ name=\@empty, - color=blue + color=\Changes@optiondefaultcolor }{} % \end{macrocode} % -% \minisec{\chcommand{added}} +% \minisec{\doccommand{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} % @@ -413,17 +443,15 @@ % \begin{macrocode} \presetkeys{Changes@added}{ id=\@empty, - remark=\@empty, comment=\@empty, }{} % \end{macrocode} % -% \minisec{\chcommand{deleted}} +% \minisec{\doccommand{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} % @@ -431,17 +459,15 @@ % \begin{macrocode} \presetkeys{Changes@deleted}{ id=\@empty, - remark=\@empty, comment=\@empty, }{} % \end{macrocode} % -% \minisec{\chcommand{replaced}} +% \minisec{\doccommand{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} % @@ -449,17 +475,15 @@ % \begin{macrocode} \presetkeys{Changes@replaced}{ id=\@empty, - remark=\@empty, comment=\@empty, }{} % \end{macrocode} % -% \minisec{\chcommand{highlight}} +% \minisec{\doccommand{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} % @@ -467,12 +491,11 @@ % \begin{macrocode} \presetkeys{Changes@highlight}{ id=\@empty, - remark=\@empty, comment=\@empty, }{} % \end{macrocode} % -% \minisec{\chcommand{comment}} +% \minisec{\doccommand{comment}} % % Declare available options of the command, define value storage. % \begin{macrocode} @@ -486,7 +509,7 @@ }{} % \end{macrocode} % -% \minisec{\chcommand{listofchanges}} +% \minisec{\doccommand{listofchanges}} % % Declare available options of the command, define value storage. % \begin{macrocode} @@ -522,101 +545,140 @@ \ProcessOptionsX*\relax % \end{macrocode} % -% \subsection{Packages} +% \subsection{Utility tests} % -% \begin{macro}{\isColored} +% \begin{macro}{\IfIsColored} % % Check if text should be colored. +% +% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests. +% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation. % \begin{macrocode} -\newtest{\isColored}{% - \not\equal{\Changes@optionmarkup}{nocolor}% +\newrobustcmd{\IfIsColored}[2]{% + \IfStrEq{\Changes@optionmarkup}{nocolor}% + {#2}% + {#1}% } % \end{macrocode} % \end{macro} % -% Package \chpackage{xcolor} provides colored text. +% \begin{macro}{\IfIsEmpty} +% +% Checks if text in \docoption{\#1} is empty, executes \docoption{\#2} if empty, \docoption{\#3} otherwise. +% +% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests. +% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation. % \begin{macrocode} -\ifthenelse{\isColored} - { - \RequirePackage{xcolor} - } +\newrobustcmd{\IfIsEmpty}[3]{% + \ifboolexpr{% + test {\ifblank{#1}} or% + test {\IfStrEq{#1}{}} or% + test {\IfStrEq{#1}{\@empty}}% + }% + {#2}% + {#3}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfIsAnonymous} +% +% Check if author id is empty, therefore the author is anonymous. +% +% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests. +% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation. +% \begin{macrocode} +\newrobustcmd{\IfIsAnonymous}[3]{% + \IfIsEmpty{#1}{#2}{#3}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfIsAuthorEmptyAtPosition} +% +% 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 \doccommand{ifthenelse}. +% +% This test could be removed if the test for empty \doccommand{Changes@output@author} would work. % todo +% +% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests. +% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation. +% \begin{macrocode} +\newrobustcmd{\IfIsAuthorEmptyAtPosition}[4]{% + \ifboolexpr{% + test {\IfIsAnonymous{#1}} or% + not test {\IfStrEq{\Changes@optionauthormarkupposition}{#2}}% + }% + {#3}% + {#4}% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Packages} +% +% Package \docpackage{xcolor} provides colored text. +% \begin{macrocode} +\IfIsColored + {\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} +% Package \docpackage{ulem} provides commands for striking out text. +% Providing the needed package options via \doccommand{ExecuteOptionsX}. +% \begin{macrocode} +\ifboolexpr{ + test {\IfIsInList{\Changes@optionaddedmarkup}{dashuline|dotuline|sout|uline|uuline|uwave|xout}} or + test {\IfIsInList{\Changes@optiondeletedmarkup}{dashuline|dotuline|sout|uline|uuline|uwave|xout}} or + test {\IfIsInList{\Changes@optionhighlightmarkup}{dashuline|dotuline|sout|uline|uuline|uwave|xout}} } {\RequirePackage{ulem}} {} % \end{macrocode} % -% Package \chpackage{todonotes} provides commands for todo notes in the margin. +% Package \docpackage{todonotes} provides commands for todo notes in the margin. % \begin{macrocode} -\ifthenelse{ - \equal{\Changes@optioncommentmarkup}{todo} -} +\IfStrEq{\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}} +% If the \docpackage{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 \docpackage{babel} or the \docpackage{polyglossia} package is loaded, the default language is English too for undefined languages. +% \begin{macrocode} +\def\listofchangesname{List of changes} +\def\summaryofchangesname{Changes} +\def\compactsummaryofchangesname{Changes (compact)} +\def\changesaddedname{Added} +\def\changesdeletedname{Deleted} +\def\changesreplacedname{Replaced} +\def\changeshighlightname{Highlighted} +\def\changescommentname{Commented} +\def\changesauthorname{Author} +\def\changesanonymousname{anonymous} +\def\changesnochanges{No changes.} +\def\changesnoloc{List of changes is available after the next \LaTeX\ run.} +\def\changesnosoc{Summary of changes is available after the next \LaTeX\ run.} +% \end{macrocode} +% +% The check for \docpackage{babel} or \docpackage{polyglossia}, define language dependent texts afterwards. +% \begin{macrocode} +\ifboolexpr{ + test {\@ifpackageloaded{babel}} or + test {\@ifpackageloaded{polyglossia}} +} { \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\changesaddedname{Eingef\"ugt}} + \addto\captionsngerman{\def\changesdeletedname{Gel\"oscht}} + \addto\captionsngerman{\def\changesreplacedname{Ersetzt}} \addto\captionsngerman{\def\changeshighlightname{Hervorgehoben}} \addto\captionsngerman{\def\changescommentname{Kommentiert}} - \addto\captionsngerman{\def\changesauthorname{Autor}} + \addto\captionsngerman{\def\changesauthorname{Autor:in}} \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.}} @@ -625,12 +687,12 @@ \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\changesaddedname{Eingef\"ugt}} + \addto\captionsgerman{\def\changesdeletedname{Gel\"oscht}} + \addto\captionsgerman{\def\changesreplacedname{Ersetzt}} \addto\captionsgerman{\def\changeshighlightname{Hervorgehoben}} \addto\captionsgerman{\def\changescommentname{Kommentiert}} - \addto\captionsgerman{\def\changesauthorname{Autor}} + \addto\captionsgerman{\def\changesauthorname{Autor:in}} \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.}} @@ -639,9 +701,9 @@ \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\changesaddedname{Added}} + \addto\captionsenglish{\def\changesdeletedname{Deleted}} + \addto\captionsenglish{\def\changesreplacedname{Replaced}} \addto\captionsenglish{\def\changeshighlightname{Highlighted}} \addto\captionsenglish{\def\changescommentname{Commented}} \addto\captionsenglish{\def\changesauthorname{Author}} @@ -653,9 +715,9 @@ \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\changesaddedname{Added}} + \addto\captionsbritish{\def\changesdeletedname{Deleted}} + \addto\captionsbritish{\def\changesreplacedname{Replaced}} \addto\captionsbritish{\def\changeshighlightname{Highlighted}} \addto\captionsbritish{\def\changescommentname{Commented}} \addto\captionsbritish{\def\changesauthorname{Author}} @@ -667,9 +729,9 @@ \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\changesaddedname{Aggiunte}} + \addto\captionsitalian{\def\changesdeletedname{Cancellazioni}} + \addto\captionsitalian{\def\changesreplacedname{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}} @@ -681,21 +743,36 @@ {} % \end{macrocode} % -% \subsection{File extension} +% \subsection{File extensions} +% +% \begin{macro}{\Changes@locextension} +% Store file extension for list of changes, set default to \emph{loc}. +% \begin{macrocode} +\newcommand{\Changes@locextension}{loc} +% \end{macrocode} +% \end{macro} % -% \begin{macro}{\Changes@extension} -% Store file extension in variable, set default to \texttt{soc} (summary of changes). +% \begin{macro}{\setlocextension} +% Sets a new file extension for list of changes. % \begin{macrocode} -\newcommand{\Changes@extension}{soc} +\newcommand{\setlocextension}[1]{ + \renewcommand{\Changes@locextension}{#1} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Changes@socextension} +% Store file extension for summary of changes, set default to \emph{soc}. +% \begin{macrocode} +\newcommand{\Changes@socextension}{soc} % \end{macrocode} % \end{macro} % % \begin{macro}{\setsocextension} -% Set a new file extension. -% Argument: new extension. +% Sets a new file extension for summary of changes. % \begin{macrocode} \newcommand{\setsocextension}[1]{ - \renewcommand{\Changes@extension}{#1} + \renewcommand{\Changes@socextension}{#1} } % \end{macrocode} % \end{macro} @@ -715,7 +792,7 @@ % \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). +% Optional arguments (key-value): author's name (default: empty) and author's color (default: \doccommand{Changes@optiondefaultcolor} (blue)). % % Store id, name and color using named variables. % Define counter and color per author. @@ -764,11 +841,21 @@ % 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}}{}{}% + \IfStrEq{\Changes@optionauthormarkup}{superscript}% + {\textsuperscript{#1}}% + {}% + \IfStrEq{\Changes@optionauthormarkup}{subscript}% + {\textsubscript{#1}}% + {}% + \IfStrEq{\Changes@optionauthormarkup}{brackets}% + {(#1)}% + {}% + \IfStrEq{\Changes@optionauthormarkup}{footnote}% + {\footnote{#1}}% + {}% + \IfStrEq{\Changes@optionauthormarkup}{none}% + {}% + {}% } % \end{macrocode} % \end{macro} @@ -807,20 +894,62 @@ % 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} +% Predefined markups for text. +% \begin{macrocode} +\newcommand{\Changes@Markup}[2]{% + \IfStrEq{#1}{background}% + {% + \IfIsColored% + {\colorbox{authorcolor!30}{#2}}% + {#2}% + }% + {}% + \IfStrEq{#1}{bf}% + {\textbf{#2}}% + {}% + \IfStrEq{#1}{colored}% + {#2}% + {}% + \IfStrEq{#1}{dashuline}% + {\dashuline{#2}}% + {}% + \IfStrEq{#1}{dotuline}% + {\dotuline{#2}}% + {}% + \IfStrEq{#1}{em}% + {\emph{#2}}% + {}% + \IfStrEq{#1}{it}% + {\textit{#2}}% + {}% + \IfStrEq{#1}{sl}% + {\textsl{#2}}% + {}% + \IfStrEq{#1}{sout}% + {\sout{#2}}% + {}% + \IfStrEq{#1}{uline}% + {\uline{#2}}% + {}% + \IfStrEq{#1}{uuline}% + {\uuline{#2}}% + {}% + \IfStrEq{#1}{uwave}% + {\uwave{#2}}% + {}% + \IfStrEq{#1}{xout}% + {\xout{#2}}% + {}% +} +% \end{macrocode} +% \end{macro} +% % \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}}{}% + \Changes@Markup{\Changes@optionaddedmarkup}{#1}{}% } % \end{macrocode} % \end{macro} @@ -838,18 +967,7 @@ % 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}}{}% + \Changes@Markup{\Changes@optiondeletedmarkup}{#1}{}% } % \end{macrocode} % \end{macro} @@ -868,14 +986,7 @@ % 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}}{}% + \Changes@Markup{\Changes@optionhighlightmarkup}{#1}{}% } % \end{macrocode} % \end{macro} @@ -900,68 +1011,37 @@ % \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}}% + \IfStrEq{\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}% - }% - }% + \IfIsColored% + {\colorlet{Changes@todocolor}{authorcolor}}% + {\colorlet{Changes@todocolor}{black}}% + \todo[color=Changes@todocolor!10, bordercolor=Changes@todocolor, linecolor=Changes@todocolor!70, nolist]{\textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{authorcommentcount}]} #1}% }{}% -% \end{macrocode} -% -% Something a little more easy. -% \begin{macrocode} - \ifthenelse{\equal{\Changes@optioncommentmarkup}{margin}}% + \IfStrEq{\Changes@optioncommentmarkup}{margin}% {% \marginpar{% - \ifthenelse{\isColored}% + \IfIsColored% {\leavevmode\color{authorcolor}}% {}% - \ifthenelse{\isAnonymous{#2}}% - {\textbf{[\arabic{Changes@commentCount#2}]:} }% - {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }% - #1% + \textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1% }% }{}% - \ifthenelse{\equal{\Changes@optioncommentmarkup}{footnote}}% + \IfStrEq{\Changes@optioncommentmarkup}{footnote}% {% \footnote{% - \ifthenelse{\isAnonymous{#2}}% - {\textbf{[\arabic{Changes@commentCount#2}]:} }% - {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }% - #1% + \textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1% }% }{}% - \ifthenelse{\equal{\Changes@optioncommentmarkup}{uwave}}% + \IfStrEq{\Changes@optioncommentmarkup}{uwave}% {% {% - \ifthenelse{\isColored}% + \IfIsColored% {\color{authorcolor}}% {}% \allowbreak% \uwave{% - \ifthenelse{\isAnonymous{#2}}% - {\textbf{[\arabic{Changes@commentCount#2}]:} }% - {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }% - #1% + \textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1% }% }% }{}% @@ -981,64 +1061,14 @@ % % \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. +% +% Loop code is taken from \url{https://texfaq.org/FAQ-repeat-num} % % This command has the following arguments: % \begin{enumerate} @@ -1046,23 +1076,26 @@ % \end{enumerate} % % \begin{macrocode} -\newboolean{Changes@WrongID} +\newbool{Changes@WrongID} \newcommand{\Changes@check@author}[1]{% - \ifIsEmpty{#1}% + \IfIsEmpty{#1}% {}% {% - \setboolean{Changes@WrongID}{true}% + \setbool{Changes@WrongID}{true}% \setcounter{Changes@Author}{0}% - \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{% + \loop% \stepcounter{Changes@Author}% - \ifthenelse{\equal{#1}{\@nameuse{Changes@AuthorID\theChanges@Author}}}% - {\setboolean{Changes@WrongID}{false}}% + \IfStrEq{#1}{\csuse{Changes@AuthorID\theChanges@Author}}% + {\setbool{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}}}% + \ifnum\theChanges@Author<\theChanges@AuthorCount% + \repeat% + \ifbool{Changes@WrongID}% + {% + \PackageError{changes}% + {Undefined changes author: #1}% + {You have to define the author #1 with e.g.: \definechangesauthor{#1}}% + }% {}% }% } @@ -1079,29 +1112,24 @@ % \item position to output the author to (left or right) % \end{enumerate} % -% \chcommand{DeclareRobustCommand} is used for not breaking the todo note definition. +% \doccommand{DeclareRobustCommand} is used for not breaking the todo note definition. % \begin{macrocode} -\DeclareRobustCommand{\Changes@output@author}[2]{% +\newrobustcmd{\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}}% + \IfIsAuthorEmptyAtPosition{#1}{#2}% {}% {% - \ifthenelse{\equal{\Changes@optionauthormarkuptext}{id}}% - {% - #1% - }% + \IfStrEq{\Changes@optionauthormarkuptext}{id}% + {#1}% {}% - \ifthenelse{\equal{\Changes@optionauthormarkuptext}{name}}% + \IfStrEq{\Changes@optionauthormarkuptext}{name}% {% - \ifIsEmpty{\@nameuse{Changes@AuthorName#1}}% - {% - #1% - }{% - \@nameuse{Changes@AuthorName#1}% - }% + \IfIsEmpty{\csuse{Changes@AuthorName#1}}% + {#1}% + {\csuse{Changes@AuthorName#1}}% }% {}% }% @@ -1119,9 +1147,9 @@ % \end{enumerate} % % \begin{macrocode} -\newcommand{\Changes@set@color}[1]{% - \ifthenelse{\isColored}% - {\colorlet{authorcolor}{\@nameuse{Changes@AuthorColor#1}}}% +\newrobustcmd{\Changes@set@color}[1]{% + \IfIsColored% + {\colorlet{authorcolor}{\csuse{Changes@AuthorColor#1}}}% {}% } % \end{macrocode} @@ -1138,12 +1166,44 @@ % % \begin{macrocode} \newcounter{authorcommentcount} -\newcommand{\Changes@set@commentcount}[1]{% +\newrobustcmd{\Changes@set@commentcount}[1]{% \setcounter{authorcommentcount}{\value{Changes@commentCount#1}}% } % \end{macrocode} % \end{macro} % +% \begin{macro}{\Changes@set@commandname} +% +% Sets the command name according to setting of \docoption{commandname}. +% \begin{macrocode} +\def\Changes@commandprefix{ch} +\newrobustcmd{\Changes@set@commandname}[1]{ + \def\Changes@commandname{#1} + \IfStrEq{\Changes@optioncommandnameprefix}{always} + { + \def\Changes@commandname{\Changes@commandprefix#1} + \typeout{changes-package option commandnameprefix=always: using prefix on #1, new command name is \Changes@commandname.} + }{ + \ifcsdef{#1} + { + \IfStrEq{\Changes@optioncommandnameprefix}{none} + { + \PackageError{changes} + {Command #1 is already defined.} + {Try package option commandnameprefix with "always" or "ifneeded", e.g. usepackage[commandnameprefix=always]{changes}} + }{} + \IfStrEq{\Changes@optioncommandnameprefix}{ifneeded} + { + \def\Changes@commandname{\Changes@commandprefix#1} + \PackageWarning{changes}{Command #1 is already defined, using \Changes@commandname} + }{} + } + {} + } +} +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\Changes@output} % % Output command for the changed text. @@ -1159,12 +1219,12 @@ % \item text for list of changes % \end{enumerate} % \begin{macrocode} -\newcommand{\Changes@output}[7]{% +\newrobustcmd{\Changes@output}[7]{% % \end{macrocode} % -% Output changed text if option \choption{draft} is set, otherwise output unchanged text. +% Output changed text if option \docoption{draft} is set, otherwise output unchanged text. % \begin{macrocode} - \ifthenelse{\boolean{Changes@optiondraft}}% + \ifbool{Changes@optiondraft}% {% % \end{macrocode} % @@ -1183,23 +1243,18 @@ % % 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}% - }% + \IfIsInList{#1}{added|deleted|replaced|highlight}% {% % \end{macrocode} % % Author text for left positioning (only without comment). % \begin{macrocode} - \ifIsEmpty{#5}% + \IfIsEmpty{#5}% {% - \ifthenelse{\isAuthorEmpty{#2}{left}}% + \IfIsAuthorEmptyAtPosition{#2}{left}% {}% {{% - \ifthenelse{\isColored}% + \IfIsColored% {\color{authorcolor}}% {}% \Changes@Markup@author{\Changes@output@author{#2}{left}}% @@ -1210,27 +1265,27 @@ % Changed/highlighted text. % \begin{macrocode} {% - \ifthenelse{\not\equal{#1}{highlight}}% - {% - \ifthenelse{\isColored}% + \IfStrEq{#1}{highlight}% + {}{% + \IfIsColored% {\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}}{}% + }% + \IfStrEq{#1}{added}{\Changes@Markup@added{#3}}{}% + \IfStrEq{#1}{deleted}{\Changes@Markup@deleted{#4}}{}% + \IfStrEq{#1}{replaced}{{\Changes@Markup@added{#3}}\allowbreak\Changes@Markup@deleted{#4}}{}% + \IfStrEq{#1}{highlight}{\Changes@Markup@highlight{#3}}{}% }% % \end{macrocode} % % Author text for right positioning (only without comment). % \begin{macrocode} - \ifIsEmpty{#5}% + \IfIsEmpty{#5}% {% - \ifthenelse{\isAuthorEmpty{#2}{right}}% + \IfIsAuthorEmptyAtPosition{#2}{right}% {}% {{% - \ifthenelse{\isColored}% + \IfIsColored% {\color{authorcolor}}% {}% \Changes@Markup@author{\Changes@output@author{#2}{right}}% @@ -1246,7 +1301,7 @@ % % Comments. % \begin{macrocode} - \ifIsEmpty{#5}% + \IfIsEmpty{#5}% {}% {% \stepcounter{Changes@commentCount#2}% @@ -1260,17 +1315,17 @@ % \end{macrocode} % Store line for list of changes. % \begin{macrocode} - \ifIsEmpty{#2}% + \IfIsEmpty{#2}% {\def\Changes@locid{}}% {\def\Changes@locid{~(#2)}}% - \addtocontents{loc}{\protect\ChangesListline{#1}{#6\Changes@locid}{#7}{\thepage}}% + \addtocontents{\Changes@locextension}{\protect\ChangesListline{#1}{#6\Changes@locid}{#7}{\thepage}}% }% % \end{macrocode} % -% Output unchanged text (option \choption{final} was set). +% Output unchanged text (option \docoption{final} was set). % \begin{macrocode} {% - \ifIsEmpty{#3}% + \IfIsEmpty{#3}% {\@bsphack\@esphack}% {#3}% }% @@ -1282,38 +1337,21 @@ % The command formats text as new text. % % Mandatory argument: added text. -% Optional argument (key-value): author's id, comment, remark (deprecated) +% Optional argument (key-value): author's id, comment % \begin{macrocode} -\newcommand{\added}[2][\@empty]{% +\Changes@set@commandname{added} +\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[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}% + {\changesaddedname}% {#2}% } % \end{macrocode} @@ -1323,42 +1361,25 @@ % 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). +% It solves the problem of additional space caused by an empty command (e.g. when using the \docoption{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) +% Optional argument (key-value): author's id, comment % \begin{macrocode} -\newcommand{\deleted}[2][\@empty]{% +\Changes@set@commandname{deleted} +\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[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}% + {\changesdeletedname}% {#2}% } % \end{macrocode} @@ -1368,38 +1389,21 @@ % The command formats text as replaced text. % % Mandatory arguments: new text and old text. -% Optional argument (key-value): author's id, comment, remark (deprecated) +% Optional argument (key-value): author's id, comment % \begin{macrocode} -\newcommand{\replaced}[3][\@empty]{% +\Changes@set@commandname{replaced} +\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[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}% + {\changesreplacedname}% {#2}% } % \end{macrocode} @@ -1409,32 +1413,15 @@ % The command formats text as highlighted text. % % Mandatory argument: highlighted text. -% Optional argument (key-value): author's id, comment, remark (deprecated) +% Optional argument (key-value): author's id, comment % \begin{macrocode} -\newcommand{\highlight}[2][\@empty]{% +\Changes@set@commandname{highlight} +\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[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}% @@ -1453,7 +1440,8 @@ % Mandatory argument: comment text. % Optional argument (key-value): author's id % \begin{macrocode} -\newcommand{\comment}[2][\@empty]{% +\Changes@set@commandname{comment} +\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[2][\@empty]{% % \end{macrocode} % % Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage. @@ -1473,9 +1461,9 @@ % % \subsection{List of changes} % -% The list of changes truncates text, therefore the \chpackage{truncate} package is used. +% The list of changes truncates text, therefore the \docpackage{truncate} package is used. % (Using fit and redefining the marker: suggestion and code by Frank Mittelbach) -% Providing the needed package options via \chcommand{ExecuteOptionsX}. +% Providing the needed package options via \doccommand{ExecuteOptionsX}. % \begin{macrocode} \RequirePackage{truncate} \renewcommand\TruncateMarker{ [\dots\negthinspace]\ } @@ -1488,14 +1476,14 @@ % 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}% + \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} @@ -1507,33 +1495,23 @@ % This command has the following arguments: % \begin{enumerate} % \item change type (added, ...) +% \item change description with author % \item text % \item page % \end{enumerate} % % \begin{macrocode} \newcommand{\ChangesListline}[4]{% - \IfSubStr{\Changes@loc@show}{#1}{% + \IfIsInList{#1}{\Changes@loc@show}{% \@ifundefined{@dotsep}% - {\def\@dotsep{4.5}}{}% - \@dottedtocline{1}{0px}{2em}{#2: \truncate{\Changes@truncate@width}{#3}}{#4}% + {\def\@dotsep{4.5}}% + {}% + \@dottedtocline{1}{0pt}{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. @@ -1545,15 +1523,15 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\Changes@summary@width} +% \begin{macro}{\Changes@truncate@width} % -% Length for the width of the change summary. +% Length for the width of the truncation. % -% Default: one third of the text width +% Default: two third of the text width % % \begin{macrocode} -\newlength{\Changes@summary@width} -\setlength{\Changes@summary@width}{.3\textwidth} +\newlength{\Changes@truncate@width} +\settruncatewidth{.6\textwidth} % \end{macrocode} % \end{macro} % @@ -1579,143 +1557,109 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\Changes@summaryline} +% \begin{macro}{\Changes@summary@width} % -% Auxiliary command for output of a summary line. +% Length for the width of the change summary. % -% 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} +% Default: one third of the text width % % \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% - }{}% - }{}% -} +\newlength{\Changes@summary@width} +\setsummarywidth{.3\textwidth} % \end{macrocode} % \end{macro} % % \begin{macro}{\listofchanges} % % This command outputs the list of changes. -% Options: \choption{style} and \choption{title}. +% Options: \docoption{title}, \docoption{style} and \docoption{show}. % % 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 +% \item [\docoption{list}] prints the list of changes like a list of figures +% \item [\docoption{summary}] prints the number of changes grouped by author +% \item [\docoption{compactsummary}] same as \docoption{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. +% The following show values are available: +% \begin{description} +% \item [\docoption{all}] all kinds of changes +% \item [\docoption{added}] print only additions (same for delete, replace, highlight, comment) +% \item [\docoption{added|deleted}] print additions and deletions (and other combinations with |) +% \end{description} % -% 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}. +% For the lists, the values are read from the auxiliary files (loc and soc). +% If no loc/soc-files exists, an according message is generated. % \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}}% + \ifbool{Changes@optiondraft}% {% % \end{macrocode} % -% Check if style is known, otherwise use \choption{list} by default. +% Check if style is known, otherwise use \docoption{list} by default. % \begin{macrocode} - \ifIsEmpty{\Changes@loc@style}% - {\def\Changes@loc@style{list}}% + \IfIsInList{\Changes@loc@style}{list|summary|compactsummary}% + {}% {% - \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}% - }% + \PackageWarning{changes}{Wrong style for list of changes: '\Changes@loc@style', using 'list' instead.}% + \def\Changes@loc@style{}% }% + \IfIsEmpty{\Changes@loc@style}% + {\def\Changes@loc@style{list}}% + {}% % \end{macrocode} % -% Check if show-value is known, otherwise use \choption{all} by default. +% Check if show-value is known, otherwise use \docoption{all} by default. % \begin{macrocode} - \ifIsEmpty{\Changes@loc@show}% - {\def\Changes@loc@show{all}}% + \IfStrEq{\Changes@loc@show}{all}% + {\def\Changes@loc@show{added|deleted|replaced|highlight|comment}}% + {}% + \IfIsInList{\Changes@loc@show}{added|deleted|replaced|highlight|comment}% + {}% {% -% \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}% - }% + \PackageWarning{changes}{Wrong show-value for list of changes: '\Changes@loc@show', using 'all' instead.}% + \def\Changes@loc@show{}% }% - \ifthenelse{\equal{\Changes@loc@show}{all}}% - {% - \def\Changes@loc@show{added|deleted|replaced|highlight|comment}% - }{}% + \IfIsEmpty{\Changes@loc@show}% + {\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}% + \IfIsEmpty{\Changes@loc@title}% {% - \ifthenelse{\equal{\Changes@loc@style}{list}}% + \IfStrEq{\Changes@loc@style}{list}% {\def\Changes@heading{\listofchangesname}}{}% - \ifthenelse{\equal{\Changes@loc@style}{summary}}% + \IfStrEq{\Changes@loc@style}{summary}% {\def\Changes@heading{\summaryofchangesname}}{}% - \ifthenelse{\equal{\Changes@loc@style}{compactsummary}}% + \IfStrEq{\Changes@loc@style}{compactsummary}% {\def\Changes@heading{\compactsummaryofchangesname}}{}% - }{}% + }% + {\def\Changes@heading{\Changes@loc@title}}% \section*{\Changes@heading} % \end{macrocode} % % Print list. +% +% The \doccommand{ifeof} command is neccessary in the loop too, otherwise there are problems with the last (empty) line of the file. % \begin{macrocode} - \ifthenelse{\equal{\Changes@loc@style}{list}}% + \IfIsInList{\Changes@loc@style}{list}% {% - \IfFileExists{\jobname.loc}% + \IfFileExists{\jobname.\Changes@locextension}% {% - \setboolean{Changes@MoreLines}{true}% \newread\Changes@InFile% - \openin\Changes@InFile = \jobname.loc% - \whiledo{\boolean{Changes@MoreLines}}{% + \openin\Changes@InFile=\jobname.\Changes@locextension% + \loop\unless\ifeof\Changes@InFile% \read\Changes@InFile to \Changes@Line% - \ifeof\Changes@InFile% - \setboolean{Changes@MoreLines}{false}% - \else% + \ifeof\Changes@InFile\else% \Changes@Line% - \fi% - }% + \fi + \repeat \closein\Changes@InFile% }{% \emph{\changesnoloc}% @@ -1724,52 +1668,73 @@ }{}% % \end{macrocode} % Print summary or compact summary. +% +% The \doccommand{ifeof} command is neccessary in the loop too, otherwise there are problems with the last (empty) line of the file. % \begin{macrocode} - \ifthenelse{\equal{\Changes@loc@style}{summary} \or \equal{\Changes@loc@style}{compactsummary}}% + \IfIsInList{\Changes@loc@style}{summary|compactsummary}% {% - \IfFileExists{\jobname.\Changes@extension}% + \IfFileExists{\jobname.\Changes@socextension}% {% - \setboolean{Changes@MoreLines}{true}% \newread\Changes@InFile% - \openin\Changes@InFile = \jobname.\Changes@extension% - \whiledo{\boolean{Changes@MoreLines}}{% + \openin\Changes@InFile = \jobname.\Changes@socextension% +% \end{macrocode} +% Every line contains the author's id, color and number of changes. +% \begin{macrocode} + \loop\unless\ifeof\Changes@InFile% \read\Changes@InFile to \Changes@Line% - \ifeof\Changes@InFile% - \setboolean{Changes@MoreLines}{false}% - \else% + \ifeof\Changes@InFile\else% \expandafter\changes@chopline\Changes@Line\\% \textbf{% - \ifthenelse{\isColored}% - {\color{\Changes@InColor}}% + \IfIsColored% + {\color{\Changes@Incolor}}% {}% - \ifthenelse{\equal{\Changes@InID}{\@empty}}% + \IfIsAnonymous{\Changes@Inid}% {\changesauthorname: \changesanonymousname}% {% - \changesauthorname: \Changes@InID% - \ifthenelse{\equal{\Changes@InName}{\@empty}}% + \changesauthorname: \Changes@Inid% + \IfIsEmpty{\Changes@Inname}% {}% - { (\Changes@InName)}% + { (\Changes@Inname)}% }% }\\% - \ifthenelse{% - \Changes@InAdded > 0 \or% - \Changes@InDeleted > 0 \or% - \Changes@InReplaced > 0 \or% - \Changes@InHighlight > 0 \or% - \Changes@InComment > 0% +% \end{macrocode} +% Compute the relevant sum of changes in order to print "no changes" correctly. +% \begin{macrocode} + \numdef{\Changes@InSum}{0}% + \renewcommand*{\do}[1]{% + \numdef{\Changes@InSum}{\Changes@InSum + \csuse{Changes@In########1}}% }% + \expandafter\dopsvlist\expandafter{\Changes@loc@show}% +% \end{macrocode} +% Print summary. +% \begin{macrocode} + \ifnumcomp{\Changes@InSum}{=}{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]% }% {% - \parbox{\Changes@summary@width}{\changesnochanges}\\[1ex]% + \numdef{\Changes@InCount}{0}% + \renewcommand*{\do}[1]{% + \numdef{\Changes@InCount}{\Changes@InCount + \csuse{Changes@In########1}}% + \ifboolexpr{% + not test {\IfStrEq{\Changes@loc@style}{compactsummary}} or% + test {\ifnumgreater{\csuse{Changes@In########1}}{0}}% + }% + {% + \parbox{\Changes@summary@width}{\csuse{changes########1name}~\let\cleaders\leaders\dotfill~\csuse{Changes@In########1}}% + \ifnumless{\Changes@InCount}{\Changes@InSum}% + {\\}% + {\\[1ex]}% + }% + {}% + }% + \expandafter\dopsvlist\expandafter{\Changes@loc@show}% }% \fi% - }% +% \end{macrocode} +% File read loop. +% \begin{macrocode} + \repeat \closein\Changes@InFile% }{% \emph{\changesnosoc}% @@ -1785,7 +1750,7 @@ % \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}. +% Changes are written as \hologo{LaTeX}-formatted text, so they can simply be read via \doccommand{input}. % % The order of entries is: id, color, name, added, deleted, replaced, comment, highlight. % The contents have to be separated by a semicolon. @@ -1795,10 +1760,10 @@ % Open output file. % \begin{macrocode} \newwrite\Changes@OutFile - \immediate\openout\Changes@OutFile = \jobname.\Changes@extension + \immediate\openout\Changes@OutFile = \jobname.\Changes@socextension % \end{macrocode} -% Redefine expandable of \chcommand{protect} in order to write correct special characters. -% Store original definition for resetting \chcommand{protect}. +% Redefine expandable of \doccommand{protect} in order to write correct special characters. +% Store original definition for resetting \doccommand{protect}. % \begin{macrocode} \let\Changes@protect\protect \let\protect\@unexpandable@protect @@ -1806,24 +1771,24 @@ % Output data for list of changes. % \begin{macrocode} \setcounter{Changes@Author}{0} - \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{% + \loop\unless\ifnum\theChanges@Author = \value{Changes@AuthorCount} \stepcounter{Changes@Author}% - \def\Changes@ID{\@nameuse{Changes@AuthorID\theChanges@Author}}% + \def\Changes@ID{\csuse{Changes@AuthorID\theChanges@Author}}% \immediate\write\Changes@OutFile{\Changes@ID;% - \@nameuse{Changes@AuthorColor\Changes@ID};% - \@nameuse{Changes@AuthorName\Changes@ID};% + \csuse{Changes@AuthorColor\Changes@ID};% + \csuse{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}}% - }% + \repeat % \end{macrocode} % Close output file. % \begin{macrocode} \immediate\closeout\Changes@OutFile % \end{macrocode} -% Restore original definition of \chcommand{protect}. +% Restore original definition of \doccommand{protect}. % \begin{macrocode} \let\protect\Changes@protect % \end{macrocode} @@ -1831,10 +1796,10 @@ % 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 - }{}% + \@ifundefined{tf@\Changes@locextension}{ + \expandafter\newwrite\csname tf@\Changes@locextension\endcsname + \immediate\openout \csname tf@\Changes@locextension\endcsname \jobname.\Changes@locextension\relax + }{} \fi } % \end{macrocode} |