latex-newnotation/newnotation.sty

720 lines
24 KiB
TeX
Executable File

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PACKAGE: NewNotation
% AUTHOR: Gaetano Geck
%
% OPTIONS:
% * rtl - Enables right-to-left orientation of table columns
%
%
% HISTORY:
% * 2015-12-23: First stable version, supporting:
% (v0.1) - commands with/without parameters
% - commands with/without descriptions
% - counting of uses of commands
% - grouped tables
% * 2015-12-25: Added
% (v0.2) - support for new tables
% - saving/loading of tables
% * 2015-12-25: use \newrobustcmd instead of \newcommand
% * 2015-12-26: - Added support for long tables and multiline descriptions
% (v0.3) - Renamed commands, allowed respecification of text & layout
% - Added support for right-to-left tables
% - Allowed specification of layout for table and groups
% * 2015-12-27: - Use package 'translations'
% (v0.4) - Allowed specification of layout for column headers
% * 2015-12-28: - Complete refacorization of the implementation
% (v0.5) (using lists, booleans)
% - Handled printing of empty groups
% - Support detailed and non-detailed tables
% * 2015-12-28: - Support redefinition
% (v0.6)
% * 2015-12-28: - Support package warnings and error messages
% (v0.7) - Support customized argument replacements
% * 2015-12-29: - Print number of arguments in detailed table
% (v0.8) - Improved spacing in output
% * 2015-12-29: Support output levels
% (v0.9)
% * 2015-12-29: Loosened dependency on babel
% (v0.91)
% * 2016-02-21: Added support for default values for optional first arguments.
% (v0.92)
% * 2016-06-18: Added starred versions for \newnotation and \renewnotation,
% (v0.93) which do do not embrace the replacement such that additional
% spaces (as for math relation or operator symbols) remain.
% * 2016-09-10: Added support for classes.
% (v0.94)
% * 2018-02-07: Added support relation symbols.
% (v0.95)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ProvidesPackage{newnotation}[2018/02/07 v0.95]
\RequirePackage{ifthen}
\RequirePackage{xparse}
\RequirePackage{xcolor}
\RequirePackage{xspace}
\RequirePackage{etoolbox}
\RequirePackage{tabularx}
\RequirePackage{ltablex}
\RequirePackage{amsmath}
\RequirePackage{pgffor}
\provideboolean{PackageBabelAvailable}
\ifcsdef{bbl@loaded}{\setboolean{PackageBabelAvailable}{true}}{}
\ifbool{PackageBabelAvailable}{%
\RequirePackage{translations}%
}{}
%==============================================================================
% TABLE OF CONTENTS
% -----------------
% 1. Translations
% 2. Internal interface
% a) Layout
% b) Printing
% c) Groups
% 3. External interface
% a) Layout
% b) Printing
% c) Groups/Tables
% d) Defining notation
%==============================================================================
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% BEGIN OF IMPLEMENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% helper functions ------------------------------------------------------------
\newcommand{\providecounter}[1]{%
\ifcsdef{c@#1}%
{\setcounter{#1}{0}}%
{\newcounter{#1}}%
}
%!helper functions ------------------------------------------------------------
\provideboolean{@NNUseRTL}
\provideboolean{@NNDetailed}
\provideboolean{@NNInListMode}
\provideboolean{@NNPrintGroup}
\providecounter{@NNCurrentGroup}
\providecounter{@NNNumberOfAllGroups}
\providecounter{@NNNumberOfEntriesInGroup0}%
\providecounter{@NNNumberOfAllEntries}%
\DeclareOption{rtl}{\setboolean{@NNUseRTL}{true}} % right-to-left
\ProcessOptions\relax
% =============================================================================
% 1. TRANSLATIONS -------------------------------------------------------------
% =============================================================================
\ifbool{PackageBabelAvailable}{%
\DeclareTranslationFallback{Table of notation}{Table of notation}%
\DeclareTranslation{German}{Table of notation}{Notationstabelle}%
\DeclareTranslationFallback{symbol}{symbol}%
\DeclareTranslation{German}{symbol}{Symbol}%
\DeclareTranslationFallback{macro name}{macro name}%
\DeclareTranslation{German}{macro name}{Makroname}%
\DeclareTranslationFallback{uses}{uses}%
\DeclareTranslation{German}{uses}{Verw.}%
\DeclareTranslationFallback{description}{description}%
\DeclareTranslation{German}{description}{Beschreibung}%
\DeclareTranslationFallback{no entries}{no entries}%
\DeclareTranslation{German}{no entries}{keine Einträge}%
}{}
\ifbool{PackageBabelAvailable}%
{\newcommand{\gettranslation}[1]{\GetTranslation{#1}}}%
{\newcommand{\gettranslation}[1]{#1}}
% =============================================================================
% 2. INTERNAL INTERFACE--------------------------------------------------------
% =============================================================================
% -----------------------------------------------------------------------------
% 2a) Layout
% -----------------------------------------------------------------------------
% NOTE: Redefinition of these layouters from outside this package is easily
% possible by using the commands defined in Section 3a).
\newcommand{\@NNLAYOUTArgument}[1]{\textcolor{blue}{#1}}
\newcommand{\@NNLAYOUTZeroUses}[1]{\textcolor{red}{#1}}
\newcommand{\@NNLAYOUTColumnHeader}[1]{\textbf{#1}}
\newcommand{\@NNLAYOUTTable}[1]{%
\notbool{@NNUseRTL}%
{{\Large\textbf{#1}}\hrulefill}%
{\hrulefill{\Large\textbf{#1}}}%
}
\newcommand{\@NNLAYOUTGroup}[1]{%
\notbool{@NNUseRTL}%
{{\large\textbf{#1}}\dotfill}%
{{\dotfill{\large\textbf{#1}}}}%
}
\newcommand{\@NNDefaultArgumentA}{1}
\newcommand{\@NNDefaultArgumentB}{2}
\newcommand{\@NNDefaultArgumentC}{3}
\newcommand{\@NNDefaultArgumentD}{4}
\newcommand{\@NNDefaultArgumentE}{5}
\newcommand{\@NNDefaultArgumentF}{6}
\newcommand{\@NNDefaultArgumentG}{7}
\newcommand{\@NNDefaultArgumentH}{8}
\newcommand{\@NNDefaultArgumentI}{9}
\let\@NNArgumentA\@NNDefaultArgumentA
\let\@NNArgumentB\@NNDefaultArgumentB
\let\@NNArgumentC\@NNDefaultArgumentC
\let\@NNArgumentD\@NNDefaultArgumentD
\let\@NNArgumentE\@NNDefaultArgumentE
\let\@NNArgumentF\@NNDefaultArgumentF
\let\@NNArgumentG\@NNDefaultArgumentG
\let\@NNArgumentH\@NNDefaultArgumentH
\let\@NNArgumentI\@NNDefaultArgumentI
% *************************************
% \@NNShowIf
% *************************************
% Fancy layout for argument numbers in a command description:
% shows text a_1 only if a_2 <= a_3, for another given number a_3:
\newcommand{\@NNShowIf}[3]{\ifthenelse{#2 > #3}{}{{\@NNLAYOUTArgument{#1}}}}
% -----------------------------------------------------------------------------
% 2b) Printing
% -----------------------------------------------------------------------------
% *************************************
% \@NNPrintTableHeader
% *************************************
% Print non-detailed or detailed table header
% either left-to-right or right-to-left.
\newcommand{\@NNPrintTableHeader}{%
\notbool{@NNDetailed}%
{%
\notbool{@NNUseRTL}%
{%
\@NNLAYOUTColumnHeader{\gettranslation{symbol}} &%
\@NNLAYOUTColumnHeader{\gettranslation{description}} \\%
}%
{%
\@NNLAYOUTColumnHeader{\gettranslation{description}} & %
\@NNLAYOUTColumnHeader{\gettranslation{symbol}} \\ %
}%
}%
{%
\notbool{@NNUseRTL}%
{%
\@NNLAYOUTColumnHeader{\gettranslation{symbol}} &%
\@NNLAYOUTColumnHeader{\gettranslation{macro name}} &%
\@NNLAYOUTColumnHeader{\gettranslation{uses}} &%
\@NNLAYOUTColumnHeader{\gettranslation{description}}\\%
}%
{%
\@NNLAYOUTColumnHeader{\gettranslation{description}}&%
\@NNLAYOUTColumnHeader{\gettranslation{uses}} &%
\@NNLAYOUTColumnHeader{\gettranslation{macro name}} &%
\@NNLAYOUTColumnHeader{\gettranslation{symbol}} \\%
}%
}%
}
% *************************************
% \@NNPrintCommand
% *************************************
% Fancy output of symbol by macro expansion (with number arguments).
\newcommand{\@NNPrintCommand}[1]{%
\letcs{\NNnum}{@NNArgumentsOfEntry#1}%
\ensuremath{%
\csname @NNCommandOfEntry#1\endcsname%
{\@NNShowIf{\@NNArgumentA}{1}{\NNnum}}%
{\@NNShowIf{\@NNArgumentB}{2}{\NNnum}}%
{\@NNShowIf{\@NNArgumentC}{3}{\NNnum}}%
{\@NNShowIf{\@NNArgumentD}{4}{\NNnum}}%
{\@NNShowIf{\@NNArgumentE}{5}{\NNnum}}%
{\@NNShowIf{\@NNArgumentF}{6}{\NNnum}}%
{\@NNShowIf{\@NNArgumentG}{7}{\NNnum}}%
{\@NNShowIf{\@NNArgumentH}{8}{\NNnum}}%
{\@NNShowIf{\@NNArgumentI}{9}{\NNnum}}%
}%
}
% *************************************
% \@NNPrintCommandName
% *************************************
\newcommand{\@NNPrintCommandName}[1]{%
\texttt{%
\csname @NNMacroNameOfEntry#1\endcsname%
\expandafter\ifthenelse{\csname @NNArgumentsOfEntry#1\endcsname < 1}{}{%
[\csname @NNArgumentsOfEntry#1\endcsname]}%
}%
}
% *************************************
% \@NNPrintEntry
% *************************************
\newcommand{\@NNPrintEntry}[1]{%
\@nameuse{@NNArgDescsOfEntry#1}%
\notbool{@NNDetailed}{%
\notbool{@NNUseRTL}%
{\@NNPrintCommand{#1} & \csname @NNDescriptionOfEntry#1\endcsname \\}%
{\csname @NNDescriptionOfEntry#1\endcsname & \@NNPrintCommand{#1} \\}%
}%
{%
\notbool{@NNUseRTL}%
{%
\@NNPrintCommand{#1} & %
\@NNPrintCommandName{#1} & %
\csname @NNNumberOfUsesOfEntry#1\endcsname & %
\csname @NNDescriptionOfEntry#1\endcsname \\ %
}%
{%
\csname @NNDescriptionOfEntry#1\endcsname & %
\csname @NNNumberOfUsesOfEntry#1\endcsname & %
\@NNPrintCommandName{#1} & %
\@NNPrintCommand{#1} \\ %
}%
}%
}
% *************************************
% \@NNPrintGroup
% *************************************
\newcommand{\@NNPrintGroup}[1]{%
\setboolean{@NNPrintGroup}{true}
\ifbool{@NNDefaultGroup#1}%
{%
\ifthenelse{\expandafter\value{@NNNumberOfEntriesInGroup#1} < 1}%
{\setboolean{@NNPrintGroup}{false}}%
{}%
}%
{%
\noindent\expandafter\@NNLAYOUTGroup{\csname @NNNameOfGroup#1\endcsname}%
\ifthenelse{\expandafter\value{@NNNumberOfEntriesInGroup#1} < 1}%
{\setboolean{@NNPrintGroup}{false}\gettranslation{no entries}}%
{}%
}%
%
\ifbool{@NNPrintGroup}%
{%
\keepXColumns%
\ifbool{@NNDetailed}{%
\notbool{@NNUseRTL}%
{\begin{tabularx}{\textwidth}{lllX}}%
{\begin{tabularx}{\textwidth}{Xlll}}%
}%
{%
\notbool{@NNUseRTL}%
{\begin{tabularx}{\textwidth}{lX}}%
{\begin{tabularx}{\textwidth}{Xl}}%
}%
\@NNPrintTableHeader %
\forlistcsloop{\@NNPrintEntry}{@NNEntriesInGroup#1} %
\end{tabularx}%
}{}%
}
% -----------------------------------------------------------------------------
% 2c) Grouping
% -----------------------------------------------------------------------------
\newcommand{\@NNGroups}{}
\newcommand{\@NNNewGroup}[3]{%
\stepcounter{@NNNumberOfAllGroups}%
\setcounter{@NNCurrentGroup}{\value{@NNNumberOfAllGroups}}%
\listeadd{\@NNGroups}{\the@NNCurrentGroup}%
\csedef{@NNNameOfGroup\the@NNCurrentGroup}{#1}%
\csedef{@NNOutputLevelOfGroup\the@NNCurrentGroup}{#3}%
\expandafter\provideboolean{@NNDefaultGroup\the@NNCurrentGroup}%
\expandafter\setboolean{@NNDefaultGroup\the@NNCurrentGroup}{#2}%
\expandafter\providecounter{@NNNumberOfEntriesInGroup\the@NNCurrentGroup}%
}
\newcommand{\@NNPrepareEntry}[1]{%
\stepcounter{@NNNumberOfAllEntries}%
\stepcounter{@NNNumberOfEntriesInGroup\the@NNCurrentGroup}%
\providecounter{@NNCounter#1}%
\csdef{@NNNumberOfUsesOfEntry\the@NNNumberOfAllEntries}%
{%
\ifthenelse{\value{@NNCounter#1} > 0 }%
{\arabic{@NNCounter#1}}%
{\@NNLAYOUTZeroUses{\arabic{@NNCounter#1}}}%
}%
}
\newcommand{\@NNAddEntry}[5]{%
\listcseadd{@NNEntriesInGroup\the@NNCurrentGroup}{\the@NNNumberOfAllEntries}%
\csedef{@NNCommandOfEntry\the@NNNumberOfAllEntries}{#1}%
\csedef{@NNMacroNameOfEntry\the@NNNumberOfAllEntries}{#2}%
\csedef{@NNArgumentsOfEntry\the@NNNumberOfAllEntries}{#3}%
\csedef{@NNDescriptionOfEntry\the@NNNumberOfAllEntries}{#4}%
\csdef{@NNArgDescsOfEntry\the@NNNumberOfAllEntries}{#5}%
}
% =============================================================================
% EXTERNAL COMMANDS -----------------------------------------------------------
% =============================================================================
% -----------------------------------------------------------------------------
% 3a) Layout
% -----------------------------------------------------------------------------
\newcommand{\notationSetLayoutTable}[1]{\renewcommand{\@NNLAYOUTTable}[1]{#1}}
\newcommand{\notationSetLayoutGroup}[1]{\renewcommand{\@NNLAYOUTGroup}[1]{#1}}
\newcommand{\notationSetLayoutColumnHeader}[1]{\renewcommand{\@NNLAYOUTColumnHeader}[1]{#1}}
\newcommand{\notationSetLayoutArgument}[1]{\renewcommand{\@NNLAYOUTArgument}[1]{#1}}
\newcommand{\notationSetLayoutZeroUses}[1]{\renewcommand{\@NNLAYOUTZeroUses}[1]{#1}}
\newcommand{\notationarg}[2]{%
\ifthenelse{#1 = 1}{\renewcommand{\@NNArgumentA}{#2}}{%
\ifthenelse{#1 = 2}{\renewcommand{\@NNArgumentB}{#2}}{%
\ifthenelse{#1 = 3}{\renewcommand{\@NNArgumentC}{#2}}{%
\ifthenelse{#1 = 4}{\renewcommand{\@NNArgumentD}{#2}}{%
\ifthenelse{#1 = 5}{\renewcommand{\@NNArgumentE}{#2}}{%
\ifthenelse{#1 = 6}{\renewcommand{\@NNArgumentF}{#2}}{%
\ifthenelse{#1 = 7}{\renewcommand{\@NNArgumentG}{#2}}{%
\ifthenelse{#1 = 8}{\renewcommand{\@NNArgumentH}{#2}}{%
\ifthenelse{#1 = 9}{\renewcommand{\@NNArgumentI}{#2}}%
{\PackageWarning{newnotation}{notationarg: Invalid argument number}{Must be an integer between 1 and 9.}}%
}}}}}}}}%
}
% -----------------------------------------------------------------------------
% 3b) Printing
% -----------------------------------------------------------------------------
% *************************************
% \tableofnotation
% *************************************
% Print groups in current table (without macro name or number of uses).
\DeclareDocumentCommand{\tableofnotation}{O{0}}{%
\setboolean{@NNInListMode}{true}%
{% (deliberate free line below)
\bigskip\noindent%
\@NNLAYOUTTable{\gettranslation{Table of notation}}
% (deliberate free line above)
}%
\renewcommand*{\do}[1]{%
\ifthenelse{\@nameuse{@NNOutputLevelOfGroup##1} < #1}{}{%
\@NNPrintGroup{##1}%
}%
}%
\dolistloop{\@NNGroups}%
\setboolean{@NNInListMode}{false}%
}
% *************************************
% \detailedtableofnotation
% *************************************
% Print groups in current table (with macro name and number of uses).
\DeclareDocumentCommand{\detailedtableofnotation}{O{0}}{%
\setboolean{@NNDetailed}{true}%
\tableofnotation[#1]%
\setboolean{@NNDetailed}{false}%
}
% -----------------------------------------------------------------------------
% 3c) Groups/Tables
% -----------------------------------------------------------------------------
% *************************************
% \notationnewgroup
% *************************************
% Creates a subtable with the given group name.
\DeclareDocumentCommand{\notationnewgroup}{O{0} m}{%
\@NNNewGroup{#2}{false}{#1}%
}
% *************************************
% \notationnewtable
% *************************************
% Creates a new table.
\newcommand{\notationnewtable}{%
\renewcommand{\@NNGroups}{}%
\@NNNewGroup{}{true}{0}%
}
\notationnewtable % create new table right at the beginning
% *************************************
% \notationsavetable
% *************************************
% Saves current table's groups in a variable of the given name.
\newcommand{\notationsavetable}[1]{%
\csedef{@NNTableCurrentGroup#1}{\the@NNCurrentGroup}%
\forlistloop{\listcsadd{@NNTable#1}}{\@NNGroups}%
}
% *************************************
% \notationloadtable
% *************************************
% Restores current table's groups from the variable of the given name
\newcommand{\notationloadtable}[1]{%
\ifcsundef{@NNTable#1}{\PackageError{newnotation}{notationloadtable: Unknown table '#1'.}{Misspelled name?}}{}%
\notationnewtable%
\expandafter\setcounter{@NNCurrentGroup}{\csname @NNTableCurrentGroup#1\endcsname}%
\forlistcsloop{\listcsadd{@NNGroups}}{@NNTable#1}%
}
% -----------------------------------------------------------------------------
% 3d) Defining notation
% -----------------------------------------------------------------------------
% *************************************
% \newnotationclass
% *************************************
% Define a class and its replacement
\newcommand{\newnotationclass}[2]{%
\csdef{@NNClass#1}{#2}%
}
% *************************************
% \newnotation
% *************************************
% Define macro and add entry to current group.
%
% Arguments:
% 1. star: prevent extra embracing
% 2. optional: class name
% 3. mandatory: macro name
% 4. optional: number of arguments (default: 0)
% 5. optional: default value for first argument
% 6. mandatory: replacement
% 7. optional: description for table of notation
% 8. optional: description of arguments for table of notation
\DeclareDocumentCommand{\newnotation}{s o m O{0} o m O{} O{}}{%
% Check whether macro is already defined:
\ifdef{#3}%
{\PackageError{newnotation}{newnotation: Command '\string#3' already defined.}{Misspelled name?}}{}%
%
\@NNPrepareEntry{\string#3}%
% DEFAULT VALUE: no ------------------------------------------------
\IfNoValueTF{#5}{%
\newrobustcmd{#3}[#4]{%
\IfNoValueTF{#2}%
% CLASS: no --------------------------------------------
%{no class defined}{class defined}
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{#6}}%
% STAR: no
{\ensuremath{{#6}}}}%
% CLASS: yes -------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\@nameuse{@NNClass#2}{#6}}}%
% STAR: no
{\ensuremath{{\@nameuse{@NNClass#2}{#6}}}}}%
\ifthenelse{\boolean{@NNInListMode}}{}{\protect\stepcounter{@NNCounter\string#3}}%
\xspace%
}%
}{%
% DEFAULT VALUE: yes -----------------------------------------------
\newrobustcmd{#3}[#4][#5]{%
\IfNoValueTF{#2}%
% CLASS: no --------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{#6}}%
% STAR: no
{\ensuremath{{#6}}}}%
% CLASS: yes -------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\@nameuse{@NNClass#2}{#6}}}%
% STAR: no
{\ensuremath{{\@nameuse{@NNClass#2}{#6}}}}}%
\ifthenelse{\boolean{@NNInListMode}}{}{\protect\stepcounter{@NNCounter\string#3}}%
\xspace%
}%
}%
\@NNAddEntry{#3}{\string#3}{#4}{#7}{#8}%
}
% *************************************
% \newrelation
% *************************************
% Define macro and add entry to current group.
%
% Arguments:
% 1. star: prevent extra embracing
% 2. optional: class name
% 3. mandatory: macro name
% 4. optional: number of arguments (default: 0)
% 5. optional: default value for first argument
% 6. mandatory: replacement
% 7. optional: description for table of notation
% 8. optional: description of arguments for table of notation
\DeclareDocumentCommand{\newrelation}{s o m O{0} o m O{} O{}}{%
% Check whether macro is already defined:
\ifdef{#3}%
{\PackageError{newnotation}{newrelation: Command '\string#3' already defined.}{Misspelled name?}}{}%
%
\@NNPrepareEntry{\string#3}%
% DEFAULT VALUE: no ------------------------------------------------
\IfNoValueTF{#5}{%
\newrobustcmd{#3}[#4]{%
\IfNoValueTF{#2}%
% CLASS: no --------------------------------------------
%{no class defined}{class defined}
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\mathrel{#6}}}%
% STAR: no
{\ensuremath{\mathrel{{#6}}}}}%
% CLASS: yes -------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\mathrel{\@nameuse{@NNClass#2}{#6}}}}%
% STAR: no
{\ensuremath{\mathrel{\@nameuse{@NNClass#2}{#6}}}}}%
\ifthenelse{\boolean{@NNInListMode}}{}{\protect\stepcounter{@NNCounter\string#3}}%
\xspace%
}%
}{%
% DEFAULT VALUE: yes -----------------------------------------------
\newrobustcmd{#3}[#4][#5]{%
\IfNoValueTF{#2}%
% CLASS: no --------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\mathrel{#6}}}%
% STAR: no
{\ensuremath{\mathrel{{#6}}}}}%
% CLASS: yes -------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\mathrel{\@nameuse{@NNClass#2}{#6}}}}%
% STAR: no
{\ensuremath{\mathrel{\@nameuse{@NNClass#2}{#6}}}}}%
\ifthenelse{\boolean{@NNInListMode}}{}{\protect\stepcounter{@NNCounter\string#3}}%
\xspace%
}%
}%
\@NNAddEntry{#3}{\string#3}{#4}{#7}{#8}%
}
% *************************************
% \renewnotation
% *************************************
% Redefine macro and add entry to current group.
%
% Arguments:
% 1. star: prevent extra embracing
% 2. optional: class name
% 3. mandatory: macro name
% 4. optional: number of arguments (default: 0)
% 5. optional: default value for first argument
% 6. mandatory: replacement
% 7. optional: description for table of notation
% 8. optional: description of arguments for table of notation
\DeclareDocumentCommand{\renewnotation}{s o m O{0} o m O{} O{}}{%
% Check whether macro is not defined so far:
\ifundef{#3}%
{\PackageError{newnotation}{renewnotation: Command '\string#2' not defined.}%
{Misspelled name?}}{}%
%
\@NNPrepareEntry{\string#3}%
% DEFAULT VALUE: no ------------------------------------------------
\IfNoValueTF{#5}{%
\renewrobustcmd{#3}[#4]{%
\IfNoValueTF{#2}%
% CLASS: no --------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{#6}}%
% STAR: no
{\ensuremath{{#6}}}}%
% CLASS: yes -------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\@nameuse{@NNClass#2}{#6}}}%
% STAR: no
{\ensuremath{{\@nameuse{@NNClass#2}{#6}}}}}%
\ifthenelse{\boolean{@NNInListMode}}{}{\protect\stepcounter{@NNCounter\string#3}}%
\xspace%
}%
}{%
% DEFAULT VALUE: yes -----------------------------------------------
\renewrobustcmd{#3}[#4][#5]{%
\IfNoValueTF{#2}%
% CLASS: no --------------------------------------------
%{no class defined}{class defined}
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{#6}}%
% STAR: no
{\ensuremath{{#6}}}}%
% CLASS: yes -------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\@nameuse{@NNClass#2}{#6}}}%
% STAR: no
{\ensuremath{{\@nameuse{@NNClass#2}{#6}}}}}%
\ifthenelse{\boolean{@NNInListMode}}{}{\protect\stepcounter{@NNCounter\string#3}}%
\xspace%
}%
}%
\@NNAddEntry{#3}{\string#3}{#4}{#7}{#8}%
}
% *************************************
% \newoperator
% *************************************
% Define macro for an operator name and add entry to current group.
%
% Arguments:
% 1. star: use limits (like \max or \lim)
% 2. optional: class name
% 3. mandatory: macro name
% 4. optional: IGNORED
% 5. optional: IGNORED
% 6. mandatory: replacement
% 7. optional: description for table of notation
% 8. optional: description of arguments for table of notation
\DeclareDocumentCommand{\newoperator}{s o m O{0} o m O{} O{}}{%
% Check whether macro is already defined:
\ifdef{#3}%
{\PackageError{newnotation}{newoperator: Command '\string#3' already defined.}{Misspelled name?}}{}%
%
\@NNPrepareEntry{\string#3}%
\newrobustcmd{#3}[#4]{%
\IfNoValueTF{#2}%
% CLASS: no --------------------------------------------
%{no class defined}{class defined}
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\operatorname*{#6}}}%
% STAR: no
{\ensuremath{\operatorname{{#6}}}}}%
% CLASS: yes -------------------------------------------
{\IfBooleanTF{#1}%
% STAR: yes
{\ensuremath{\operatorname*{\@nameuse{@NNClass#2}{#6}}}}%
% STAR: no
{\ensuremath{\operatorname{\@nameuse{@NNClass#2}{#6}}}}}%
\ifthenelse{\boolean{@NNInListMode}}{}{\protect\stepcounter{@NNCounter\string#3}}%
\xspace%
}%
\@NNAddEntry{#3}{\string#3}{0}{#7}{#8}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatother %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% END OF IMPLEMENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%