%
% \GetFileInfo{gmutils.sty}
% \title{The \pk{gmutils} Package\thfileinfo}
% \author{Grzegorz Murzynowski}
% \maketitle
%
% \let\ty\emph
%
% \begin{copyrnote}
%
%%Written by Grzegorz Murzynowski,
%% natror at o2 dot pl
%%
%% \copyright\,2005, 2006, 2007, 2008, 2009, 2010 by Grzegorz Murzynowski.
%%
%% This program is subject to the \LaTeX\ Project Public License.
%% See ^^A
%% \url{http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html} ^^A
%% for the details of that license.\rrthis
%%
%% LPPL status: "author-maintained".\par
%%
%% Many thanks to my \TeX\ Guru Marcin Woliński for his \TeX nical ^^A
%% support.
%
%\end{copyrnote}
%% 
%%
% \RecordChanges
% \ChangesStart{}{1000/00/0}
%
% \chschange{v0.59}{06/09/04}{396}
% \chschange{v0.61}{06/09/06}{432}
% \chschange{v0.62}{06/9/7}{444}
% \chschange{v0.65}{06/9/28}{700}
% \chschange{v0.66}{06/10/5}{698}
% \chschange{v0.67}{06/10/11}{739}
% \chschange{v0.68}{06/10/12}{812}
% \chschange{v0.69}{06/10/17}{844}
% \chschange{v0.70}{06/10/20}{852}
% \chschange{v0.71}{06/10/27}{876}
% \chschange{v0.72}{06/11/14}{906}
% \chschange{v0.74}{06/12/1}{1185}
% \chschange{v0.76}{07/4/9}{1538}
% \chschange{v0.77}{07/4/14}{1547}
% \chschange{v0.78}{07/4/26}{1685}
% \chschange{v0.80}{2007/4/29}{1689}
% \chschange{v0.84}{2007/11/13}{2684}
% \chschange{v0.85}{2007/11/16}{2795}
% \chschange{v0.87}{2008/8/3}{4027}
% \chschange{v0.88}{2008/8/3}{4040}
% \chschange{v0.90}{2008/8/4}{4035}
% \chschange{v0.91}{2008/8/6}{4055}
% \chschange{v0.92}{2008/8/11}{4133}
% \chschange{v0.93}{2008/8/21}{4140}
% \chschange{v0.93}{2008/8/30}{4501}
% \chschange{v0.94}{2008/10/4}{4880}
% \chschange{v0.95}{2008/10/8}{4908}
% \chschange{v0.96}{2008/11/21}{5363}
% \toCTAN{2008/11/21 v0.96}
% \chschange{v0.97}{2008/11/22}{5375}
% \toCTAN{2008/11/22 v0.97}
% \chschange{v0.98}{2008/11/30}{5429}
% \chschange{v0.98}{2008/12/5}{5577}[\cs{DeclareCommand}]
% \chschange{v0.98}{2008/12/5}{5627}[\cs{fakeonum}]
% \chschange{v0.98}{2008/12/9}{6035}[\cs{DeclareCommand}, \cmd\arg]
% \chschange{v0.98}{2008/12/10}{6129}
% [\cmd\DeclareEnvironment]
% \chschange{v0.98}{2008/12/10}{6147}
% [\cmd\arg\ in verbatims]
% \chschange{v0.98}{2008/12/12}{6535}
% [\cmd\UrlFix]
% \chschange{v0.98}{2008/12/14}{6656}
% [type settings for \pk{gmdoc} (\cmd\narrativett) and for
% \cmd\verbatimspecials] 
% \chschange{v0.991}{2010/3/4}{8257}
% [some shorthands and major development of \cmd\DeclareCommand,
% including ‘Knuthian’ and general optional arguments and
% ‘\cmd\afterassignment’ pseudo-argument]
% \toCTAN{2010/03/04 v0.991}
%
% \skiplines we skip the driver 
\ifnum\catcode`\@=12

\documentclass[debug, countalllines, codespacesgrey, outeroff,
pagella, trebuchet, cursor, fontspec=quiet]{gmdocc}
\usepackage{eufrak}% for |\continuum| in the commentary.
\twocoltoc
\begin{document}

\DocInput{\jobname.sty}
\PrintChanges
\thispagestyle{empty}
\typeout{%
  Produce change log with^^J%
  makeindex -r -s gmglo.ist -o \jobname.gls \jobname.glo^^J
  (gmglo.ist should be put into some texmf/makeindex directory.)^^J}
\typeout{%
  Produce index with^^J%
  makeindex -r \jobname^^J}
\afterfi{\end{document}}

\fi% of driver pass
%\endskiplines

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{gmutils}
     [2010/03/04 v0.991 some rather TeXnical macros, some of them tricky (GM)]

%
% \tableofcontents
%
% \division{Intro} 
% 
% The \pk{gmutils.sty} package provides some macros that are
% analogous to the standard \LaTeX\ ones but extend their
% functionality, such as |\@ifnextcat|, |\addtomacro| or |\begin(*)|.
%   The others are just conveniences I~like to use in all my TeX
%   works, such as |\afterfi|, |\pk| or |\cs|.
%
% I wouldn't say they are only for the package writers but I~assume
% some nonzero \LaTeXpar-awareness of the user.
%
% For details just read the code part.
%
% \begin{gmlonely}
%   \subdivision{Installation} Unpack the \file{gmutils-tds.zip}
%   archive (this is an archive that conforms the \acro{TDS} standard,
%   see \file{CTAN/tds/tds.pdf}) in some texmf directory or just put
%   the \pk{gmutils.sty} somewhere in the \file{texmf/\:tex/\:latex}
%   branch. Creating a~\file{texmf/\:tex/\:latex/\:gm} directory may
%   be advisable if you consider using other packages written by me.
%
%   Then you should refresh your \TeX\ distribution's files' database
%   most probably.
% \end{gmlonely}
%
% \subdivision{Contents of the \pk{gmutils.zip} archive}
%
% The distribution of the \pk{gmutils} package consists of the
% following three files and a~\acro{TDS}-compliant archive.
% \begin{verse}
%   \pk{gmutils.sty}\\
%   \pk{README}\\
%   \pk{gmutils.pdf}\\
%   \pk{gmutils.tds.zip}
% \end{verse}
% 
% \begin{gmlonely}
%   \subdivision{Compiling of the documentation}
%
%   The last of the above files (the \pk{.pdf}, i.e., \emph{this
%     file}) is a~documentation compiled from the \pk{.sty} file by
%   running \LaTeX\ on the \pk{gmutils.sty} file twice
%   (|xelatex gmutils.sty|  in the directory you wish the
%   documentation to be in, you don't have copy the \file{.sty} file
%   there, \TeX\ will find it),
%   then MakeIndex on the \file{gmutils.idx} file, and then \LaTeX\
%   on \file{gmutils.sty} once more.
%
%   MakeIndex shell command:
%   \[\hbox{|makeindex -r gmutilsDoc|}\]
%   The |-r| switch is to forbid MakeIndex to make implicit ranges since
%   the (code line) numbers will be hyperlinks.
%
%   Compiling the documentation requires the packages:
%   \pk{gmdoc} (\pk{gmdoc.sty} and \pk{gmdocc.cls}), \pk{gmverb.sty},
%   \pk{gmutils.sty}, \pk{gmiflink.sty}  and also some standard packages:
%   \pk{hyperref.sty}, \pk{color.sty}, \pk{geometry.sty},
%   \pk{multicol.sty}, \pk{lmodern.sty}, \pk{fontenc.sty} that should
%   be installed on your computer by default.
%
%   If you had not installed the \pk{mwcls} classes (available on
%   CTAN and present in \TeX\ Live e.g.), the result of your
%   compilation might differ a~bit from the \pk{.pdf} provided in this
%   \pk{.zip} archive in formatting: If you had not installed
%   \pk{mwcls}, the standard \pk{article.cls} class would be used.
% \end{gmlonely}
%
\ifx\XeTeXversion\relax
  \let\XeTeXversion\@undefined% If someone earlier used 
% \nlperc|\@ifundefined{XeTeXversion}| to test
% whether the engine is \XeTeX, then \incs{XeTeXversion} \emph{is} defined
% in the sense of \eTeX\ tests. In that case we |\let| it to something
% really undefined. Well, we might keep sticking to \incs{@ifundefined},
% but it's a~macro and it eats its arguments, freezing their catcodes,
% which is not what we want in line \ref{not@ifundef}.
\fi

\ifdefined\XeTeXversion
\XeTeXinputencoding utf-8 % we use Unicode dashes later in this file.
\fi% and if we are not in \XeTeX, we skip them thanks to \XeTeX-test.


 %^^A % \division{Ignoring spaces and line ends in packages and classes}
 %^^A %
 %^^A % Spurious spaces and line ends that convert to spaces are a~plague
 %^^A % for the package writers including me. On the other hand, changing
 %^^A % catcodes is dangerous and should be done with care. Therefore
 %^^A % I~provide a~declaration that reverts its effect at most at the end
 %^^A % of a~package or class.
 %^^A 
 %^^A \def\package@ignorespaces{%
 %^^A   \catcode`\ =9
 %^^A   \endlinechar-1
 %^^A   \AtEndOfPackage{\package@restorespace}}
 %^^A 
 %^^A \def\package@restorespace{\catcode`\ =10 \endlinechar13 }
 %^^A 

% \division{Options}

\newif\ifgmu@quiet

\DeclareOption{quiet}{\gmu@quiettrue}

\ProcessOptions

% 
% \division{A~couple of abbreviations}
% {\DoIndex{\@nx \@xa} \Define\@xa \Define\@nx
\let\@xa\expandafter
\let\@nx\noexpand

\def\@xau#1{\unexpanded\@xa{#1}}
%\changes{v0.94}{2008/10/4}{added}
% \nostanza Note that there's only one |\expandafter|, after
% |\unexpanded|. It's because |\unexpanded| expands expandable tokens
% and gobbles |\relax|es while looking for an opening brace or |\bgroup|.
% Note also that it \emph{requires} a text in braces. 
%
% \chgs{2010/03/04 v0.991 made 1-parameter}
% Note also that (since v0.991) this is a 1-parameter macro so doesn't
% expand subsequent tokens until meets a \<balanced text> but just
% takes first single token or \<text>.



%} \HideDefining*\pdef
\def\pdef{\protected\def}
%\changes{v0.93}{2008/08/20}{added}

% And this one is defined, I~know, but it's not |\long| with the
% standard definition and I~want to be able to |\gobble| a~|\par|
% sometimes. 
% \Define\gobbletwo
\long\def\gobble#1{}
% \Define\@gobble
\let\@gobble\gobble
\let\gobbletwo\@gobbletwo


% \HideDefining*\provide 
\long\pdef\provide#1{%\changes{v0.93}{2008/08/30}{added}
  \ifdefined#1% \UnDef
    \ifx\relax#1\afterfifi{\def#1}%
    \else\afterfifi{\gmu@gobdef}% \UnDef
    \fi
  \else\afterfi{\def#1}%
  \fi}


\long\def\gmu@gobdef#1#{% \UnDef
  \def\gmu@tempa{}% it's a~junk macro assignment
  % to absorb possible prefixes.
  \@gobble}

% \HideDefining*\pprovide
\def\pprovide{\protected\provide}
% \changes[\pprovide]{v0.93}{2008/08/30}{added} Note that both
% |\provide| and |\pprovide| may be prefixed with |\global|, |\outer|,
% |\long| and |\protected| because the prefixes stick to |\def|
% because all before it is expandable. If the condition(s) is false
% (|#1| is defined) then the prefixes are absorbed by a~junk
% assignment.
%
% Note moreover that unlike \LaTeX's |\providecommand|, our
% \cs{(p)provide} allow any parameters string just like |\def|
% (because they just \emph{expand} to |\def|).
%

\long\def\@nameedef#1#2{% \changes{v0.93}{2008/08/30}{added}
  \@xa\edef\csname#1\endcsname{#2}}

% \division{\cs{if}s as a~four-argument \LaTeX\ command robust to unbalanced \cs{if}s and \cs{fi}s}

\long\def\gmu@if#1#2{%
  \csname if#1\endcsname#2\@xa\@firstoftwo\else\@xa\@secondoftwo\fi
}

% \division{\cs{firstofone} and the queer \cs{catcode}s}
%
% Remember that once a~macro's argument has been read, its
% |\catcode|s are assigned forever and ever. That's what is
% |\firstofone| for. It allows you to change the |\catcode|s locally
% for a~definition \emph{outside} the changed |\catcode|s' group.
% Just see the below usage of this macro `with \TeX's eyes', as my
% \TeX\ Guru taught me.
%
\long\def\firstofone#1{#1}

% ^^A \long\def\bracethis#1{{#1}}
% ^^A \long\def\fooscant{\@xa\scantokens\bracethis}
\long\pdef\scantwo#1#2{
  \begingroup\endlinechar\m@ne
  \@xa\endgroup\scantokens{#1#2}%
}

\long\def\@firstofthree#1#2#3{#1}
\long\def\@secondofthree#1#2#3{#2}
\long\def\@thirdofthree#1#2#3{#3}
\long\def\@secondoffive#1#2#3#4#5{#2}

% In some |\if›[cat›?›]|\ test I~needed to look only at the first token of
% a~tokens' string (first letter of a~word usually) and to 
% drop the rest of it. So I~define a~macro that expands
% to the first token (or \arg{text}) of its argument.
%
\long\def\@firstofmany#1#2\@@nil{#1}
% \changes{v0.63}{06/9/9}{added}

\long\def\@allbutfirstof#1#2\@@nil{#2}
% \changes{v0.97}{2008/11/22}{added}
% \changes{v0.98}{2008/11/22}{renamed from \cs{@secondofmany}}


% \division{\cs{afterfi} and pals}

% It happens from time to time that you have some sequence of macros
% in an |\if…| and you would like to expand |\fi| before expanding
% them (e.g., when the macros should take some tokens next to |\fi…|
% as their arguments. If you know how many macros are there, you may
% type a~couple of |\expandafter|s and not to care how terrible it
% looks.  But if you don't know how many tokens will there be, you
% seem to be in a~real trouble. There's the Knuthian trick with
% |\next|. And here another, revealed to me by my \TeX\ Guru.
%
% I~think the situations when the Knuthian (the former) trick is not
% available are rather seldom, but they are imaginable at least: the
% |\next| trick involves an assignment so it won't work e.g.\ in
% |\edef|. 
%
% But |\afterfi| and pals are sensitive to |\fi|s that may occur in
% macros' arguments so probably the safest and expandable way is the
% |\expandafter\@›(first⁄|second›)oftwo| trick. %^^A|
%^^A % One warning: those macros peel the braces off, i.e., 
%^^A % \[|\if..\afterfi{\@makeother\^^M}\fi|\] 
%^^A % causes a~leakage of
%^^A % |^^M|\catother. To avoid pollution write 
%^^A % \[|\if..\afterfi{\bgroup\@makeother\^^M\egroup}\fi|\,.\] 
%

\def\longafterfi{%
  \long\def\afterfi##1##2\fi{\fi##1}}
\longafterfi
% And two more of that family:
\long\def\afterfifi#1#2\fi#3\fi{\fi\fi#1}
% \changes{v0.94}{2008/09/09}{\cs{if} removed from parameters' string}
\long\def\afteriffifi#1#2\fi#3\fi{\fi#1}
% Notice the refined elegance of those macros, that cover both `then'
% and `else' cases thanks to |#2| that is discarded.

\long\def\afterififfififi#1#2\fi#3\fi#4\fi{\fi#1}
\long\def\afteriffififi#1#2\fi#3\fi#4\fi{\fi\fi#1}
\long\def\afterfififi#1#2\fi#3\fi#4\fi{\fi\fi\fi#1}

% \division{\cs{foone}}

% The next command, |\foone|, is intended as two-argument for
% shortening of the |\begingroup…\firstofone{\endgroup…}| hack.
% 
\long\def\foone#1{\begingroup#1\relax\egfirstofone}
% \UnDef
\long\def\egfirstofone#1{\endgroup#1}

\def\fooatletter{\foone\makeatletter}



% \division{\cs{@ifempty}, \cs{IfAmong}, \cmd\IfIntersect\ \cs{@ifinmeaning}}
% After a~short deliberation I~make the \cmd\IfAmong…\cmd\among\ and
% \cmd\IfIntersect\ macros' names apeless since they are intended for
% the macro and class writers, at the same level of abstraction as
% \cmd\DeclareCommand.
%
\long\pdef\@ifempty#1{%\
  % \begin{enumargs}
  % \item the token(s) we test, it may be just |{}|,
  % \item the stuff executed if |#1| is empty (is |{}|),
  % \item the stuff executed if |#1| consists of at least one token.   
  % \end{enumargs}
  \def\gmu@reserveda{#1}%
  \ifx\gmu@reserveda\@empty\@xa\@firstoftwo
  \else\@xa\@secondoftwo
  \fi}

\long\def\@ifnonempty#1#2#3{\@ifempty{#1}{#3}{#2}}

\long\pdef\IfAmong#1\among#2{%\label{IfAmong}\
  % \begin{enumargs}
  % \item the token(s) whose presence we check,
  % \item the list of tokens in which we search |#1|,
  % \item the ‘if found’ stuff,
  % \item the ‘if not found’ stuff.
  % \end{enumargs}
  % \chgs{2008/12/05 v0.98 split from \cs{IfAmong}}
  %
  \long\def\gmu@among@##1#1##2\gmu@among@{%
    \@ifempty{##2}\@secondoftwo\@firstoftwo}%
  \gmu@among@#2#1\gmu@among@}

\long\def\IfIntersect#1#2{% this (not expandable) macro checks\
  % whether the list of tokens \inverb|#1| and \inverb|#2| have\
  % nonempty intersection and if so executes \incs{@firstoftwo} or\
  % else \incs{@secondoftwo}, so it's a~4-argument command:\
  % \begin{enumargs}
  % \item first list to match,
  % \item second list to match,
  % \item if match (nonempty intersection),
  % \item if not match (empty intersection).
  % \end{enumargs}
  \let\IfIntersect@next\@secondoftwo
  \gmu@foreach#1\gmu@foreach{%
    \@xa\IfAmong\gmu@forarg\among{#2}
    {\let\IfIntersect@next\@firstoftwo}{}}%
  \IfIntersect@next}

% We need a~macro that iterates over every token on a~list. \LaTeX's
% |\@for| iterates over a~list separated with commas so it's not the
% case. Our macro is much simpler.
\long\def\gmu@foreach#1\gmu@foreach#2{%
  \long\def\gmu@forer##1{%
    \ifx\gmu@foreach##1\else
    \long\def\gmu@forarg{##1}%
    #2%
    \@xa\gmu@forer
    \fi}%
  \gmu@forer#1\gmu@foreach}



\long\pdef\@ifinmeaning#1\of#2{% \
  % \begin{enumargs}
  % \item the token(s) whose presence we check,
  % \item the macro in whose meaning we search |#1| (the first token of
  %   this argument is expanded one level with |\expandafter|),
  % \item the `if found' stuff,
  % \item the `if not found' stuff.
  % \end{enumargs}
  %
  % \chgs{2007/11/06 v0.98 (in \pk{gmdoc}) made more elegant:
  % \cs{if} changed to \cs{ifx} made four parameters and not expanding
  % to an open \cs{if›(true⁄|false›)}. Also renamed from \cs{@ifismember}}
  % \chgs{2008/12/05 v0.98 moved here from \pk{gmdoc} and rewritten,
  % including split to \cs{IfAmong} because the latter is needed in
  % \cs{DeclareCommand}} 
  %
  \def\gmu@reserveda{\IfAmong#1\among}%
  \@xa\gmu@reserveda\@xa{#2}}


% \division{Global Boolean switches}
%
% The |\newgif| declaration's effect is used even in the \LaTeXe\
% source by redefining some particular user defined ifs (UD-ifs
% henceforth) step by step.  The goal is to make the UD-if's
% assignment global. I~needed it at least twice during \pk{gmdoc}
% writing so I~make it a~macro. It's an almost verbatim copy of
% \LaTeX's |\newif| modulo the letter $g$ and the |\global| prefix.
% (File d: \file{ltdefns.dtx} Date: 2004/02/20 Version v1.3g, lines
% 139--150) \Define\newgif
\pdef\newgif#1{%
  {\escapechar\m@ne
    \global\let#1\iffalse
    \@gif#1\iftrue
    \@gif#1\iffalse
  }}
% `Almost' is also in the detail that in this case, which deals with
% |\global| assignments, we don't have to bother with storing and
% restoring the value of |\escapechar|: we can do all the work inside
% a~group.
% \DefIndex\@gif
\def\@gif#1#2{%
  \protected\@xa\gdef\csname\@xa\@gobbletwo\string#1%
  g% the letter $g$ for `|\global|'.
  \@xa\@gobbletwo\string#2\endcsname
  {\global\let#1#2}}

\pdef\newif#1{% We not only make \incs{newif}
  % \incs{protected} but also make it to define \cs{protected}
  % assignments so that premature expansion doesn't affect
  % \inverb|\if…\fi| nesting.
 % \changes{v0.92}{2008/08/09}{added redefinition so that now
 % switches defined with it are \cs{protected} so they won't expand to
 % a~further expanding or unbalanced \cs{iftrue/false} in an \cs{edef}}
  \count@\escapechar \escapechar\m@ne
  \let#1\iffalse
  \@if#1\iftrue
  \@if#1\iffalse
  \escapechar\count@}

\def\@if#1#2{% 
  \protected \@xa\def\csname\@xa\@gobbletwo\string#1%
  \@xa\@gobbletwo\string#2\endcsname
  {\let#1#2}}


\pdef\hidden@iffalse{\iffalse}
\pdef\hidden@iftrue{\iftrue}

% After |\newgif\iffoo| you may type |{\foogtrue}| and the |\iffoo|
% switch becomes globally equal |\iftrue|. Simili modo |\foogfalse|.
% Note the letter $g$ added to underline globalness of the assignment.
%
% If for any reason, no matter how queer ;-) may it be, you need
% \emph{both} global and local switchers of your |\if…|, declare
% it both with |\newif| and |\newgif|.
%
% Note that it's just a~shorthand. |\global\if⁄<switch>›(true⁄|false›)|
% \emph{does} work as expected.

% \Define\grefstepcounter
% \changes{v0.59}{06/09/04}{moved here from \pk{gmdoc}.}
% There's a~trouble with |\refstepcounter|: defining |\@currentlabel|
% is local. So let's |\def| a~|\global| version of |\refstepcounter|.
%
% Warning. I~use it because of very special reasons in \pk{gmdoc} and
% in general it is probably not a~good idea to make |\refstepcounter|
% global since it is contrary to the original \LaTeX\ approach.
\pdef\grefstepcounter#1{%
  {\let\protected@edef=\protected@xdef\refstepcounter{#1}}}
% Na\"\i{}ve first try |\globaldefs=\tw@| raised an error 
% |unknown command \reserved@e|. The matter was to globalize
% |\protected@edef| of |\@currentlabel|.\rrthis
% 
% Thanks to using the true |\refstepcounter| inside, it observes the
% change made to |\refstepcounter| by \pk{hyperref}.
% \dekmedskip
%
% 2008/08/10 I~spent all the night debugging \cs{penalty 10000} that
% was added after a~hypertarget in vertical mode. I~didn't dare to
% touch \pk{hyperref}'s guts, so I~worked it around with ensuring
% every \cs{grefstepcounter} to be in hmode:

\pdef\hgrefstepcounter#1{%
  \ifhmode\leavevmode\fi\grefstepcounter{#1}}

% By the way I~read some lines from \TB\ and was reminded that
% \cs{unskip} strips any last skip, whether horizontal or
% vertical. And I~use \cs{unskip} mostly to replace a~blank space with
% some fixed skip. Therefore define

\pdef\hunskip{\ifhmode\unskip\fi}

% Note the two macros defined above are \cs{protected}. I~think it's
% a~good idea to make \cs{protected} all the macros that contain
% assignments. There is one more thing with \cs{ifhmode}: it can be different
% at the point of \cs{edef} and at the point of execution.


% Another shorthand. It may decrease a~number of |\expandafter|s e.g.
% \Define\glet
\def\glet{\global\let}


% \LaTeX\ provides a~very useful |\g@addto@macro| macro that adds its
% second argument to the current definition of its first argument
% (works iff the first argument is a~no argument macro). But I~needed
% it some times in a~document, where |@| is not a~letter. So:
% \Define\gaddtomacro
\let\gaddtomacro=\g@addto@macro

% The redefining of the first argument of the above macro(s) is
% |\global|. What if we want it local? Here we are:
% 
\long\def\addto@macro#1#2{%
  % \chgs{2008/12/7 v0.98 \cs{toks@} replaced with some
  % \cmd\expandafter s because use of \cs{toks@} here caused
  % a~disaster in \cs{DeclareCommand}}
  \edef#1{\@xa\unexpanded\@xa{#1}\unexpanded{#2}}% \incmd\edef\ and
                                % \incmd\unexpanded\ to double the hashes.
}

% And for use in the very document,
% \Define\addtomacro
\let\addtomacro=\addto@macro

% 2008/08/09 I~need to prepend something not add at the end---so
\long\def\prependtomacro#1#2{% \changes{v0.94}{2008/09/15}{order of
  % arguments reversed}
  \edef#1{\unexpanded{#2}\@xa\unexpanded\@xa{#1}}}
% Note that \cs{prependtomacro} can be prefixed.

% \Define\addtotoks
\long\def\addtotoks#1#2{%
  #1=\@xa{\the#1#2}}

% \Define\emptify
\newcommand*\@emptify[1]{\let#1=\@empty}
\@ifdefinable\emptify{\let\emptify\@emptify}

% Note the two following commands are in fact one-argument.
%\Define\g@emptify \Define\gemptify
\newcommand*\g@emptify{\global\@emptify}
\@ifdefinable\gemptify{\let\gemptify\g@emptify}

% \Define\relaxen
\newcommand\@relaxen[1]{\let#1=\relax}
\@ifdefinable\relaxen{\let\relaxen\@relaxen}

% Note the two following commands are in fact one-argument.
% \Define\g@relaxen \Define\grelaxen
\newcommand*\g@relaxen{\global\@relaxen}
\@ifdefinable\grelaxen{\let\grelaxen\g@relaxen}

% \division{\cs{gm@ifundefined}---a~test that doesn't create any\
%   hash entry unlike \cs{@ifundefined}}

% I~define it under another name not redefine |\@ifundefined| because
% I~can imagine an odd case when something works thanks to
% |\@ifundefined|'s `relaxation’ effect.

\long\def\gm@ifundefined#1{% not |\protected| because expandable.
  % \changes{v0.94}{2008/9/12}{added. All \cs{@ifundefined}s used by
  % me changed to this}
  % \changes{v0.94}{2008/10/03}{made robust to unbalanced \cs{if}s and
  % \cs{fi}s the same way as \LaTeX's \cs{@ifundefined} (after a~heavy
  % debug :-)}
  \ifcsname#1\endcsname% defined…
    \@xa\ifx\csname #1\endcsname\relax% but only as |\relax|---then
    % 2nd argument.
      \afterfifi\@firstoftwo%
    \else%  defined and not |\relax|---then 3rd argument.
      \afterfifi\@secondoftwo%
    \fi
  \else% not defined---then 3rd.
    \afterfi\@firstoftwo%
  \fi}


\long\def\gm@testdefined#1\iftrue{% This is a~macro that expands to
  % \incs{iftrue} or \incs{iffalse} depending on whether its argument
  % is defined in the \LaTeX\ sense. Its syntax requires an
  % \incs{iftrue} to force balancing \incs{if}s with \incs{fi}s.
  % \changes{v0.95}{2008/10/8}{added}
  \csname
  \ifdefined#1%
    \ifx#1\relax
       iffalse%
    \else iftrue%
    \fi
  \else iffalse%
  \fi\endcsname
}

\long\def\gm@testundefined#1\iftrue{% we expand the last macro two
  % levels. We repeat the parameter string to force the proper syntax.
  % \changes{v0.95}{2008/10/8}{added}
  \@xa\@xa\@xa\unless\gm@testdefined#1\iftrue}



% \division{Some `other' and active stuff}
% Here I~define a~couple of macros expanding to special chars made
% `other'. It's important the \CS are expandable and therefore
% they can occur e.g. inside |\csname›…\endcsname| unlike e.g.\
% \CS'es |\chardef|ed.
%
% \Define\subs
\foone{\catcode`\_=8 }
{\let\subs=_}

% \Define\sups
\foone{\catcode`\^=7 }
{\let\sups=^}

\foone{\@makeother\_}
{\def\xiiunder{_}}

\let\all@unders\xiiunder
\foone{\catcode`\_=8 }
{\addtomacro\all@unders{_}}
\foone{\catcode`\_=11 }
{\addtomacro\all@unders{_}}
\foone{\catcode`\_=13 }
{\addtomacro\all@unders{_}}
% \nostanza Now |\all@unders| bears underscores of categories 8, 11,
% 12 and 13.

\def\all@stars{*}
\foone{\catcode`\*=11 }
{\addtomacro\all@stars{*}}
\foone{\catcode`\*=13 }
{\addtomacro\all@stars{*}}
%\nostanza And |\all@stars| bears stars of categories 11, 12 and 13.


\ifdefined\XeTeXversion
  \chardef\_="005F 
\fi

\foone{\@makeother\`}%
{\def\backquote{`}}


\foone{\catcode`\[=1 \@makeother\{ 
  \catcode`\]=2 \@makeother\}}%
[%
  \def\xiilbrace[{]%
  \def\xiirbrace[}]%
]% of |\firstofone|

% Note that \LaTeX's  |\@charlb| and |\@charrb| are of catcode 11
% (`letter'), cf. The \LaTeXe\ Source file k, lines 129--130.



% Now, let's define such a~smart |_| (underscore) which will be usual
% |_|${}_8$ in the math mode and |_|\catother\ (`other') outside math.
% \Define\smartunder
% \changes{v0.60}{06/09/05}{\cs{\_} instead of \cs{xiiunder}}
\foone{\catcode`\_=\active}
{%
  \newcommand*\smartunder{%
    \catcode`\_=\active
    \def_{\ifmmode\subs\else\_\fi}}}% We define it as \inverb|\_| not just as
% \inverb|\xiiunder| because some font encodings don't have \inverb|_| at the
% \inverb|\char`\_| position.
%
% \CodeEscapeChar\!
% \Define\bslash \Define\xiibackslash
\foone{\catcode`\!=0 
  \@makeother\\}
{!newcommand*!xiibackslash{\}}
%^^A] balancing braces for Emacs
% \CodeEscapeChar\\

\let\bslash=\xiibackslash


%    \begin{oldmc}
\foone{\@makeother\%}
{\def\xiipercent{%}}
%    \end{oldmc}

\foone{\@makeother\&}%
{\def\xiiand{&}}

\foone{\@makeother\ }%
{\def\xiispace{ }}

\foone{\@makeother\#}%
{\def\xiihash{#}}

% We introduce \cs{visiblespace} from Will Robertson's \pk{xltxtra} if
% available. It's not sufficient |\@ifpackageloaded{xltxtra}| since
% \cs{xxt@visiblespace} is defined only unless |no-verb| option is
% set. 2008/08/06 I~recognised the difference between \cs{xiispace}
% which has to be plain `other' char (used in \cs{xiistring}) and
% something visible to be printed in any font.

\AtBeginDocument{%
  \ifdefined\xxt@visiblespace
    \let\visiblespace\xxt@visiblespace
    \def\xxt@visiblespace@fallback{{%
        \fontspec{Latin Modern Mono}\textvisiblespace}}%
  \else
    \let\visiblespace\xiispace
  \fi}


\foone\obeyspaces{\def\gmu@activespace{ }}

\foone\obeylines{\def\activeM{^^M}}


% \division{\cs{@ifnextcat}, \cs{@ifnextac}, catcode-independent\
% \cs{gm@ifstar}, \cs{@ifnextsingle}, \cs{@ifnextgroup}} 
%
% As you guess, we |\def| |\@ifnextcat| \agrave~la |\@ifnextchar|, see
% \LaTeXe\ source dated 2003/12/01, file d, lines 253--271. The
% difference is in the kind of test used: while |\@ifnextchar| does
% |\ifx|, |\@ifnextcat| does |\ifcat| which means it looks not at the
% meaning of a~token(s) but at their |\catcode|(s). As you (should)
% remember from \TeXbook, the former test doesn't expand macros while
% the latter does. But in |\@ifnextcat| the peeked token is protected
% against expanding by |\noexpand|. Note that the first parameter is
% not protected and therefore it shall be expanded if it's
% expandable. Because an assignment is involved, you can't test
% whether the next token is an active char. But you can test if the
% next token is |{|$_1$ or |}|$_2$: |\@ifnextcat\bgroup›…|,
% |\@ifnextcat\egroup›…|. 

\long\pdef\@ifnextcat#1#2#3{%
% \changes{v0.75}{2007/01/01}{\cs{let} for \cs[\#]1 changed to
% \cs{def} to allow things like \cs{noexpand\texttilde}}
% \HideDef
  \def\reserved@d{#1}%
  \def\reserved@a{#2}%
  \def\reserved@b{#3}%
  \futurelet\@let@token\@ifncat}

% \ResumeDef
\def\@ifncat{%
  \ifx\@let@token\@sptoken
    \let\reserved@c\@xifncat
  \else
    \ifcat\reserved@d\@nx\@let@token
      \let\reserved@c\reserved@a
    \else
      \let\reserved@c\reserved@b
    \fi
  \fi
  \reserved@c}

{\def\:{\let\@sptoken= } \global\: % this makes |\@sptoken| a space token.

  % \DefIndex\@xifncat
\def\:{\@xifncat} \@xa\gdef\: {\futurelet\@let@token\@ifncat}}
% Note the trick to get a~macro with no parameter and requiring
% a~space after it. We do it inside a~group not to spoil the general
% meaning of |\:| (which we extend later).
% \dekmedskip
% 
% \stanza The next command provides the real \cs{if} test for the next
% token. \emph{It} should be called |\@ifnextchar| but that name is
% assigned for the future \cs{ifx} text, as we know. Therefore we call
% it \cs{@ifnextif}.
%
% \stanza
% Having |\@ifnextcat| defined, let's apply it immediately. Similar
% thing does probably the \pk{xspace} package.
\def\spifletter{\@ifnextcat a{\space}{}}


\long\pdef\@ifnextif#1#2#3{%
% \changes{v0.75}{2007/01/01}{\cs{let} for \cs[\#]1 changed to
% \cs{def} to allow things like \cs{noexpand\texttilde}}
% \chgs{2010/3/4 v0.991 inner macro fixed to handle active chars more
% properly (more as \cmd\if\ would do it)}
% \HideDef
% (the future token in |\noexpand|ed, unlike \inhash1)
  \def\reserved@d{#1}%
  \def\reserved@a{#2}%
  \def\reserved@b{#3}%
  \futurelet\@let@token\@ifnif}
% \ResumeDef

\def\@ifnif{%
  \ifx\@let@token\@sptoken
    \let\reserved@c\@xifnif
  \else
    \if\reserved@d\@nx\@let@token
      \let\reserved@c\reserved@a
    \else % |#1| of |\@ifnextif| is not |\if|-equivalent the future
      % token. But this may be because the future token is active
      % so it \emph{would} be |\if|-equivalent if not passed
      % through |\futurelet|. Let's manage this case.
      \begingroup
      \edef\gmu@tempa{%
        \lccode`\@nx~=`\reserved@d
      }\gmu@tempa
      \lowercase{\endgroup
        \ifx~}\@let@token
        \let\reserved@c\reserved@a
      \else
        \let\reserved@c\reserved@b
      \fi
    \fi
  \fi
  \reserved@c}

% \UnDef
{\def\:{\let\@sptoken= } \: % this makes |\@sptoken| a space token.
% \UnDef
\def\:{\@xifnif} \@xa\gdef\: {\futurelet\@let@token\@ifnif}}

% \dekmedskip
%
% But how to peek at the next token to check whether it's an active
% char? First, we look with |\@ifnextcat| whether there stands a~group
% opener. We do that to avoid taking a~whole |{…}| as the argument
% of the next macro, that doesn't use |\futurelet| but takes the next
% token as an argument, tests it and puts back intact.
% \changes{v0.75}{2007/01/11}{added}
%
\long\pdef\@ifnextac#1#2{%
  \@ifnextsingle
  {\gm@ifnac{#1}{#2}}%
  {#2}}

\long\def\gm@ifnac#1#2#3{%
  \ifcat\@nx~\@nx#3%
    \@xa\@firstoftwo
  \else\@xa\@secondoftwo
  \fi{#1#3}{#2#3}}

% Yes, it won't work for an active char |\let| to |{|${}_1$, but it ^^A~}
% \emph{will} work for an active char |\let| to a~char of
% catcode${}\neq1$. (Is there anybody on Earth who'd make an active
% char working as |\bgroup| not just recatcode it to $_1$?)
%

% Having defined such tools, let's redefine |\gm@ifstar| to make it work
% with whatever catcode |*| may be.
% make a~version of |\gm@ifstar| that would work with
% |*|\catletter. 


\pdef\gmu@lowstar{%
  \iffontchar\font"22C6 \char"22C6 \else\gmu@lowstarfake\fi}% we could define it to
% be expandable (with \inverb|^^^^22c6|) but the only goal of it would
% be allowing this low star in |\csname›…\endcsname|. But it would be
% misleading (not everyone can easily distinguish |⁄string*| from |*|)
% so \IMHO\ it's better to raise an error should such an active occur
% in a~|\csname|.
% This macro is intended to be |\let| to an active star only in
% verbatims. For usual text there's

% Commands around making star low (via |\active|ation) are defined in
% line \ref{def:gmu@star} because they use |\DeclareCommand|.


\def\gmu@tempa{*}
\foone{\catcode`\*=\active}
{\def\gmu@tempb{*}% it's defined in line \ref{active star}
 % to make |*| defined (when it was undefined,
  % \incmd\newcommand's \incs{gm@ifstar} test turned
  % true, the next undefined token was gobbled and raised an error).
  \let*=\gmu@lowstar}



\edef\gmu@tempa{%
  \long\pdef\@nx\gm@ifstar##1##2{% \chgs{2008/12/16 v0.98 renamed from
    % \cs{@ifstar} since something
    % redefines \cs{@ifstar}}]
    \@nx\@ifnextif\gmu@tempa%
    {\@nx\@firstoftwo{##1}}%
    {%
      \@nx\@ifnextchar\@xa\@nx\gmu@tempb
      {\@nx\@firstoftwo{##1}}{##2}}%
  }% of |\gm@ifstar|.
}\gmu@tempa


%\stanza
% A~test whether we can pick a~single token. We have to check whether
% we are not next to |{| and whether we are not next to |}|.

\long\pdef\@ifnextsingle#1#2{% \chgs{2008/12/11 v0.98 extracted from
  % \cs{@ifnextac}} This macro checks whether the next token is able
  % to be picked or is it a~braced list of tokens or is it a~group
  % closer so there's no token to be picked.
  \@ifnextcat\bgroup{#2}{%
    \@ifnextcat\egroup{#2}% \chgs{2008/12/11 v0.98 added test for
    % \cmd\egroup} 
    {#1}}}

\long\pdef\@ifnextgroup#1#2{% Note this macro turns true both before
  % a~group opener and before a~group closer.
  \@ifnextsingle{#2}{#1}}


% now let's apply this to sth. useful (used in \pk{gmverse} and in
% some typesetting, e.g.\ for prof.\ JSB.
\pdef\ignoreactiveM{%
  \@ifnextgroup{}{\gmu@checkM}}

\foone\obeylines{% we know it's a~single token since we use this macro
  % only in \incmd\@ifnextgroup's ‘else’.
  \long\pdef\gmu@checkM#1{%
    \ifx
    #1\@xa\ignoreactiveM%
    \else\@xa#1\fi}}


%
% \stanza Now, define a~test that checks whether the next token is
% a~genuine space, | |${}_{10}$ that is. First define
% a~\CS let such 
% a~space. The assignment needs a~little trick (\TeXbook\ appendix D)
% since |\let|'s syntax includes one optional space after |=|.
%
\let\gmu@reserveda\*%
\def\*{%
  \let\*\gmu@reserveda
  \let\gm@letspace= }%
\* %

% \Define\@ifnextspace
\def\@ifnextspace#1#2{%
  \let\gmu@reserveda\*%
  \def\*{%
    \let\*\gmu@reserveda
    \ifx\@let@token\gm@letspace\afterfi{#1}%
    \else\afterfi{#2}%
    \fi}%
  \futurelet\@let@token\*}
% First use of this macro is for an active |-| that expands to |---|
% if followed by a~space. Another to make dot checking whether is
% followed by |~| without gobbling the space if it occurs instead.
%
% \stanza
% Now a~test if the next token is an active line end. I~use it in
% \pk{gmdoc} and later in this package for active long dashes.

\foone\obeylines{%
  \long\pdef\@ifnextMac#1#2{%
    \@ifnextchar^^M{#1}{#2}}}


% \division{Storing and restoring the meanings of \CSs}
%
% First a~Boolean switch of globalness of assignments and 
% its verifier.
\newif\ifgmu@SMglobal

\pdef\SMglobal{\gmu@SMglobaltrue}
% The subsequent commands are defined in such a~way that you can
% `prefix' them with |\SMglobal| to get global (re)storing.
% \stanza
% A~command to store the current meaning of a~\CS in another macro to
% temporarily redefine the \CS and be able to set its original meaning
% back (when grouping is not recommended):
%
%\Define\StoreMacro
%\changes{v0.61}{06/09/05}{added.}
%\changes{v0.67}{06/10/11}{enriched with \cs{makeatletter}}
\pdef\StoreMacro{%
  \begingroup\makeatletter\gm@ifstar\egStore@MacroSt\egStore@Macro}
% The unstarred version takes a~\CS and the starred version
% a~text, which is intended for special control sequences. For storing
% environments there is a~special command in line \ref{StoreEnvironment}.

\long\def\egStore@Macro#1{\endgroup\Store@Macro{#1}}
\long\def\egStore@MacroSt#1{\endgroup\Store@MacroSt{#1}}

\long\def\Store@Macro#1{%
  \escapechar92
  \ifgmu@SMglobal\afterfi\global\fi
  \@xa\let\csname /gmu/store\string#1\endcsname#1%
  \global\gmu@SMglobalfalse}


\long\def\Store@MacroSt#1{%
  \edef\gmu@smtempa{%
    \ifgmu@SMglobal\global\fi
    \@nx\let\@xa\@nx\csname/gmu/store\bslash#1\endcsname%\label{SMbslash}
    % we add backslash because to ensure compatibility between
    % \incs{(Re)StoreMacro} and \incs{(Re)StoreMacro*}, that is. to allow
    % writing e.g.  \inverb|\StoreMacro\kitten| and then
    % \inverb|\RestoreMacro*{kitten}| to restore the meaning of
    % \incs{kitten}.\ilrr
    \@xa\@nx\csname#1\endcsname}
  \gmu@smtempa
  \global\gmu@SMglobalfalse}% we wish the globality to be just
                            % once.\par

% We make the |\StoreMacro| command a~three-step to allow usage of the
% most inner macro also in the next command.
%
% The starred version, |\StoreMacro*| works with csnames (without the
% backslash). It's first used to store the meanings of robust
% commands, when you may need to store not only |\foo|, but also
% |\csname foo \endcsname|.
% 
%
% The next command iterates over a~list of \CSs and stores each of
% them. The \CS'es may be separated with commas but they don't have to.
% \Define\StoreMacros

\long\pdef\StoreMacros{\begingroup\makeatletter\Store@Macros}
\long\def\Store@Macros#1{\endgroup
  \gmu@setsetSMglobal
  \let\gml@StoreCS\Store@Macro
  \gml@storemacros#1.}
% \label{InnerStore}

\def\gmu@setsetSMglobal{%
  \ifgmu@SMglobal
    \let\gmu@setSMglobal\gmu@SMglobaltrue
  \else
    \let\gmu@setSMglobal\gmu@SMglobalfalse
  \fi}

% And the inner iterating macro:
\long\def\gml@storemacros#1{%
  \def\gmu@reserveda{\@nx#1}% My \TeX\ Guru's trick to deal with |\fi|
  % and such, i.e., to hide |#1| from \TeX\ when it is processing a~test's
  % branch without expanding.
  \if\gmu@reserveda.% a~dot finishes storing.
    \global\gmu@SMglobalfalse
  \else
    \if\gmu@reserveda,% The list this macro is put before may
    % contain commas and that's O.K., we just continue the work.
      \afterfifi\gml@storemacros
    \else% what is else this shall be stored.
      \gml@StoreCS{#1}% we use a~particular \CS to may |\let| it both to
      % the storing macro as above and to the restoring one as
      % \gmiflink[letRestore]{below}. 
      \afterfifi{\gmu@setSMglobal\gml@storemacros}%
    \fi
  \fi}

% And for the restoring
%\Define\RestoreMacro
%\changes{v0.61}{06/09/05}{added.}
%\changes{v0.67}{06/10/11}{enriched with \cs{makeatletter}}
\pdef\RestoreMacro{%
  \begingroup\makeatletter\gm@ifstar\egRestore@MacroSt\egRestore@Macro}

\long\def\egRestore@Macro#1{\endgroup\Restore@Macro{#1}}
\long\def\egRestore@MacroSt#1{\endgroup\Restore@MacroSt{#1}}

\long\def\Restore@Macro#1{%
  \escapechar92
  \gmu@ifstored#1{%
    \ifgmu@SMglobal\afterfi\global\fi
    \@xa\let\@xa#1\csname /gmu/store\string#1\endcsname
    \global\gmu@SMglobalfalse}%
  {\unless\ifgmu@quiet
      \PackageWarning{gmutils}{\@nx#1 is not stored, I do nothing with
        it}%
    \fi
  }%
}

\long\def\gmu@ifstored#1#2#3{%
  \gm@ifundefined{/gmu/store%
    \if\relax\@nx#1\else\bslash\fi
    \string#1}{#3}{#2}%
}

\long\pdef\gmu@storeifnotyet#1{%
  \if\relax\@nx#1% we check if it's a~\CS
  \gmu@ifstored{#1}{}{\StoreMacro#1}%
  \fi}


\long\def\Restore@MacroSt#1{%
  \gm@ifundefined{/gmu/store\bslash#1}%
  {\unless\ifgmu@quiet
    \PackageWarning{gmutils}{\bslash#1 is not stored. I~do nothing}%
    \fi}%
  {\edef\gmu@smtempa{%
      \ifgmu@SMglobal\global\fi
      \@nx\let\@xa\@nx\csname#1\endcsname
      \@xa\@nx\csname/gmu/store\bslash#1\endcsname}% cf. the commentary
    % in line \ref{SMbslash}.
    \gmu@smtempa}%
  \global\gmu@SMglobalfalse}

% \Define\RestoreMacros
\long\pdef\RestoreMacros{\begingroup\makeatletter\Restore@Macros}

\long\def\Restore@Macros#1{\endgroup
  \gmu@setsetSMglobal
  \let\gml@StoreCS\Restore@Macro% \gmhypertarget[letRestore]{we}
  % direct the core \CS towards restoring and call the same iterating
  % macro as in line \ref{InnerStore}.
  \gml@storemacros#1.}
% As you see, the |\RestoreMacros| command uses the same iterating
% macro inside, it only changes the meaning of the core macro.

% And to restore \emph{and} use immediately:
%\changes{v0.67}{06/10/11}{enriched with \cs{makeatletter}}
\def\StoredMacro{\begingroup\makeatletter\Stored@Macro}
\long\def\Stored@Macro#1{\endgroup\Restore@Macro#1#1}

% To be able to call a~stored \CS without restoring it.
\def\storedcsname#1{%% \changes{v0.88}{2008/08/03}{added}
  \csname /gmu/store\bslash#1\endcsname}


% 2008/08/03 we need to store also an environment.
\pdef\StoreEnvironment#1{% \label{StoreEnvironment}
% \changes{v0.88}{2008/08/03}{added}
  \StoreMacro*{#1}\StoreMacro*{end#1}}

\pdef\RestoreEnvironment#1{%
% \changes{v0.88}{2008/08/03}{added}
  \RestoreMacro*{#1}\RestoreMacro*{end#1}}


% It happened (see the definition of |\@docinclude| in \pk{gmdoc.sty})
% that I~needed to |\relax| a~bunch of macros and restore them after
% some time. Because the macros were rather numerous and I~wanted the
% code more readable, I~wanted to |\do| them. After a~proper defining
% of |\do| of course. So here is this proper definition of |\do|,
% provided as a~macro (a~declaration).
%
% \Define\StoringAndRelaxingDo
% \changes{v0.59}{06/09/04}{added for storing index-related macros in
%   \pk{gmdoc}'s \cs{DocInclude}.}
% \changes{v0.61}{06/09/05}{renamed from \cs{MacroStoringDo} and the
% storing cs's prefix changed from \cs[]{@gml@srs}.}
\def\StoringAndRelaxingDo{%
  \gmu@SMdo@setscope
  \long\def\do##1{%
    \gmu@SMdo@scope
    \@xa\let\csname /gmu/store\string##1\endcsname##1%
    \gmu@SMdo@scope\let##1\relax}}

\def\gmu@SMdo@setscope{%
  \ifgmu@SMglobal\let\gmu@SMdo@scope\global
  \else\let\gmu@SMdo@scope\relax
  \fi
  \global\gmu@SMglobalfalse}

% And here is the counter-definition for restore.
%
% \Define\RestoringDo
% \changes{v0.59}{06/09/04}{added for restoring index-related macros in
%   \pk{gmdoc}'s \cs{DocInclude}.}
% \changes{v0.61}{06/09/05}{renamed from \cs{MacroRestoringDo} and
%   relaxing of the storing cs removed.}
\long\def\RestoringDo{%
  \gmu@SMdo@setscope
  \long\def\do##1{%
    \gmu@SMdo@scope
    \@xa\let\@xa##1\csname /gmu/store\string##1\endcsname}}
% Note that both |\StoringAndRelaxingDo| and |\RestoringDo| are
% sensitive to the |\SMglobal| `prefix'.

% And to store a~cs as explicitly named cs, i.e. to |\let| one csname
% another (|\n@melet| not |\@namelet| because the latter is defined
% in Till Tantau's \pk{beamer} class another way) (both arguments
% should be text):
\long\def\n@melet#1#2{%
  \edef\gmu@nl@reserveda{%
    \let\@xa\@nx\csname#1\endcsname
    \@xa\@nx\csname#2\endcsname}%
  \gmu@nl@reserveda}

% The |\global| prefix doesn't work with |\n@melet| so we define the
% alternative. 
\long\def\gn@melet#1#2{%
  \edef\gmu@nl@reserveda{%
    \global\let\@xa\@nx\csname#1\endcsname
    \@xa\@nx\csname#2\endcsname}%
  \gmu@nl@reserveda}

\long\pdef\envirlet#1#2{%
  \n@melet{#1}{#2}%
  \n@melet{end#1}{end#2}%
}


% ^^A \StoreMacro\ch@ck
% ^^A % \label{store:ch@ck}


 %\division{\cs{DeclareCommand} and \cmd\DeclareEnvironment}
 % The code of this section is based on the \pk{xparse}
 % package version 0.17 dated 1999/09/10, the version available in \TeX
 % Live 2007-13, in Ubuntu packages at least. Originally considered  a~stub `im Erwartung'
 % (Schönberg) for the \LaTeX 3 bundle, it evolved to quite a~nice
 % tool I~think.  
 % 
 % I~rewrote the ancient \pk{xparse}'s code to use the usual
 % catcodes (only with |@| a~letter) and not to use the \pk{ldcsetup}
 % package (which caused an error of
 % undefined \CS\ |\KV@def|).
 % Then I~added the |\protected| prefix to the first macro. And I~added
 % my concept of |S|/|T| arg.\ spec. And of |b| and |B| spec. And the
 % |Q| argument type. And made \cmd\DeclareEnvironment\ makes the
 % arguments passed also to the end macro.
%
%   After a~short deliberation I~rename the command to
%  \cs{DeclareCommand} which is much shorter than original
%  \cs{DeclareDocumentCommand} and more adequate at least
%  in my case: I~don't only use this powerful declaration for
%  ‘document’ commands.
%
% ^^A % After exchange of some mails with Morten H\o{}gholm and trying
% ^^A % \pk{xparse} of 2008/08/03 svn 748 (which beautifully spoils the
% ^^A % catcodes)  I~wrap the
% ^^A % ancient code in a~conditional to avoid name collision if someone
% ^^A % loads \pk{xparse} before \pk{gmutils}
%
% In the args specification you can use:
% \begin{itemize}
% \item [\texttt{m}] for mandatory argument (braced or not),
% \item [\env{O\arg{default}}] for optional argument (in square
% brackets) with default value \<default> (which is passed as |#|\<n>
% if the argument is missing),
% \item [\texttt{o}] equivalent of |O{\NoValue}|:  optional argument
% (in square brackets) lack of which makes  the \cs{NoValue} macro
% passed as |#|\<n>. You can check it with 
% \possfil  |\If›[No›]Value›(T⁄|F⁄|TF›){\#⁄<n>}|,
% \item [\texttt{s}] for optional star (if star is present, it becomes
% respective |#|\<n>, or else |\NoValue| is at the |#|\<n> (unlike in \pk{xparse}!).
% \item [\texttt{S}\arg{list}{default}] for a~Single token, checks whether on the
% respective position there's an unbraced token one of \<list> and
% returns it on |#|\<n>  if present or \arg{default} if absent. The
% \arg{default} is a braced optional. If absent, |\NoValue| is the default.
% ^^A Then that
% ^^A % token can become |#|\<$n+1$>.
% \item [\texttt{T}] as ‘Token’, just an alias for |S|.
%
% Like in \pk{xparse}, |s| is a~shorthand for |S{*}|, but
% \emph{unlike} in \pk{xparse}, in the parsed arguments you get |*| or
% |\NoValue| as |#|\<n>. You can now declare
%\begin{verbatim}
%\DeclareCommand\mimbla{S{+-}m}{%
% \leavevmode
% \ifx#1+\raise\fi
% \ifx#1-\lower\fi
% \ifx#1\NoValue\@tempdima=\fi
% 7pt \hbox{#2}%
% }
%\end{verbatim}
% and after |\mimbla+{raised} \mimbla-{lowered} \mimbla {untouched}|
% get:\par
% \fooatletter{\DeclareCommand\mimbla{S{+-}m}{\leavevmode\ifx#1+\raise\fi\ifx#1-\lower\fi\ifx#1\NoValue\@tempdima=\fi7pt\hbox{#2}}\mimbla+{raised}}
%\mimbla-{lowered} \mimbla {untouched} 
%
% This example is rather silly but shows that you spend only one |#|
% for two symbols while in \pk{xparse} you would spend two. What if
% you wanted 10 options for the optional symbol? Here it's no
% problem. And with any number $k$ of tokens on the list the next |#| is
% always $n+1$ not $n+k+1$.
%
% \item [\texttt{Q}\arg{list}] as ‘se\textbf Quence’, a~sequence of
% symbols from \<list>; for the fundamental usage see line
% \ref{Q-type}. More clearly, an argument specified with
% |Q|\arg{tokens} is a~word over the alphabet
% \<tokens>${}\cup{\tt\visiblespace}$ where {\tt\visiblespace}
% is ignored and shall not be passed in the respective \hash{\<n>}.
%
% \item [\texttt{c}] for an optional argument in
% parentheses. Historically it comes from a ‘coordinate’ argument and
% may serve as such: if you declare \TextUsage\DCcoordinate, then
% its catcher will be redefined to check for presence of a comma and pass
% the argument as |{|\arg{before comma}{after comma}|}| if comma
% present. |\NoValue| is passed if absent. By default
% \TextUsage\DCnocoordinate\ is executed that defines the |c| type
% argument as just an optional in parentheses.
%
% \item [\texttt C\arg{default}] as |c|, with default value.
%
% \item [\texttt b] for for an \emph{optional} argument in curly
% braces. That's strange for anyone acquainted with \LaTeX\ and
% contrary to its basic convention, but practised by Til Tantau in the
% \pk{beamer} class. If missing, |\NoValue| is passed as |#|\<n> and
% therefore all the tests |If›[No›]Value›(T⁄|F⁄|TF›)| apply.
%
% \item [\texttt B\arg{default}] for a~braced \emph{optional} argument with
% the default value \<default>.
%
% \item [\texttt K\arg{\#-string}\metachar{[}\arg{replacement}\metachar{]}]
%   for a~\emph{mandatory} \textbf Knuthian delimited or undelimited macro
%   parameters. This concept comes from Stephen Hicks' suggestion at
%   Bacho\TeX\ 2009 of implementing arguments delimited with
%   |#{|. ^^A}
%   So, in the mandatory first argument to |K| you give
%   an arbitrary parameters string as described in Chapter 20 of
%   \TB. If you don't provide the replacement, only |#1| of those
%   parameters will be passed to the core macro of your command as
%   |#|\<n>. In both arguments you use single |#| char.
%
% \item [\texttt G\arg{pair of tokens}\metachar{[}{default value}\metachar{]}] a \textbf General
% catcher of an optional. For instance, to declare an optional in
% angles (used e.g.\ in Till Tantau's \pk{beamer}), declare
% |G{<>}|. Again, if second argument is absent, |\NoValue| is assumed.
% \item[\texttt{A}] (for ‘angles’) a~shorthand for |G{<>}| (accepts
% the second braced as the default value).
%
% \item [\texttt{\string\afterassignment}\arg{register}] a
% pseudo-argument that in fact \emph{interrupts} parsing arguments to
% let an assignment to \<register>. The default \<register> is |\@tempcnta|. For
% example, 
%\begin{verbatim}
% \DeclareCommand\llf{\afterassignment}
% {{\lastlinefit\@tempcnta\par}}
%\end{verbatim}
% defines |\llf| to be a command that expects a value for a numerical
% assignment, assigns it to  (|\@tempcnta| and then to) the |\lastlinefit|
% special register and executes |\par| with that setting inside a
% group.
%
% Actually, \<register> may be empty |{}| and then each
% time our command is used the left side of the assignment has to
% be given explicitly and may even be different each time.
%
% Doesn't add anything to the arguments' list.
%
% \emph{This pseudo-argument type should be considered experimental.}
%
% \end{itemize}
% 
%
% \stanza
% 
% Note that you could limit acceptable values of a~mandatory or an
% optional-in-brackets argument
% to a~list inside definition of the command, using |\IfAmong›…\among…|
% defined in line \ref{IfAmong}.
%
% The |S|/|T|, |s| and |Q| arguments are always `long', they allow
% |\par| as their value that is. They have to be unbraced to be parsed so
% there's no danger of “runaway argument”.
%
% By default, \TextMarginize*{\long!lL} all the |c|, |C|,  |o|, |O|, |m|, |b| and
% |B| are ‘short’, they don't allow |\par| in them that
% is. Note however that |\par| is allowed in the default values. If
% you wish to allow |\par| for all the arguments, you can say
% |\DeclareCommand\mycommand!|… — the optional |!| makes all
% the arguments ‘long’. Instead of |!| you can use |L| or |l| for
% ‘long’ or just |\long| itself.
%
% In the arguments specification string you can write |>›[{›]⁄<prefix>›[}›]|
% to make subsequent argument ‘long’ or ignored:
%
% Any of  \TextUsage*{Pp!lL\long\par} to make a particular argument ‘long’,
% allowing |\par| in it that is, and/or any of \TextUsage*{iI} to make the
% argument ignored (just gobbled).
%
% (Note that also the |c| and |C| arguments may be made ‘long’. That's
% because I use them not as coordinates but as just another kind of
% optional argument.
%
% The concept of ignored arguments came to my head when I was
% declaring a command with three braced optionals and put optional
% stars only to distinguish the braced optionals.
%
%  For example, after
% \begin{verbatim}
% \DeclareCommand\GLBTQKi{%
%    G{&&}{\#1 default}
%    >LB{\#2 default}
%    >iT{*\ht}
%    Q{0123456789}{0}
%    K{#1\par#2\par}{{\text{#1}\over\text{#2}}}
% \end{verbatim}
% and you get |\GLBTQKi|  4-argument with:
% \begin{enumargs}
%   \dc G{&&} optional short in a pair of |&|  with  |\NoValue| as the default,
%   \dc >LB  optional long in curly braces,
%   \dc >iT{*\ht} star or |\ht| control sequence,
%   \dc Q{0123456789}{0} optional sequence of decimal digits with
%   default 0,
%   \dc K{#1\par#2\par}{{\text{#1}\over\text{#2}}} mandatory sequence
%   of two arguments both delimited with |\par|, that will be passed
%   the inner macro as |{\text{#1}\over\text{#2}}|.
% \end{enumargs}
%
% \stanza The arguments  may be tested inside the command with
% \TextUsage\IfLong|{#⁄<n>}|\arg{what if long}{what if short}. The
% test looks for |\par| at any level of nesting (|{\par}|---|\par| in
% braces will not hide) since it  |\detokenize|s
% its argument.
%
% ^^A % \stanza
% ^^A %
% ^^A % There's an  idea that came to my mind but I~did not
% ^^A % implement it: 
% ^^A % \begin{itemize}
% ^^A % \item [\texttt{>B}] spec prefix for
% ^^A %   mandatory argument to check whether that argument is braced. 
% ^^A % \end{itemize}
% ^^A % The |B| and |b| argument types partially fulfil it.
%
% \stanza If you wish \TextMarginize*{\global\outer} to define your
% command |\global|ly, you can specify
% |\DeclareCommand\mycommand\global|. If you wish to forbid usage of
% your command in arguments of macros, add the |\outer| prefix. As
% with original \TeX's |\def| and like, the prefixes are allowed in
% any order and in any number only here they come between the
% command's name and the arguments specification. You can also add
% |\long|, as we mentioned above, and, for the symmetry, also
% |\protected|, although the latter is \emph{always} added since the
% command is not expandable.
%
% \stanza Handling of white spaces with optionals seems to me too
% complicated compared to the estimated weight of the problem and
% I~haven't faced it so far so I~don't provide anything. But!---but
% there are some commands that should be invisible in the typeset
% text, such as indexing commands and font declarations. For those
% there is a~working \LaTeX\ mechanism of |\@bsphack|---|\@esphack|
% and to use it I~provide yet another ‘prefix’:
% if you type \TextMarginize*{iIwW\sphack} |W| or
% |w| (for ‘white’) or |I| or |i| (for ‘invisible’) or, if you prefer
% a~prefix-like, |\sphack|\qfootnote{I~don't define the \cmd\sphack\
%   control sequence and don't assume it's defined. I~use it only
%   as a~marker and my use of it doesn't create an entry in the
%   hash table.}
% between the \CS to be defined and arguments 
% spec, |\@bsphack| and |\@esphack| will be
% added in proper places.
%
% \stanza The original inner macros of the ancient \pk{xparse} had
% names like |\@dc@o| etc. According to my \TeX\ Guru's advice
% I~changed them to |\ArgumentCatcher@|\<letter(s)> to make the error
% messages less confusing. Well, I~don't know if they are but
% \possfil|\ArgumentCatcher@PO| looks better than |\@dc@PO| doesn't it?
%
% Talking of messages, there's a~Boolean switch
% \TextUsage\IfDCMessages. Its default setting is
% \TextUsage\DCMessagesfalse\ but if you set
% \TextUsage\DCMessagestrue, every |\command| created with my
% |\DeclareCommand| will issue a~message “Parsing arguments
% for |\command|” at the beginning of its execution.
%
% If you are positive \TextMarginize{.qQ} that no such message will
% ever be useful, you can suppress the very placing of it in the
% command's definition with an optional argument to
% \cs{Dec\-la\-re\-comm\-and} with all other ‘prefixes’, |.| or |q|
% or |Q| for ‘quiet’.
% 
% \stanza
% To sum up, |\DeclareCommand| takes the following arguments:
% \begin{enumargs}
%   \dc >Pm the command to be defined (can be even |\par| if you
%   really wish),
%
% \dc Q{\long\global\outer\protected!lL.qQiIwW\sphack} optional
% \eTeX's prefix\:(es) and/or symbols for making all the arguments
% long (|!|, |l| or |L|) and/or to suppress placing of the diagnostic
% message in the definition (|.|, |q|, |Q|) and/or for placing
% |\@sphack|---|\@esphack|  (|i|, |I|, |w|, |W|, |\sphack|),
%
%   \dc >Pm the arguments
%   specification (can contain |\par| as you see), 
%
%   \dc >Pm the definition body. You refer to the arguments with
%   |#|\<n> and can test their presence and absence with
%   |\If›[No›]Value›(T⁄|F⁄|TF›){#⁄<n>}| and if the argument was specified
%   with the |>P| prefix (allows |\par| in itself), you can test it
%   with |\IfLong{#⁄<n>}|\arg{if long}{if short}. You are also
%   provided the |\IfAmong›…\among| and |\IfIntersect| tests defined
%   earlier in this package to process the arguments, especially of
%   the |S|/|T| and |Q| type.
%   
% \end{enumargs}
% 
%\stanza
% There is also the \TextUsage\DeclareEnvironment\ command to
% define environments with sophisticated optionals. It takes the
% arguments analogous to those of |\DeclareCommand|. 
%
% The |iIwW\sphack| specifier however acts  different: it doesn't add
% |\@bsphack| nor |\@esphack| but only |\@ignoretrue|  to the
% end macro so the spaces following |\end{myenvir}| will be
% ignored. (I~tried the space hack but it's problematic (“bad space
% factor” error) if an environment begins in the vertical mode and
% ends in horizontal.
% 
% \stanza
% So the arguments to
% \cs{Decl\-are\-Env\-iron\-ment} are:
% \begin{enumargs}
%
%   \dc Pm the environment's name; you may wonder why it allows
%   \cmd\par; it's to allow environments like
%   \inverb|\string\par|---I~met such an environment once.
%
%   \dc Q{\long\outer\global\protected!lL.qQiIwW\sphack} to prefix
%   \possfil the
%   command (note that |\outer| prefix will actually not work  since
%   the command is called with |\csname|), make all the
%   arguments ‘long’ (|\long|, |!|, |l| or |L|), not to place the message
%   issuer in the command (|.|, |q|, |Q|) or  to make the
%   environment ignores spaces following its end (|iIwW\sphack|).
%   
%   \dc Pm the arguments specification (both for the begin and for the
%   end macros)
%   
%   \dc Pm the begin definition,
%   
%   \dc Pm the end definition; it can use the same parameters
%   (\hash{\<n>}'s) as the begin definition. Note however that there
%   is only one
%    specification of the arguments and both begin and end have to have 9
%   parameters in total at most.
%
% \end{enumargs}
% 
% 
 
\unless\ifdefined\@temptokenb
\newtoks\@temptokenb
\fi

\newif\if@dc@alllong@ % for an option of all arguments long.
\newif\if@dc@quiet@ % for suppressing the message of using  of
% declared command. 

\newif\IfDCMessages % a~global switch to suppress the message about
% parsing. 


\def\@dc@long@yes{P}

\newtoks\@dc@arguments

\newcount\@dc@catchernum
\newcount\@dc@argnum

\newif\if@dc@ignore


% \UnPdef
\long\pdef\DeclareCommand#1#2#3{% ^^B It's the draft version just
  % ^^B~to declare the true one, which is  defined in line \ref{DC:final}.
  % \begin{enumargs}
  % \item command to be defined,
  % \item arguments specification,
  % \item definition body.
  % \end{enumargs}
  % \chgs[\DeclareCommand]{2008/12/05 v0.98 added the \env{S}/\env{T} spec parsing, the
  %   \env{s} spec parsing rewritten to be a~shorthand for
  %   \env{S\{*\}}, unused code removed}
  %
  \@dc@catchernum\z@
  \@dc@argnum\z@
  \toks@{}% in this register we will store  the created sequence of
  % argument catchers. 
  % ^^A Later, in the working declared command,
  % ^^A   % \incs{toks@} bears \inverb|{#1}{#2}{#3}…|.
  \@temptokena\toks@ % in this register we will store the sequence of \inverb|#1#2…|.
  \@temptokenb\toks@ % in this register we will store the sequences of
  % \inverb|m|'s. 
  % ^^A   \@temptokenc\toks@ % this register will bear the sequence of tests
  % ^^A   % for `longness' of arguments.
  \emptify\@dc@long@
  \@dc@ignorefalse
  \@dc#2X% |X| is the sentinel of parsing.
  \protected\edef#1{%
    \@nx\@dc@    {\the\toks@}%
    \@xa\@nx\csname\string#1\endcsname 
    \@nx #1%
  }%
  \edef\gmu@reserveda{%
    \long\def\@xa\@nx\csname\string#1\endcsname
    \the\@temptokena{%
      % ^^A       \the\@temptokenc
      \unexpanded{#3}}}%
  \gmu@reserveda}% of the ‘draft’ |\DeclareCommand|.


\long\def\@dc@
  #1%  the argument catchers in a~pair of braces (their arguments
  %   may contain \incmd\par\ so the macro is long).
  #2% |\\thecommand|
  #3% |\thecommand|
  {% 
  \ifx\protect\@typeset@protect
    \@xa\@firstofone
  \else
    \protect#3\@xa\@gobble
  \fi
  {\@dc@arguments{#2}#1\the\@dc@arguments}}


\def\@dc#1{% The main parsing macro.
  \ifx#1X% if we meet the sentinel we stop. Note there may be some
  % \inverb|m|'s in \incs{@temptokenb} and we might not to care about
  % them since
  % they denote mandatory arguments and as such they will
  % be grabbed by \nlperc|\\⁄<declared command>|. However, if any of them
  % contains \incs{par} (while it shouldn't), then it wouldn't be
  % noticed since \inverb|\\⁄<declared command>| is always
  % long. Therefore:
    \@dc@add@ms
  \else
    \ifx#1>%
      \let\next@dc\grab@prefix
    \else % not |X| neither |>|
      \if@dc@alllong@\let\@dc@long@\@dc@long@yes\fi
      \ifx#1\afterassignment\@dc@ignoretrue\fi % if we parse the
      % assigned pseudo-argument, we don't want to add anything to the
      % % arguments' toks register so we apply general mechanism of
      % % ignoring an argument.
      \ifx#1\gobblespace\@dc@ignoretrue\fi % again, as above for
      % ignoring spaces.
      \ifnum \ifx#1m0\else1\fi \ifx\@dc@long@\@empty 0\else 2\fi
          \if@dc@ignore 1\else0\fi = 0 % we check
      % whether \inverb|#1| is \inverb|m| and not prefixed.
        \addto@hook\@temptokenb m% as you see, \incs{@temptokenb} serves as
        % a~storage of |m|'s.
      \else % (not |m|) or prefixed
        \@dc@add@ms
        \if@dc@ignore\addtotoks\toks@{\@dc@ignorearg}\fi
        \@xa\addtotoks\@xa\toks@\@xa{%
          \csname ArgumentCatcher@\@dc@long@\detokenize{#1}\endcsname}% the argument catcher's name
        % is  \inverb|\ArgumentCatcher@›[P›]⁄<arg. type>|.
        \@temptokenb{}%
      \fi% of |\if| short |m| or not
      \advance\@dc@catchernum\@ne
      \unless\if@dc@ignore
        \advance\@dc@argnum\@ne
        \@temptokena\@xa{%
          \the\@xa\@temptokena\@xa##\the\@dc@argnum}%
      \else
        \@dc@ignorefalse
      \fi
      \IfAmong#1\among{ABCO}%
      {\let\next@dc\grab@default}%
      {\IfAmong#1\among{GQST}%
        {\let\next@dc\grab@defaults}% G, Q, S and T have second argument,
        % braced optional, which is the default value (|\NoValue| by default).
        {\gmu@if  x {K#1}%
          {\let\next@dc\@dc@define@K}%
          {\gmu@if x {\afterassignment#1}%
            {\let\next@dc\dc@grab@afterass}%
            {\let\next@dc\@dc}%
          }%
        }%
      }%
      \unless\ifx\next@dc\@dc@define@K
        \emptify\@dc@long@
      \fi
  \fi % of |\if#1>|.
    \@xa\next@dc
  \fi
}%

\def\@dc@add@ms{%
  \@xa\@ifempty\@xa{\the\@temptokenb}%
  {}%
  {\toks@\@xa{%
      \the\@xa\toks@
      \csname ArgumentCatcher@\the\@temptokenb\endcsname}}}


\long\def\grab@default#1{% the default value or the list of tokens for
  % \inenv{S} may contain \incs{par} (why not?), that's why we make
  % this macro \incs{long}. 
  \toks@\@xa{\the\toks@{#1}}%
  \let\next@dc\@dc
  \@dc
}

\long\def\grab@defaults#1{% default (when default is absent)
  \toks@\@xa{\the\toks@{#1}}%
  \@ifnextchar\bgroup
  {\grab@default}%
  {\grab@default{\NoValue}}%
}

\def\dc@grab@afterass{%
  \@ifnextchar\bgroup
  {\grab@default}%
  {\grab@default{\@tempcnta}}%
}


\long\def\@dc@addargum{%
  \addtotoks\@dc@arguments}

\StoreMacro\@dc@addargum

\pdef\@dc@ignorearg{%
  \long\def\@dc@addargum##1{%
    \RestoreMacro\@dc@addargum}}

% Parsing of Knuthian parameters string is easier to implement with
% full-feature |\DeclareCommand| so we postpone it till line \ref{K@parse}


\def\grab@prefix#1{% 
  \IfIntersect{#1}{\long!lL\par Pp}%
  {\def\@dc@long@{P}}{}%
  \IfIntersect{#1}{Ii}%
  {\@dc@ignoretrue}{}%
  \@dc
}

\long\def\ArgumentCatcher@o#1\@dc@arguments{% parsing of an optional with no default
  \@ifnextchar[%^^A]
  {\def\@dc@parse@next{#1}\ArgumentCatcher@o@}%\
  % the last macro has to be short so
  % we can't give it all the arguments' catchers since some default may 
  % contain \incs{par}. Therefore we hide all the argument catchers in
  % \incs{@dc@parse@next}. 
  {\@dc@addargum\NoValue#1\@dc@arguments}}

\def\ArgumentCatcher@o@[#1]{%
  \@dc@addargum{{#1}}\@dc@parse@next\@dc@arguments}

\long\def\ArgumentCatcher@Po#1\@dc@arguments{% parsing of an optional with no default.
  \@ifnextchar[%^^A]
  {\ArgumentCatcher@Po@{#1}}%
  {\@dc@addargum\NoValue#1\@dc@arguments}}

\long\def\ArgumentCatcher@Po@#1[#2]{%
  \@dc@addargum{{#2}}#1\@dc@arguments}

\long\def\ArgumentCatcher@O#1#2\@dc@arguments{% parsing of optional with default value.\
  % \begin{enumargs}
  %   \mand  the default value,
  %   \mand  the tail of args parser.
  % \end{enumargs}
  % 
  \@ifnextchar[%^^A]
  {\def\@dc@parse@next{#2}\ArgumentCatcher@o@}% note that even when an
  % optional is short, its default  may contain \incs{par}.
  {\@dc@addargum{{#1}}#2\@dc@arguments}}


\long\def\ArgumentCatcher@PO#1#2\@dc@arguments{% parsing of optional with default value.\
  % \begin{enumargs}
  %   \mand  the default value,
  %   \mand  the tail of args parser.
  % \end{enumargs}
  % 
  \@ifnextchar[%^^A]
  {\ArgumentCatcher@Po@#2}% note that even when an
  % optional is short, its default  may contain \incs{par}.
  {\@dc@addargum{{#1}}#2\@dc@arguments}}


\long\def\ArgumentCatcher@b#1\@dc@arguments{% parsing of an optional braced short argument.
  \@ifnextcat\bgroup
  {\def\@dc@parse@next{#1}\ArgumentCatcher@m@}%\
  % the last macro has to be short so
  % we can't give it all the arguments' parsers since some default may 
  % contain \incs{par}. Therefore we hide all the argument catchers in \incs{@dc@parse@next}.
  {\@dc@addargum\NoValue#1\@dc@arguments}}


\long\def\ArgumentCatcher@Pb#1\@dc@arguments{% parsing of a~braced and
  % long optional with \incmd\NoValue\ default.
  \@ifnextcat\bgroup
  {\ArgumentCatcher@Pm#1\@dc@arguments}%
  {\@dc@addargum\NoValue#1\@dc@arguments}%
}

\long\def\ArgumentCatcher@B#1#2\@dc@arguments{% parsing of a~braced optional with default value.\
  % \begin{enumargs}
  %   \mand  the default value,
  %   \mand  the tail of args catchers.
  % \end{enumargs}
  % 
  \@ifnextcat\bgroup
  {\def\@dc@parse@next{#2}\ArgumentCatcher@m@}% note that even when an
  % optional is short, its default  may contain \incs{par}.
  {\@dc@addargum{{#1}}#2\@dc@arguments}}

\long\def\ArgumentCatcher@PB#1#2\@dc@arguments{% parsing of a~braced
                                % and long  optional with default value.\
  % \begin{enumargs}
  %   \mand  the default value,
  %   \mand  the tail of args catchers.
  % \end{enumargs}
  % 
  \@ifnextcat\bgroup
  {\ArgumentCatcher@Pm#2\@dc@arguments}% 
  {\@dc@addargum{{#1}}#2\@dc@arguments}}


\long\def\ArgumentCatcher@S@% parsing of a~Single continued:
#1%  the list to search |#4| on,
#2% the default value,
#3% the tail of args parsers,
#4% the token we search in |#1|  (it's an unbraced
% single token as we checked in line \ref{dc@S:bgroup}).
{%
  \IfAmong#4\among{#1}%
  {\@dc@addargum{{#4}}#3\@dc@arguments}%
  {\@dc@addargum{{#2}}#3\@dc@arguments#4}%
}

\long\def\ArgumentCatcher@S % parsing of a~\textbf Single\
  % token. It's always long since we look for a~single unbraced token\
  % so there is no danger of “runaway argument”.
#1% the list we search optional token on,
#2% the default value,
#3%  the tail  of args parser.
\@dc@arguments{%
  \@ifnextsingle
  % \label{dc@S:bgroup}
  {\ArgumentCatcher@S@{#1}{#2}{#3}}%
  {\@dc@addargum{{#2}}#3\@dc@arguments}% if we parse an
  % opening or closing brace, then we are sure it's not any expected
  % Single.
}
  

\let\ArgumentCatcher@PS\ArgumentCatcher@S % as above: we always act `long' with single tokens.
\let\ArgumentCatcher@T\ArgumentCatcher@S % we allow |T| (for Token) as
% an alias of |S|.


\edef\ArgumentCatcher@s{%
  \@nx\ArgumentCatcher@S{\@xa\@nx\all@stars}{\@nx\NoValue}}% the |s| arg spec is
% a~shorthand for \inverb|S{*}|. Except the star may be of any
% category from $\{11,12,13\}$.
\let\ArgumentCatcher@Ps\ArgumentCatcher@s

\long\def\ArgumentCatcher@Q% parsing of a~se\textbf Quence\
            % of tokens from the list. It's always long since we look for  unbraced tokens\
            % so there is no danger of “runaway argument”.
#1%  the list we search optional tokens on,
#2%  the default value,
#3%   the tail  of args parser.
\@dc@arguments % delimiter
{% 
  \def\@dc@parse@next{#3}%
  \emptify\@dc@seQuence
  \ArgumentCatcher@Q@{#1}{#2}}

% \Define\ArgumentCatcher@PQ
\let\ArgumentCatcher@PQ\ArgumentCatcher@Q

\long\def\ArgumentCatcher@Q@#1#2{% list, default
  % ^^A   \typeout{@@@@ AC@Q@, toks@: \the\@dc@arguments}%
  \@ifnextsingle
  {\ArgumentCatcher@Q@@{#1}{#2}}%
  {\@dc@seQuence@finish{#2}}%
}

\long\def\ArgumentCatcher@Q@@#1#2#3{% list, default, token to be checked\\
  % we only launch this macro when not
  % before opening curly brace. \inverb|#1| is the list of acceptable
  % values, \inverb|#2| the default value, \inverb|#3| is the token to
  % be sought on the list. 
  \IfAmong #3\among{#1}%
  {\addtomacro\@dc@seQuence#3%
    \ArgumentCatcher@Q@{#1}{#2}}%
  {\@dc@seQuence@finish{#2}#3}%
}

\long\def\@dc@seQuence@finish#1{%
  % ^^A   \typeout{@@@@ l.\the\inputlineno\space \@xa\unexpanded\@xa{\@dc@seQuence}}%
  \ifx\@dc@seQuence\@empty\def\@dc@seQuence{#1}\fi
  \@xa\@dc@addargum\@xa{\@xa{\@dc@seQuence}}%
  % ^^A   \typeout{@@@@ finish, toks@: \the\@dc@arguments}%
  \@dc@parse@next\@dc@arguments }


\long\def\ArgumentCatcher@c#1\@dc@arguments{%
  \@ifnextchar(%^^A)
  {\def\@dc@parse@next{#1}\ArgumentCatcher@c@}%
  {%
    % ^^A     \PackageError{gmutils/gmparse}{Missing coordinate argument}%
    % ^^A     {A value of (0,0) is assumed}%
    \@dc@addargum{{\NoValue}}#1\@dc@arguments}%
}

\def\DCcoordinate{%
  \def\ArgumentCatcher@c@(##1){%
    \IfAmong,\among{##1}%
    {\@xa\@dc@addargum\@dc@commasep##1\@dc@commasep}%
    {\@dc@addargum{{##1}}}\@dc@parse@next\@dc@arguments}%
  % \stanza
  \def\@dc@commasep##1,##2\@dc@commasep{{{{##1}{##2}}}}%
  % \stanza
  \long\def\ArgumentCatcher@Pc@(##1){%
  \IfAmong,\among{##1}%
  {\@xa\@dc@addargum\@dc@commasep##1\@dc@commasep}%
  {\@dc@addargum{{##1}}}\@dc@parse@next\@dc@arguments}%
}

\def\DCnocoordinate{%
  \def\ArgumentCatcher@c@(##1){%
    \@dc@addargum{{##1}}\@dc@parse@next\@dc@arguments}%
  % \stanza
  \long\def\ArgumentCatcher@Pc@(##1){%
    \@dc@addargum{{##1}}\@dc@parse@next\@dc@arguments}%
}

\DCnocoordinate

\long\def\ArgumentCatcher@C#1#2\@dc@arguments{%
  \@ifnextchar(%^^A)
  {\def\@dc@parse@next{#2}\ArgumentCatcher@c@}%
  {\@dc@addargum{{#1}}#2\@dc@arguments}}


\long\def\ArgumentCatcher@Pc#1\@dc@arguments{%
  \@ifnextchar(%^^A)
  {\def\@dc@parse@next{#1}\ArgumentCatcher@Pc@}%
  {\@dc@addargum{{\NoValue}}#1\@dc@arguments}%
}

\long\def\ArgumentCatcher@PC#1#2\@dc@arguments{%
  \@ifnextchar(%^^A)
  {\def\@dc@parse@next{#2}\ArgumentCatcher@Pc@}%
  {\@dc@addargum{{#1}}#2\@dc@arguments}}


\long\def\ArgumentCatcher@Pm#1\@dc@arguments#2{%
  \@dc@addargum{{#2}}#1\@dc@arguments}

\def\gmu@hashes#1#2{% this is a~fully expandable loop analogous to
  % that of The  % \eTeX\ Manual p.~9.
  \ifnum#1<#2%
  ####\number#1
  \expandafter\gmu@hashes
  \expandafter{\number\numexpr#1+1\expandafter}%
  \expandafter{\number#2\expandafter}%
  \fi}% of |\gmu@hashes|.

\def\gmu@hashesbraced#1#2{%
  \ifnum#1<#2%
  {####\number#1}%
  \expandafter\gmu@hashesbraced
  \expandafter{\number\numexpr#1+1\expandafter}%
  \expandafter{\number#2\expandafter}%
  \fi}% of |\gmu@hashesbraced|.

\@tempcnta=1
\@whilenum\@tempcnta<9\do{%
  \edef\gmu@ms{\romannumeral\numexpr\@tempcnta*1000 }%
  % 
  % ^^A   \typeout{@@@@ gmutils.sty: defining \bslash
  %   ^^A     ArgumentCatcher@\gmu@ms}% 
  \edef\gmu@tempa{%
    \long\def\@xa\@nx\csname
       ArgumentCatcher@\gmu@ms
    \endcsname 
    ##1\@nx\@dc@arguments{\def\@nx\@dc@parse@next{##1}%
      \@xa\@nx\csname
        ArgumentCatcher@\gmu@ms @%
      \endcsname}%
    % 
    \def\@xa\@nx\csname
    ArgumentCatcher@\gmu@ms @%
    \endcsname
    \gmu@hashes1{\numexpr\@tempcnta+1}%
    {\@nx\@dc@addargum{%
        \gmu@hashesbraced1{\numexpr\@tempcnta+1}}%
      \@nx\@dc@parse@next\@nx\@dc@arguments
    }% of \incs{ArgumentCatcher@\<m's>@}.
  }% of |\edef|.
  \gmu@tempa
  \advance\@tempcnta1\relax
}% of the loop.

% The loop above defines 8 pairs of macros as we see thanks to the
% code below:
\if 1 1
\@tempcnta\@ne
\@whilenum\@tempcnta<9\do{%
  \edef\gmu@ms{\romannumeral\numexpr\@tempcnta*1000}%
  \typeout{\bslash  ArgumentCatcher@\gmu@ms:%
    ^^J\@xa\meaning\csname ArgumentCatcher@\gmu@ms\endcsname}%
  \typeout{\bslash  ArgumentCatcher@\gmu@ms @:%
    ^^J\@xa\meaning\csname ArgumentCatcher@\gmu@ms @\endcsname}%
  \advance\@tempcnta\@ne
}
\fi
% The code above produces on the terminal:
%\begin{verbatim}
% \ArgumentCatcher@m:
% macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@m@ 
% \ArgumentCatcher@m@:
% macro:#1->\addto@hook \@dc@arguments {{#1}}\@dc@parse@next \@dc@arguments 
% \ArgumentCatcher@mm:
% macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mm@ 
% \ArgumentCatcher@mm@:
% macro:#1#2->\addto@hook \@dc@arguments {{#1}{#2}}\@dc@parse@next \@dc@arguments 
% \ArgumentCatcher@mmm:
% macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmm@ 
% \ArgumentCatcher@mmm@:
% macro:#1#2#3->\addto@hook \@dc@arguments {{#1}{#2}{#3}}\@dc@parse@next \@dc@arguments 
% \ArgumentCatcher@mmmm:
% macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmm@ 
% \ArgumentCatcher@mmmm@:
% macro:#1#2#3#4->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}}\@dc@parse@next \@dc@arguments 
% \ArgumentCatcher@mmmmm:
% macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmmm@ 
% \ArgumentCatcher@mmmmm@:
% macro:#1#2#3#4#5->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}{#5}}\@dc@parse@next \to
% ks@ 
% \ArgumentCatcher@mmmmmm:
% macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmmmm@ 
% \ArgumentCatcher@mmmmmm@:
% macro:#1#2#3#4#5#6->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}{#5}{#6}}\@dc@parse@ne
% xt \@dc@arguments 
% \ArgumentCatcher@mmmmmmm:
% macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmmmmm@ 
% \ArgumentCatcher@mmmmmmm@:
% macro:#1#2#3#4#5#6#7->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}{#5}{#6}{#7}}\@dc@pa
% rse@next \@dc@arguments 
% \ArgumentCatcher@mmmmmmmm:
% macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmmmmmm@ 
% \ArgumentCatcher@mmmmmmmm@:
% macro:#1#2#3#4#5#6#7#8->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}\@
% dc@parse@next \@dc@arguments 
%\end{verbatim}
 

\def\ArgumentCatcher@mmmmmmmmm\the\@dc@arguments
#1#2#3#4#5#6#7#8#9{% yes, it has to be
  % delimited (well, actually: started) by \inverb|\the\@dc@arguments| not
  % only \incs{@dc@arguments}. And it doesn't need to be long and launch inner
  % short macro because there's nothing more to catch.
  \@dc@addargum{%
    {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}\the\@dc@arguments}


\long\def\ArgumentCatcher@Pm#1\@dc@arguments#2{% catcher of a~long mandatory.
  \@dc@addargum{{#2}}#1\@dc@arguments}


\long\def\ArgumentCatcher@K %  a~Knuthian delimited or undelimited
% arguments parsed and passed to the command's body in a~digest
% (Knuthian replacement)
#1% the particular Knuthian macro
#2%   the tail of args parser.
\@dc@arguments % tail delimiter
{\def\@dc@parse@next{#2}#1}

\let\ArgumentCatcher@PK\ArgumentCatcher@K

\long\def\gmu@twostring#1#2{\string#1\string#2}

\long\def\ArgumentCatcher@G % general catcher
#1% left and right delimiter
#2% default value
#3% the tail of args parser.
\@dc@arguments % tail delimiter
{%
  \edef\@dc@Gname{ArgumentCatcher@G\gmu@twostring#1}%
  \unless\ifcsname \@dc@Gname \endcsname
    \@xa\def\csname \@dc@Gname\@xa\endcsname
    \@dc@Gparams#1{\@dc@addargum{{##2}}##1\@dc@arguments}%
  \fi
  \@xa\@ifnextchar\@firstoftwo#1%
  {\def\dc@parse@next{#3}% we hide possible |\par|s.
    \csname\@dc@Gname\endcsname\dc@parse@next}%
  {\@dc@addargum{{#2}}#3\@dc@arguments}%
}


\long\def\ArgumentCatcher@PG % general catcher
#1% left and right delimiter
#2% default value
#3% the tail of args parser.
\@dc@arguments % tail delimiter
{%
  \edef\@dc@Gname{ArgumentCatcher@PG\gmu@twostring#1}%
  \unless\ifcsname \@dc@Gname \endcsname
    \long\@xa\def\csname \@dc@Gname\@xa\endcsname
    \@dc@Gparams#1{\@dc@addargum{{##2}}##1\@dc@arguments}%
  \fi
  \@xa\@ifnextchar\@firstoftwo#1%
  {\csname\@dc@Gname\endcsname{#3}}%
  {\@dc@addargum{{#2}}#3\@dc@arguments}%
}


\long\def\@dc@Gparams#1#2{##1#1##2#2}% expands to parameters string
% with \inhash1 delimited with first argument and \inhash2 delimited
% with second. In fact it's intended to pass  \inhash1 further (it will
% always be braced) and to catch an argument put in a~pair of tokens
% given \incmd\@dc@Gparams\ as the arguments.

\long\def\ArgumentCatcher@A{\ArgumentCatcher@G{<>}}
\long\def\ArgumentCatcher@PA{\ArgumentCatcher@PG{<>}}

\long\def\ArgumentCatcher@a{\ArgumentCatcher@G{<>}{\NoValue}}
\long\def\ArgumentCatcher@Pa{\ArgumentCatcher@PG{<>}{\NoValue}}


\def\NoValue{-NoValue-}

\long\def\IfNoValueTF#1{% % \chgs{2008/12/1 v0.98 the \pk{xparse} tests for
  % the presence of value redefined and much simplified (43 \CS'es
  % less). Moreover, they are now fully expandable: \cmd\IfNoValueTF,
  % \cmd\IfNoValueT, \cmd\IfNoValueF, \cmd\IfValueTF, \cmd\IfValueT,
  % \cmd\IfValueF} 
  %
  \@xa\ifx\@firstofmany#1\@empty\@@nil\NoValue \afterfi\@firstoftwo
  \else\afterfi\@secondoftwo
  \fi}

\long\def\IfNoValueT#1#2{\IfNoValueTF{#1}{#2}\@empty}

\long\def\IfNoValueF#1#2{\IfNoValueTF{#1}\@empty{#2}}

\long\def\IfValueTF#1#2#3{\IfNoValueTF{#1}{#3}{#2}}

\long\def\PutIfValue#1{\IfValueT{#1}{#1}}

% \Define\IfValueT
\let\IfValueT\IfNoValueF

% \Define\IfValueF
\let\IfValueF\IfNoValueT

\long\pdef\IfLong#1{%\
  % \begin{enumargs}
  % \item the argument to check for |\par|,
  % \item what if |\par| found,
  % \item what if |\par| not found.
  % \end{enumargs}
  % 
  \edef\gmu@reserveda{\detokenize{#1}}%
  \edef\gmu@reserveda{%
    \IfAmong\string\par\@nx\among{\gmu@reserveda}}%
  \gmu@reserveda}


% |\afterassignment| pseudo-argument

\long\@namedef{ArgumentCatcher@\detokenize{\afterassignment}}%
#1% register used in the assignment
#2%  the tail  of args parser.
\@dc@arguments{%
  \def\@dc@parse@next{%
    \@dc@addargum\NoValue  % to make ignoring mechanism work  
    #2\@dc@arguments}%
  \afterassignment\@dc@parse@next
  #1}% optional space and |=| is left at user's discretion. In fact,
% \inhash1 may be empty and then each
% time our command is used the left side of the assignment has to
% be given explicitly and may even be different each time.
  
\n@melet{ArgumentCatcher@P\detokenize{\afterassignment}}
{ArgumentCatcher@\detokenize{\afterassignment}}

% |\gobblespace| pseudo-argument: useful between optional and
% Knuthian-type arguments and after all parsing.  Equivalent
% |>iT{\somedummymacro}|. At first I wanted mark it |\ignorespaces|
% but the gobbling doesn't expand macros: it doesnt't use
% |\ignorespaces| but |\@ifnextchar|'s space trick.

\long\@namedef{ArgumentCatcher@\detokenize{\gobblespace}}%
{\ArgumentCatcher@S{\dc@gobblespace@dummy}{\NoValue}}

\n@melet{ArgumentCatcher@P\detokenize{\gobblespace}}
{ArgumentCatcher@\detokenize{\gobblespace}}

\def\dc@gobblespace@dummy{\dc@gobblespace@dummy}

\let\gobblespace\dc@gobblespace@dummy


% end of catchers' definitions


\DeclareCommand\DeclareCommand   % This is the final version by now.\
  % Note we introduce the ‘prefixes’ at the \inhash2 position only at \
  % this point so we have yet to prefix every argument specifier\
  % separately. Note also we only here ‘teach’ |\DeclareCommand| to
  % pass the name of its main argument in the |\dc@bsname| macro.
{>Pm             %   (1)  command to be defined (may  be \incs{par} if you
                         %   really wish),
  Q{\global\protected\outer\long!lL.qQiIwW\sphack\envhack}%\
                 % \label{Q-type}  % (2) an optional
                 % se\textbf Quence of \eTeX's prefixes and/or |!| or |l| or |L|
                 % for ‘all
                 % long’ and/or |.| or |q| or
                 % |Q| for `quiet' (message about calling the command is
                 % suppressed) and/or % |i| or |I| as ‘invisible’ or |W| or |w| as
                 % ‘white’ or |\sphack| to make the command ‘invisible’ in
                 % the leading with the \incs{@bsphack}…\incs{@esphack}\qfootnote{To
                 %   deal with an ‘invisible’ environment, there is one more
                 %   acceptable value of this argument: \cmd\envhack, which
                 %   suppresses placing \cs{@bsphack}---\cs{@esphack} and places
                 %   \cs{@ignoretrue} instead in the end macro.},
  >Pm % (3)  arguments specification (may contain \incmd\par),
  >Pm % (4) the definition body; may contain nearly anything including
                  % \incmd\par\ and tests for presence/absence of arguments
                  % \nlperc|\If›[No›]Value›(T⁄|F⁄|TF›)| and for their longness \incmd\IfLong;
                  % you refer to the arguments with \inverb|#|\<n>.
}{% \label{DC:final}  %
                 % \chgs{2008/12/05 v0.98 added the \cs{@bsphack}---\cs{@esphack} option}
                 % \chgs{2008/12/07 v0.98 added the \env{Q\arg{tokens}} argument type
                 %   (a~word over the alphabet \<tokens>)}
                 %
                 % ^^A   \edef\@detokena{\detokenize{{#1} {#2} {#3} {#4} {#5} {#6}}}%
                 % ^^A   \typeout{\@detokena}%
                 % 
  \edef\dc@bsname{\string#1}% we'll use it in K-type arg.\ catcher and
  % to allow \inhash1${}=={}$\incs{par}
  % (\incs{Pack\+age\+Warn\+ing} is short and \incs{typeout} too!).
  \gm@testdefined#1\iftrue
    \IfDCMessages
      \PackageWarning{gmutils (gmparse)}{Redefining command \dc@bsname\space
        with \string\DeclareCommand}%
    \fi
  \else
    \IfDCMessages
      \typeout{^^J\string\DeclareCommand\dc@bsname\space (new)^^J}%
    \fi
  \fi
  %
  % First we parse the declaration options to know whether all the
  % arguments are to be long and whether we should suppress the
  % message ``Parsing arguments for…''.\nostanza
  \@dc@alllong@false
  \@dc@quiet@false
  % ^^A \typeout{@@@@ \the\inputlineno\space DC \xiihash1: \@nx#1}%
  \IfIntersect{#2}{\long!lL}{%
    % ^^A \typeout{@@@ \@nx #1 \space intersect with !lL }%
    \@dc@alllong@true}{}%
  \IfIntersect{#2}{.qQ}{\@dc@quiet@true}{}%
  \IfIntersect{#2}{iIwW\sphack}%
  {% if `invisibility' is specified: \UnDef
    \def\@dc@bsphack@{\@nx\@bsphack}% \UnDef
    \def\@dc@esphack@{\@nx\@esphack}%
  }% 
  {\emptify\@dc@bsphack@\emptify\@dc@esphack@}% if `invisibility' is not specified.
  \IfAmong\envhack\among{#2}%
  {% but  if we define an environment:
    \emptify\@dc@bsphack@\emptify\@dc@esphack@}%
  {% and if we don't define an environment:
    \emptify\@dc@env@argstoend}%
  \relaxen\@dc@global@ \relaxen\@dc@outer@
  \IfAmong\outer\among{#2}{\let\@dc@outer@\outer}{}%
  \IfAmong\global\among{#2}{\let\@dc@global@\global}{}%
  % We initialise the scratch count and toks registers before parsing
  % of the arguments specifiers.\nostanza
  \@dc@catchernum\z@
  \@dc@argnum\z@
  \toks@{}% 
  \@temptokena\toks@
  \@temptokenb\toks@
  % We parse the arguments specifiers:\nostanza
  \@dc#3X% |X| is the sentinel of parsing.\par
  % Now we define the basic macro:\nostanza
  \@dc@outer@\@dc@global@ % possibly the prefixes,
  \protected\edef#1{% always |\protected| \balsmiley( ;-)
    \@dc@bsphack@ % perhaps |\@bsphack|
    \unless\if@dc@quiet@
      \unexpanded{%
        \IfDCMessages
        \typeout}{Parsing arguments for \dc@bsname.}%
        \@nx\fi
    \fi
    \@nx\@dc@{\the\toks@}% in the braces appear the argument catchers.
    \@xa\@nx\csname\dc@bsname\endcsname
    \ifx\@dc@outer@\outer
      \@xa\@nx\csname \@xa\gobble\string#1 \endcsname % note the blank
      % space after \inhash1! If the command is to be \incmd\outer, we
      % can't put it itself, so we put another, whose name is the same
      % plus a~space. Anyway, since \inhash1 becomes \incmd\protected,
      % this case will never be executed.
      \else \@nx #1%
      \fi
  }% \UnDef
  \edef\gmu@reserveda{%
    \@dc@global@ % perhaps |\global|
    \long\def\@xa\@nx\csname\string#1\endcsname% for a~command
    % \incmd\command, define \incs{\bslash command}\ilrr
    \the\@temptokena% it's |#1#2#3…|
    {% the definition body:
      \@dc@env@argstoend % if we define an environment, this macro
      % will provide passing the arguments to the end macro (see
      % line \ref{@dc@env@argstoend}).
      % ^^A \IfNoValueTF{#1}%
      % ^^A       {\@dc@test@long\@nx#2{\the\@temptokena}}{}%
      \unexpanded{#4}%
      \@dc@esphack@}%
  }% of |\edef|.
  \gmu@reserveda
}% of |\DeclareCommand|.

% Now we have a~convenient tool to implement parsing of a~Knuthian
% argument(s).

% Knuthian argument's default replacement
\def\@dc@K@defaultrepl{##1}
% 2009/11/22 inner pair of braces removed (as leading to additional
% group causing errors).

\DeclareCommand\@dc@define@K\long{mb}{% \label{K@parse}
  %  first we add the particular \CS to the toks register:\nostanza
  \edef\gmu@tempa{%
    \unexpanded{\toks@\@xa}%
    {\@nx\the\toks@{%
        \@xa\@nx\csname\dc@bsname @K\the\@dc@catchernum\endcsname}}%
  }\gmu@tempa
  %  and define this macro: \nostanza
  \edef\gmu@tempa{%
    \def\@xa\@nx\csname\dc@bsname @K\the\@dc@catchernum\endcsname
    \unexpanded{#1}{%
    \@nx\@dc@addargum{{%
        \IfValueTF{#2}{\unexpanded{#2}}{\@xau{\@dc@K@defaultrepl}}%
      }}% we add the Knuthian
    % replacement to the toks register as \inhash n.
    \@nx\@dc@parse@next\@dc@arguments}% and continue parsing.
  }% of |\edef|. Now we execute this temporary macro, which means we \incmd\def|\⁄<command>@K⁄<n>|
  \@dc@global@ % set properly before |\@dc#3X|. 
  \if P\@dc@long@\relax\long\fi
  \gmu@tempa
  % ^^A  \nameshow{\dc@bsname @K\the\@dc@catchernum}%
  % Now we clean up and continue construction of arguments parser. \nostanza
  \emptify\@dc@long@
  \@dc
}


\DeclareCommand\DeclareEnvironment\long
{m% Pm the environment's name; you may wonder why it allows
  %   \incmd\par. Once I~met an environment with a~name containing
  %   \nlperc|\string\par|.
    Q{\outer\global\protected\long!lL.qQiIwW\sphack\envhack}% \  
    % a~sequence of \eTeX's prefixes and/or specifiers to make all the
    % arguments ‘long’ (\incmd\long, |!|,
    % |l| or |L|)
    % and/or not to place the message issuer in the command
    % (\inverb|.|, \inverb|q|, \inverb|Q|) and/or to make the
    % environment ignore spaces following its end (|i|, |I|, |w|, |W|
    % or \incmd\sphack),
  m   %    the arguments specification (both for the begin and the
                % end  definitions),
 m %  the begin definition,
 m %    the end definition; it \emph{can} contain any
  %   \inverb|#|\<n>---the arguments of the environment are passed
  %   to it, too.
}{% 
  \def\@dc@env@argstoend{% \label{@dc@env@argstoend} \UnDef
    \edef
    \@xa\@nx\csname \bslash#1(arguments)\endcsname
    {\unexpanded{%
        \@xa\@xa\@xa\unexpanded\@xa\@xa\@xa{\@xa\@gobble\the\@dc@arguments}%
      }% of outer |\unexpanded|,
    }% of |\edef|'s body.
    % \nostanza Note that |\@dc@env@argstoend| will be put in an
    % |\edef| and the arguments bearer it sets will be defined as custom for
    % this particular environment (its name contains the name of the
    % environment) and inside the environment's group
    % and will bear a~list of tokens \arg{arg.1}{arg.2}\mch… not
    % the \CS\ |\@dc@arguments| so it's robust to nested environments
    % and even to \cs{DeclareEnvironment}'s occurrences inside the
    % environment.\fullpar \nostanza
  }% of |\@dc@env@argstoend|.
  % 
  \def\gmu@reserveda{\envhack}%  we add the information we define an
  % environment.
  \IfValueT{#2}%
  {\addtomacro\gmu@reserveda{#2}}% we pass all the ‘prefixes’ to
  % \incs{Decl\+are\+Comm\+and} 
  % \stanza
  \@xa\DeclareCommand\csname#1\@xa\endcsname
  \gmu@reserveda{#3}{#4}%
  %
  %\nostanza Now the begin definition is done. Let's get down to the
  %end definition. \nostanza
  %
  \@dc@global@ % note this \CS was for sure redefined by the last
  % \incs{Decl\+are\+Com\+m\+and} (and by nothing else) and that's
  % exactly what we want. 
  \@nameedef{end#1}% It's |\edef| inside.
  {\@nx\@xa\@xa\@nx\csname\bslash end#1\endcsname
    \@xa\@nx\csname \bslash#1(arguments)\endcsname}% 
  % \nostanza We |\edef| the |\end|\<env. name> macro to be 
  % \[|\expandafter\\end⁄<env. name>\\⁄<env. name>(arguments)|\]
  % (it's |\expandafter| and two  control sequences, the latter with
  % |(arguments)| in its name).
  % 
  \IfIntersect{#2}{iIwW\sphack}%
  {\@dc@global@\@xa\addtomacro
    \csname end#1\endcsname{\@ignoretrue}}{}%
  \edef\gmu@reserveda{% \UnDef
    \@dc@global@\long\def % the inner end macro is always \incmd\long\
    % and perhaps defined \incmd\global ly.
    \@xa\@nx\csname\bslash end#1\endcsname 
    \the\@temptokena% it's |#1#2#3›…|---the inner end macro takes the
    % same number of parameters as the begin macro.
    {% the definition body
      % ^^A \IfNoValueTF{#1}%
      % ^^A       {\@dc@test@long\@nx#2{\the\@temptokena}}{}%
      \unexpanded{#5}}%
  }% of |\edef|.
  \gmu@reserveda
}


% ^^A \unless\ifdefined\DeclareDocumentCommand
% ^^A \let\DeclareDocumentCommand\DeclareCommand
% ^^A \fi
% ^^A 
% ^^A \unless\ifdefined\DeclareDocumentEnvironment
% ^^A \let\DeclareDocumentEnvironment\DeclareEnvironment
% ^^A \fi



% \division{Ampulex Compressa-like modifications of macros}
% Ampulex Compressa is a~wasp that performs brain surgery on its
% victim cockroach to lead it to its lair and keep alive for its
% larva. Well, all we do here with the internal \LaTeX\ macros
% resembles Ampulex's actions but here is a~tool for a~replacement of
% part of macro's definition. 
%
% The \cs{ampulexdef} command takes its |#2| which has to be a~macro
% and replaces part of its definition delimited with |#5| and |#6|
% with the replacement |#7|. The redefinition may be prefixed with
% |#1|. |#2| may have parameters and for such a~macro you have to set
% the parameters string and arguments string (the stuff to be taken by
% the one-step expansion of the macro) as the optional |[#3]| and
% |[#4]|.  . If \cs{ampulexdef} doesn't find the start and end tokens
% in the meaning of the macro, it does nothing to it.  You have to
% write |####| instead of |#| or you can use |\ampulexhash| as
% well. For an example use see line \ref{ampulexset}.

%^^A \showthe\catcode`:
%^^A \showthe\catcode`_
%^^A 
%^^A \gmu@storespecials
%^^A 
%^^A \RequirePackage{xparse}[2008/08/03]
%^^A 
%^^A % This should not happen but well, it did: the catcodes changed the
%^^A % \pk{expl3} way leaked so I~fix them here.
%^^A \gmu@septify
%^^A \@makeother\:
%^^A \catcode`_=8
%^^A \catcode`\ =10


\DeclareCommand\ampulexdef\long
{Q{\outer\long\global\protected} % (1)  (optional) prefix\:(es);
  % allowed is any sequence of them in any order, just like for the 
  % original \TeX's \incmd\def.
  S{\def\edef\gdef\xdef\pdef} % (2) (optional) kind of definition; if
  % not specified, \incmd\def\ will be used.
  m % (3)  macro to be redefined,
  O{} % (4) \cs{def}'s parameters string; empty by default,
  O{} % (5) definition body's parameters to be taken in a~one-step
  % expansion of the redefined macro; empty by default,
  m % (6) start token(s),
  m % (7) end token(s)
  m % (8) the replacement
}{%^^B
  % \changes{v0.93}{2008/08/29}{added}
  % \changes{v0.94}{2008/09/07}{made \pk{xparse}-ish and
  %   \cs{ampulexset} removed}
  % \chgs{2008/12/7 v0.98 first argument (the prefix) made of the
  % \env{Q} type}
  % For the example of usage see \ref{ampulexset}. \HideDef
  \def\gmu@tempa{#6}%
  \def\gmu@tempb{#7}%
  \def\gmu@tempc{#8}% we wrap the start, end and replacement tokens in
  % macros to avoid unbalanced \incs{if}s. \ResumeDef
  \edef\gmu@tempd{%
    \long\def\@nx\gmu@tempd
    ####1\detoken@xa\gmu@tempa
    ####2\detoken@xa\gmu@tempb
    ####3\@nx\gmu@tempd{%
      \unexpanded{% \chgs[\ampulexdef]{2008/11/30 v0.98 a~bug fixed:
        % added \cs{unexpanded}} 
        \@ifempty{##3}{\hidden@iffalse}{\hidden@iftrue}}}}%
  %
  \gmu@tempd% it defines \incs{gmu@tempc} to produce an open \incs{if}
  % depending on whether the start and end token(s) are found in the
  % meaning of \inverb|#3|.
  %
  \edef\gmu@tempe{%
    \@nx\gmu@tempd\all@other#3% note that |#3| may have parameters so
    % we have to look at its meaning not at its one-level expansion,
    % which could produce an ‘extra \cmd\}’ error.
    \detoken@xa\gmu@tempa
    \detoken@xa\gmu@tempb\@nx\gmu@tempd
  }%
  %
  \gmu@tempe% we apply the checker and it
  % produces an  open \incs{if}.
  \edef\gmu@tempd{%
    \long\def\@nx\gmu@tempd
    ####1\@xa\unexpanded\@xa{\gmu@tempa}%
    ####2\@xa\unexpanded\@xa{\gmu@tempb}%
    ####3\@nx\ampulexdef{% we define a~temporary
      % macro with the parameters delimited with the `start' and `end' parameters
      % of \incs{ampulexdef}.\fullpar
      \@nx\unexpanded{####1}%
      \@nx\@xa\@nx\unexpanded
      \@nx\@xa{\@nx\gmu@tempc}%we replace the part of the redefined
      % macro's meaning with the replacement text.
      \@nx\unexpanded{####3}}}%
%^^A\show\gmu@tempd
  \gmu@tempd
%^^A\show\gmu@tempd
  % 
  \edef\gmu@tempf{#5}%
  \edef\gmu@tempe{%
    \IfValueT{#1}{#1}\IfValueTF{#2}{#2}{\def}%
    \@nx#3#4{%
      \@xa\@xa\@xa\gmu@tempd\@xa#3\gmu@tempf\ampulexdef}}%
  \gmu@tempe
  \fi}

\def\ampulexhash{####}% for your convenience (not to count the hashes).

% For the heavy debugs I~was doing while preparing \pk{gmdoc}, as
% a~last resort I~used |\showlists|. But this command alone was
% usually too little: usually it needed setting |\showboxdepth| and
% |\showboxbreadth| to some positive values. So,
%
\def\gmshowlists{\showboxdepth=1000 \showboxbreadth=1000 \showlists}
% \changes{v0.59}{06/09/04}{moved here from \pk{gmdoc}}



\newcommand\nameshow[1]{\@xa\show\csname#1\endcsname}
\newcommand\nameshowthe[1]{\@xa\showthe\csname#1\endcsname}
% Note that to get proper |\showthe\my@dimen14| in the `other' |@|'s
% scope you write |\nameshowthe{my@dimen}14|\,.

% Standard |\string| command returns a~string of `other' chars except
% for the space, for which it returns | |$_{10}$. In \pk{gmdoc}
% I~needed the spaces in macros' and environments' names to be always
% \catother, so I~define
% \Define\xiistring
% \changes{v0.59}{06/09/04}{moved here from \pk{gmdoc}}
\long\def\xiistring#1{%
  \if\@nx#1\xiispace
    \xiispace
  \else
    \afterfi{\string#1}% to make the same error as bare |\string|
    % would cause in case of empty \inhash1.
  \fi}

%The next macro is applied to a~|\detokenized| nonempty string to convert the spaces into
% ‘other’. \nostanza
\def\@xiispaces#1 #2\@@nil{%
  #1%
  \ifx\@xiispaces#2\@xiispaces
  \else
  \xiispace
  \afterfi{\@xiispaces#2\@@nil}%
  \fi}


% \division{Environments redefined}
% \subdivision{Almost an environment or redefinition of \cs{begin}}
%
% We'll extend the functionality of |\begin|: the non-starred
% instances shall act as usual and we'll add the starred version. The
% difference of the latter will be that it won't check whether the
% `environment' has been defined so any name will be allowed. 
%
% This is intended to structure the source with named groups that
% don't have to be especially defined and probably don't take any
% particular action except the scoping.
%
%  (If the |\begin*|'s argument is a~(defined) environment's name,
%  |\begin*| will act just like |\begin|.)
% \dekmedskip
%
% Original \LaTeX's |\begin|:
% \begin{verbatim}
%\def\begin#1{%
%  \@ifundefined{#1}%
%    {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
%    {\def\reserved@a{\def\@currenvir{#1}%
%        \edef\@currenvline{\on@line}%
%        \csname #1\endcsname}}%
%    \@ignorefalse
%    \begingroup\@endpefalse\reserved@a}
%\end{verbatim}
% 
%   \Define\@begnamedgroup
\long\def\@begnamedgroup#1{%
  \edef\@prevgrouplevel{\the\currentgrouplevel}% added 2009/03/24 to
  % handle special pseudo-environments that don't increase
  % \incmd\currentgrouplevel (such as \inenv{document}). Note it's
  % |\edef|ed \emph{outside} the environment's group.
  \@ignorefalse% not to ignore blanks after group
  \begingroup\@endpefalse
  \edef\@prevenvir{\@currenvir}% Note we |\edef| it inside the group
  % (for obvious reason), unlike the ‘previous’ grouplevel.
  \edef\@currenvir{#1}% We could do recatcoding
  % through\inverb|\string| or \nlperc\cmd\detokenize\ but all the name
  % `other' and 10 could affect
  % a~thousand packages so we don't do that and we'll recatcode in
  % a~testing macro, see line \ref{@ifenvir}.
  \edef\@currenvline{\on@line}%
  \csname #1\endcsname}% if the argument is a~command's name (an
% environment's e.g.), this command will now be executed. (If the
% corresponding control sequence hasn't been known to \TeX, this line
% will act as |\relax|.)

% Let us make it the starred version of |\begin|.
%   \begin{DoIndex}{\begin}
%       \Define\begin
% \Define*{\begin*}
\def\begin{\gm@ifstar{\@begnamedgroup}{%
      \@begnamedgroup@ifcs}}
% \end{DoIndex}

\def\@begnamedgroup@ifcs#1{%
  \ifcsname#1\endcsname\afterfi{\@begnamedgroup{#1}}%
  \else\afterfi{\@latex@error{Environment #1 undefined}\@eha}%
  \fi}%


%\subdivision{\cs{@ifenvir} and improvement of \cs{end}}
%
% \changes{v0.74}{2006/11/27}{The catcodes of \cs{begin} and \cs{end}
% argument(s) don't have to agree strictly anymore: an environment is properly
% closed if the \cs{begin}'s and \cs{end}'s arguments result in the
% same \cs{csname}}
%
% It's very clever and useful that |\end| checks whether its argument
% is |\ifx|-equivalent |\@currenvir|. However, in standard \LaTeX\ it
% works not quite as I~would expect: Since the idea of environment is
% to open a~group and launch the \CS named in the |\begin|'s
%   argument. That last thing is done with |\csname…\endcsname| so
%   the catcodes of chars are irrelevant (until they are |\active|,
%   ${}_1$, ${}_2$ etc.). Thus should be also in the |\end|'s test and
% therefore we ensure the compared texts are both expanded and made
% all `other'.
%
% First a~(not expandable) macro that checks whether current
% environment is as given in |#1|. Why is this macro |\long|?---you
% may ask. It's |\long| to allow environments such as |\string\par|.
%
\long\def\@ifenvir#1{%\label{@ifenvir}\
  % \begin{enumargs}
  %   \mand enquired environment name which will be confronted with
  %   \incs{@currenvir}
  %   \mand what if true (if the names are
  %   equivalent\qfootnote{The names are checked whether they produce
  %     the same \cmd\csname. They don't have to have the same
  %     catcodes.})
  %   \mand what if false
  % \end{enumargs}
  % 
  % \changes{v0.92}{2008/08/07}{added}
\@ifedetokens{\@currenvir}{#1}}


\long\pdef\@ifedetokens#1#2{%
  % \begin{enumargs}
  % \item first list of tokens to be expanded and detokenized
  % \item second list
  % \item if agree
  % \item else
  % \end{enumargs}
  % 
  % \chgs{2009/04/21 v0.99 moved to a~separate macro from
  % \cmd\@ifenvir\ and made symmetric to both arguments}
  % \chgs{2008/12/01 v0.98 rewritten not to make entries in the hash
  % table, thanks to \cmd\detokenize\ and made robust to open \cs{if}s
  % in the arguments thanks to substitution of explicit parameters
  % with \cmd\@firstoftwo\ and \cmd\@secondoftwo}
  \edef\gmu@tempa{#1}% to get |#1| fully expanded.
  \edef\gmu@reserveda{\@xa\detokenize\@xa{\gmu@tempa}}% with our
  % brave new \incs{begin}, \incs{@currenvir} is fully expanded,
  % remember? 
  \edef\gmu@tempa{#2}% to get |#2| fully expanded.
  \edef\gmu@reservedb{\@xa\detokenize\@xa{\gmu@tempa}}%
  \ifx\gmu@reserveda\gmu@reservedb\@xa\@firstoftwo
  \else\@xa\@secondoftwo
  \fi}

\def\@ifjobname#1{\@ifedetokens{\jobname}{#1}}

\long\def\@ifprevenvir#1{%\label{@ifenvir}\
  % \begin{enumargs}
  %   \mand enquired environment name which will be confronted with
  %   \incs{@prevenvir}
  %   \mand what if true (if the names are
  %   equivalent\qfootnote{The names are checked whether they produce
  %     the same \cmd\csname. They don't have to have the same
  %     catcodes.})
  %   \mand what if false
  % \end{enumargs}
  % 
  % \changes{v0.92}{2009/09/04}{added}
\@ifedetokens{\@prevenvir}{#1}}



% Note that |\@ifjobname| and |\@ifenvir| are expandable and in an
% |\edef| they expand to 
% \[|\@ifedetokens{⁄<current jobname>}{⁄<arg.1>}|\] and
% \[|\@ifedetokens{⁄<current envir>}{⁄<arg.1>}|\] resp. which may be
% useful for some  \TeX vert.


\def\@checkend#1{\@ifenvir{#1}{}{\@badend{#1}}}
% \changes{v0.92}{2008/08/07}{shortened thanks to \cs{@ifenvir}}
% Thanks to it you may write |\begin{macrocode*}| with |*|\catother
% and end it with |\end{macrocode*}| with |*|\catletter\ (that was the
% problem that led me to this solution). The error messages looked
% really funny:
%\begin{verbatim}
%! LaTeX Error: \begin{macrocode*} on input line 1844 ended by \end{macrocode*}.
%\end{verbatim}
% You might also write
% also |\end{macrocode\star}| where |\star| is defined as `other' star
% or letter star.

% \division{Storing and restoring the catcodes of specials}
%
% \Define\gmu@restorespecials
\DeclareCommand\gmu@storespecials{o}{% we provide a~possibility of
  % adding stuff. For usage see line \ref{@storespecials}.
  \def\do##1{\catcode`\@nx##1=\the\catcode`##1\relax}%
  \edef\gmu@restorespecials{%
    \dospecials\do\^^M}\IfValueT{#1}{#1}}

\pdef\gmu@septify{% restoring the standard catcodes of specials. The
  % name is the opposite of `sanitize' ^^A(
  % :-)\,. It restores also the original catcode of \inverb|^^M|.
  \def\do{\relax\catcode`}%
  \do\ 10\do\\0\do\{1\do\}2\do\$3\do\&4%
  \do\#6\do\^7\do\_8\do\%14\do\~13\do\^^M5\relax
  %\nostanza |%% \let\do\@makeother|\\
  % |%% \do0\do1\do2\do3\do4\do5\do6\do7\do8\do9\relax|\nostanza
}




%\division{From \pk{relsize}}
%
%\changes{v0.58}{06/09/02}{Relative font size change macros added}
%
% As file \pk{relsize.sty}, v3.1 dated July 4, 2003 states, \LaTeXe\
% version of these macros was written by Donald Arseneau
% \url{asnd@triumf.ca} and Matt Swift \url{swift@bu.edu} after the
% \LaTeX\,2.09 \pk{smaller.sty} style file written by Bernie Cosell
% \url{cosell@WILMA.BBN.COM}\,.
%
% I~take only the basic, non-math mode commands with the assumption
% that there are the predefined font sizes.
% 
% You declare the font size with \TextUsage\relsize\arg{n} where
% \<n> gives the number of steps ("mag-step" = factor of 1.2) to
% change the size by. E.g., $n = 3$ changes from |\normalsize| to
% |\LARGE| size.  Negative $n$ selects smaller fonts.
% \TextUsage\smaller${}=={}$|\relsize{-1}|;
% \TextUsage\larger${}=={}$|\relsize{1}|. \TextUsage\smallerr (my
% addition)${}=={}$|\relsize{-2}|; \TextUsage\largerr\ guess yourself.
% 
% (Since |\DeclareRobustCommand|
% doesn't issue an error if its argument has been defined and it only
% informs about redefining, loading \pk{relsize} remains allowed.)
% \Define\relsize
\pdef\relsize#1{%
  \ifmmode \@nomath\relsize\else
    \begingroup
     \@tempcnta % assign number representing current font size
       \ifx\@currsize\normalsize 4\else   % funny order is to have most …
        \ifx\@currsize\small 3\else       % …likely sizes checked first
         \ifx\@currsize\footnotesize 2\else
          \ifx\@currsize\large 5\else
           \ifx\@currsize\Large 6\else
            \ifx\@currsize\LARGE 7\else
             \ifx\@currsize\scriptsize 1\else
              \ifx\@currsize\tiny 0\else
               \ifx\@currsize\huge 8\else
                \ifx\@currsize\Huge 9\else
                4\rs@unknown@warning % unknown state: |\normalsize| as starting point
     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
%  Change the number by the given increment:
     \advance\@tempcnta#1\relax
%  watch out for size underflow:
      \ifnum\@tempcnta<\z@ \rs@size@warning{small}{\string\tiny}\@tempcnta\z@ \fi
      \@xa\endgroup
      \ifcase\@tempcnta  % set new size based on altered number
         \tiny \or \scriptsize \or \footnotesize \or \small \or \normalsize \or 
         \large \or \Large \or \LARGE \or \huge \or \Huge \else 
          \rs@size@warning{large}{\string\Huge}\Huge
\fi\fi}% end of |\relsize|.

\providecommand*\rs@size@warning[2]{\PackageWarning{gmutils (relsize)}{%
 Size requested is too #1.\MessageBreak Using #2 instead}}


\providecommand*\rs@unknown@warning{\PackageWarning{gmutils (relsize)}{Current font size 
 is unknown! (Why?!?)\MessageBreak Assuming \string\normalsize}}

% And a~handful of shorthands: 
%
\DeclareRobustCommand*\larger[1][\@ne]{\relsize{+#1}}
\DeclareRobustCommand*\smaller[1][\@ne]{\relsize{-#1}}
\DeclareRobustCommand*\textlarger[2][\@ne]{{\relsize{+#1}#2}}
\DeclareRobustCommand*\textsmaller[2][\@ne]{{\relsize{-#1}#2}}
\pdef\largerr{\relsize{+2}}
\pdef\smallerr{\relsize{-2}}



%\division{Meta-symbols}
% I~fancy also another Knuthian trick for typesetting \<meta-symbols>
% in \TeXbook. So I~repeat it here. The inner |\meta| macro is
% copied verbatim from \pk{doc}'s v2.1b documentation dated 2004/02/09
% because it's so beautifully crafted I~couldn't resist. I~only don't
% make it |\long|.
% \dekmedskip
%
% \begin{quotation}
% The new implementation fixes this problem by defining
% |\meta| in a radically different way: we prevent hyphenation by defining a |\language|
% which has no patterns associated with it and use this to typeset the words within
% the angle brackets.
% \end{quotation}
%^^A~\DefIndex\l@nohyphenation
%^^A~\ifx\l@nohyphenation\undefined
%^^A~  \newlanguage\l@nohyphenation
%^^A~\fi
\pdef\meta#1{%
  % \begin{quotation}
  %   Since the old implementation of |\meta| could be used in math we better ensure
  %   that this is possible with the new one as well. So we use |\ensuremath| around
  %   |\langle| and |\rangle|. However this is not enough: if |\meta@font@select| below
  %   expands to |\itshape| it will fail if used in math mode. For this reason we hide
  %   the whole thing inside an |\nfss@text| box in that case.
  % \end{quotation}
  {\meta@fontsetting\ensuremath\langle}%
  \ifmmode\@xa\nfss@text\fi
  {% this has to be a~begin-group because \incmd{\nfss@text} becomes
   % \incmd\hbox\ in math mode.
   \gmu@activespaceblank
    \meta@font@select
    % Need to keep track of what we changed just in case the user changes font inside
    % the argument so we store the font explicitly.
    % ^^A~% \DefIndex\meta@hyphen@restore
    % ^^A    \edef\meta@hyphen@restore{%
    %   ^^A      \hyphenchar\the\font\the\hyphenchar\font}%
    % ^^A    \hyphenchar\font\m@ne
    % ^^A    \language\l@nohyphenation
    #1\/%
    % ^^A~    \meta@hyphen@restore
  }%
  {\meta@fontsetting\ensuremath\rangle}%
}% of |\meta|.

\pdef\gmu@activespaceblank{%
  \@xa\def\gmu@activespace{\space\ignorespaces}% note the
  % subtle perversity of this definition: if we meet more than one
  % subsequent active spaces, then the first of them will
  % typeset \incmd\space and its \incmd\ignorespaces\ will
  % gobble \incmd\space\ of the second and will stop at
  % \incs{ignorespaces} and this \incs{ignorespaces} will gobble
  % the next \incs{space} and so on.
}

\def\meta@fontsetting{\color{red!50!black}}

\def\meta@font@select{\meta@fontsetting\it}
% \changes {v0.76}{06/9/21}{\cs{itshape} changed to an explicit and
% violent \cs{it} to work as expected in \cs{cs}'s argument}
% But I~define |\meta@font@select| as the brutal and explicit |\it|
% instead of the original |\itshape| to make it usable e.g.\ in the
% \pk{gmdoc}'s |\cs| macro's argument.


% The below |\meta|'s drag\qfootnote{Think of the drags that transform
%   a~very nice but rather standard `auntie' (`Tante' in Deutsch) into
%   \balsmiley( a~most adorable Queen ;-)\,.} is a~version of
% \TeXbook's one.  \Define*[\<⁄kern⁄string-3pt›…>]{\<›…>}
\def\<#1>{\meta{#1}}

\pdef\metachar#1{\begingroup\metacharfont #1\endgroup}
\def\metacharfont{\meta@fontsetting\rm}

% ^^A\gmshowlists

% \division{Macros for printing macros and filenames}
%
% First let's define three auxiliary macros analogous to |\dywiz| from
% \pk{polski.sty}: a~shorthands for |\discretionary| that'll stick to
% the word not spoiling its hyphenability and that'll won't allow
% a~line break just before nor just after themselves.  The
% |\discretionary| \TeX\ primitive has three arguments: |#1| `before
% break', |#2| `after break', |#3| `without break', remember?
% \Define\discre \Define\discret
\pdef\discre#1#2#3{\leavevmode\kern0sp%
  \discretionary{#1}{#2}{#3}\penalty10000\hskip0sp\relax}

\pdef\discret#1{\discre{#1}{#1}{#1}}

% A~tiny little macro that acts like |\-| outside the math mode and
% has its original meaning inside math.
\def\:{%
  \ifmmode\afterfi{\mskip\medmuskip}%
  \else\afterfi{\discre{\null}{}{}}% \incs{null} to get
  % \incs{hyphenpenalty} not \incs{exhyphenpenalty}.
  \fi}



\let\gmu@discretionaryhyphen\- % for the cases when we don't redefine
                               % \incs\- but use \incs\UrlFix


\DeclareCommand\bihyphen{O{*}}{% a~redefinition of |\-| that makes it
  % optional-argument to allow further hyphenation
  \DeclareCommand\gmu@discretionaryhyphen{T{#1}ca}{%
    \IfValueT{##2}{%
      \@ifempty{##2}{}{%
        \def\gmu@bihyphen@char{##2}}%
    }%
    \IfValueT{##3}{%
      \@ifempty{##3}{}{%
        \def\gmu@bihyphen@corr{##3}}%
    }%
    \IfValueTF{##1}\discre\discretionary
    {% before break
      \IfValueTF{##2}{%
        \@ifempty{##2}{\gmu@bihyphen@char}{##2}%
      }{%
        \ifnum\hyphenchar\font>\z@
          \char\hyphenchar\font
        \fi}}% end of before break
    {%after break
      \IfValueT{##3}{%
        \@ifempty{##3}{\gmu@bihyphen@corr}{##3}%
      }%
    }%
    {% without break
    }% almost as in \TB: unlike \TB, we allow hyphenchars
    % $\ge255$ as we are \XeTeX.
  }% of |\DeclareCommand\-|
  \gmu@storeifnotyet\-% original |\-| is a~\TeX's
  % primitive, therefore we should store it.
  \let\-\gmu@discretionaryhyphen
  \let\@dischyph\gmu@discretionaryhyphen % to override \pk{framed.sty}
}% of |\bihyphen|


\relaxen\gmu@bihyphen@corr

\pdef\vs{\discre{\visiblespace}{}{\visiblespace}}

% Then we define a~macro that makes the spaces visible even if used in
% an argument (i.e., in a~situation where re|\catcode|ing has no
% effect).
%
\def\printspaces#1{{\let~=\vs \let\ =\vs \gm@pswords#1 \@@nil}}
% \DefIndex\gm@pswords
\def\gm@pswords#1 #2\@@nil{%
  \ifx\relax#1\relax\else#1\fi
  \ifx\relax#2\relax\else\vs\penalty\hyphenpenalty\gm@pswords#2\@@nil\fi}% note 
% that in the recursive call of \incs{gm@pswords} the argument string is
% not extended with a~sentinel space: it has been already by
% \incs{printspaces}.\ilrr

\pdef\sfname#1{\textsf{\printspaces{#1}}}

\def\gmu@discretionaryslash{\discre{/}{\hbox{}}{/}}% the second
% pseudo-argument nonempty to get
% \incs{hyphenpenalty} not \incs{exhyphenpenalty}.\ilrr


\pdef\file#1{\gmu@printslashes#1/\gmu@printslashes}

\def\gmu@printslashes#1/#2\gmu@printslashes{%
  \sfname{#1}%
  \ifx\gmu@printslashes#2\gmu@printslashes
  \else
  \textsf{\gmu@discretionaryslash}%
  \afterfi{\gmu@printslashes#2\gmu@printslashes}\fi}
    

% it allows the spaces in the filenames (and prints
% them  as \vs).

% The  macro defined below I~use to format the packages' names.
\pdef\pk#1{\textsf{#1}}
% \changes{v0.96}{2008/11/13}{\cs{textup} removed to allow slanting
% the name in titles (that are usually typeset in Italic font)}


% Some (if not all) of the below macros are copied from \pk{doc}
% and/or \pk{ltxdoc}.
% 
% A~macro for printing control sequences in arguments of
% a~macro. Robust to avoid writing an explicit |\| into a~file. It
% calls |\ttfamily| not |\tt| to be usable in headings which are
% boldface sometimes.
%
% 
\DeclareCommand\cs{O{\type@bslash\penalty\@M\hskip\z@skip}}{%\
  % \begin{enumargs}
  %   \dc O{\bslash}  the control sequence's prefix, by default it's
  %   \inverb|\| allowing hyphenation of subsequent word,
  %   \dc m the control sequence or anything to be typeset in
  %   typewriter font.
  %   ^^A this argument is long to allow \inverb|\cmd\par|
  %   ^^A     % that expands to |\cs{\string\par}| or so.
  % \end{enumargs}
  % \chgs{2008/12/12 v0.98 added \cs{verbatim@specials}}
  % \chgs{2008/12/12 v0.98 made \cmd\- switch to \cmd\normalfont\
  % because \IMHO\ this underlines the fact that a~\CS\ belongs to the
  % narrative. \cmd\hyphenchar\ set to 45 as in usual texts} 
  \begingroup
  \ifdefined\verbatim@specials\verbatim@specials\fi
  \edef\-{\discretionary{%
      \ifdefined\gmv@hyphen\gmv@hyphen
      \else\unexpanded{{\normalfont-}}%
      \fi}{}{}}%
  \def\{{\type@lbrace\yeshy}\def\}{\char`\}}%
  \narrativett
  \edef\narrativett@storedhyphenchar{\the\hyphenchar\font}%
  \hyphenchar\font=\ifdefined\gmv@hyphenchar\gmv@hyphenchar
  \else "A6 \fi
  \cs@inner{#1}}

\pdef\cs@inner#1#2{%
  #1#2%
  \hyphenchar\font=\narrativett@storedhyphenchar\relax
  \endgroup}

\def\narrativett{\ttfamily}% such name because I~introduce it to
% distinguish the narrative verbatims from the code in \pk{gmdoc}.

\long\pdef\env{\cs[]}
% \changes{v0.66}{06/09/29}{the braces removed}

% And for the special sequences like |^^A|:\nostanza
\foone{\@makeother\^}
  {\pdef\hathat{\cs[^^]}}

\AtBeginDocument{%
  \@ifpackageloaded{gmdoc}{\def\hash{\cs[\#]}}{}}

% And one for encouraging line breaks e.g., before long verbatim words.
\def\possfil{\hfil\penalty1000\hfilneg}

\def\possvfil{\vfil
  \penalty\numexpr
  \gmu@minnum{\clubpenalty+\widowpenalty}{9999}%
  %^^A\gmu@maxnum
 %^^A   {\ifnum\widowpenalty<\@M
 %^^A       \gmu@minnum{\widowpenalty+1}{9999}\relax
 %^^A     \else1000%
 %^^A     \fi}%
 %^^A   {\ifnum\clubpenalty<\@M
 %^^A       \gmu@minnum{\clubpenalty+1}{9999}\relax
 %^^A     \else1000%
 %^^A     \fi}%
  \relax % eaten by |\gmu@maxnum|
  \relax % eaten by |\numexpr|
  \vfilneg}

\long\def\gmu@extremnum#1#2#3{%\
  % \begin{enumargs}
  % \item inequality sign
  % \item left side of comparison
  % \item right side of comparison
  % \end{enumargs}
  \@xa\ifx\@firstofmany#3\@@nil\relax % this complicated test is to
  % allow arguments beginning with some \incs{if⁄<…>} as in
  % \incs{possvfil} e.g.
    \@xa\@firstoftwo
  \else\@xa\@secondoftwo
  \fi
  {#2}%
  {%
    \ifnum\numexpr#2\relax#1\numexpr#3\relax 
      \@xa\@firstoftwo
    \else\@xa\@secondoftwo
    \fi
    {\gmu@extremnum#1{#2}}%
    {\gmu@extremnum#1{#3}}%
  }%
}

\def\gmu@maxnum{\gmu@extremnum>}
\def\gmu@minnum{\gmu@extremnum<}


% \division{Typesetting arguments and commands} 
%
% We define a~conditional and iterating command \TextUsage\arg\ that
% in math mode does what it used to do was in math and outside math it
% typesets mandatory, optional and picture (parenthesed) and angled
% arguments and optional stars. You can
% write \[|\arg[gefilte]*<fisch>(mit){baigele}|\] to get
% \[\hbox{\arg[gefilte]*{fisz}(mit){bajgele}}\]
% or even
% \[|\verb+\MoltoAdagio⁄⁄arg*{Dankgesang}<an>[die Gottheit]+|\] 
% (where |⁄⁄| is the escape char in verbatims) to
% get \[|\MoltoAdagio⁄arg*{Dankgesang}<an>[die Gottheit]|\] (in
% der lydischen Tonart).
%
% For more complicated arguments configurations consider using
% \pk{gmdoc}'s environment \env{enumargs}.
% \stanza
% The five macros below are taken from the \pk{ltxdoc.dtx}.
%
% \begin{quotation}|\cmd{\foo}| Prints |\foo| verbatim. It may be used inside moving
% arguments. |\cs{foo}| also prints |\foo|, for those who prefer that
% syntax. (This second form may even be used when |\foo| is
% |\outer|).\end{quotation}
% 

\long\def\cmd#1{\@xa\cs\@xa{\@xa\cmd@to@cs\string#1}}% it has to be
% un\incs{protected}! It has so many \incmd\expandafter s to allow
% \inverb|\cmd\par| and still keep the \incmd\cs\ command ‘short’.

\def\cmd@to@cs#1#2{\char\number`#2\relax}
% \nostanza It can be short since it never gets actual control
% sequence as an argument only a~string of ‘other’ tokens (and maybe spaces).

% |\marg{text}| prints \marg{text}, `mandatory argument'.
% \Define\marg
\pdef\marg#1{{\narrativett\type@lbrace}\meta{#1}{\narrativett\char`\}}}

% |\oarg{text}| prints \oarg{text}, `optional argument'.
% Also |\oarg[text]| does that.
% \HideAllDefining
% \Define\oarg
\pdef\oarg{\@ifnextchar[\@oargsq\@oarg}
%^^A]
\pdef\@oarg#1{{\narrativett[}\meta{#1}{\narrativett]}}
\pdef\@oargsq[#1]{\@oarg{#1}}

% |\parg{te,xt}| prints \parg{te,xt}, `picture mode argument'.
% \Define\parg
\pdef\parg{\@ifnextchar(\@pargp\@parg}
%^^A)
\def\@parg#1{{\narrativett(}\meta{#1}{\narrativett)}}
\def\@pargp(#1){\@parg{#1}}

\pdef\aarg{\@ifnextchar<\@aarga\@aarg}
\def\@aarg#1{{\narrativett<}\meta{#1}{\narrativett>}}
\def\@aarga<#1>{\@aarg{#1}}

\def\@verbaarga#1#2>{\@aarg{#2}\arg@dc}

\foone{\catcode`>\active}{%
  \def\@verbaargact#1#2>{\@aarg{#2}\arg@dc}%
}

\foone{\@makeother\{\@makeother\}%
  \catcode`[=\@ne\catcode`]=\tw@}
[% ^^A{
  \def\@verbmargm#1#2}[% for an argument in curly braces in a verbatim, where
    % the braces are not groupers and not necessary ‘other’. We'll know
    % by \incmd{\@ifnextif} that the future token is an opening
    % brace. Note this macro has 2nd parameter delimited with ‘other’
    % closing brace (so may not act correctly when braces are nested
    % (then hide them with special verbatim groupers)).  
    \marg[#2]%
    \arg@dc
  ]%
]% of |\foone|

% \ResumeAllDefining
\DeclareCommand\arg@dc!{%
  % \chgs{200/03/04 v0.991 added rcognising of verbatim braces and
  %   angles}  
  s % (1)
  o % (2)
  c % (3)
  b % (4)
  a % (5)
  S{\arg} % (6) just gobbled (for backwards compatibility)
}{% This command iterates while it
  % has arguments and typesets them in brackets, parentheses or curly
  % braces. Note it gobbles subsequent |\arg|s and just iterates.
  \def\next{0}%
  \IfValueT{#1}%
  {\metachar[\scanverb{*}\metachar]\def\next{1}}%
  \IfValueT{#2}{\@oarg{#2}\def\next{1}}%
  \IfValueT{#3}{\@parg{#3}\def\next{1}}%
  \IfValueT{#4}{\marg{#4}\def\next{1}}%
  \IfValueT{#5}{\aarg{#5}\def\next{1}}%
  \@ifnextchar\egroup{\endgroup}{%
    \if1\next\@xa\arg@dc
    \else % it's crucial that we look for verbatim braces \emph{after}
      % we checked there were no \inhash4, otherwise there would
      % be an error.
      \def\next{%
        \@ifnextif\xiilbrace{\@verbmargm}%
        {% not active or other lbrace
          \@ifnextif<{% then we look for angles
            \ifnum\catcode`>=\active
              \@xa\@verbaargact
            \else\@xa\@verbaarga
            \fi}%
          {% and if not angles neither verbatim braces, then
            \endgroup  % if we have no more arguments to typeset, we
            % close the group opened in line \ref{queer.group}
          }%
        }%
      }%
      \@xa \next
    \fi
  }% of not egroup
}% of  |\arg@dc|


% Now define the front-end macro of the |\arg| command:\nostanza
\foone{\obeylines}{%
  \AtBeginDocument{%
    \let\math@arg\arg %
    \pdef\arg{\ifmmode\math@arg %
      % \chgs{200/03/04 v0.991 added rcognising of verbatim braces and angles}
      \else\afterfi{%
        \begingroup %
        % \label{queer.group}
        \ifdefined\@ifQueerEOL\@ifQueerEOL{%
          \def^^M{\unskip\space}% in the ‘queer’ \ac{EOL}s scope we
          % keep line end active in case we have
          % \incmd\arg\nlpercent\arg{arg.} ending a~line: the next
          % char peeper touches line end or, if the line end was $_5$,
          % gobbles the space it turns into so the comment layer would
          % ‘leak’ to the code layer.
        }{}\fi %
        \arg@dc}%
      \fi}% of |\arg|,
  }% of |\AtBeginDocument|,
}% of |\foone|.
% \chgs{2008/12/07 v0.98 made iterating thanks to \cmd\DeclareCommand\cs{arg@dc}}


% Now you can write 
%\begin{verse}
% |\arg{mand.\ arg} [opt.\ arg] (pict.\ arg)| \\
% to get \arg{mand.\ arg} [opt.\ arg] (pict.\ arg). (Yes, with only one |\arg|!)\\
% And |$\arg(1+i) = \pi/4$| for $\arg(1+i) = \pi/4$.
% \end{verse}
% 

\DeclareCommand\cat{Q{'"0123456789ABCDEF}}{%
  ${}_{\the\numexpr#1}\m@th$\@ifnextcat a\space{}}


% \division{Not only preamble!}
% Let's remove some commands from the list to erase at begin document!
% Primarily that list was intended to save memory not to forbid
% anything. Nowadays, when memory is cheap, the list of only-preamble
% commands should be rethought \IMHO.


% \Define\not@onlypreamble
% \changes{v0.79}{2007/04/28}{All the actions are done in a~group and
% therefore \cs{xdef} used instead of \cs{edef} because this command
% has to use \cs{do} (which is contained in the \cs{@preamblecmds}
% list) and \cs{not@onlypreamble} itself should be able to be let to
% \cs{do}} 
\newcommand\not@onlypreamble[1]{{%
  \def\do##1{\ifx#1##1\else\@nx\do\@nx##1\fi}%
  \xdef\@preamblecmds{\@preamblecmds}}}

\not@onlypreamble\@preamblecmds
\not@onlypreamble\@ifpackageloaded
\not@onlypreamble\@ifclassloaded
\not@onlypreamble\@ifl@aded
\not@onlypreamble\@pkgextension

% And let's make the message of only preamble command's forbidden use
% informative a~bit:

\def\gm@notprerr{ can be used only in preamble (\on@line)}

\AtBeginDocument{%
  \def\do#1{\@nx\do\@nx#1}%
  \edef\@preamblecmds{%
    \def\@nx\do##1{%
      \def##1{\@nx\PackageError{gmutils/LaTeX}%
        {\@nx\string##1 \@nx\gm@notprerr}\@nx\@eha}}%
    \@preamblecmds}}

% A~subtle error raises: the \LaTeX\ standard |\@onlypreamble| and
% what |\document| does with |\@preamblecmds| makes any two of `only
% preamble' \CS's |\ifx|-identical inside \env{document}. And my
% change makes any two \CS's |\ifx|-different. The first it
% causes a~problem with is standard \LaTeX's |\nocite| that checks
% |\ifx\@onlypreamble\document|. So hoping this is a~rare problem, we
% circumvent it. 2008/08/29 a~bug is reported by Edd Barrett that
% with \pk{natbib} an `extra \}' error occurs so we wrap the fix in
% a~conditional. 
%
% \changes[\nocite]{v0.93}{2008/08/29}{a~bug fixed: with \pk{natbib}
% an `extra \}' error. Now it fixes only the standard version of
% \cs{nocite}}


\def\gmu@nocite@ampulex{% we wrap the stuff in a~macro to hide an open
  % \incs{if}. And not to make the begin-input hook too large.
  % \label{ampulexset} the first optional argument is the
  % parameters string and the second the argument for one-level
  % expansion of \incs{nocite}. Both hash strings are doubled to pass
  % the  % first \incs{def}.
  \ampulexdef\nocite[####1][{{####1}}]% note the double brace
  % around \inhash3. 
  \ifx
  {\@onlypreamble\document}%
  \iftrue}


\AtBeginDocument{\gmu@nocite@ampulex}%


% \division{Third person pronouns}
%
% Is a~reader of my documentations `she' or 'he' and does it make
% a~difference?
% 
% Previous versions of this documentation were consequently
% alternating ’he’ and ’she’ and provided specific macros for that
% purpose. Now I'm not that queer and gender so I take what is
% normally used,  ’they’ that is.
%
% (The issue of human sexes and genders (certainly much more numerous
% than 2) is complex and delicate and a \TeX\ macro package is
% probably not the best place to discuss it.)
% ^^A % Not to favour any gender in the personal pronouns, define
% ^^A % commands that'll print alternately masculine and feminine
% ^^A % pronoun of third person. By `any' I~mean not only typically
% ^^A % masculine and typically feminine but the entire amazingly rich
% ^^A % variety of people's genders, \emph{including} those who do not
% ^^A % describe themselves as `man' or `woman'.
% ^^A %
% ^^A % One may say two pronouns
% ^^A % is far too little to cover this variety but I~could point Ursula's
% ^^A % K.\ LeGuin's \textit{The Left Hand Of Darkness} as another acceptable
% ^^A % answer. In that moody and moderate \acro{SF} novel the androgynous
% ^^A % persons are usually referred to as `mister', `sir' or `he': the
% ^^A % meaning of reference is extended. Such an extension also my
% ^^A % automatic pronouns do suggest. It's \emph{not} political
% ^^A % correctness, it's just respect to people's diversity.
% ^^A % \DefIndex*{gm@PronounGender}
% ^^A % \let\do\Define
% ^^A % \do\gm@atppron \do\heshe \do\hisher \do\himher \do\hishers
% ^^A % \do\HeShe \do\HisHer \do\HimHer \do\HisHers
% ^^A \newcounter{gm@PronounGender} ^^A ^^A
% ^^A \newcommand*\gm@atppron[2]{%
%   ^^A
%   ^^A   \stepcounter{gm@PronounGender}% remember |\stepcounter| is global.
%   ^^A \ifodd\value{gm@PronounGender}#1\else#2\fi} 
% ^^A  \newcommand*\heshe{\gm@atppron{he}{she}} 
% ^^A  \newcommand*\hisher{\gm@atppron{his}{her}} 
% ^^A  \newcommand*\himher{\gm@atppron{him}{her}} 
% ^^A  \newcommand*\hishers{\gm@atppron{his}{hers}} 
% ^^A  \newcommand*\HeShe{\gm@atppron{He}{She}} 
% ^^A  \newcommand*\HisHer{\gm@atppron{His}{Her}} 
% ^^A  \newcommand*\HimHer{\gm@atppron{Him}{Her}} 
% ^^A  \newcommand*\HisHers{\gm@atppron{His}{Hers}} 
 
\def\heshe{they}
\def\hisher{their}
\def\himher{them}
\def\hishers{theirs}

\def\HeShe{They}
\def\HisHer{Their}
\def\HimHer{Them}
\def\HisHers{Theirs}

% \division{Improvements to \pk{mwcls} sectioning commands}
%
% That is, `Expe-ri-mente'\footnote{A.\ Berg, \textit{Wozzeck}.} mit MW
% sectioning \& \cs{refstepcounter} to improve \pk{mwcls}'s cooperation
% with \pk{hyperref}. They shouldn't make any harm if another class
% (non-\pk{mwcls}) is loaded.
%
% We |\refstep| sectioning counters even if the sectionings are not
% numbered, because otherwise
% \begin{enumerate}
% \item \pdfTeX\ cried of multiply defined |\label|s,
% \item e.g.\ in a~table of contents the hyperlink
% |<rozdzia\l\ Kwiaty polskie>| linked not to the chapter's heading but
% to the last-before-it change of |\ref|.
% \end{enumerate}

\AtBeginDocument{% because we don't know when exactly \pk{hyperref} is
  % loaded and maybe after this package.
  \@ifpackageloaded{hyperref}{\newcounter{NoNumSecs}%
    \setcounter{NoNumSecs}{617}% to make |\ref|ing to an unnumbered section
    % visible (and funny?).
    \def\gm@hyperrefstepcounter{\refstepcounter{NoNumSecs}}%
    \pdef\gm@targetheading#1{%
      \hypertarget{#1}{#1}}}% end of then
  {\def\gm@hyperrefstepcounter{}%
    \def\gm@targetheading#1{#1}}% end of else
}% of |\AtBeginDocument|

% Auxiliary macros for the kernel sectioning macro:
\def\gm@dontnumbersectionsoutofmainmatter{%
  \if@mainmatter\else \HeadingNumberedfalse \fi}
\def\gm@clearpagesduetoopenright{%
  \if@openright\cleardoublepage\else \clearpage\fi}

% To avoid |\def|ing of |\mw@sectionxx| if it's undefined, we redefine
% |\def| to gobble the definition and restore the original meaning of
% itself.
%
% Why shouldn't we change the ontological status of |\mw@sectionxx|
% (not define if undefined)? Because some macros (in \pk{gmdocc} e.g.)
% check it to learn whether they are in an \pk{mwcls} or not.
%
% But let's make a~shorthand for this test since we'll use it three
% times in this package and maybe also somewhere else.
% \Define\@ifnotmw
\long\def\@ifnotmw#1#2{\gm@ifundefined{mw@sectionxx}{#1}{#2}}



%^^A \let\gmu@def\def
%^^A \@ifnotmw{%
%^^A   \StoreMacro\gmu@def \def\gmu@def#14#2{\RestoreMacro\gmu@def}}{}
%^^A % I~know it may be of bad taste (to write such a~way \emph{here}) but
%^^A % I~feel so lonely and am in an alien state of mind after 3 hour sleep
%^^A % last night and, worst of all, listening to sir Edward Elgar's flamboyant
%^^A % Symphonies d'Art Nouveau. 
%^^A %
%^^A % A~\emph{decent} person would just wrap the following
%^^A % definition in |\gm@ifundefined|'s Else. But look, the definition is so
%^^A % long and I~feel so lonely etc. So,
%^^A % I~define |\def| (for some people there's nothing sacred) to be
%^^A % a~macro with two parameters, first of which is 
%^^A % delimited by digit 4 (the last token of |\mw@sectionxx|'s parameter
%^^A % string) and the latter is undelimited which means it'll be the body
%^^A % of the definition. Such defined |\def| does nothing else but
%^^A % restores its primitive meaning by the way sending its arguments to
%^^A % the Gobbled Tokens' Paradise. Luckily, |\RestoreMacro| contains
%^^A % |\let| not |\def|.

% The kernel of MW's sectioning commands:
\@ifnotmw{}{%
\def\mw@sectionxx#1#2[#3]#4{%
  \edef\mw@HeadingLevel{\csname #1@level\endcsname
        \space}% space delimits level number!
  \ifHeadingNumbered
      \ifnum \mw@HeadingLevel>\c@secnumdepth \HeadingNumberedfalse \fi
      % \nostanza line below is in |\gm@ifundefined| to make it work in classes
      % other than \pk{mwbk}\nostanza
      \gm@ifundefined{if@mainmatter}{}{\gm@dontnumbersectionsoutofmainmatter}
  \fi
%\begin{verbatim}
%%   \ifHeadingNumbered
%%     \refstepcounter{#1}%
%%     \protected@edef\HeadingNumber{\csname the#1\endcsname\relax}%
%%   \else
%%     \let\HeadingNumber\@empty
%%   \fi
%\end{verbatim}
  \def\HeadingRHeadText{#2}%
  \def\HeadingTOCText{#3}%
  \def\HeadingText{#4}%
  \def\mw@HeadingType{#1}%
  \if\mw@HeadingBreakBefore
    \if@specialpage\else\thispagestyle{closing}\fi
    \gm@ifundefined{if@openright}{}{\gm@clearpagesduetoopenright}%
    \if\mw@HeadingBreakAfter
      \thispagestyle{blank}\else
      \thispagestyle{opening}\fi
       \global\@topnum\z@
  \fi% of |\if\mw@HeadingBreakBefore|
%%
% placement of |\refstep| suggested by me (GM):\nostanza
  \ifHeadingNumbered
    \refstepcounter{#1}%
    \protected@edef\HeadingNumber{\csname the#1\endcsname\relax}%
  \else
    \let\HeadingNumber\@empty
    % ^^A    \gm@hyperrefstepcounter it's nonsense
  \fi% of |\ifHeadingNumbered|
%%
  \if\mw@HeadingRunIn
    \mw@runinheading
  \else
    \if\mw@HeadingWholeWidth
      \if@twocolumn
        \if\mw@HeadingBreakAfter
        \onecolumn
        \mw@normalheading
        \pagebreak\relax
              \if@twoside
                \null
                \thispagestyle{blank}%
                \newpage
              \fi% of |\if@twoside|
        \twocolumn
        \else
          \@topnewpage[\mw@normalheading]%
        \fi% of |\if\mw@HeadingBreakAfter|
      \else
        \mw@normalheading
        \if\mw@HeadingBreakAfter\pagebreak\relax\fi
      \fi% of |\if@twocolumn|
    \else
      \mw@normalheading
      \if\mw@HeadingBreakAfter\pagebreak\relax\fi
    \fi% of |\if\mw@HeadingWholeWidth|
  \fi% of |\if\mw@HeadingRunIn|
  }
%^^A%%% (End of Experimente with MW sectioning.)


%
% \subdivision{An improvement of MW's \cs{SetSectionFormatting}}
%
% A~version of MW's |\SetSectionFormatting| that lets to leave some
% settings unchanged by leaving the respective argument empty (|{}| or
% |[]|).
%
% Notice: If we adjust this command for new version of \acro{MWCLS},
% we should name it |\SetSectionFormatting| and add issuing errors if
% the inner macros are undefined.
%
%\begin{enumargs*}^^B
%\opt the flags, e.g. |breakbefore|, |breakafter|;
%\item the sectioning name, e.g. |chapter|, |part|;
%\item preskip;
%\item heading type;
%\item postskip
%\end{enumargs*}
%

\relaxen\SetSectionFormatting
\newcommand*\SetSectionFormatting[5][\empty]{%
  \ifx\empty#1\relax\else% empty (not |\empty|!) |#1| also launches |\else|.\HideDef
    \def\mw@HeadingRunIn{10}\def\mw@HeadingBreakBefore{10}%
    \def\mw@HeadingBreakAfter{10}\def\mw@HeadingWholeWidth{10}%
    \@ifempty{#1}{}{\mw@processflags#1,\relax}% If |#1| is omitted,
    % the flags are left unchanged. If |#1| is given, even as [], the
    % flags are first cleared and then processed again.
  \fi
  \gm@ifundefined{#2}{\@namedef{#2}{\mw@section{#2}}}{}%
  \mw@secdef{#2}{@preskip} {#3}{2 oblig.}%
  \mw@secdef{#2}{@head}    {#4}{3 oblig.}%
  \mw@secdef{#2}{@postskip}{#5}{4 oblig.}%
  \ifx\empty#1\relax
    \mw@secundef{#2@flags}{1 (optional)}%
  \else\mw@setflags{#2}% \ResumeDef
  \fi}

\def\mw@secdef#1#2#3#4{% ^^B
% \begin{enumargs}
% \item  the heading name,
% \item  the command distincter,
% \item  the meaning,
% \item  the number of argument to error message.
% \end{enumargs}
  \@ifempty{#3}
    {\mw@secundef{#1#2}{#4}}
    {\@namedef{#1#2}{#3}}}

\def\mw@secundef#1#2{%
  \gm@ifundefined{#1}{%
    \ClassError{mwcls/gm}{%
      command \bslash#1  undefined \MessageBreak
      after \bslash SetSectionFormatting!!!\MessageBreak}{%
      Provide the #2 argument of \bslash SetSectionFormatting.}}{}}


% First argument is a~sectioning command (wo.\ the backslash) and second the
% stuff to be added at the beginning of the heading declarations.
\def\addtoheading#1#2{%
    \n@melet{gmu@reserveda}{#1@head}%
    \edef\gmu@reserveda{\unexpanded{#2}\@xa\unexpanded{\gmu@reserveda}}%
    \n@melet{#1@head}{gmu@reserveda}%
%^^A    \@xa\show\csname#1@head\endcsname
}

}% of |\@ifnotmw|'s else.

% \subdivision{Negative \cs{addvspace}} When two sectioning commands
% appear one after another (we may assume that this occurs only when
% a~lower section appears immediately after higher), we prefer to put
% the \emph{smaller} vertical space not the larger, that is, the
% preskip of the lower sectioning not the postskip of the higher.
%
% For that purpose we modify the very inner macros of \acro{MWCLS}
% to introduce a~check whether the previous vertical space equals the
% postskip of the section one level higher.

\@ifnotmw{}{% We proceed only in \acro{MWCLS}.
  
% The information that we are just after a~heading will be stored in
% the |\gmu@prevsec| macro: any heading will define it as the section
% name and |\everypar| (any normal text) will clear it.
\def\@afterheading{%
  \@nobreaktrue
  \xdef\gmu@prevsec{\mw@HeadingType}% added now
  \everypar{%
    \grelaxen\gmu@prevsec% added now. All the rest is original \LaTeX.
    \if@nobreak
    \@nobreakfalse
    \clubpenalty \@M
    \if@afterindent \else
    {\setbox\z@\lastbox}%
    \fi
    \else
    \clubpenalty \@clubpenalty
    \everypar{}%
    \fi}}
  
% If we are (with the current heading) just after another heading (one
% level lower I~suppose), then we add the less of the higher header's
% post-skip and the lower header pre-skip or, if defined, the
% two-header-skip. (We put the macro defined below just before
% |\addvspace| in \pk{mwcls} inner macros.)
\def\gmu@checkaftersec{%
  \gm@ifundefined{gmu@prevsec}{}{%
    \ifgmu@postsec% an additional switch that is true by default but
    % may be turned into an \cs{ifdim} in special
    % cases, see line \ref{gmu@postsec}.
    {\@xa\mw@getflags\@xa{\gmu@prevsec}%
      \glet\gmu@reserveda\mw@HeadingBreakAfter}% \UnDef
    \if\mw@HeadingBreakBefore\def\gmu@reserveda{11}\fi% if the 
    % current heading inserts page break before itself, all the play
    % with vskips is irrelevant.
    \if\gmu@reserveda\else
    \penalty10000\relax
    \skip\z@=\csname\gmu@prevsec @postskip\endcsname\relax
    \skip\tw@=\csname\mw@HeadingType @preskip\endcsname\relax
    \gm@ifundefined{\mw@HeadingType @twoheadskip}{%
      \ifdim\skip\z@>\skip\tw@
      \vskip-\skip\z@% we strip off the post-skip of previous
      % header if it's bigger than current pre-skip
      \else
      \vskip-\skip\tw@% we strip off the current pre-skip otherwise
      \fi}{% But if the two-header-skip is defined, we put
      % \emph{it}
      \penalty10000
      \vskip-\skip\z@
      \penalty10000
      \vskip-\skip\tw@
      \penalty10000
      \vskip\csname\mw@HeadingType @twoheadskip\endcsname
      \relax}%
    \penalty10000
    \hrule height\z@\relax% to hide the last (un)skip before subsequent
    % \incs{addvspace}s. \ilrr
    \penalty10000
    \fi
    \fi
  }% of |\gm@ifundefined{gmu@prevsec}| `else'.
}% of |\def\gmu@checkaftersec|.

\def\ParanoidPostsec{% \label{gmu@postsec} this version of
  % \inverb|\ifgmu@postsec| is intended for the special case of
  % sections may contain no normal text, as while \pk{gmdoc}ing.
  \def\ifgmu@postsec{% note this macro expands to an open \cs{if}.
    \skip\z@=\csname\gmu@prevsec @postskip\endcsname\relax
    \ifdim\lastskip=\skip\z@\relax% we play
    % with the vskips only if the last skip is the previous
    % heading's postskip (a~counter-example I~met while
    % \pk{gmdoc}ing).
  }}
  
\let\ifgmu@postsec\iftrue
  
\def\gmu@getaddvs#1\addvspace#2\gmu@getaddvs{%
  \toks\z@={#1}%
  \toks\tw@={#2}}

% And the modification of the inner macros at last:
\def\gmu@setheading#1{%
  \@xa\gmu@getaddvs#1\gmu@getaddvs
  \edef#1{%
    \the\toks\z@\@nx\gmu@checkaftersec
    \@nx\addvspace\the\toks\tw@}}

\gmu@setheading\mw@normalheading
\gmu@setheading\mw@runinheading

\def\SetTwoheadSkip#1#2{\@namedef{#1@twoheadskip}{#2}}

}% of |\@ifnotmw|'s else.


% \subdivision{My heading setup for \pk{mwcls}}
%
% The setup of heading skips was tested in `real' typesetting, for
% money that is. The skips are designed for 11/13\,pt leading and
% together with my version of \pk{mw11.clo} option file for \pk{mwcls}
% make the headings (except paragraph and subparagraph) consist of
% an integer number of lines. The name of the declaration comes from
% my employer, ``Wiedza Powszechna'' Editions.

\@ifnotmw{}{% We define this declaration only when in \pk{mwcls}.
\DeclareCommand\WPheadings{T{\chapter}}{%
  \SetSectionFormatting[breakbefore,wholewidth]
      {part}{\z@\@plus1fill}{}{\z@\@plus3fill}%
  % 
  \IfValueF{#1}{%
    \gm@ifundefined{chapter}{}{%
      \SetSectionFormatting[breakbefore,wholewidth]
      {chapter}
      {66\p@}% |{67\p@}|% for Adventor/Schola 0,95.
      {\FormatHangHeading{\LARGE}}
      {27\p@\@plus0,2\p@\@minus1\p@}%
    }%
  }% of unless |#1|
  % 
  \SetTwoheadSkip{section}{27\p@\@plus0,5\p@}%
  \SetSectionFormatting{section}
      {24\p@\@plus0,5\p@\@minus5\p@}%  ^^A {24\p@\@plus5\p@\@minus2\p@}
      {\FormatHangHeading {\Large}}
      {10\p@\@plus0,5\p@}% ed.\ Krajewska of ``Wiedza Powszechna'', as
      % we understand her, wants the skip between a~heading and text
      % to be rigid.
  %
  \SetTwoheadSkip{subsection}{11\p@\@plus0,5\p@\@minus1\p@}%
  \SetSectionFormatting{subsection}
      {19\p@\@plus0,4\p@\@minus6\p@}
      {\FormatHangHeading {\large}}% 12/14 pt
      {6\p@\@plus0,3\p@}% after-skip 6\,pt due to p.12, not to squeeze
      % the before-skip too much.
  %
  \SetTwoheadSkip{subsubsection}{10\p@\@plus1,75\p@\@minus1\p@}%
  \SetSectionFormatting{subsubsection}
      {10\p@\@plus0,2\p@\@minus1\p@}
      {\FormatHangHeading {\normalsize}}
      {3\p@\@plus0,1\p@}% those little skips should be smaller than
      % you calculate out of a~geometric progression, because the
      % interline skip enlarges them.
  %
  \SetSectionFormatting[runin]{paragraph}
      {7\p@\@plus0,15\p@\@minus1\p@}
      {\FormatRunInHeading{\normalsize}}
      {2\p@}%
  %
  \SetSectionFormatting[runin]{subparagraph}
      {4\p@\@plus1\p@\@minus0,5\p@}
      {\FormatRunInHeading{\normalsize}}
      {\z@}%
}% of |\WPheadings|
}% of |\@ifnotmw|


% \subdivision{Compatibilising standard and \pk{mwcls} sectionings}
%
% If you use Marcin Woli\nacute ski's document classes (\pk{mwcls}), you
% might have met their little queerness: the sectioning commands take
% two optional arguments instead of standard one. It's reasonable
% since one may wish one text to be put into the running head,
% another to the toc and yet else to the page. But the order of
% optionalities causes an incompatibility with the standard classes:
% MW section's first optional argument goes to the running head not to
% toc and if you've got a~source file written with the standard
% classes in mind and use the first (and only) optional argument, the
% effect with \pk{mwcls} would be different if not error.
%
% Therefore I~counter-assign the commands and arguments to reverse the
% order of optional arguments for sectioning commands when \pk{mwcls}
% are in use and reverse, to make \pk{mwcls}-like sectioning optionals usable
% in the standard classes.
%
% \stanza
% With the following in force, you may both in the standard classes
% and in \pk{mwcls} give a~sectioning command one or two optional
% arguments (and mandatory the last, of course). If you give just one
% optional, it goes to the running head and to toc as in scls (which
% is unlike in \pk{mwcls}). 
% If you give two optionals, the first goes to the running head and
% the other to toc (like in \pk{mwcls} and unlike in scls). 
%
% (In both cases the mandatory last argument goes only to the page.)
%
% What more is unlike in scls, it's that even with them the starred
% versions of sectioning commands allow optionals (but they still send
% them to the Gobbled Tokens' Paradise).
%
% (In \pk{mwcls}, the only difference between starred and non-starred
% sec commands is (not) numbering the titles, both versions make a~contents
% line and a~mark and that's not changed with my redefinitions.)
%
%
\@ifnotmw{% we are not in \pk{mwcls} and want to
  % handle \pk{mwcls}-like sectionings i.e., those written with two
  % optionals.
  \def\gm@secini{gm@la}%
  \StoreMacros{\partmark\chaptermark\sectionmark\subsectionmark\subsubsectionmark\paragraphmark}%
  % \Define\gm@secxx
  \def\gm@secxx#1#2[#3]#4{%
    \ifx\gm@secstar\@empty
    % \nostanza a~little trick to allow
      % a~special version of the heading just to the running head.
      \@namedef{#1mark}##1{% we redefine \cs{\<sec>mark} to gobble its
        % argument and to launch the stored true marking command on the
        % appropriate argument.
        \storedcsname{#1mark}{#2}%
        \RestoreMacro*{#1mark}% after we've done what we
        % wanted we restore original |\#1mark|.\ilrr
      }%
      \def\gm@secstar{[#3]}% if |\gm@secstar|
    % is empty, which means the sectioning command was written
    % starless, we pass the `true' sectioning command |#3| as the
    % optional argument. Otherwise the sectioning command was written
    % with star so the `true' s.c.\ takes no optional.
    \fi
    \@xa\@xa\csname\gm@secini#1\endcsname
    \gm@secstar{#4}}%
% \stanza
}{% we are in \pk{mwcls} and want to reverse MW's optionals order
  % i.e., if there's just one optional, it should go both to toc and to
  % running head.
  \def\gm@secini{gm@mw}%
  % 
  \let\gm@secmarkh\@gobble% in \pk{mwcls} there's no need to make
  % tricks for special version to running headings.
  % \Define\gm@secxx
  \def\gm@secxx#1#2[#3]#4{%
    \@xa\@xa\csname\gm@secini#1\endcsname
    \gm@secstar[#2][#3]{#4}}%
}

\def\gm@sec#1{\@dblarg{\gm@secx{#1}}}
\def\gm@secx#1[#2]{%
  \@ifnextchar[{\gm@secxx{#1}{#2}}{\gm@secxx{#1}{#2}[#2]}}% if
% there's only one optional, we double \emph{it} not the mandatory
% argument.  ^^A}

\def\gm@straightensec#1{% the parameter is for the command's name.
  \gm@ifundefined{#1}{}{% we don't change the ontological status of the
    % command because someone may test it.
    \n@melet{\gm@secini#1}{#1}%
    \@namedef{#1}{%
      \gm@ifstar{\def\gm@secstar{*}\gm@sec{#1}}{%
        \def\gm@secstar{}\gm@sec{#1}}}}%
}%

\let\do\gm@straightensec
\do{part}\do{chapter}\do{section}\do{subsection}\do{subsubsection}
\@ifnotmw{}{\do{paragraph}}% this `straightening' of
% |\paragraph| with the standard \pk{article} caused the `\TeX\
% capacity exceeded' error. Anyway, who on Earth wants paragraph
% titles in toc or running head?
%
%
% \division{\env{enumerate*} and \env{itemize*}}
% We wish the starred version of \env{enumerate} to be just numbered
% paragraphs. But \pk{hyperref} redefines |\item| so we should do it
% a~smart way, to set the \LaTeX's \env{list} parameters that is.
%
% (Marcin Woli\nacute ski in \pk{mwcls} defines those environments slightly
% different: his item labels are indented, mine are not; his
% subsequent paragraphs of an item are not indented, mine are.)
%
% \Define*{enumerate*}
\@namedef{enumerate*}{%
  \ifnum\@enumdepth>\thr@@
    \@toodeep
  \else
    \advance\@enumdepth\@ne
    \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
    \@xa\list\csname label\@enumctr\endcsname{%
      \partopsep\topsep \topsep\z@ \leftmargin\z@ 
      \itemindent\@parindent %|%\advance\itemindent\labelsep|
      \labelwidth\@parindent
      \advance\labelwidth-\labelsep
      \listparindent\@parindent
      \usecounter \@enumctr 
      \def\makelabel##1{##1\hfil}}%
  \fi}
\@namedef{endenumerate*}{\endlist}

% \Define*{itemize*}
\@namedef{itemize*}{%
  \ifnum\@itemdepth>\thr@@
    \@toodeep
  \else
    \advance\@itemdepth\@ne
    \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
    \@xa\list\csname\@itemitem\endcsname{%
      \partopsep\topsep \topsep\z@ \leftmargin\z@ 
      \itemindent\@parindent 
      \labelwidth\@parindent 
      \advance\labelwidth-\labelsep
      \listparindent\@parindent
      \def\makelabel##1{##1\hfil }}%
  \fi}
\@namedef{enditemize*}{\endlist}



% \division{The logos}
%
% We'll modify The \LaTeX\ logo now to make it fit better to various
% fonts. 

\let\oldLaTeX\LaTeX
\let\oldLaTeXe\LaTeXe

\pdef\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}
\StoreMacro\TeX
\AtBeginDocument{\RestoreMacro\TeX}

\newcommand*\DeclareLogo[3][\relax]{% \begin{enumargs*}
  % \opt  is for non-\LaTeX\ spelling and will be used in the
  % \acro{PD1} encoding (to make pdf bookmarks);
  % \item is the command, its name will be the PD1 spelling by
  % default,
  % \item is the definition for all the font encodings except PD1.
  % \end{enumargs*}
  % 
  \ifx\relax#1\def\gmu@reserveda{\@xa\@gobble\string#2}%
  \else
    \def\gmu@reserveda{#1}%
  \fi
  \edef\gmu@reserveda{%
    \@nx\DeclareTextCommand\@nx#2{PD1}{\gmu@reserveda}}
  \gmu@reserveda
  \DeclareTextCommandDefault#2{#3}%
  \pdef#2{#3}% added for \XeTeX.
}

% \DeclareDefining\DeclareLogo
\DeclareLogo\LaTeX{%
  {%
    % ^^A\typeout{***** LaTeX logo of GM ^^J}\show\relax
    L%
    \setbox\z@\hbox{\check@mathfonts
      \fontsize\sf@size\z@
      \math@fontsfalse\selectfont
      A}%
    \kern-.57\wd\z@
    \sbox\tw@ T%
    \vbox to\ht\tw@{\copy\z@ \vss}%
    \kern-.2\wd\z@% originally $-,15$\,em for T.
  }%
  {% 
    \ifdim\fontdimen1\font=\z@
    \else
      \count\z@=\fontdimen5\font
      \multiply\count\z@ by 64\relax
      \divide\count\z@ by\p@
      \count\tw@=\fontdimen1\font
      \multiply\count\tw@ by\count\z@
      \divide\count\tw@ by 64\relax
      \divide\count\tw@ by\tw@
      \kern-\the\count\tw@ sp\relax
    \fi}%
  \TeX}

\DeclareLogo\LaTeXe{\mbox{\m@th \if
    b\expandafter\@car\f@series\@nil\boldmath\fi
    \LaTeX\kern.15em2$_{\textstyle\varepsilon}$}}

\StoreMacro\LaTeX
\StoreMacro*{LaTeX }
% \label{SMLaTeX}

% `\LaTeXpar' in my opinion better describes what I~work with/in than
% just `\LaTeX'.
% \Define\LaTeXpar
\DeclareLogo[(La)TeX]{\LaTeXpar}{%
  {%
    \setbox\z@\hbox{(}%)
    \copy\z@
    \kern-.2\wd\z@ L%
    \setbox\z@\hbox{\check@mathfonts
      \fontsize\sf@size\z@
      \math@fontsfalse\selectfont
      A}%
    \kern-.57\wd\z@
    \sbox\tw@ T%
    \vbox to\ht\tw@{\box\z@%
      \vss}%
  }%
  \kern-.07em% originally $-,15$\,em for T.
  {%(
    \sbox\z@)%
    \kern-.2\wd\z@\copy\z@  
    \kern-.2\wd\z@}\TeX
}

% \begin{quotation} Here are a few definitions which can usefully be
% employed when documenting 
% package files: now we can readily refer to \AmSTeX, \BibTeX\ and \SliTeX, as well
% as the usual \TeX\ and \LaTeX. There's even a \PlainTeX\ and
% a~\Web.\end{quotation}
\gm@ifundefined{AmSTeX}
  {\def\AmSTeX{\leavevmode\hbox{$\mathcal A\kern-.2em\lower.376ex%
        \hbox{$\mathcal M$}\kern-.2em\mathcal S$-\TeX}}}{}

\DeclareLogo\BibTeX{{\rmfamily B\kern-.05em%
    \textsc{i{\kern-.025em}b}\kern-.08em% the kern is wrapped in
                                % braces for my |\fakescaps|' sake.
    \TeX}}


\DeclareLogo\SliTeX{{\rmfamily S\kern-.06emL\kern-.18em\raise.32ex\hbox
        {\scshape i}\kern -.03em\TeX}}

\DeclareLogo\PlainTeX{\textsc{Plain}\kern2pt\TeX}

\DeclareLogo\Web{\textsc{Web}}
% There's also the \LaTeXpar\ logo got with the |\LaTeXpar| macro
% provided by \pk{gmutils}. And here \TeXbook's logo:
\DeclareLogo[The TeX book]\TeXbook{\textsl{The \TeX book}}
\let\TB\TeXbook% \textit{TUG Boat} uses this.

\DeclareLogo[e-TeX]\eTeX{%
  \iffontchar\font"03B5{\itshape ε}\else
  \ensuremath{\varepsilon}\fi-\kern-.125em\TeX}% definition sent by Karl
% Berry from \textit{TUG Boat} itself.

\StoreMacro\eTeX

\DeclareLogo[pdfe-TeX]\pdfeTeX{pdf\eTeX}

\DeclareLogo\pdfTeX{pdf\TeX}
\DeclareLogo\pdfLaTeX{pdf\LaTeX}
% \changes{v0.97}{2008/11/22}{added}

\gm@ifundefined{XeTeX}{%
  \DeclareLogo\XeTeX{X\kern-.125em\relax
    \gm@ifundefined{reflectbox}{%
      \lower.5ex\hbox{E}\kern-.1667em\relax}{%
      \lower.5ex\hbox{\reflectbox{E}}\kern-.1667em\relax}%
    \TeX}}{}

\gm@ifundefined{XeLaTeX}{%
  \DeclareLogo\XeLaTeX{X\kern-.125em\relax
    \gm@ifundefined{reflectbox}{%
      \lower.5ex\hbox{E}\kern-.1667em\relax}{%
      \lower.5ex\hbox{\reflectbox{E}}\kern-.1667em\relax}%
    \LaTeX}}
% As you see, if \TeX\ doesn't recognise \cs{reflectbox}
% (\pk{graphics} isn't loaded), the first |E| will not be reversed.
% This version of the command is intended for non-\XeTeX\ usage. With
% \XeTeX, you can load the \pk{xltxtra} package (e.g.\ with the
% \pk{gmutils} |\XeTeXthree| declaration) and then the reversed |E|
% you get as the Unicode Latin Letter Reversed E.

\DeclareLogo[LuaTeX]\LuaTeX{\textsc{Lua}\TeX}
% \changes{v0.96}{2008/10/10}{added}

% \division{Expandable turning stuff all into `other'}
% ^^A 
% ^^A % While typesetting a~Unicode file contents with \pk{inputenc} package
% ^^A % I~got a~trouble with some Unicode sequences that expanded to
% ^^A % unexpandable \CSs: they couldn't be used within
% ^^A % |\csname…\endcsname|. My \TeX Guru advised to use |\meaning| to
% ^^A % make all the name `other'. So---here we are.
% ^^A %
% ^^A % Don't use them in |\edef|s, they would expand not quite.
% ^^A % \Define\unex@namedef \Define\unex@nameuse
% ^^A 
% ^^A 

% A shorthand.  Note that it takes an undelimited argument not
% requires \<balanced text>.

\long\def\detoken@xa#1{\detokenize\@xa{#1}}

% The next macro originates from the ancient era when I didn't know
% about \eTeX's |\detokenize|. A try to redefine it to
% |\detokenize\@xa{#1}| resulted in error so (v0.991) I leave it and
% use as is. 
%
% Note however it acts different than |\detoken@xa| for a macro with
% parameters: while |\detoken@xa| produces and ‘extra |}|’ error,
% |\all@other| expands to the detokenised meaning.  \Define\all@other
 \long\def\all@other#1{\@xa\gm@gobmacro\meaning#1}
 
 % The |\gm@gobmacro| macro above is applied to gobble the |\meaning|'s
 % beginning, |long macro:->| all `other' that is. 
 % \Define\gm@gobmacro
 \edef\gmu@tempa{%
   \def\@nx\gm@gobmacro##1\@xa\@gobble\string\macro:##2->{}}
 \gmu@tempa


% \division{Brave New World of  \XeTeX}

\def\@ifXeTeX{% two-argument command
  \ifdefined\XeTeXversion
  \unless\ifx\XeTeXversion\relax\afterfifi\@firstoftwo\else\afterfifi\@secondoftwo\fi
  \else\afterfi\@secondoftwo\fi}

\def\XeTeXifprefix{% to be used as prefix to an |\if›…| test.
  \@ifXeTeX{}{\unless}}

\DeclareCommand\XeTeXthree{o}{% \
  % \changes{v0.90}{2008/8/4}{adjusted
  %   to the redefinition of
  %   \cs{verb} in \pk{xlxtra} 2008/07/29}
  \@ifXeTeX{%
    \IfValueT{#1}{\PassOptionsToPackage{#1}{fontspec}}%
    \@ifpackageloaded{gmverb}{\StoreMacro\verb}{}% 
    \RequirePackage{xltxtra}% since v 0.4 (2008/07/29) this package
    % redefines |\verb| and \env{verbatim*},
    % and quite elegantly provides an option
    % to suppress the redefinitions, but
    % unfortunately that option excludes also
    % a~nice definition of |\xxt@visiblespace|
    % which I~fancy.
    \@ifpackageloaded{gmverb}{\RestoreMacro\verb}{}% 
    \AtBeginDocument{%
      \RestoreMacro\LaTeX\RestoreMacro*{LaTeX }% my version of the
      % \LaTeX\ logo has been stored just
      % after defining, in line \ref{SMLaTeX}. \ilrr
      \RestoreMacro\eTeX}%
    % \stanza
    \pdef\adddefaultfontfeatures##1{%
      \addtomacro\zf@default@options{#1,}}
  }% of |\@ifXeTeX|'s first argument,
  {}% |\@ifXeTeX|'s second argument,
}% of |\XeTeXthree|'s body.


% \indent The |\udigits| declaration causes the digits to be typeset
% uppercase. I~provide it since by default I~prefer the lowercase
% (nautical) digits.
\AtBeginDocument{%
  \@ifpackageloaded{fontspec}{%
    \pdef\udigits{%
      \addfontfeature{Numbers=Uppercase}}%
  }{%
    \emptify\udigits}}


% \subdivision{Fractions}

\def\Xedekfracc{\gm@ifstar\gmu@xedekfraccstar\gmu@xedekfraccplain}
    % (plain) The starless version turns the font feature |frac| on. 
    % 
    % (\*) But nor my modification of Minion Pro neither \TeX\ Gyre
    % Pagella doesn't feature the
    % |frac| font feature properly so, with the starred version of the
    % declaration we use the characters from the font where available
    % (see the |\@namedef|s below) and the |numr| and |dnom| features
    % with the fractional slash otherwise (via |\gmu@dekfracc|).
    % 
    % (\*\*) But Latin Modern Sans Serif Quotation doesn't support the
    % numerator and denominator positions so we provide the double
    % star version for it, which takes the char from font if it exist
    % and typesets with lowers and kerns otherwise.
    
\def\gmu@xedekfraccstar{%
  \def\gmu@xefraccdef##1##2{%
      \iffontchar\font ##2
        \@namedef{gmu@xefracc##1}{\char##2 }%
      \else
        \n@melet{gmu@xefracc##1}{relax}%
      \fi}%
    % 
    \def\gmu@dekfracc##1/##2{%
      {\addfontfeature{VerticalPosition=Numerator}##1}\gmu@numeratorkern
      \char"2044 \gmu@denominatorkern
      {\addfontfeature{VerticalPosition=Denominator}##2}}%
    % 
    % We define the fractional macros. Since Adobe Minion Pro doesn't
    % contain $\frac n5$ nor $\frac n6$, we don't provide them here.
    \gmu@xefraccdef{1/4}{"BC}%
    \gmu@xefraccdef{1/2}{"BD}%
    \gmu@xefraccdef{3/4}{"BE}%
    \gmu@xefraccdef{1/3}{"2153}%
    \gmu@xefraccdef{2/3}{"2154}%
    \gmu@xefraccdef{1/5}{"2155}%
    \gmu@xefraccdef{2/5}{"2156}%
    \gmu@xefraccdef{3/5}{"2157}%
    \gmu@xefraccdef{4/5}{"2158}%
    \gmu@xefraccdef{1/6}{"2159}%
    \gmu@xefraccdef{5/6}{"215A}%
    \gmu@xefraccdef{1/8}{"215B}%
    \gmu@xefraccdef{3/8}{"215C}%
    \gmu@xefraccdef{5/8}{"215D}%
    \gmu@xefraccdef{7/8}{"215E}%
    \pdef\dekfracc@args##1/##2{%
      \gm@ifundefined{gmu@xefracc\detokenize{##1/##2}}{%
        \gmu@dekfracc{##1}/{##2}}{%
        \csname gmu@xefracc\detokenize{##1/##2}\endcsname}%
      \if@gmu@mmhbox\egroup\fi
    }% of |\dekfracc@args|.
    \gm@ifstar{\let\gmu@dekfracc\gmu@dekfraccsimple}{}%
  }

\def\gmu@xedekfraccplain{% `else' of the main |\gm@ifstar|
    \pdef\dekfracc@args##1/##2{%
      \ifmmode\hbox\fi{%
        \addfontfeature{Fractions=On}%
        ##1/##2}%
      \if@gmu@mmhbox\egroup\fi
    }% of |\dekfracc@args|
  }

\newif\if@gmu@mmhbox% we'll use this switch for |\dekfracc| and also
% for |\thous| (hacky thousand separator).

\pdef\dekfracc{% \changes{v0.94}{2008/09/14}{made to work also in math
               % mode, even with math-active digits}
  \ifmmode\hbox\bgroup\@gmu@mmhboxtrue\fi
  \dekfracc@args}


\def\gmu@numeratorkern{\kern-.055em\relax}
\def\gmu@denominatorkern{\kern-.05em\relax}


% What have we just done? We defined two versions of the
% |\Xefractions| declaration. The starred version is intended to make
% use only of the built-in fractions such as \dekfracc1/2 or
% \dekfracc7/8. To achieve that, a~handful of macros is defined that
% expand to the Unicodes of built-in fractions and |\dekfracc| command
% is defined to use them.
%
% The unstarred version makes use of the Fraction font feature and
% therefore is much simpler.
%
% Note that in the first argument of |\gm@ifstar| we wrote 8 (eight)
% |#|s to get the correct definition and in the second argument `only'
% 4. (The \LaTeXe\ Source claims that that is changed in the `new
% implementation' of |\gm@ifstar| so maybe it's subject to change.)

% A~simpler version of |\dekfracc| is provided in line \ref{2292}.

% \subdivision{\cs{resizegraphics}}

\pdef\resizegraphics#1#2#3{% % \changes{v0.94}{2008/10/4}{\cs{includegraphics}
  % works well in \XeTeX\ so I~remove the complicated version
  % with \cs{XeTeXpicfile}}
  % 2009/11/17 works bad with a file whose name contains spaces so I
  % return \cmd\XeTeXpicfile
  \resizebox{#1}{#2}{%
    \edef\gmu@tempa{\@nx\csname XeTeX\@nx\@ifendswithpdf{%
        \@xa\string\csname#3\endcsname}{pdf}{pic}file\@nx\endcsname}%
    \gmu@tempa "#3"\relax}}

\edef\gmu@tempa{%
  \def\@nx\@ifendswithpdf##1{%
    \unexpanded{%
      \ifnum
      \if\relax\gmu@pdfdetector}##1%
    \detokenize{pdf}\unexpanded{\relax0\else1\fi}% we expand to 1 if
    % \inhash1 ends with lowercase ‘pdf’ of cat. 12
    \unexpanded{\if\relax\gmu@PDFdetector}##1%
    \detokenize{PDF}\unexpanded{\relax0\else1\fi}% we expand to 1 if
    % \inhash1 ends with uppercase ‘PDF’ of cat. 12
    >0 
    \unexpanded{\@xa\@firstoftwo\else\@xa\@secondoftwo\fi}%
  }% of |\@ifendswithpdf|
  %
  % \stanza
  % 
  \def\@nx\gmu@pdfdetector##1\detokenize{pdf}{}%
  \def\@nx\gmu@PDFdetector##1\detokenize{PDF}{}%
}\gmu@tempa


\pdef\textsuperscript@@#1{%
  \@textsuperscript{\selectfont#1}}%
\def\@textsuperscript#1{%
  {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}}

\let\textsuperscript@@\textsuperscript

\def\GMtextsuperscript{%
  \@ifXeTeX{%
    \DeclareCommand\textsuperscript{sm}{%
      \IfValueTF{##1}{\textsuperscript@@{##2}}%
      {%
        \begingroup
        \addfontfeature{VerticalPosition=Numerator}##2%
        \endgroup}}%
  }{\truetextsuperscript}}

\def\truetextsuperscript{%
  \let\textsuperscript\textsuperscript@@
}

%^^A %\subdivision{Proper loading of \pk{tikz}}
%^^A \def\xetikz{\def\pgfsysdriver{pgfsys-dvipdfm.def}%
%^^A   \usepackage{tikz}}

% \subdivision{Settings for mathematics in main font} I~used these
% terrible macros while typesetting E.~Szarzyński's \textit{Letters}
% in 2008. The \TextUsage\gmath\ declaration introduces math-active
% digits and binary operators and redefines Greek letters and parentheses, the
% \TextUsage\garamath\ declaration redefines the quantifiers and is
% more Garamond Premier Pro-specific.

% So, when you set default fonts (in the preamble), put
% \TextUsage\gmath\ to set what possible from them to math. This sets
% the |normal| math version. If you want to use another set of fonts
% elsewhere in your document and have according math for them, set
% them ‘for a~while’ in the preamble and in their scope declare
% |\gmath⁄arg[version]|. Then put |\mathversion{normal}| right after
% |\begin{document}| and |\gmath[⁄<version>]| where you want those
% other fonts. 
%
%  |\gmath| takes second optional argument, in parentheses,
% which should be (sth.\ that expands to) a |\fontspec| font selecting
% command. A font selected by this command will be declared and used
% when some char in basic font is missing and only else the default
% math font will be left for such a char.
%
% So, \[|\gmath⁄arg[version](rescue font«(spec-ification)»)|\]
%
% Note that |\gmath| without first optional argument has always to
% come first because otherwise it overwrite settings of your math
% version. 

\def\gmu@getfontstring{%
  \xdef\gmu@fontstring{%
    \gmu@fontstring@}}

\def\gmu@fontstring@{%
  \@xa\@xa\@xa\gmu@fontstring@@\@xa\meaning\the\font\@@nil}

 %^^A \edef\gmu@tempa{%
 %^^A   \def\@nx\gmu@fontstring@@
 %^^A   \detokenize{select font }##1\@nx\@@nil
 %^^A   {##1}%
 %^^A }\gmu@tempa

\def\gmu@fontstring@@#1"#2"#3\@@nil{"#2"}

\def\gmu@getfontscale#1Scale#2=#3,{%
  \ifx\gmu@getfontscale#3\else
    \def\gmu@tempa{MatchLowercase}%
    \def\gmu@tempb{#3}%
    \ifx\gmu@tempa\gmu@tempb
      \gmu@calc@scale{5}%
      \@xa\@firstoftwo
    \else
      \def\gmu@tempa{MatchUppercase}%
      \ifx\gmu@tempa\gmu@tempb
        \gmu@calc@scale{8}%
        \afterfifi\@firstoftwo
        \else\afterfifi\@secondoftwo
      \fi
    \fi
    {\xdef\gmu@fontscalebr{[\gmu@fontscale] }}%
    {\xdef\gmu@fontscalebr{[#3] }}%
    \afterfi\gmu@getfontscale
  \fi
}


\def\gmu@getfontdata#1{%
  \global\emptify\gmu@fontscalebr
  \begingroup
  #1%
  %^^A\typeout{@@@@ \@xa\meaning\the\font}%
  \@xa\@xa\@xa\gmu@getfontscale
  \csname zf@family@options\f@family\endcsname
  ,Scale=\gmu@getfontscale,%
  \gmu@getfontstring
  \xdef\gmu@theskewchar{\the\skewchar\font}%
  \endgroup}
  

\def\gmu@stripchar#1"{"}

\DeclareCommand\gmath@getfamnum{C{\gmath@fam}}{%
  \edef\gmath@famnum{\@xa\gmu@stripchar\meaning#1}%
}

%\incs{XeTeXmathcode}\<char slot> \arg[=] \<type> \<family> \<char slot>

\DeclareCommand\gmathFams{o  % the name of math version
  C{\NoValue} % ‘rescue’ font. Will be accessible via
  % \inverb|\symgmathRoman⁄<version>| (math family) and
  % \inverb|\gmath@fontt⁄<version>| (font).
}{%
  %^^A\AtBeginDocument{\setbox0=\hbox{$\showthe\textfont0 $}}%
  \IfValueT{#1}{%
    \DeclareMathVersion{#1}% this sets the defaults so no need to
    % define them explicitly
    % ^^A     \SetSymbolFont{operators}{#1}{OT1}{qpl}{m}{n}%
    % ^^A     %^^A\SetSymbolFont{letters}  {#1}{OML}{qpxmi} {m}{it}%
    % ^^A     \SetSymbolFont{symbols}{#1}{OMS}{pxsy}{m}{n}%
    % ^^A     \SetSymbolFont{largesymbols}{#1}{OMX}{pxex}{m}{n}%
    }% of if |#1| given
  % 
  \gmu@getfontdata{\rmfamily\itshape}%
  % 
  \edef\gmu@tempa{%
    \IfValueTF{#1}{\@nx\SetSymbolFont{letters}{#1}}%
    {\@nx\DeclareSymbolFont{letters}}%
    {\encodingdefault}{gmathit\PutIfValue{#1}}{m}{it}%
    \IfValueT{#1}{%
      \@nx\DeclareSymbolFont{letters#1}%
      {\encodingdefault}{gmathit\PutIfValue{#1}}{m}{it}%
      }%
    \@nx\DeclareFontFamily{\encodingdefault}{gmathit\PutIfValue{#1}}{%
      \skewchar\font\gmu@theskewchar\space}%
    \@nx\DeclareFontShape{\encodingdefault}{gmathit\PutIfValue{#1}}{m}{it}{%
      <-> \gmu@fontscalebr \gmu@fontstring}{}%
    \IfValueT{#1}{%
      \@nx\SetMathAlphabet\@nx\mathit{#1}{\encodingdefault}{gmathit#1}{m}{it}}%
  }\gmu@tempa
  % 
  \IfValueT{#2}{%
    \gmu@getfontdata{#2\gmu@ifstored{\upshape}{\storedcsname{upshape}}{\upshape}}%
    \edef\gmu@tempa{%
      \@nx\DeclareSymbolFont{gmathRoman\PutIfValue{#1}}%
      {\encodingdefault}{gmathRm\PutIfValue{#1}}{m}{n}%
      \@nx\DeclareFontFamily{\encodingdefault}{gmathRm\PutIfValue{#1}}{%
        \skewchar\font\gmu@theskewchar\space}%
      \@nx\DeclareFontShape{\encodingdefault}{gmathRm\PutIfValue{#1}}{m}{n}{%
        <-> \gmu@fontscalebr \gmu@fontstring}{}%
    }\gmu@tempa
    \@xa\font\csname gmath@fontt\PutIfValue{#1}\endcsname
    =\gmu@fontstring\relax
    % \stanza
    \gmu@getfontdata{#2\gmu@ifstored{\itshape}{\storedcsname{itshape}}{\itshape}}%
    \edef\gmu@tempa{%
      \@nx\DeclareSymbolFont{gmathItalic\PutIfValue{#1}}%
      {\encodingdefault}{gmathIt\PutIfValue{#1}}{m}{n}%
      \@nx\DeclareFontFamily{\encodingdefault}{gmathIt\PutIfValue{#1}}{%
        \skewchar\font\gmu@theskewchar\space}%
      \@nx\DeclareFontShape{\encodingdefault}{gmathIt\PutIfValue{#1}}{m}{n}{%
        <-> \gmu@fontscalebr \gmu@fontstring}{}%
    }\gmu@tempa
  }% of if |#2| given
  % \stanza 
  \gmu@getfontdata{\rmfamily\upshape}%
  \edef\gmu@tempa{%
    \IfValueTF{#1}{\@nx\SetSymbolFont{gmathroman}{#1}}%
    {\@nx\DeclareSymbolFont{gmathroman}}%
    {\encodingdefault}{gmathrm\PutIfValue{#1}}{m}{n}%
    \@nx\DeclareFontFamily{\encodingdefault}{gmathrm\PutIfValue{#1}}{%
      \skewchar\font\gmu@theskewchar\space}%
    \@nx\DeclareFontShape{\encodingdefault}{gmathrm\PutIfValue{#1}}{m}{n}{%
      <-> \gmu@fontscalebr \gmu@fontstring}{}%
    \IfValueT{#1}{%
      \@nx\SetMathAlphabet\@nx\mathrm{#1}{\encodingdefault}{gmathrm#1}{m}{n}}%
  }\gmu@tempa
  % ^^A \typeout{@@@ gmathrm (upright symbols):
  %   ^^A     \meaning\gmu@tempa}%
    \@xa\font\csname gmath@font\PutIfValue{#1}\endcsname
    =\gmu@fontstring\relax
    \gmathfamshook
}

\emptify\gmathfamshook

\DeclareCommand\gmathbase{oC{\NoValue}}{%
  \gmathFams[#1](#2)%
  \DeclareCommand\gmath@do{%
    m % (1) the character or \CS\ to be declared,
    o % (2)  the Unicode to be assigned,
    m % (3) math type (\CS like \cs{mathord} etc.)
    C{\gmath@fam} % font family
  }{%\
    %
    \gmath@getfamnum(##4)%
    \IfValueTF{##2}{%
      \edef\gmu@tempa{%
        = \mathchar@type##3\space
        \gmath@famnum\space
        % ^^A\the\XeTeXcharglyph
        "##2\relax}%
      \if\relax\@nx##1%
        \gmu@ifstored{##1}{}{\StoreMacro##1}%
        \edef\gmu@tempa{%
          \XeTeXmathchardef \@nx##1\gmu@tempa}%
        \else
        \edef\gmu@tempa{%
          \XeTeXmathcode `##1 \gmu@tempa}
        \fi%
      }%
      {% no value of |##2|
        \edef\gmu@tempa{%
          \XeTeXmathcode `##1 =
          \mathchar@type##3\space
          \gmath@famnum\space 
          %^^A \the\XeTeXcharglyph
          `##1\relax}%
      }%
      \gmu@tempa
      % ^^A       \typeout{@@@@ \@nx##1}%
      % ^^A       \typeout{@@@@ \@xa\detokenize\@xa{\gmu@tempa}}%
    }% of \incs{gmath@do}
    % 
    \DeclareCommand\gmath@doif{%
      m        % (1) the Unicode hex of char enquired,
      m      % (2) the char or \CS\ to be declared,
      m      % (3) math type \CS (\cs{mathord} etc.),
      o      % (4) second-choice Unicode (taken if first-choice is absent),
      o      % (5) third-choice Unicode (as above if second-choice is absent from font).
      B{\gmath@fam} % (6) never used in this package. Why?
      C{\NoValue}
    }{%
      \gmu@storeifnotyet{##2}%
      \@xa\let\@xa\gmath@ft\csname
        gmath@font%
        \ifx\gmath@fam##6\else t\fi
        \gmath@version
      \endcsname
      \iffontchar\gmath@ft"##1 \gmath@do##2[##1]##3(##6)%
      \else
        \IfValueTF{##4}{%
          \iffontchar\gmath@ft"##4 \gmath@do##2[##4]##3(##6)%
          \else
            \IfValueTF{##5}{%
              \iffontchar\gmath@ft"##5 \gmath@do##2[##5]##3(##6)%
              \else 
                \gmath@restore{##1}{##2}{##3}{##4}{##5}{##7}%
              \fi}%
            {\gmath@restore{##1}{##2}{##3}{##4}{##5}{##7}}%
          \fi}%
        {\gmath@restore{##1}{##2}{##3}{##4}{##5}{##7}}%
      \fi
    }% of |\gmath@doif|
    % In the command above we try to define math char or a~\CS in the
    % family given as |##6|. If there're no respective chars, we try
    % the same with the family given (as a~word) in |##7|.
    \def\gmath@restore##1##2##3##4##5##6{%
      \IfValueT{##6}%
      {\ifcsname ##6\endcsname
          \edef\gmu@tempa{%
            \unexpanded{\gmath@doif{##1}{##2}{##3}[##4][##5]}%
            {\@xa\@nx\csname##6\endcsname}\relax
          }\gmu@tempa
          \@xa\@gobbletwo % if family |##6| is defined, we gobble the
          % other branch
        \fi
      }%
      \firstofone
      {\if\relax\@nx##2%
          \RestoreMacro##2%
        \fi
      }%
    }%
    % 
\iffalse % doesn't work in a~non-math font.
    \DeclareCommand\gmath@delc{mo}{%\
      % \begin{enumargs*}
      %   \mand the char or \CS\ to be declared,
      % \opt the Unicode (if not the same as the char).
      % \end{enumargs*}
      %
    \gmath@getfamnum
    \IfValueTF{##2}{%
      \edef\gmu@tempa{%
        = \gmath@famnum\space "##2\relax}%
      \edef\gmu@tempa{%
        \XeTeXdelcode `##1 \gmu@tempa}
    }%
    {%
      \edef\gmu@tempa{%
        \XeTeXdelcode `##1 =
        \gmath@famnum\space 
        % ^^A \the\XeTeXcharglyph
        `##1\relax}%
    }%
    \gmu@tempa
    % ^^A     \typeout{@@@@ \@nx##1}%
    % ^^A     \typeout{@@@@ \meaning\gmu@tempa}%
  }% of \incs{gmath@delc}
  % 
  \def\gmath@delcif##1##2{%\
    % \begin{enumargs*}
    %   \mand the Unicode enquired,
    % \item the char to be delcode-declared
    % \end{enumargs*}
    % 
    \iffontchar\gmath@font"##1 \gmath@delc##2[##1]\fi}
\fi% of iffalse
  %
  \def\gmath@delimif##1##2##3{%\
    % \begin{enumargs*}
    % \item the Unicode enquired,
    % \item the \CS\ defined as \cs{XeTeXdelimiter},
    % \item the math type \CS\ (probably \incs{mathopen} or
    %   \incs{mathclose}).
    % \end{enumargs*}
    \iffontchar\gmath@font"##1 
      \gmath@getfamnum
      \protected\edef##2{\@nx\ensuremath{%
          \XeTeXdelimiter \mathchar@type##3\space
          \gmath@famnum\space "##1\relax}}%
    \fi}% of \cs{gmath@delimif}.
  %
  \pdef\rmopname##1##2##3{%
    \mathop {##1\kern \z@ \mathrm{##3}}\csname n##2limits@\endcsname
  }%
  %
  \DeclareCommand\gmu@dogmathbase{oC{\NoValue}}{%
    %^^A\setbox0=\hbox{$\showthe\textfont0 $}%
    \RestoreMacro\mathchar@type%
    % 
    \IfValueT{##1}{\mathversion{##1}}%
    %
    \edef\gmath@version{\PutIfValue{##1}}%
    % ^^A\show\gmath@version
    %
    \@xa\let\@xa\gmath@fam\csname symgmathroman%
    \endcsname
    \edef\gmath@famm{symgmathRoman\gmath@version}% as you see, this is
    % not a~font family (number) but a~macro containing the name: of
    % the secondary (‘rescue’) family.
    %
    \typeout{@@@ gmutils.sty: taking some math chars from the font^^J \gmu@fontstring@}%
    \gmath@do+\mathbin
    \gmath@doif{2212}-\mathbin[2013](\gmath@famm)% minus sign if present or else en dash
    \gmath@do=\mathrel
    \gmath@do0\mathord
    \gmath@do1\mathord
    \gmath@do2\mathord
    \gmath@do3\mathord
    \gmath@do4\mathord
    \gmath@do5\mathord
    \gmath@do6\mathord
    \gmath@do7\mathord
    \gmath@do8\mathord
    \gmath@do9\mathord
    %% 
    \gmath@doif{2264}\le\mathrel(\gmath@famm)%
    \let\leq\le
    \let\leeng\le
    \gmath@doif{2265}\ge\mathrel(\gmath@famm)%
    \let\geq\ge
    \let\geeng\ge
    \gmath@doif{2A7D}\xleq\mathrel(\gmath@famm)%
    \gmath@doif{2A7E}\xgeq\mathrel(\gmath@famm)%
    \@ifpackageloaded{polski}{%
      \ifdefined\xleq
      \gmu@storeifnotyet\leq
      \let\leq=\xleq
      \let\le=\leq
      \fi
      \ifdefined\xgeq
      \gmu@storeifnotyet\geq
      \let\geq=\xgeq
      \let\ge=\geq
      \fi}{}%
    % 
    \gmath@do.\mathpunct
    \gmath@do,\mathpunct
    \gmath@do;\mathpunct
    \gmath@do…\mathpunct 
    \gmath@do(\mathopen
%^^A    \gmath@delc(% doesn't work with a~non-math font (I~dunno if
%^^A~it works with a~math font).
    \gmath@do)\mathclose
%^^A    \gmath@delc)%
    \gmath@do[\mathopen
%^^A    \gmath@delc[%
    \gmath@do]\mathclose
%^^A    \gmath@delc]%
    % 
    \gmath@doif{00D7}×\mathbin (\gmath@famm)%
    \gmath@do:\mathrel
    \gmath@doif{00B7}·\mathbin(\gmath@famm)%
    \gmath@doif{22C6}*\mathbin(\gmath@famm)% % low star
    \gmath@doif{2300}\varnothing\mathord(\gmath@famm)%
    \gmath@doif{221E}\infty\mathord(\gmath@famm)%
    \gmath@doif{2248}\approx\mathrel(\gmath@famm)%
    \gmath@doif{2260}\neq\mathrel(\gmath@famm)%
    \let\ne\neq
    \gmath@doif{00AC}\neg\mathbin(\gmath@famm)%
    \gmath@doif{00AC}\nego\mathord(\gmath@famm)%
    \gmath@do/\mathop
    \gmath@do<\mathrel
%^^A    \gmath@delcif{2329}<%
    \gmath@do>\mathrel
%^^A    \gmath@delcif{232A}>%
    \gmath@doif{2329}\langle\mathopen(\gmath@famm)%
    \gmath@doif{232A}\rangle\mathclose(\gmath@famm)%
    \gmath@doif{2202}\partial\mathord(\gmath@famm)%
    \gmath@doif{00B1}\pm\mathbin(\gmath@famm)%
    \gmath@doif{007E}\sim\mathrel(\gmath@famm)%
    \gmath@doif{2190}\leftarrow\mathrel(\gmath@famm)%
    \gmath@doif{2192}\rightarrow\mathrel(\gmath@famm)%
    \gmath@doif{2194}\leftrightarrow\mathrel(\gmath@famm)%% if not present,
    % \incs{gmathfurther} will take care
    % of it if left and right arrows are present.
    \gmath@doif{2191}\uparrow\mathrel(\gmath@famm)%% it should be a~delimiter
    % (declared with \incs{gmath@delimif}) % but in a~non-math
    % font the delimiters don't work (2008/11/19) and I~don't think
    % I'll ever need up- and down- arrows as delimiters.
    \gmath@doif{2193}\downarrow\mathrel(\gmath@famm)%
    % 
    \gmath@doif{2208}\in\mathrel[03F5][0454](\gmath@famm)%%
    % As a~fan of modal logics I~allow redefinition of \incs{lozenge}
    % and \incs{square} iff both are in the font. I~don't accept
    % the ‘ballot box’ U+2610.
    \if\iffontchar\gmath@font"25CA 0\else 1\fi
       \iffontchar\gmath@font"25FB 0\else\iffontchar\gmath@font"25A1 0\else 2\fi\fi
      \gmath@do\lozenge[25CA]\mathord
      \gmath@doif{25FB}\square\mathord[25A1](\gmath@famm)%%  ‘medium white square (modal
      % operator)’ of just ‘white square’. 
    \fi
    \gmath@doif{EB08}\bigcircle\mathbin(\gmath@famm)%
    \gmath@doif{2227}\wedge\mathbin(\gmath@famm)%
    \gmath@doif{2228}\vee\mathbin(\gmath@famm)%
    %
    \gmath@doif{0393}\Gamma\mathalpha(\gmath@famm)%
    \gmath@doif{0394}\Delta\mathalpha(\gmath@famm)%
    \gmath@doif{0398}\Theta\mathalpha(\gmath@famm)%
    \gmath@doif{039B}\Lambda\mathalpha(\gmath@famm)%
    \gmath@doif{039E}\Xi\mathalpha(\gmath@famm)%
    %^^A~\gmath@doif{039F}\Xi\mathalpha(\gmath@famm)%
    \gmath@doif{03A3}\Sigma\mathalpha(\gmath@famm)%
    \gmath@doif{03A5}\Upsilon\mathalpha(\gmath@famm)%
    \gmath@doif{03А6}\Phi\mathalpha(\gmath@famm)%
    \gmath@doif{03A8}\Psi\mathalpha(\gmath@famm)%
    \gmath@doif{03A9}\Omega\mathalpha(\gmath@famm)%
    % 
    \@xa\let\@xa\gmath@fam\csname symletters\gmath@version%
    \endcsname
    \edef\gmath@famm{symgmathItalic\gmath@version}%
    % 
    \gmath@doif{03B1}\alpha\mathalpha(\gmath@famm)%
    \gmath@doif{03B2}\beta\mathalpha(\gmath@famm)%
    \gmath@doif{03B3}\gamma\mathalpha(\gmath@famm)%
    \gmath@doif{03B4}\delta\mathalpha(\gmath@famm)%
    \gmath@doif{03F5}\epsilon\mathalpha(\gmath@famm)%
    \gmath@doif{03B5}\varepsilon\mathalpha(\gmath@famm)%
    \gmath@doif{03B6}\zeta\mathalpha(\gmath@famm)%
    \gmath@doif{03B7}\eta\mathalpha(\gmath@famm)%
    \gmath@doif{03B8}\theta\mathalpha(\gmath@famm)%
    \gmath@doif{03D1}\vartheta\mathalpha(\gmath@famm)%
    \gmath@doif{03B9}\iota\mathalpha(\gmath@famm)%
    \gmath@doif{03BA}\kappa\mathalpha(\gmath@famm)%
    \gmath@doif{03BB}\lambda\mathalpha(\gmath@famm)%
    \gmath@doif{03BC}\mu\mathalpha(\gmath@famm)%
    \gmath@doif{03BD}\nu\mathalpha(\gmath@famm)%
    \gmath@doif{03BE}\xi\mathalpha(\gmath@famm)%
    \gmath@doif{03C0}\pi\mathalpha(\gmath@famm)%
    \gmath@doif{03A0}\Pi\mathalpha(\gmath@famm)%
    \gmath@doif{03C1}\rho\mathalpha(\gmath@famm)%
    \gmath@doif{03C3}\sigma\mathalpha(\gmath@famm)%
    \gmath@doif{03DA}\varsigma\mathalpha(\gmath@famm)%% 03C2?
    \gmath@doif{03C4}\tau\mathalpha(\gmath@famm)%
    \gmath@doif{03C5}\upsilon\mathalpha(\gmath@famm)%
    \gmath@doif{03D5}\phi\mathalpha(\gmath@famm)%
    \gmath@doif{03C7}\chi\mathalpha(\gmath@famm)%
    \gmath@doif{03C8}\psi\mathalpha(\gmath@famm)%
    \gmath@doif{03C9}\omega\mathalpha(\gmath@famm)%
    %
    \if 1 1%
    \iffontchar\gmath@font"221A
      \fontdimen61\gmath@font=1pt
      \edef\sqrtsign{%
        \XeTeXradical \@xa\gmu@stripchar\meaning\symgmathroman\space "221A\relax}%
    \fi
    \fi% of if 1 1.
    \def\max{\rmopname \relax m{max}}%
    \def\min{\rmopname \relax m{min}}%
    \def\lim{\rmopname \relax m{lim}}%
    \def\sin{\rmopname \relax o{sin}}%
    \def\cos{\rmopname \relax o{cos}}%
    \def\tg{\rmopname \relax o{tg}}%
    \def\ctg{\rmopname \relax o{ctg}}%
    \def\tan{\rmopname \relax o{tan}}%
    \def\ctan{\rmopname \relax o{ctan}}%
  }% of |\gmu@dogmathbase|
  \AtBeginDocument{\gmu@dogmathbase[#1](#2)%
    \let\gmathbase\gmu@dogmathbase
  }% of atbd
    \not@onlypreamble\gmathbase
}% of \cs{gmathbase}

% The |\gmatbase| declaration defines a~couple of gmath defining
% commands and then launches them for the default font at begin
% document and becomes only that launching.

\@onlypreamble\gmathbase
% \nostanza It's a~bit tricky: if \cs{gmathbase} occurs first time in
% a~document inside \env{document} then an error error is raised. But
% if \cs{gmathbase} occurs first time in the preamble, then it removes
% itself from the only-preamble list and redefines itself to be only
% the inner macro of the former itself.

\pdef\gmathfurther{% \HideDef
  % \changes{v0.94}{2008/10/4}{removed definition of
  %   \cs{}\<letter>s and \cs{}\<digit>s}
  % \changes{v0.96}{2008/11/7}{Greek letters completed. Wrapped with
  %   \cs{addtotoks} to allow using in any order with \cs{garamath}
  %   and others}
  % 
  \def\do##1##2##3{\gmu@storeifnotyet##1%
    \def##1{%
      \mathop{\mathchoice{\hbox{%
            \rm
            \edef\gma@tempa{\the\fontdimen8\font}%
            \larger[3]%
            \lower\dimexpr(\fontdimen8\font-\gma@tempa)/2 %
              \hbox{##2}}}{\hbox{%
              \rm
              \edef\gma@tempa{\the\fontdimen8\font}%
              \larger[2]%
              \lower\dimexpr(\fontdimen8\font-\gma@tempa)/2 %
              \hbox{##2}}}%
          {\mathrm{##2}}{\mathrm{##2}}}##3}}%
    \iffontchar\gmath@font"2211    \do\sum{\char"2211}{}\fi%
    \do\forall{\gma@quantifierhook \rotatebox[origin=c]{180}{A}%
      \gmu@forallkerning
    }{\nolimits}%
    \def\gmu@forallkerning{\setbox0=\hbox{A}\setbox2=\hbox{\scriptsize x}%
      \kern\dimexpr\ht2/3*2 -\wd0/2\relax}% to be able to redefine it
    % when the big quantifier is Bauhaus-like.
    \do\exists{\rotatebox[origin=c]{180}{\gma@quantifierhook E}}\nolimits%
    % 
    \def\do##1##2##3{\gmu@storeifnotyet##1%
      \def##1{##3{%
          \mathchoice{\hbox{\rm##2}}{\hbox{\rm##2}}%
          {\hbox{\rm\scriptsize##2}}{\hbox{\rm\tiny##2}}}}}%
    %
    \unless\iffontchar\gmath@font"2227
      \do\vee{\rotatebox[origin=c]{90}{<}}\mathbin%
    \fi
    \unless\iffontchar\gmath@font"2228
      \do\wedge{\rotatebox[origin=c]{-90}{<}}\mathbin
    \fi
    %
    \unless\iffontchar\gmath@font"2194
      \if\iffontchar\gmath@font"2190 0\else1\fi
        \iffontchar\gmath@font"2192 0\else2\fi
        \do\leftrightarrow{\char"2190\kern-0,1em \char"2192}\mathrel
        %^^A\typeout{@@@ I fake \string\leftrightarrow}%
    \fi\fi
    % 
    \def\do##1##2##3{\gmu@storeifnotyet##1%
      \def##1####1{##2{\hbox{%
            \rm
            \setbox0=\hbox{####1}%
            \edef\gma@tempa{\the\ht0}%
            \edef\gma@tempb{\the\dp0}%
            ##3%
            \setbox0=\hbox{####1}%
           \lower\dimexpr(\ht0 + \dp0)/2-\dp0 -((\gma@tempa+\gma@tempb)/2-\gma@tempb) %
           \box0}}}}%
   \do\bigl\mathopen\larger
   \do\bigr\mathclose\larger
   \do\Bigl\mathopen\largerr
   \do\Bigr\mathclose\largerr
   \do\biggl\mathopen{\larger[3]}%
   \do\biggr\mathclose{\larger[3]}%
   \do\Biggl\mathopen{\larger[4]}%
   \do\Biggr\mathclose{\larger[4]}%
   % 
   % 
   \addtotoks\everymath{% \changes{v0.96}{2008/11/20}{the
     % \cs{everymath}'s left brace moved here:
     % earlier all the stuff was put into \cs{everymath}}
     \def\do##1##2{\gmu@storeifnotyet##1%
       \def##1{\ifmmode##2{\mathchoice
           {\hbox{\rm\char`##1}}{\hbox{\rm\char`##1}}%
           {\hbox{\rm\scriptsize\char`##1}}{\hbox{\rm\tiny\char`##1}}}%
         \else\char`##1\fi}}%
     % ^^A  \StoreMacros{\{\}}%
     \do\{\mathopen
     \do\}\mathclose
     % 
     \def\={\mathbin{=}}%
     \def\neqb{\mathbin{\neq}}%
     \let\neb\neqb
     \def\do##1{\gmu@storeifnotyet##1%
       \edef\gma@tempa{%
         \def\@xa\@nx\csname \@xa\gobble\string##1r\endcsname{%
           \@nx\mathrel{\@nx##1}}}%
       \gma@tempa}%
     \do\vee \do\wedge \do\neg
     \def\fakern{\mkern-3mu}%
     \thickmuskip=8mu plus 4mu\relax
     % 
     \gma@gmathhook
   }% of |\everymath|.
   \everydisplay\everymath
   \ifdefined\Url
     \ampulexdef\Url{\let\do}\@makeother
     {\everymath{}\let\do\@makeother}% I~don't know why but the
     % \pk{url} package's \incs{url} typesets the argument inside
     % a~math which caused digits not to be typewriter but Roman and
     % lowercase. 
  \fi% of |\ifdefined\Url|.
}% of |\def\gmathfurther|. \ResumeDef

\StoreMacro\mathchar@type

\DeclareCommand\gmath{oC{\NoValue}}{%
  \gmathbase[#1](#2)%
  \gmathfurther
  \IfValueT{#1}{\csname gmathhook#1\endcsname}% this allows adding
  % version-specific stuff (I~first used this for Fell fonts rescued
  % with Garamond Premier)
}

\pdef\gmathscripts{% \changes{v0.96}{2008/11/11}{added}
  \addtotoks\everymath{\catcode`\^=7\relax \catcode`\_=8\relax }%
  \everydisplay\everymath}

\pdef\gmathcats{%
  \addtotoks\everymath{\gmu@septify}%
  \everydisplay\everymath}

\emptify\gma@quantifierhook
\def\quantifierhook#1{%
  \def\gma@quantifierhook{#1}}

\emptify\gma@gmathhook
\def\gmathhook#1{\addtomacro\gma@gmathhook{#1}}


\def\gma@dollar$#1${{\gmath$#1$}}%
\def\gma@bare#1{\gma@dollar$#1$}%
\def\gma@checkbracket{\@ifnextchar\[%^^A\]
  \gma@bracket\gma@bare}
\def\gma@bracket\[#1\]{{\gmath\[#1\]}\@ifnextchar\par{}{\noindent}}
\def\gma{\@ifnextchar$%^^A $
  \gma@dollar\gma@checkbracket}

   %^^A In Beamer presentations it will we defined another way.
   %^^B trial composition
\def\bgcolor{\color{white}}

\DeclareCommand\garamath{%
  O{\rm}% the font command
}{%
  % Before 2009/10/19 all the stuff was added to |\everymath| which
  % didn't work.
  \quantifierhook{\addfontfeature{OpticalSize=800}}%
  % 
  \def\gma@arrowdash{{%
      \setbox0=\hbox{\char"2192}\copy0\kern-0,6\wd0
      \bgcolor\rule[-\dp0]{0,6\wd0}{\dimexpr1,07\ht0+\dp0}\kern-0,6\wd0}}%
  % 
  \def\gma@gmathhook{%
    \def\do####1####2####3{\gmu@storeifnotyet####1%
      \def####1{####3{%
          \mathchoice{\hbox{#1####2}}{\hbox{#1####2}}%
          {\hbox{#1\scriptsize####2}}{\hbox{#1\tiny####2}}}}}%
    \do\mapsto{\rule[0,4ex]{0,1ex}{0,4ex}\kern-0,05em%
      \gma@arrowdash\kern-0,05em\char"2192}\mathrel
    \do\cup{\scshape u}\mathbin
    \do\varnothing{\setbox0=\hbox{\gma@quantifierhook\addfontfeature{Scale=1.272727}0}%
      \setbox2=\hbox{\char"2044}%
      \copy0 \kern-0,5\wd0 \kern-0,5\wd2 \lower0,125\wd0 \copy2
      \kern0,5\wd0\kern-0,5\wd2}{}% of |\varnothing|
    \do\leftarrow{\char"2190\kern-0,05em\gma@arrowdash}\mathrel
    \do\shortleftarrow{\char"2190}\mathrel
    \do\rightarrow{\gma@arrowdash\kern-0,05em\char"2192}\mathrel
    \do\shortrightarrow{\char"2192\relax}\mathrel
    \do\in{\gma@quantifierhook\char"0454}\mathbin
    \do\prec{\gma@quantifierhook
      \rotatebox[origin=c]{-90}{%
        \glyphname{u03A5.a}}}\mathrel % added 2009/9/11
  }% of |\gma@gmathhook|
}% of |\garamath|.




% \subdivision{Minion and Garamond Premier kerning and ligature fixes}

%»Ws« shall not make long »s« because long »s« looks ugly next to »W«.

\def\gmu@tempa{\kern-0,08em\penalty10000\hskip0sp\relax
  s\penalty10000\hskip0sp\relax}

\protected\edef\Vs{V\gmu@tempa}

\protected\edef\Ws{W\gmu@tempa}

\pdef\Wz{W\kern-0,05em\penalty10000\hskip0sp\relax z}



% \subdivision{A~left-slanted font} Or rather a~left Italic \emph{and}
% left slanted font. In both cases we sample the skewness of the
% itshape font of the current family, we reverse it and apply to
% \cs{itshape} in \cs{litshape} and 
% \cs{textlit} and to \cs{sl} in \cs{lsl}. Note
% a~slight asymmetry: \cs{litshape} and \cs{textlit} take the current
% family while \cs{lsl} and \cs{textlsl} the basic Roman family and
% basic (serif) Italic font. Therefore we introduce the \cs{lit}
% declaration for symmetry, that declaration left-slants \cs{it}.
%
% {\leftslanting
% I~introduced them first while typesetting E.~Szarzyński's
% \ty{Letters} to follow his (elaborate) hand-writing and now I copy
% them here when need left Italic for his \ty{Albert Camus' ^^B
% \ty{The Plague}} to avoid using bold font.\par}
%
% Of course it's rather esoteric so I~wrap all that in a~declaration.

\pdef\leftslanting@{%
  \def\litdimen{\strip@pt\fontdimen1\font ex}%
  \def\litcorrection{%
    \ifhmode\null\nobreak\hskip\litdimen\relax\fi}%
  \def\litkern{% note it's to be used inside the left slanted font,
    % unlike \incmd\litcorrection, intended to be used \emph{before}
    % switching to left slant/italic.
    \leavevmode\null
    \kern-\litdimen\relax}%
  \def\dilitkern{\kern\litdimen\litkern}%
  % \stanza
  \pdef\litshape{% \changes{v0.93}{2008/08/22}{copied here from
    % E.~Szarzyński's \ty{The Letters}}
    \litcorrection
    \itshape
    \@tempdima=-2\fontdimen1\font
    \advance\leftskip by\strip@pt\fontdimen1\font ex % to assure at
    % least the lowercase letters not to overshoot to the (left)
    % margin. Note this has any effect only if there is a~\incs{par} in
    % the scope.
    \litcorrection
    \edef\gmu@tempa{%
      \@nx\addfontfeature{FakeSlant=\strip@pt\@tempdima}}%^^B 
    % \ilrr when not \incs{edef}ed, it caused an error, which is
    % perfectly understandable. 
    \gmu@tempa}%
  %
  % 
  \pdef\textlit##1{% \changes{v0.93}{2008/08/22}{added}
    {\litshape##1}}%
  %
  \pdef\lit{\rm\litshape}%
  %
  % 
  \pdef\lsl{{%
      \litcorrection      
      \it
      % \changes{v0.93}{2008/08/22}{copied here from E.~Szarzyński's \ty{The
      %     Letters}}
      \@tempdima=-\fontdimen1\font
      \litcorrection
      \xdef\gmu@tempa{%
        \@nx\addfontfeature{RawFeature={slant=\strip@pt\@tempdima}}}}%
    \rm  % Note in this declaration we left-slant the basic Roman font
    % not the itshape of the current family.
    \gmu@tempa}%
  %
  % Now we can redefine \cs{em} and \cs{emph} to use left Italic for
  % nested emphasis. In Polish typesetting there is bold in nested
  % emphasis as I~have heard but we don't like bold since it perturbs
  % homogeneous greyness of a~page. So we introduce a~three-cycle
  % instead of two-: Italic, left Italic, upright.
  % 
  \pdef\em{%\changes{v0.93}{2008/08/22}{added}
    \ifdim\fontdimen1\font=\z@  \itshape
    \else
      \ifdim\fontdimen1\font>\z@ \litshape
      \else \upshape
      \fi
    \fi}%
  %
  %
  \pdef\emph##1{% \changes{v0.93}{2008/08/22}{added}
    {\em##1}}%
}% of \cs{leftslanting@}.

\pdef\leftslanting{\AtBeginDocument\leftslanting@}

\AtBeginDocument{\let\leftslanting\leftslanting@}


% \subdivision{Fake Old-style Numbers}
%
% While preparing documentation of this package I~faced an \ae ^^A
% sthetic problem of lack of old-style numbers in a~font I~fancy. The
% font is for the sans serif and the digits occur only in the date in
% title so it would be a~pity not too use a~nice font when only one or
% two numbers are needed.

\def\romorzero#1{%
  \ifnum#1=0 zero\else\romannumeral#1 \fi}

\DeclareCommand\fakeonum{%
  o %  fake bold for the digit »2« (for which emboldening improves
  % look),
  >Pm   %  the text to fake old-style numbers in.
  % ^^A  Note it's an optional
  % ^^A   % braced argument so if the next non-space token after
  % ^^A   % \incs{fakeonum} is not left brace, the \inverb|#2|-less version
  % ^^A   % will be executed. It allows one to use this command as an
  % ^^A   % environment. 
}{%\
  % I~tried to use this command as a~declaration but active digits are
  % very uncomfortable, e.g.\ you can't define macros with arguments. 
  % \chgs{2008/12/04 v0.98 added}
  \gmu@if@onum{#2}{%
    \begingroup
    \edef\gmu@tempa{#2}%
    \makeatletter%
    \IfValueT{#1}{%
      \prependtomacro\fake@onum@ii{%
        \begingroup\addfontfeature{FakeBold=#1}}%
      \addtomacro\fake@onum@ii\endgroup
    }%
    \endlinechar\m@ne % to suppress the line end added by
    % |\scantokens|, especially in active |^^M|'s scopes.
    \gmu@dofakeonum
    \@xa\scantokens\@xa{\gmu@tempa}%
    \endgroup
  }% of |\gmu@ifonum| ‘else’.
}% of |\fakeonum|.

\def\gmu@dofakeonum{%
  \def\do##1{%
    \catcode`##1\active
    \scantokens{%
      \@xa\let\@xa##1%
      \csname fake@onum@\@xa\romorzero\string##1\endcsname\empty}}%
  \do0\do1\do2\do3\do4\do5\do6\do7\do8\do9%
}

\def\do#1#2{%
  \@namedef{fake@onum@\romorzero#1}{#2}}

\def\gmu@tempa#1{%
  \do#1{\leavevmode
    \gmu@calculateslant{#1}% uses \incs{gmu@tempa} and
    % \incs{gmu@tempb}, therefore goes first. And defines \incs{gmu@tempd}.
    \gmu@measurewd{#1}% the width of char |#1| is in \incs{gmu@tempa}
    % without kerning and in \incs{gmu@tempb} with kerning.
    %^^A\typeout{@@@@@@ \gmu@tempa}%
    %^^A     {\gmu@tempe
    %  ^^A       \typeout{@@@@@@ \the\fontcharwd\font`#1}%
    %  ^^A     }%
    \edef\gmu@tempc{\the\fontcharht\font`#1}%
    \hbox to \gmu@tempb {%
      \hss\resizebox{\gmu@tempa}%
      {\dimexpr\fontdimen5\font+\gmu@tempc-\fontdimen8\font}%
      {\gmu@tempd#1}\hss}}}

\def\gmu@measurewd#1{% \label{@measurewd}
  \edef\gmu@tempa{\the\fontcharwd\font`#1}%
  \settowidth{\@tempdimb}{% to preserve kerning
    \char`#1\char`#1\char`#1\char`#1\char`#1\char`#1%
    \char`#1\char`#1\char`#1\char`#1\char`#1\char`#1%
    \char`#1\char`#1\char`#1\char`#1\char`#1\char`#1%
    \char`#1\char`#1\char`#1}%
  \edef\gmu@tempb{\the\dimexpr(\@tempdimb-\gmu@tempa)/20}%
}

\gmu@tempa0 % |\fake@onum@zero|
\gmu@tempa1 % |\fake@onum@i|
\gmu@tempa2 % |\fake@onum@ii|

\def\gmu@tempa#1{%
  \do#1{\leavevmode
    \gmu@measurewd{#1}%
    \lower
    \dimexpr\fontdimen8\font-\fontdimen5\font\relax
    \hbox to \gmu@tempb {\hss#1\hss}}%
}

\gmu@tempa3 % |\fake@onum@iii|
\gmu@tempa4 % |\fake@onum@iv|
\gmu@tempa5 % |\fake@onum@v|
\gmu@tempa7 % |\fake@onum@vii|
\gmu@tempa9 % |\fake@onum@ix|

\def\gmu@tempa#1{% to preserve pseudo-kerning in digits sequences.
  \do#1{\leavevmode
  \gmu@measurewd#1%
  \hbox to \gmu@tempb {\hss#1\hss}}}

\gmu@tempa6 % |\fake@onum@vi|
\gmu@tempa8 % |\fake@onum@viii|


\protected\def\gmu@if@onum{%
  \edef\gmu@tempa{\@xa\meaning\the\font}%
  \@xa\@ifinmeaning\detokenize{+onum}\of\gmu@tempa
}
% \nostanza Thus |\gmu@if@onum| becomes a~two-argument command that
% executes its \hash1 if there is |+onum| in current font
% specification or its |#2| if |+onum| is absent.
%
% One could easily generalise |\gmu@if@onum| to |\@if@fontfeature|,
% i.e.\ to a~test for an arbitrary font feature, probably with
% employing that very nice feature specification of \pk{fontspec}, so
% that you could write
% |\IfFontFeature{Numbers=OldStyle}{}{fake old-style digits}|.

\pdef\gmu@getslant{% we define |\gmu@tempa| to the (fake) slant of current font.
  \edef\gmu@tempa{\@xa\meaning\the\font\detokenize{slant=0,}}%
  \edef\gmu@tempb{%
    \def\@nx\gmu@tempb####1%
    \detokenize{slant=}%
    ####2,####3}%
  \gmu@tempb\@@nil{##2}%
  \edef\gmu@tempa{\@xa\gmu@tempb\gmu@tempa\@@nil pt}%
  %^^A~\typeout{@@@@  :::\gmu@tempa:::}%
}

\def\gmu@calculateslant#1{%
  \gmu@getslant
  %^^A~\typeout{@@@@ \the\fontdimen1\font}%
  \edef\gmu@tempa{\the\numexpr\dimexpr\fontdimen1\font + \gmu@tempa}%\
  % \incs{gmu@tempa} bears the number of scaled points of total slant
  % (\inverb|\fontdimen1\font|${}+$\inverb|slant=…| if present) per 1pt
  % of \inhash1.\ilrr
  \edef\gmu@tempa{\the\numexpr \gmu@tempa *
    \numexpr\fontdimen5\font\relax/\numexpr\fontcharht\font`#1
    \relax}%\
  % we scale the total slant of \inverb|#1| by the ratio of original
  % and scaled height of \inverb|#1|.
  \edef\gmu@tempd{%
    \the\dimexpr \gmu@tempa sp  - \fontdimen1\font}%\
  % and we subtract slant-fontdimen from the scaled total slant.
  %^^A\typeout{@@@ \gmu@tempd}%
  \ifdim\gmu@tempd=\z@ \emptify\gmu@tempd
  \else\edef\gmu@tempd{%
    \@nx\addfontfeature{FakeSlant=\strip@pt\dimexpr\gmu@tempd}}%
  \fi}

\DeclareCommand\gmu@cepstnof{O{\gmu@tempa}% a~cs to be |\xdef|ed the
  % font specification,
  s% not used really,
  m% |\fontspec| token or name of feature font (\inverb|Italic|, \inverb|Bold|,
   % \inverb|SmallCaps|, \inverb|BoldItalic| ),
  O{, Scale=MatchLowercase}% \pk{fontspec}  font features (key=val)
}
{% |\gmu@cepstnof|'s body
  \def\gmu@reservedc##1:##2:\@@nil{%
    \ifx:##2:\else RawFeature={\gmu@maybestripcomma##2,,\@@nil} \fi}%
  % \stanza
  \def\gmu@reservedd##1/##2/\@@nil{% to check whether font name
    % contains |/| (which may not be true!)
    \ifx&##2&\@xa\@firstoftwo\else\@xa\@secondoftwo\fi}%
  % \stanza
  \def\gmu@reservede##1:##2:\@@nil{% to check whether the font name
    % contains |:| when it doesn't contain |/|.
    \ifx&##2&\@xa\@firstoftwo\else\@xa\@secondoftwo\fi}%
  % \stanza
  \edef\gmu@reserveda{%
    % now, reserved B parses the font name and features. It uses an
    % auxiliary reserved C because after |/| may be or may not be
    % features specification.
    \@xa\@xa\@xa\gmu@reservedd\@xa\meaning\the\font//\@@nil
    {% font name doesn't contain a~slash
      \@xa\@xa\@xa\gmu@reservede\@xa\meaning\the\font::\@@nil
      {% nor does it contain a~colon
        \def\@nx\gmu@reservedb\detokenize{select font
          "}####1\detokenize{"}####2\@nx\@@nil{%
          \ifx\fontspec#3%
            \@nx\@nx\@nx\fontspec[\@gobble#4\@empty]{####1}% gobble a~comma
          \else
            #3Font={####1}, #3Features={\@gobble #4\@empty}%
          \fi
        }%
      }%
      {% no slash but there is a~colon
        \def\@nx\gmu@reservedb\detokenize{select font
          "}####1:####2\detokenize{"}####3\@nx\@@nil{%
          \ifx\fontspec#3%
            \@nx\@nx\@nx\fontspec[\@nx\gmu@reservedc####2::\@nx\@@nil#4]{####1}%
          \else
            #3Font={####1}, #3Features={\@nx\gmu@reservedc####2::\@nx\@@nil#4}%
          \fi
        }%
      }%
    }% of ‘no slash’ case
    {% font name contains a~slash
      \def\@nx\gmu@reservedb\detokenize{select font
        "}####1/####2\detokenize{"}####3\@nx\@@nil{%
        \ifx\fontspec#3%
          \@nx\@nx\@nx\fontspec[\@nx\gmu@reservedc####2::\@nx\@@nil#4]{####1}%
        \else
          #3Font={####1}, #3Features={\@nx\gmu@reservedc####2::\@nx\@@nil#4}%
        \fi
      }% of |\gmu@reservedb|
    }% of ‘slash present’ case
  }\gmu@reserveda
  % ^^A\typeout{@@@@@ ›\@xa\meaning\the\font‹}%
  \xdef#1{\@xa\@xa\@xa\gmu@reservedb\@xa\meaning\the\font\@@nil}%
  % ^^A~\typeout{@@@@@ ›\meaning#1‹}%
}%

\def\gmu@maybestripcomma#1,,#2\@@nil{#1}

\pdef\gmu@setbasefont{\@xa\let\@xa\gmu@basefont\the\font}

\let\setbasefont\gmu@setbasefont

\DeclareCommand\gmu@calc@scale{%
  O{1}% a~factor,
  m% number of the fontdimen
  }
{\begingroup
  % ^^A~\setlength\@tempdima{\fontdimen#1\font}%
  % ^^A~\setlength\@tempdimb{\fontdimen#1\zf@basefont}%
  % ^^A~\setlength\@tempdimc{1pt*\ratio{\@tempdima}{\@tempdimb}}%
  % We ‘descale’ the current font:\nostanza
  \gmu@cepstnof\fontspec[, Scale=1]\gmu@tempa
  \@xa\let\@xa\gmu@currfont@descaled\the\font
  \gmu@basefont
  % ^^A\typeout{@@@@ \meaning\gmu@basefont}%
  \gmu@cepstnof\fontspec[, Scale=1]\gmu@tempa
  % \nostanza now also the base font is descaled.
  \xdef\gmu@fontscale{%
    \strip@pt
    % ^^A\@tempdimc
    \dimexpr  1pt *
     \numexpr\dimexpr#1\fontdimen#2\font\relax\relax /
    \numexpr\fontdimen#2\gmu@currfont@descaled\relax 
    \relax}%
  % ^^A    \zf@PackageInfo{\zf@fontname\space scale = \zf@scale}%
  \endgroup}


%\division{Varia}
%

% A~very neat macro provided by \pk{doc}. I~copy it
% \texttilde|verbatim|.
\def\gmu@tilde{%
  \leavevmode\lower.8ex\hbox{$\,\widetilde{\mbox{ }}\,$}}
% Originally there was just |\ | instead of |\mbox{ }| but some
% commands of ours do redefine |\ |.
%^^A\pdef\*{\gmu@tilde}
% \changes[\*]{v0.97}{2008/11/29}{ removed (it was a~text tilde,
% available as \cmd\texttilde)}
\AtBeginDocument{% to bypass redefinition of |\~| as a~text command
  % with various encodings
  \pdef\texttilde{% 
    % \changes{v0.83}{2007/08/22}{postponed to
    %   \cs{begin\{document\}} to avoid overwriting by a~text command
    %   and
    %   made sensible to a~subsequent
    %   /} % \changes{v0.86}{2007/12/11}{renamed from \cmd\~
    % since the latter is one of \LaTeX's\ accents}
    \@ifnextchar/{\gmu@tilde\kern-0,1667em\relax}\gmu@tilde}}
% We prepare the proper kerning for ``\texttilde/''.

% The standard |\obeyspaces| declaration just changes the space's
% |\catcode| to \catactive\ (`active'). Usually it is fairly enough
% because no one `normal' redefines the active space. But we are
% \emph{not} normal and we do \emph{not} do usual things and therefore
% we want a~declaration that not only will |\active|ate the space but
% also will (re)define it as the |\ | primitive. So define
% |\gmobeyspaces| that obeys this requirement.
% 
% (This definition is repeated in \pk{gmverb}.)
\foone{\catcode`\ \active}%
{\def\gmobeyspaces{\let \ \catcode`\ \active}}

% While typesetting poetry, I~was surprised that sth.\ didn't work. The
% reason was that original |\obeylines| does |\let| not |\def|, so I~give
% the latter possibility.
% \Define\defobeylines
% \changes{v0.62}{06/09/07}{moved from \pk{pmlectionis.cls}}
\foone{\catcode`\^^M\active}% the comment signs here are crucial.
{\def\defobeylines{\catcode`\^^M=13 \def^^M{\par}}}

% Another thing I~dislike in \LaTeX\ yet is doing special things for
% |\…skip|'s, 'cause I~like the Knuthian simplicity. So I~sort of
% restore Knuthian meanings:
% \changes{v0.63}{06/9/8}{Plain-like skip macros
% defined: \cs{dek›(small⁄|med⁄|big›)skip} i.e., moved here from
% another file}

\def\deksmallskip{\vskip\smallskipamount}
\def\undeksmallskip{\vskip-\smallskipamount}
\def\dekmedbigskip{\vskip\glueexpr \medskipamount+\smallskipamount}
\def\dekmedskip{\vskip\medskipamount}
\def\dekbigskip{\vskip\bigskipamount}


\def\hfillneg{\hskip 0pt plus -1fill\relax}
% \changes{v0.80}{2007/04/28}{added}


% A~mark for the \TODO{}s:
\newcommand*{\TODO}[1][]{{%
    \sffamily\bfseries\huge TO-DO!\if\relax#1\relax\else\space\fi#1}}
% \changes{v0.64}{06/9/17}{moved here from \pk{pmlectionis}}

% \skiplines
% The code contained in this |\skiplines| I~wrote to make the table of
% contents two-column. The first difficulties led me to making the
% writes immediate at begin and end document but this also worked bad
% in a~special situation, namely, when a~contents line was added on
% the last page of the document. So for now I~give this way up and
% brutally redefine the internal \LaTeX\ macro.
%
% % A~trick for making |\protected@write| immediate. What's a~use of it?
% % See the next macro.
% % Define\MakeWriteImmediate
% % CodeDefIndex\@@write
% % changes{v0.65}{06/9/26}{added}
% \newcommand*\MakeWriteImmediate{%
%   \let\@@write\write
%   \def\write{\immediate\@@write}}
%
% % First I~used it for closing of \env{multicols} in the \file{.toc}
% % file. Second time to make \emph{two} tables of contents containing
% % two different parts of the document
% % Define\ImmediateAddtoConts
% % changes{v0.65}{06/9/26}{added}
% \newcommand\ImmediateAddtoConts[2]{{%
%     \MakeWriteImmediate
%     \addtocontents{#1}{#2}%
% }}
% \endskiplines

% I~like two-column tables of contents. First I~tried to provide them by
% writing |\begin{multicols}{2}| and |\end{multicols}| out to the
% \file{.toc} file but it worked wrong in some cases. So I~redefine the
% internal \LaTeX\ macro instead.
\newcommand*\twocoltoc{%
  \RequirePackage{multicol}%
  \def\@starttoc##1{%
    \begin{multicols}{2}\makeatletter\@input {\jobname .##1}%
      \if@filesw \@xa \newwrite \csname tf@##1\endcsname 
        \immediate \openout \csname tf@##1\endcsname \jobname .##1\relax
      \fi 
      \@nobreakfalse\end{multicols}}}

\@onlypreamble\twocoltoc

% The macro given below is taken from the \pk{multicol} package (where
% its name is |\enough@room|). I~put it in this package since I~needed
% it in two totally different works.
\DeclareCommand\enoughpage{%
  Q{+-0123456789}% (optional short version (number of |\baselineskip|s))
  B{2\baselineskip}% (2) optional (formerly mandatory) long version of
  % required room on a page
  >is
  B{} % (3) what if the room is enough
  >isB{\newpage} % (4) what if there's to little room on a page
}{% 
  % \chgs{2009/03/18 v0.98 made \eTeX-ish}
  % \chgs{2009/05/25 v0.98 made ifthenelse-like with ‘then’ and ‘else’
  %   optional default \<nothing> and \cmd\newpage resp.}
  % \chgs{2009/10/21 v0.98 \cmd\par\ removed since to let it be used
  %   for \cmd\pagebreak\ inside a paragraph}
  % ^^A  \par
  \if
  \ifdim\dimexpr\pagegoal-\pagetotal<\dimexpr
  \IfValueTF{#1}{#1\baselineskip}{#2}\relax
   1\else0\fi
   \unless\ifdim\dimexpr\pagegoal-\pagetotal<\z@
    1\else2\fi
    % \nostanza We check both whether space left on page is larger
    % than we check \emph{and} whether it's nonnegative (the latter
    % happens when we are already on the next page). Therefore this
    % test will not work properly for large values of \inhash1 or
    % values close to \incmd\textwidth.
  % ^^A   % \nostanza since 2009/03/18 the test is expandable but
  % ^^A   % I~leave this macro \inverb|\protected| because  user's will to
  % ^^A   % make the test during the (e-)definition of  some macro or while
  % ^^A   % expanding macros as in inserts seems to me not 
  % ^^A   % very likely. \nostanza
    \@xa\@firstoftwo
  \else
    \@xa\@secondoftwo
  \fi
  {#4}{#3}%
}

%^^A % Two shorthands for debugging:
%^^A %\Define\tOnLine\Define\OnAtLine
%^^A \newcommand*\tOnLine{\typeout{\on@line}}
%^^A 
%^^A \let\OnAtLine\on@line

% An equality sign properly spaced:
\pdef\equals{\hunskip${}={}$\ignorespaces}
% And for the \LaTeX's pseudo-code statements:
\pdef\eequals{\hunskip${}=={}$\ignorespaces}

\pdef\·{\hunskip${}·{}$\ignorespaces}


% While typesetting a~\acro{UTF-8} ls-R result I~found a~difficulty that
% follows: \acro{UTF-8} encoding is handled by the \pk{inputenc}
% package. It's O.K. so far. The \acro{UTF-8} sequences are managed using
% active chars. That's O.K. so far. While writing such sequences to
% a~file, the active chars expand. You feel the blues? When the result of
% expansion is read again, it sometimes is again an active char, but
% now it doesn't star a~correct \acro{UTF-8} sequence. 
%
% Because of that I~wanted to `freeze' the active chars so that they
% would be |\write|n to a~file unexpanded. A~very brutal operation is
% done: we look at all 256 chars' catcodes and if we find an active
% one, we |\let| it |\relax|.  As the macro does lots and lots of
% assignments, it shouldn't be used in |\edef|s.
%
% \Define\freeze@actives
% \changes{v0.76}{2007/02/07}{added}

\def\freeze@actives{%
  \count\z@\z@
  % 
  \@whilenum\count\z@<\@cclvi\do{%
    \ifnum\catcode\count\z@=\active
      \uccode`\~=\count\z@
      \uppercase{\let~\relax}%
    \fi
    \advance\count\z@\@ne}}


% A~macro that typesets all 256 chars of given font. It makes use of
% |\@whilenum|. \Define\ShowFont

\newcommand*\ShowFont[1][6]{%
  \begin{multicols}{#1}[The current font (the \f@encoding\ encoding):]
    \parindent\z@
    \count\z@\m@ne
    \@whilenum\count\z@<\@cclv\do{
      \advance\count\z@\@ne
      \ \the\count\z@:~\char\count\z@\par}
  \end{multicols}}


% A~couple of macros for typesetting liturgic texts such as psalmody
% of Liturgia Horarum. I~wrap them into a~declaration since they'll be
% needed not every time.
% \Define\liturgiques
% \changes{v0.76}{07/3/30}{added, or rather moved from \file{Akatyst.tex}}
\newcommand*\liturgiques[1][red]{% Requires the \pk{color} package.
  \gmu@RPfor{xcolor}\color%
  \newcommand*\czerwo{\small\color{#1}}% environment
  \newcommand{\czer}[1]{\leavevmode{\czerwo##1}}% we leave
  % vmode because if we don't, then \env{verse}'s |\everypar| would be
  % executed in a~group and thus its effect lost.
  \StoreMacro\*%
  \def\*{\czer{\storedcsname{*}}}%
  \def\+{\czer{†}}%
  \newcommand*\nieczer[1]{\textcolor{black}{##1}}%
}

% After the next definition you can write
% \cs{gmu@RP}\arg[options]{package}{\CS} to get the package |#2|
% loaded with options |#1| if the \CS |#3| is undefined.
\newcommand*\gmu@RPfor[3][]{% \changes{v0.93}{2008/08/30}{renamed from
  % \cs{gmu@RPif} and \#3 changed from a~csname to \CS} 
  \ifx\relax#1\relax\emptify\gmu@resa
  \else \def\gmu@resa{[#1]}%
  \fi
  \@xa\RequirePackage\gmu@resa{#2}}

% Since inside \env{document} we cannot load a~package, we'll redefine
% |\gmu@RPfor| to issue a~request before the error issued by undefined
% \CS. 
%^^A \Define\gmu@RPfor
\AtBeginDocument{%
  \renewcommand*\gmu@RPfor[3][]{%
    \unless\ifdefined#3%
      \@ifpackageloaded{#2}{}{%
        \typeout{^^J! Package `#2' not loaded!!! (\on@line)^^J}}%
    \fi}}


% It's very strange to me but it seems that $\continuum$ is not
% defined in the basic math packages. It is missing at least in the
% \textit{Symbols} book.
\pprovide\continuum{%
  \gmu@RPfor{eufrak}\mathfrak\ensuremath{\mathfrak{c}}}

% And this macro I~saw in the \pk{ltugproc} document class and I~liked
% it.
\def\iteracro{%
  \pdef\acro##1{%
    \begingroup
    \acropresetting
    \gmu@acrospaces##1 \gmu@acrospaces
    \endgroup
  }%
}

\emptify\acropresetting

\iteracro

\def\gmu@acrospaces#1 #2\gmu@acrospaces{%
  \gmu@acroinner#1\gmu@acroinner
  \ifx\relax#2\relax\else
    \space
    \afterfi{\gmu@acrospaces#2\gmu@acrospaces}% when |#2| is nonempty,
    % it is ended with a~space. Adding one
    % more space in this line resulted in
    % an infinite loop, of course.
  \fi}


\def\gmu@acroinner#1{%
  \ifx\gmu@acroinner#1\relax\else
    \ifcat a\@nx#1\relax%
      \ifnum`#1=\uccode`#1%
        {\acrocore{#1}}%
      \else{#1}% tu było |\smallerr|
      \fi
    \else#1%
    \fi
    \afterfi\gmu@acroinner
  \fi}

% We extract the very thing done to the letters to a~macro because we
% need to redefine it in fonts that don't have small caps.
\pdef\acrocore{\smaller % was: |\scshape\lowercase|
}

% Since the fonts I~am currently using do not support required font
% feature, I~skip the following definition. 

\def\IMHO{\acro{IMHO}}
\def\AKA{\acro{AKA}}

\pdef\usc#1{{\addfontfeature{Letters=UppercaseSmallCaps}#1}}

\def\uscacro{\let\acro\usc}

%^^A \newcommand*\qxenc{\fontencoding{QX}\selectfont}
%^^A % The |\copyright| command is unavailable in T1 and U~(unknown)
%^^A % encodings so provide
%^^A \newcommand*\qxcopyright{{\qxenc\copyright}}
%^^A \newcommand*\qxcopyrights{%
%^^A   \let\gmu@copyright\copyright
%^^A   \def\copyright{{\qxenc\gmu@copyright}}}
%^^A 
%^^A \newcommand*\fixcopyright{%
%^^A   \@ifXeTeX{\def\copyright{\char"00A9 }}{\qxcopyrights}}


% Probably the only use of it is loading \pk{gmdocc.cls} `as second
% class'. This command takes first argument optional, options of the
% class, and second mandatory, the class name. I~use it in an article
% about \pk{gmdoc}.
\def\secondclass{%
  \newif\ifSecondClass
  \SecondClasstrue
  \@fileswithoptions\@clsextension}%|[outeroff,gmeometric]{gmdocc}|%
% it's loading \pk{gmdocc.cls} with all the bells and whistles except
% the error message.


% Cf.\ \TeXbook\ ex.\ 11.6.\par
% A~line from \LaTeX:
% \[|% \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont|\]
% didn't work as I~would wish: in a~|\footnotesize|'s scope it still
% was |\scriptsize|, so too large.
% \changes{v0.81}{2007/05/13}{moved here from \pk{pmlectionis.cls}}

\def\gmu@dekfraccsimple#1/#2{\leavevmode\kern.1em
  \raise.7ex\hbox{%^^A \udigits
    \gmu@fracfontsetup#1}\gmu@numeratorkern
  \dekfraccslash\gmu@denominatorkern
  %^^A\lower.25ex\hbox
  {%^^A\udigits
    \gmu@fracfontsetup#2}%
  \if@gmu@mmhbox\egroup\fi}

\def\gmu@fracfontsetup{%
  \smaller[3]\addfontfeature{FakeBold=1}}


\def\dekfraccsimple{% \label{2292}
  \let\dekfracc@args\gmu@dekfraccsimple
}
\@ifXeTeX{\def\dekfraccslash{\char"2044 }}
{\def\dekfraccslash{/}} % You can define it as the fraction slash,
% %%%%% \nlpercent|\char"2044 |\ilrr
\dekfraccsimple

% \changes{v0.81}{2007/05/13}{moved here from \pk{pmlectionis.cls}}


% A~macro that  acts like |\,| (thin and unbreakable space) except it
% allows hyphenation afterwards:

\newcommand*\ikern{\,\penalty\@M\hskip\z@skip\relax}
%\changes{v0.82}{2007/07/17}{added}

% And a~macro to forbid hyphenation of the next word:
\pdef\nohy{\leavevmode\kern0sp\relax}
\pdef\yeshy{\leavevmode\penalty\@M\hskip\z@skip}
% In both of the above definitions `0sp' not |\z@| to allow their
% writing to and reading from files where @ is `other'. 




% \subdivision{\cs{include} not only \file{.tex}'s}
% |\include| modified by me below lets you to include files of any
% extension provided that extension in the argument. 
% 
% If you want to |\include| a~non-\file{.tex} file and deal with it
% with |\includeonly|, give the latter command full file name, with
% the extension that is.
%
\def\gmu@getext#1.#2\@@nil{%\UnDef
  \def\gmu@filename{#1}%\UnDef
  \def\gmu@fileext{#2}}

\def\include#1{\relax
  \ifnum\@auxout=\@partaux
  \@latex@error{\string\include\space cannot be nested}\@eha
  \else \@include#1 \fi}

\def\@include#1 {%
  \gmu@getext#1.\@@nil
  % \UnDef
  \ifx\gmu@fileext\empty\def\gmu@fileext{tex}\fi
  \clearpage
  \if@filesw
    \immediate\write\@mainaux{\string\@input{\gmu@filename.aux}}%
  \fi
  \@tempswatrue
  \if@partsw
    \@tempswafalse
    \edef\reserved@b{#1}%
    \@for\reserved@a:=\@partlist\do{%
      \ifx\reserved@a\reserved@b\@tempswatrue\fi}%
  \fi
  \if@tempswa
    \let\@auxout\@partaux
    \if@filesw
      \immediate\openout\@partaux \gmu@filename.aux
      \immediate\write\@partaux{\relax}%
    \fi
    \@input@{\gmu@filename.\gmu@fileext}%
    \inclasthook
    \clearpage
    \@writeckpt{\gmu@filename}%
    \if@filesw
      \immediate\closeout\@partaux
    \fi
  \else
% If  the file is not included, reset |\@include| |\deadcycles|, so that a
% long list of non-included files 
% does not generate an `Output loop' error.
    \deadcycles\z@
    \@nameuse{cp@\gmu@filename}%
  \fi
  \let\@auxout\@mainaux}


\newcommand\whenonly[3]{%
  \def\gmu@whonly{#1,}%
  \ifx\gmu@whonly\@partlist\afterfi{#2}\else\afterfi{#3}\fi}

% I~assume one usually includes chapters or so so the last page style
% should be closing.
\def\inclasthook{\thispagestyle{closing}}

% \subdivision{Switching on and off parts of one file}
%
% The |\include| facility is very nice only it forces you to split
% your source in many files. Therefore I~provide a~tool analogous to
% |\include| and using the same |\includeonly| mechanism/list to
% switch on and off parts of the same source file.
%
\def\filepart#1{\relax
  \ifnum\@auxout=\@partaux
  \@latex@error{\string\filepart\space cannot be nested}\@eha
  \else\afterfi{\@filepart#1 }\fi}

\def\@filepart#1 {%
  \clearpage
  \edef\gmu@filepartname{#1}% we'll use it later
  \if@filesw
    \immediate\write\@mainaux{\string\@input{#1.aux}}%
  \fi
  \@tempswatrue
  \if@partsw
    \@tempswafalse
    \@for\reserved@a:=\@partlist\do{%
      \ifx\reserved@a\gmu@filepartname\@tempswatrue\fi}%
  \fi
  \if@tempswa
    \let\@auxout\@partaux
    \if@filesw
      \immediate\openout\@partaux #1.aux
      \immediate\write\@partaux{\relax}%
    \fi
    \@xa\@firstoftwo
    % \label{spart:iftrue}
  \else
% If  the file is not included, reset |\@include| |\deadcycles|, so that a
% long list of non-included files 
% does not generate an `Output loop' error.
    \deadcycles\z@
    \@nameuse{cp@\gmu@filepartname}%
    \let\@auxout\@mainaux
    \@xa\@secondoftwo
  \fi
  {\iftrue}%
  {\let\endfilepart\fi
    \csname gm@skipped@#1\endcsname
    \def\next{\RestoreMacro\endfilepart
      \@ifnextchar\bgroup{\show\NextBgroup\@gobble}{}}%
    \@xa\next\iffalse}%
}


\DeclareCommand\endfilepart{b}{% Note the argument is  not used really. Maybe later we'll
  % use it for checking of proper matching. Or maybe not.
  \inclasthook
  \clearpage
  \@writeckpt{\gmu@filepartname}%
  \if@filesw
  \immediate\closeout\@partaux
  \fi
  \fi% this |\fi| closes |\Iftrue| put by line \ref{spart:iftrue}.
  \let\@auxout\@mainaux
}

\StoreMacro\endfilepart

\def\nofileparts{%
  \let\filepart\@gobble
  \DeclareCommand\endfilepart{b}{}%
}

% \subdivision{Fix of including when \pk{fontspec} is used}
% The \pk{fontspec} package creates counters for font families. If
% a~\pk{fontspec} command is used in a~part of a~document and then
% such a~part is skipped, an error occurs ‘No counter zf@fam@…
% defined’. Now we fix that by ensuring all the counters are defined
% before they are set.
%
% Note it's a~draft version which doesn't support resetting of one counter
% within another.

\def\includecountfix{%
  \def\@wckptelt##1{%
    \immediate\write\@partaux{%
      \providecounter{##1}% to
      % provide the font counters defined
      % in parts of the document.
      \string\setcounter{##1}{\the\@nameuse{c@##1}}}}%
}

\pdef\providecounter#1{%
  \unless\ifcsname c@#1\endcsname\newcounter{#1}\fi}


% \subdivision{Faked small caps}

\def\gmu@scapLetters#1{%
  \ifx#1\relax\relax\else% two |\relax|es to cover the case of empty |#1|.
    \ifcat a\@nx#1\relax
      \ifnum\the\lccode`#1=`#1\relax
        {\fakescapscore\MakeUppercase{#1}}% not Plain |\uppercase|
                                % because that works bad with \pk{inputenc}.
      \else#1%
      \fi
    \else#1%
    \fi%
    \@xa\gmu@scapLetters
  \fi}%
%
\def\gmu@scapSpaces#1 #2\@@nil{%
  \ifx#1\relax\relax
  \else\gmu@scapLetters#1\relax
  \fi
  \ifx#2\relax\relax
  \else\afterfi{\ \gmu@scapSpaces#2\@@nil}%
  \fi}
%
\def\gmu@scapss#1\@@nil{{\def~{{\nobreakspace}}%
    \gmu@scapSpaces#1 \@@nil}}%|% \def\\{{\newline}}\relax|
% adding redefinition of |\\| caused stack overflow.  Note it
% disallows hyphenation except at |\-|.

\pdef\fakescaps#1{{\gmu@scapss#1\@@nil}}

\let\fakescapscore\gmu@scalematchX

% Experimente z~akcentami patrz no3.tex.
\def\tinycae{{\tiny\AE}}% to use in |\fakescaps[\tiny]{…}|

\RequirePackage{calc}

% wg |\zf@calc@scale| pakietu \pk{fontspec}.

\@ifpackageloaded{fontspec}{%
  \def\gmu@scalar{1.0}%
  \def\zf@scale{}%
  \def\gmu@scalematchX{%
    \begingroup
      \ifx\zf@scale\empty\def\gmu@scalar{1.0}%
      \else\let\gmu@scalar\zf@scale\fi
      \setlength\@tempdima{\fontdimen5\font}% 5---ex height
      \setlength\@tempdimb{\fontdimen8\font}% 8---\XeTeX\ synthesised
      % uppercase height.
      \divide\@tempdimb by1000\relax
      \divide\@tempdima by\@tempdimb
      \setlength{\@tempdima}{\@tempdima*\real{\gmu@scalar}}%
      \gm@ifundefined{fakesc@extrascale}{}{%
        \setlength{\@tempdima}{\@tempdima*\real{\fakesc@extrascale}}}%
      \@tempcnta=\@tempdima
      \divide\@tempcnta by 1000\relax
      \@tempcntb=-1000\relax
      \multiply\@tempcntb by\@tempcnta
      \advance\@tempcntb by\@tempdima
      \xdef\gmu@scscale{\the\@tempcnta.%
        \ifnum\@tempcntb<100 0\fi
        \ifnum\@tempcntb<10 0\fi
        \the\@tempcntb}%^^A{\strip@pt\@tempdimc}%
%^^A      \typeout{**** \gmu@scscale}%
    \endgroup
    \addfontfeature{Scale=\gmu@scscale}%
  }}{\let\gmu@scalematchX\smallerr}

\def\fakescextrascale#1{\def\fakesc@extrascale{#1}}
 

% \subdivision{See above/see below}
% To generate a~phrase as in the header depending of whether the
% respective label is before of after.
\newcommand*\wyzejnizej[1]{%
  \edef\gmu@tempa{\gm@ifundefined{r@#1}{\arabic{page}}{%
      \@xa\@xa\@xa\@secondoftwo\csname r@#1\endcsname}}%
  \ifnum\gmu@tempa<\arabic{page}\relax wy\.zej\fi
  \ifnum\gmu@tempa>\arabic{page}\relax ni\.zej\fi
  \ifnum\gmu@tempa=\arabic{page}\relax \@xa\ignorespaces\fi
}

%\subdivision{\env{luzniej} and \env{napapierki}---environments used\
%  in page breaking for money}
%
% \QueerEOL
% The name of first of them comes from Polish typesetters' phrase
% ``rozbija\cacute\ [sk\l ad] na papierki''---`to broaden [leading] with
% paper scratches'.

\def\napapierkistretch{0,3pt}% It's quite much for 11/13pt leading.

\def\napapierkicore{\advance\baselineskip%
  by 0ptplus\napapierkistretch\relax}


% ^^A % \catcode`\^^D\active \def^^D{\traceon}
% ^^A % \catcode`\^^E\active \def^^E{\traceoff\gmshowlists}
% ^^A \catcode`\^^D=9
% ^^A \catcode`\^^E=9
\DeclareEnvironment{napapierki}{s}{%
  % \chgs{2009/01/05 v0.98 added optional star controlling globalness}
  \par\IfValueT{#1}{\global
  }%
  \napapierkicore}
{%
  \par
  \IfValueT{#1}{\global\baselineskip=1\baselineskip\relax
  }%
}% so that you can use  \inverb|\napapierki*›…\endnapapierki*|
% in interlacing environments.



\newcount\gmu@luzniej

\newcommand*\luzniejcore[1][1]{%
  \advance\gmu@luzniej\@ne% We use this count to check whether we open
  % the environment or just set |\looseness| inside it again.
  \ifnum\gmu@luzniej=\@ne  \multiply\tolerance by 2 \fi
  \looseness=#1\relax}

% After |\begin{luzniej}| we may put the optional argument of
% |\luzniejcore| 
\newenvironment*{luzniej}{\par\luzniejcore}{\par}


% The starred version sets |\looseness| in |\everypar|, which has its advantages
% and disadvantages.\nostanza
\newenvironment*{luzniej*}[1][1]{%
  \multiply\tolerance by 2\relax
  \everypar{\looseness=#1\relax}}{\par}

\newcommand*\nawj{\kern0,1em\relax}% a~kern to be put between
% parentheses and letters with descendants such as $j$ or $y$ in
% certain fonts.
%
% The original |\pauza| of \pk{polski} has the skips rigid (one is
% even a~kern). We make the skips flexible. Moreover, our |\pauza|
% begins with |\ifhmode| to be usable also at the beginning of a~line
% where it  marks a~part of a~dialogue.

\def\pauza@skipcore{\hskip0.2em plus0.1em\relax
  \pauzacore
  \@ifnextchar,{% 2009/11/22 added a special case of a comma following pauza
  }{\hskip.2em plus0.1em\relax\ignorespaces}}%
%
\def\ppauza@skipcore{\unskip\penalty10000\hskip0.2em plus0.1em\relax
          \ppauza@dash\hskip.2em plus0.1em\ignorespaces}
% 

\AtBeginDocument{%
  \pdef\pauza{%
    \ifhmode
      \unskip\penalty10000
      \hskip0.2em plus0.1em\relax
      \pauzacore\hskip.2em plus0.1em\relax\ignorespaces%
    \else
      \pauzadial
    \fi}%
  % 
  % According to \tytul{Instrukcja technologiczna.\ Skład ręczny ^^B
  %   i~maszynowy} the dialogue dash (in Polish) should be followed by
  % a~rigid hskip of \dekfracc1/2\,em.
  \pdef\pauzadial{%
    \leavevmode\pauzacore\penalty10000\hskip0,5em\ignorespaces}
  % 
  % And a~version with no space at the left, to begin a~|\noindent|ed
  % paragraph explaining e.g.\ a~quotation:
  \pdef\lpauza{%
    \leavevmode
    \pauzacore\hskip.2em plus0.1em\ignorespaces}%
  % 
  % We define |\ppauza| as an en dash surrounded with thin stretchable
  % spaces and sticking to the upper line or bare but discretionary
  % depending on the next token being space${}_10$. Of course you'll
  % never get such a~space after a~literal \CS so an explicit |\ppauza|
  % will always result with a~bare discretionary en dash, but if we
  % |\let–\ppauza|…
  % \stanza
   \pdef\ppauza{%
    \ifvmode    \PackageError{gmutils}{%
      command \bslash ppauza (en dash) not intended for vmode.}{%
      Use \bslash ppauza (en dash) only in number and numeral ranges.}%
    \else
      \unskip\discretionary
      {\ppauza@dash}{\ppauza@dash}{\ppauza@dash}%
    \fi}%
}% of at begin document

\ifdefined\XeTeXversion
%
\AtBeginDocument{% to be independent of moment of loading of \pk{polski}.
  \pdef\—{%
    \ifhmode
      \unskip\penalty10000
      \afterfi{%
        \@ifnextspace{\pauza@skipcore}%
        {\@ifnextchar,{\pauza@skipcore}% a special case of comma added 2009/11/22
          {\@ifnextMac{\pauza@skipcore}%
            {\pauzacore\penalty\hyphenpenalty\hskip\z@skip}}}%
      }% of |\afterfi|'s argument
      \else
    % \nostanza According to \tytul{Instrukcja technologiczna.\ Skład ręczny ^^B
    % i~maszynowy} the dialogue dash should be followed by a~rigid
    % hskip of \dekfracc1/2\,em.\nostanza
      \leavevmode\pauzacore\penalty10000\hskip0,5em\ignorespaces
    \fi}%
  % The next command's name consists of letters and therefore it eats
  % any spaces following it, so |\@ifnextspace| would always be
  % false, therefore we don't use it.\nostanza 
  \pdef\–{%
    \ifvmode    \PackageError{gmutils}{%
      command \bslash ppauza (en dash) not intended for vmode.}{%
      Use \bslash ppauza (en dash) only in number and numeral ranges.}%
    \else
      \afterfi{%
        \@ifnextspace{\ppauza@skipcore}{%
          \@ifnextMac\ppauza@skipcore
          {\unskip\discretionary
            {\ppauza@dash}{\ppauza@dash}{\ppauza@dash}}}%
      }%
    \fi
  }%
  % 
  \def\emdash{\char`\—}
}% of at begin document 

\def\longpauza{\def\pauzacore{—}}
\longpauza
\def\shortpauza{% 
  \def\pauzacore{\hbox{–\kern,23em\relax\llap{–}}}}%
\def\ppauza@dash{–}%


\else % not \XeTeX
\def\longpauza{\def\pauzacore{---}}
\longpauza
\def\shortpauza{% 
  \def\pauzacore{--\kern,23em\relax\llap{--}}}%
\def\ppauza@dash{--}%


\fi% of if \XeTeX.



% If you have all the three dashes on your keyboard (as I~do), you may want to use
% them for short instead of |\pauza|, |\ppauza| and |\dywiz|. The
% shortest dash is defined to be smart in math mode and result with
% $-$.
\ifdefined\XeTeXversion
\foone{\catcode`—\active \catcode`–\active \catcode`-\active}{%\label{not@ifundef}
  \def\adashes{\AtBeginDocument\adashes}% because |\pauza|
  % is defined at begin document.
  \AtBeginDocument{\def\adashes{%
      \catcode`—\active \def—{\—}%
      \catcode`–\active \def–{\–}%
      % ^^A        \catcode`-\active \let-\gmu@dywiz
      \addtomacro\dospecials{\do\–\do\—}%
      \addtomacro\@sanitize{\@makeother\–\@makeother\—}%
      \addtomacro\gmu@septify{\do\–13\do\—13\relax}%
}}}
\else
\relaxen\adashes
\fi


% The hyphen shouldn't be active \IMHO\ because it's used in \TeX\
% control such as |\hskip-2pt|. Therefore we provide the |\ahyphen|
% declaration reluctantly, because sometimes we need it and always use
% it with caution. Note that my active hyphen in vertical and math
% modes expands to |-|\catother.

\def\gmu@dywiz{\ifmmode-\else
  \ifvmode-\else\afterfifi\dywiz\fi\fi}%

\foone{\catcode`-\active}{% aktivnyj diefis aktywny dywiz active hyphen
    \def\ahyphen{\let-\gmu@dywiz\catcode`\-\active}}


% To get current time. Works in \eTeX s, including \XeTeX. |\czas|
% typesets \czas\ and |\czas[:]| typesets \czas[:].
\newcommand*\czas[1][.]{%
  \the\numexpr(\time-30)/60\relax#1%
  \@tempcnta=\numexpr\time-(\time-30)/60*60\relax
  \ifnum\@tempcnta<10 0\fi\the\@tempcnta}


\@ifXeTeX{%
  \pdef\textbullet{% \changes{v0.94}{2008/10/3}{the \XeTeX\
    % version enriched with \cs{iffontchar} due to lack of bullets
    % with the default settings reported by Morten H\o{}gholm and Edd Barrett}
    \iffontchar\font"2022 \char"2022 \else\ensuremath{\bullet}\fi}%
  % 
  \pprovide\glyphname#1{% \changes{v0.96}{2008/11/12}{moved here from
    % my private document class}
    \XeTeXglyph \numexpr\XeTeXglyphindex "#1"\relax\relax}% since
                                % \XeTeX\ … \incs{numexpr} is redundant.
}
{\def\textbullet{\ensuremath{\bullet}}}

\newenvironment*{tytulowa}{\newpage}{\par\thispagestyle{empty}\newpage}

% To typeset peoples' names on page 4 (the editorial page):
\def\nazwired{\quad\textsc}




% \subdivision{Typesetting dates in my memoirs}

% A~date in the |YYYY-MM-DD| format we'll transform into  
% `\acro{DD mmmm YYYY}' 
% format or we'll just typeset next two tokens/|{…}| if the
% arguments' string begins with |--|. The latter option is provided to
% preserve compatibility with already used macros and to avoid
% a~starred version of |\thedate| and the same time to be able to turn
% |\datef| off in some cases (for \file{SevSev04.tex}).
\pdef\polskadata{%
  \DeclareCommand\gmu@datefsl{%
    Q{0123456789\bgroup}>iT{/-} % (1) year
    Q{0123456789\bgroup}>iT{/-} % (2) month
    Q{0123456789\bgroup} % (3) day
    T{,} K{##1\gmu@datefsl} % (4, 5) additional stuff after comma
  }{%
      \IfValueF{##2}{\PutIfValue{##3}}%
      \IfValueT{##2}{%
        \@tempcnta=0##3\relax\the\@tempcnta
        \ifcase##2\relax\or\ stycznia\or\ lutego%
        \or\ marca\or\ kwietnia\or\ maja\or\ czerwca\or\ lipca\or\ sierpnia%
        \or\ września\or\ października\or\ listopada\or\ grudnia\else
        {}%
        \fi}%
        \IfValueT{##1}{\space ##1}%
        \PutIfValue{##4}\IfValueT{##5}{ ##5}%
      }% of \incs{gmu@datefsl}.
  }% of |\polskadata|

\polskadata

% For documentation in English:
\pdef\englishdate{%
  \DeclareCommand\gmu@datefsl{%
    Q{0123456789\bgroup}>iT{/-} % (1) year
    Q{0123456789\bgroup}>iT{/-} % (2) month
    Q{0123456789\bgroup} % (3) day
    T{,}  K{##1\gmu@datefsl} % (4, 5) additional stuff after comma
  }{%
    \IfValueF{##2}{\PutIfValue{##3}}%
    \IfValueT{##2}{%
      \ifcase##2\relax\or January\or February%
        \or March\or April\or May\or June\or July\or August%
        \or September\or October\or November\or December\else
        {}%
      \fi}%
    \space
    \@tempcnta=##3\relax\the\@tempcnta,
    \IfValueT{##1}{ ##1}%
    \PutIfValue{##4}\IfValueT{##5}{ ##5}%
  }% of \incs{gmu@datefsl}.
}%



% Dates for memoirs to be able to typeset them also as diaries.
\newif\ifdate
% ^^A|%\newcounter{dateinsection}[section]|
\pdef\bidate#1{%
  \gmu@datefsl#1\gmu@datefsl
}

\pdef\linedate{\gm@ifstar\linedate@@\linedate@}
\pdef\linedate@@#1{\linedate@{--{}{}#1}}
\pdef\linedate@#1{\par
  \linedate@hook{#1}%
  \ifdate\addvspace{\dateskipamount}%
  \possvfil% if we put it before |\addvspace|, the v-space is always added.
  \date@line{\footnotesize\itshape \bidate{#1}}%
  \nopagebreak
  \else%|%\ifnum\arabic{dateinsection}>0\dekbigskip\fi|
    \addvspace{\bigskipamount}\possvfil
  \fi}% end of |\linedate|.
  
\let\linedate@hook\@gobble

\let\dateskipamount\medskipamount
  
\pdef\rdate{\let\date@line\rightline \linedate}
  
  
\def\date@left#1{\par{%
    \raggedright#1%
    \leftskip\z@skip
    % ^^A     \hangindent\z@skip
    % ^^A     \hangafter\z@
    % ^^A     \parshape\z@
    % ^^A~wycinam, bo gryzło się z~floatingfigure.
    \@@par}}%

\pdef\ldate{%\changes{v0.94}{2008/09/06}{\cs{leftline}
  % replaced with \cs{par}…\cs{par} to work well with \pk{floatflt}}
  \let\date@line\date@left
  \linedate}

\newcommand*\runindate[1]{%
  \paragraph{\footnotesize\itshape \gmu@datef#1\gmu@datef}%
  \stepcounter{dateinsection}}
% I'm not quite positive which side I~want the date to be put to so
% let's |let| for now and we'll be able to change it in the very documents.
\let\thedate\ldate


\pdef\zwrobcy#1{\emph{#1}} %ostinato, allegro con moto,
                                %garden party etc., także kompliment

\pdef\tytul#1{\emph{#1}}


% Maszynopis w~świecie justowanym zrobi delikatną
% chorągiewkę. (The \env{maszynopis} environment will make a~delicate
% ragged right if called in a~justified world.)
\newenvironment{maszynopis}[1][]{#1\ttfamily
  \hyphenchar\font=45\relax% this assignment is global for the font.
  \@tempskipa=\glueexpr\rightskip+\leftskip\relax
  \ifdim\gluestretch\@tempskipa=\z@ 
  \tolerance900
  % \nostanza it worked well with tolerance \equals 900.\nostanza
  \advance\rightskip by\z@ plus0,5em\relax\fi
  \fontdimen3\font=\z@% we forbid stretching spaces…\par\nostanza\gmdnoindent
  %|%  \fontdimen4\font=\z@| but allow shrinking them.\nostanza
  \hyphenpenalty0 % not to make \TeX\ nervous: in a~typewriting this
  % marvellous algorithm of hyphenation should be turned off and every
  % line broken at the last allowable point.
  \StoreMacro\pauzacore
  \def\pauzacore{-\rlap{\kern-0,3em-}-}%
}{\par}



\pdef\justified{%
  \leftskip=1\leftskip% to preserve the natural length and discard
  % stretch and shrink.
  \rightskip=1\rightskip
  \parfillskip=1\parfillskip
  \advance\parfillskip by 0sp plus 1fil\relax
  % ^^A~\lastlinefit=700
  \let\\\@normalcr}

% To conform Polish recommendation for typesetting saying that
% a~paragraph's last line leaving less than |\parindent| should be
% stretched to fill the text width:\nostanza
\DeclareCommand\fullpar{%
  T{+-}%
  Q{+-0123456789} % optional looseness (most probably negative)
}{%
  \begingroup
  \IfValueT{#1}{\looseness=#1\IfValueTF{#2}{#2}{1}\relax
    \multiply\tolerance by \tw@
  }%
  \fullparcore
  \par
  \endgroup}

\pdef\fullparcore{%
  \hunskip
  \parfillskip\z@skip}


% To conform Polish recommendation for typesetting that says that the
% last line of a~paragraph has to be 2|\parindent| long at least. The
% idea is to set \cs{parfillskip} naturally rigid and long as
% |\textwidth-2\parindent|, but that causes non-negligible shrinking
% of the
% inter-word spaces so we provide a~declaration to catch the proper
% glue where the parindent is set (e.g.\ in footnotes parindent is 0\,pt) 
\newcommand*\twoparinit{% the name stands for `\emph{last} paragraph
  % line's length \emph{min}imum \emph{two} \incs{parindent}.
  \def\twopar@defts{%
    \hsize-\leftskip-\rightskip-\fontcharwd\font`…}%
  \def\twopar@atleast{2\@parindent}%
  \DeclareCommand\twopar{%
    T{+-}% (1) you can specify loosening the paragraph by one only by
         % typing single |+| and tightening by one by typing single |-|.
    Q{+-0123456789}% (2)
    A{\twopar@atleast}% (3)
    >iT{\cipolagwa}}{%
    \begingroup
    \IfValueT{##1}{%
      \looseness=##1\IfValueTF{##2}{##2}{1}\relax
      \multiply\tolerance by2
    }%
    \twoparcore<##3>%
    \par
    \endgroup
  }% of \incmd\twopar.
  % \stanza
  \ifdefined\XeTeXversion
    \DeclareCommand\twoparcore{%
      A{\twopar@atleast}>iT{\cipolągwa}}{%
      \hunskip % it's \ac{O.K.} it's in a~group, it'll work anyway.
      \edef\gmu@tempa{\the\dimexpr\twopar@defts-##1\relax}%
      \parfillskip=\glueexpr\gmu@tempa minus \gmu@tempa
      \relax% to delimit |\glueexpr|.
      \relax% to delimit the assignment.
    }%
  \else % not \XeTeX---doesn't use |\fontcharwd|.
    \DeclareCommand\twoparcore{%
      A{\twopar@default}>iT{\cipolagwa}}{%
      \hunskip % it's \ac{O.K.} it's in a~group, it'll work anyway.
      {\setbox0=\hbox{\dots}%
        \xdef\gmu@tempa{\the\wd0}}%
      \edef\gmu@tempa{%
        \the\dimexpr\hsize-\leftskip-\rightskip
        -\gmu@tempa-2\@parindent\relax}%
      \parfillskip=\glueexpr\gmu@tempa minus \gmu@tempa
      \relax% to delimit |\glueexpr|.
      \relax% to delimit the assignment.
    }%
  \fi
  % \stanza
  \AtBeginDocument{%
    \unless\ifdefined\@parindent
      \newskip\@parindent
      \@parindent=\parindent
    \fi
    \def\restoreparindent{\parindent\@parindent}%
  }% of \cmd\AtBeginDocument.
}% of \cs{twoparinit}.




% \subdivision{For dati under poems}
% Or explanations under results of \pk{time}.

\DeclareCommand\wherncore{om}{%\
  % \begin{enumargs}
  %   \dc optional value of \incs{hskip} of (left) indent of the parbox. If
  %   absent, parbox is aligned right;
  % \dc text for the datum parbox.
  % \end{enumargs}
  \IfValueTF{#1}{\leftline{%
      \whernfont
      \hskip#1\relax\parbox
      {\dimexpr\textwidth-\leftskip-\rightskip-#1}%
      {#2}% of |\parbox|,
    }% of |\leftline|,
  }% of |ValueT{#1}|.
  {% |ValueF{#1}|:
    \rightline
    {\whernfont
      \whern@parbox{#2}%
    }% of |\rightline|,
    \setprevdepth
  }% of |ValueF{#1}|,
}% of |\wherncore|.


\DeclareCommand\whern@parbox{%
  S{\leftskip\rightskip}% horizontal alignment of resulting box (the
  % side to be ragged)
  O{t} % vertical alignment of parbox
  >is % separator
  O{0,7666\textwidth} % (3) width of parbox
  m % (4) parbox contents
}{%
  % \begin{enumargs}
  %   \dc S the skip of the ragged side,
  %   \dc the |\parbox|'s contents.
  % \end{enumargs}
  \parbox[#2]{#3}{%
    \IfValueTF{#1}{#1}{\leftskip}=0sp plus \textwidth
    \parfillskip0sp\relax
    \let\\\linebreak
    \disobeylines
    \whernfont #4\unskip\strut\endgraf
    \getprevdepth
  }% of |\parbox|,
}% of |\whern@parbox|.
  
\def\whern{%
  \endgraf\nopagebreak
  \gm@ifstar{\wherncore}%
  {\vskip\whernskip\wherncore}}

\let\whernfont\footnotesize

\newskip\whernskip
\whernskip2\baselineskip minus 2\baselineskip\relax

\DeclareCommand\whernup{%
  o % a~vskip before
  >is % separating star (ignored)
  o  % (2) custom width of parbox
  >Pm}{\par
  \IfValueT{#1}{\vskip#1\relax}%
  \leftline{%
    \IfValueTF{#2}{\whern@parbox\rightskip[b][#2]}%
    {\whern@parbox\rightskip[b]}%
    {#3}%
  }%
  \setprevdepth
  \nopagebreak\relax
  \@ifenvir{quote}{\noindent\ignorespaces}{}}



%\subdivision{Thousand separator}

\pdef\thousep#1{% a~macro that'll put the thousand separator between
  % every two three-digit groups.\par\nostanza
  % First we check whether we have at least five digits.
  %\changes{v0.93}{2008/08/23}{added}
  \gmu@thou@fiver#1\relax\relax\relax\relax\relax% we put five
  % \incs{relax}es after the parameter to ensure the string will meet
  % \incs{gmu\+@\+thou\+@\+fi\+ver}'s definition.\ilrr
  \gmu@thou@fiver{#1}{% if more than five digits:
    \emptify\gmu@thou@put
    \relaxen\gmu@thou@o\relaxen\gmu@thou@i\relaxen\gmu@thou@ii
    \@tempcnta\z@
    \gmu@thou@putter#1\gmu@thou@putter
    \gmu@thou@put
  }}

\def\gmu@thou@fiver#1#2#3#4#5\gmu@thou@fiver#6#7{% this macro only
  % checks if the text delimited with itself consists of at least five tokens/braces
  \ifx\relax#5\relax\@xa\@firstoftwo
  \else\@xa\@secondoftwo
  \fi{#6}{#7}}

\def\gmu@thou@putter#1#2{% we are sure to have at least five tokens
  % before the sentinel \incs{gmu@thou@putter}.
  \advance\@tempcnta\@ne
  \@tempcntb\@tempcnta
  \divide\@tempcntb3\relax
  \@tempcnta=\numexpr\@tempcnta-\@tempcntb*3
  \edef\gmu@thou@put{\@xau{\gmu@thou@put}\unexpanded{#1}%
    \ifx\gmu@thou@putter#2\else
      \ifcase\@tempcnta
        \gmu@thou@o\or\gmu@thou@i\or\gmu@thou@ii% all three
        % \CSes are yet  \incs{relax} so we may put them in
        % an \incs{edef} safely.\ilrr
      \fi
    \fi}% of \cs{edef}
  \ifx\gmu@thou@putter#2% if we are at end of the digits…
    \edef\gmu@tempa{%
      \ifcase\@tempcnta
        \gmu@thou@o\or\gmu@thou@i\or\gmu@thou@ii
      \fi}%
    \@xa\let\gmu@tempa\gmu@thousep% … we set the proper \CS…
  \else% or …
    \afterfi{%  iterate.
      \gmu@thou@putter#2}% of \cs{afterfi}
  \fi% of if end of digits.
}% of \cs{gmu@thou@putter}.

\def\gmu@thousep{\,}% in Polish the recommended thousand separator is
% a~thin space.
%
% So you can type |\thousep{7123123123123}| to get
% \thousep{7123123123123}. But what if you want to apply |\thousep| to
% a~count register or a~|\numexpr|? You should write one or two
% |\expandafter|s and |\the|. Let's do it only once for all:

\pdef\xathousep#1{\@xa\thousep\@xa{\the#1}}
% Now write |\xathousep{\numexpr 10*9*8*7*6*120}| to get
% \xathousep{\numexpr 90*8*7*6*120}. 

\def\shortthousep{%
  \DeclareCommand\thous{Q{+-0123456789}}{%
    % we declare it as a command with Q-type argument to allow spaces
    % between digits.
    \ifmmode\hbox\bgroup\@gmu@mmhboxtrue\fi
    \IfValueTF{##1}{% we are given a sequence of digits
      \@tempcnta=##1\relax
      \ifnum\@tempcnta<0 $-$%
        \@tempcnta=-\@tempcnta
      \fi
      \xathousep\@tempcnta
      \if@gmu@mmhbox\egroup
      \else\@xa\spifletter
      \fi
    }%
    {% no bare digits given, then we assume the argument is braced.
      \thousep
    }%
  }% of |\thous|.
}% of |\shortthousep|.
%
% And now write \shortthousep |\thous 3628800| to get \thous 3628800 even with
% a~blank space (beware of the range of \TeX's counts).


% \subdivision{\pk{hyperref}'s \cs{nolinkurl} into \cs{url*}}

\def\urladdstar{%
  \AtBeginDocument{%
    \@ifpackageloaded{hyperref}{%
      \StoreMacro\url
      \pdef\url{\gm@ifstar{\nolinkurl}{\storedcsname{url}}}%
    }{}}}

\@onlypreamble\urladdstar


% \subdivision{Footnotes suggested by Andrzej Tomaszewski}

\DeclareCommand\ATfootnotes{s}{% \chgs{2008/11/29 v0.98 moved here
  % from my own private macro package to allow the beauty of these
  % footnotes for the general audience} 
  % \stanza
  % We make the footnote mark in the footnote |\scriptsize| not
  % |\scriptscriptsize|.\nostanza
  \IfValueT{#1}% the following setting is suitable for old style
  % numbers in footnote marks, therefore I~place it in the starred
  % version of the command.
  {\prependtomacro\gmu@ATfootnotes{%
      \pdef\@makefnmark{%
        \mbox {\normalfont \textsuperscript {\smaller[3]\@thefnmark }}}%
    }% of prepend,
  }% of |\IfValueT|.
  % 
  \gmu@ATfootnotes
  \gmu@AT@ampulex\maketitle% without \pk{hyperref}
  \ifdefined\HyOrg@maketitle
    \afterfi{\gmu@AT@ampulex\HyOrg@maketitle}% with \pk{hyperref}
  \fi
}

\pdef\gmu@AT@ampulex#1{%
  \ampulexdef#1{\def\@makefnmark}%
  \if@twocolumn
  {\gmu@ATfootnotes\if@twocolumn}% Ampulex redefinition of
  % \incs{maketitle} for the standard classes.
  \ampulexdef#1{\long\def\@makefntext}%
  \if@twocolumn{\gmu@ATfootnotes\if@twocolumn}% Ampulex redefinition
  % of \incs{maketitle} for \pk{mwcls}.
}

\pdef\gmu@ATfootnotes{%
  % And we make the footnote number not be in superscript but on the
  % base line, according to Andrzej Tomaszewski's suggestion on
  % Bacho\TeX\ 2008, and the same size as in the footnote mark.\nostanza
  \long\pdef\@makefntext##1{%
    \ifdefined\@parindent \parindent\@parindent
    \else \parindent 1em\relax
    \fi
    \indent{\ATf@font\scriptsize% ^^A \hphantom{19}\llap
      {\@thefnmark}}%
    \gmu@fnhook
    \enspace\ignorespaces##1}%
}

\let\ATf@font\normalfont

\emptify\gmu@fnhook

\pdef\rrthis{% ‘rag right this’: make only the current paragraph
  % ragged right (e.g.\ if the paragraph consists of a~long \ac{URL}).
  % \chgs{2008/12/01 v0.98 added}
  \begingroup\rightskip=0sp plus \hsize \endgraf\endgroup}

\pdef\centerthis{% 2009/12/15
  \begingroup
  \rightskip=1\rightskip plus \hsize
  \leftskip=1\leftskip plus\hsize
  \parfillskip=\z@skip
  \endgraf\endgroup}


\def\balsmiley#1 {}% to balance parentheses and brackets in
                % smileys. \balsmiley( ;-) \inverb|\balsmiley( ;-)|
% \chgs{2008/12/9 v0.98 moved here from my personal macro package
% since I~needed it in the documentation of \pk{gmutils}}. 
%^^A The \pk{wasysym} package defines \incs{smiley} as it should be, a~smiley
%^^A that is.

\long\pdef\scantnoline#1{%  ‘rescan tokens without adding line end’
  {\endlinechar\m@ne\scantokens{#1}}}
% \chgs{2008/12/14 v0.98 added}

% \subdivision{A~fix to the \pk{url} package}
%
% It happened that a~\ac{URL}s typeset with the |\url| command of the
% \pk{url} package came out sort of spaced because kerning was off
% because of the math mode. So I~provide a~redefinition of the
% internal macros of the \pk{url} package which in my version uses not math mode but
% |\scantokens| and not |\relpenalty| and |\binoppenalty| but
% |\hyphenpenalty| (as it is in the paragraph) and
% |\discretionary|. I~tried putting explicit penalties after the
% symbols but that spoiled kerning.
%
% The rules of line breaking are somewhat different, too: in the original \pk{url}
% package line breaks are forbidden between any two symbols listed in
% |\UrlBigBreaks|.  In  my version line breaks are
% forbidden between any two \emph{identical} ‘\ac{URL} Breaks’ and
% ‘\ac{URL} Big Breaks’. 
%
% There are some more differences in formatting some chars, i.a.\ |~|,
%  |%| and angle brackets which I~don't treat specially and just take from font
% assuming the font provides \ac{ASCII} chars and checking whether it
% provides the angle brackets.
%
\@ifXeTeX{%
  \pdef\UrlFix{\AtBeginDocument{%
      \@ifpackageloaded{url}{\gm@UrlFix}{}}%
    \relaxen\UrlFix}%
  %
  \AtBeginDocument{%
    \pdef\UrlFix{%
      \@ifpackageloaded{url}{\gm@UrlFix}{}%
      \relaxen\UrlFix}}%
}
{%
  \pdef\UrlFix{\PackageWarning{gmutils}{!!! The \string\UrlFix\space
      declaration works only with XeTeX}}%
}


\@ifXeTeX{}{%
  \edef\gmu@restoreUpUpUp{\catcode`\@nx\^^^=\the\catcode`\^^^}%
  \AtEndOfPackage\gmu@restoreUpUpUp
  \catcode`\^^^=9 }
  
\def\gm@UrlFix{%
  % \stanza
  % default style assignments
  \def\UrlBreaks{\do\.\do\@\do\\\do\/\do\!\do\_\do\|\do\;\do\]%
    \do\)\do\,\do\?\do\'\do\"\do\+\do\=\do\#\do\%\do\~\do\_\do\|%
    \do\{\do\}\do\$}%
  \def\UrlBigBreaks{\do\:}%
  \def\UrlNoBreaks{\do\(\do\[\do\{}%
  \def\UrlSpecials{%
    \do\ {\hbox{\visiblespace}}\do\^^M{\hbox{\visiblespace}}}%
  % \stanza
  % 
  % \stanza
  \def\Url@Format##1{%
    \UrlFont 
    \ifdefined\verbatim@specials
      \catcode`\>\active
      \verbatim@specials
      \verbatim@mathhack
    \fi % setting of
    % the escape char, begin and end group and optionally math shift,
    % defined in \pk{gmverb}.
    \gm@UrlSetup 
    \UrlLeft
    \edef\gmu@theendlinechar{\the\endlinechar}%
    \endlinechar\m@ne
    \kern\z@% to forbid hyphenating the first word if the \ac{URL}
    % begins with a~word
    \hyphenchar\font=\UrlHyphenchar\relax
    \let\-\gmu@discretionaryhyphen
    \scantokens{##1}%
    \endlinechar\gmu@theendlinechar\relax
    \UrlRight
  }% of |\Url@Format|.
  % \stanza
  \edef\UrlHyphenchar{%
    \ifdefined\gmv@hyphenchar\gmv@hyphenchar
    \else"A6 \fi}% \label{UrlHyphenchar} broken bar, |¦| or the same as
  % provided in \pk{gmverb} for verbatims. You
  % can redefine it as you please. This char is used as the
  % hyphenation char in \ac{URL}s and therefore should be different
  % from |-| (hyphen), which is often a part of an \ac{URL}. The
  % broken bar seems to be quite unlikely in \ac{URL}s and/or file
  % names.
  % \stanza
  \def\verbatim@mathhack{%
    \ifdefined\verbatim@specials@list
      \@xa\verbatim@mathhack@\verbatim@specials@list
    \fi
  }%
  % \stanza
  \def\verbatim@mathhack@##1##2##3##4##5##6{%
    \IfValueT{##4}{%
      \edef\gmu@thinmuskip{\the\thinmuskip}%
      \edef\gmu@medmuskip{\the\medmuskip}%
      \edef\gmu@thickmuskip{\the\thickmuskip}%
      \begingroup
      \lccode`\~=`##4\lowercase{%
        \endgroup\def~####1~}%
      {$\thinmuskip\gmu@thinmuskip\relax
        \medmuskip\gmu@medmuskip\relax
        \thickmuskip\gmu@thickmuskip\relax
        ####1%
        $}%
      \catcode`##4\active
    }%
  }%
  %\stanza
  \def\gm@UrlSetup{%
    \medmuskip\Urlmuskip \thickmuskip\medmuskip \thinmuskip0mu%
    \relpenalty\UrlBigBreakPenalty \binoppenalty\UrlBreakPenalty
    % ^^A     \exhyphenpenalty\@M % seems not to work.
    % ^^A     \hyphenpenalty\@M
    \def\do{\gmu@doUrlMath\UrlBreakPenalty}\UrlBreaks % bin
    % (\incs{hyphenpenalty} anyway)
    \def\do{\gmu@doUrlMath\UrlBigBreakPenalty}\UrlBigBreaks % rel
                                % (\incs{hyphenpenalty} anyway)
    \def\do{\gmu@doUrlMath\@M}\UrlNoBreaks % open (no break)
    \def\do{\gmu@doUrlMathAc\UrlBreakPenalty}% (\incs{hyphenpenalty})
    \UrlSpecials
    \if \iffontchar\font"2329 1\else0\fi\iffontchar\font"232A 1\else2\fi
    % \nostanza we check whether the font provides both left and right
    % angle brackets. \nostanza
      \gmu@measurewd{^^^^2329}%
      \edef\gmu@tempa{%
        \@nx\gmu@doUrlMathAc\@M\@nx\<{%
          \hbox to\gmu@tempb{\unexpanded{\hss\char"2329 \hss}}}%
        }\gmu@tempa
      \gmu@measurewd{^^^^232a}%
      \edef\gmu@tempa{%
        \@nx\do\@nx\>{%
          \hbox to\gmu@tempb{\unexpanded{\hss\char"232A \hss}}}%
        }\gmu@tempa
    \else
      \gmu@doUrlMathAc\@M\<{\langle}\do\>{\rangle}%
    \fi
    \iffontchar\font"22C6 % low star
      \do\*{\hbox{\char"22C6 }}% 
    \else \do\**% 
    \fi
    \ifx\do@url@hyp\@empty
      \gmu@measurewd{-}% this macro is defined in line \ref{@measurewd}. 
      \edef\gmu@tempa{%
        \unexpanded{\gmu@doUrlMathAc\@M\-}%
        {\hbox to \gmu@tempb{\unexpanded{\hss-\hss}}%
          \@nx\-}% hyphen is a
        % good point for hyphenation, but the hyphenation char should
        % be sth. else, and it is indeed: |¦| (broken bar,
        % |\char"A6|). See also line \ref{UrlHyphenchar}
      }\gmu@tempa
    \fi
    \addfontfeature{Ligatures=NoCommon, Mapping=none}% instead of
    % ‘doing’ \incs{ver\+bat\+im\+@\+no\+lig\+@\+list}.
    % ^^A     \let\do\set@mathnolig \verbatim@nolig@list  % prevent ligatures
  }% of |\gm@UrlSetup|.
  % \stanza
  % ^^A   \def\gmu@UrlBreakPenalty{\gobble{\penalty\UrlBreakPenalty\relax}}%
  % ^^A   \def\gmu@UrlBigBreakPenalty{\gobble{\penalty\UrlBigBreakPenalty\relax}}%
  % ^^A   \def\gmu@Url@M{\gobble{\penalty\@M\relax}}%
  % 
  % \stanza
  \def\gmu@doUrlMath##1##2{%\
    % \begin{enumargs}
    % \item value of the penalty (used as a~Boolean: if $<$
    % \thous 10000, \nlperc\cs{hyphenpenalty} will be used anyway, if $\ge$
    % \thous10000, there will be no \incs{discretionary}),
    % \item the char, given as |\⁄<char>|.
    % \end{enumargs}
    % ^^A     % \begin{enumargs}
    % ^^A     % \item a~type information macro that expands to |\gobble{⁄«penalty»}|,
    % ^^A     % \item the char, given as |\⁄<char>|.
    % ^^A     % \end{enumargs}
    % ^^A\gmu@measurewd{##3}%
    \begingroup 
    \lccode`\~=`##2\lowercase{%
      \endgroup\def~{\@ifnextchar~}%
      \@xa\addtomacro\@xa~}% of |\lowercase|.
    \ifnum##1<\@M
    {%
      {\char`##2\csname gmu@dbl\string##2kern\endcsname}% if next is  the same char
      {\ifmmode\char`##2% else
        \else\gmu@urlbreakable{##1}{##2}%
        \fi}%
    }% of |\addtomacro|'s argument |\ifnum| true.
    \else
    {%
      {\char`##2\csname gmu@dbl\string##2kern\endcsname}{\char`##2}%
    }% of |\addtomacro|'s argument |\ifnum| false.
    \fi
      \catcode`##2=\active
    }% of |\gmu@doUrlMath|.
  % \stanza
  \def\gmu@doUrlMathAc##1##2##3{%\
    % \begin{enumargs}
    % \item  (value of) a~penalty (see the remark to \inverb|##1| of
    % the previous macro),
    % \item the char (as |\⁄<char>|),
    % \item the definition.
    % \end{enumargs}
    \begingroup 
    \lccode`\~=`##2\lowercase{%
      \endgroup\def~{\@ifnextchar~}%
      \@xa\addtomacro\@xa~}% of |\lowercase|.
    \ifnum ##1<\@M
    {%
      {\ifmmode\char`##2\else$##3\m@th$\fi}%
      {\ifmmode\char`##2%
        \else\discretionary{\hbox{$##3\m@th$}}{}{\hbox{$##3\m@th$}}%
        \fi}%
    }% of |\addtomacro|'s argument if num true.
    \else
    {%
      {\ifmmode\char`##2\else$##3\m@th$\fi}{\ifmmode\char`##2\else$##3\m@th$\fi}%
    }% of |\addtomacro|'s argument if num false.
    \fi
    \catcode`##2=\active
  }% of |\gmu@doUrlMathAc|.
  % \stanza
  \pdef\gmu@url@rigidbreak##1##2{\discretionary{\char`##2}{}{\char`##2}}%
  % \stanza
  \pdef\gmu@url@flexbreak##1##2{\penalty\@M \hskip\z@ plus0,03em
    \char`##2\penalty##1\hskip\z@ plus0,03em\relax}% 
  % \stanza
  \let\gmu@urlbreakable\gmu@url@flexbreak
  % \stanza
  \def\Url@z##1{%
    %  Do any hyper referencing due to hyperref (or perform a url-def)
    \Url@HyperHook
    % Now do the formatting in a group (can also have \incs{Url@HyperHook} take
    % this as an argument). \nostanza
    {\Url@Format{##1}}%
    \endgroup}%
  % \stanza
  \DeclareUrlCommand\file{\urlstyle{sf}}%
  % \stanza
  \emptify\Url@moving% with our settings |\url| is pretty allowed in
  % moving arguments, I~hope.
}% of |\gmu@UrlFix|.

\DeclareCommand\UrlSlashKern{O{tt}m}%
{\AtBeginDocument{%
    \@nameedef{url@#1style}{\def\@nx\UrlFont{%
        \@xa\@nx\csname#1family\endcsname
        \def\@xa\@nx\csname gmu@dbl\string\/kern\endcsname
        {\kern#2\relax}%
        % ^^A        \hyphenchar\font=124
      }% of |\UrlFont|
    }% of |\url#1style|
    \urlstyle{#1}%
  }% of |\AtBeginDocument|
}% of |\UrlSlashKern|




% \division{Conditional tilde}
%
% Polish typesetting standards say that for 12 dd and 10 dd \<czcionki>
% if leading is narrower that 3\dekfracc1/2 \<kwadratu>, $ 3\dekfracc1/2 × 48$dd,
% then hanging letters are allowed, which also applies to 8 and 6 dd
% \<czcionki> in less than 3 \<kwadraty> leading. I~treat this
% recommendation not strictly but as an inspiration, that is
% I~translate »dd« to »pt«.

\def\TrzaskaTilde{%
  \@xa\DeclareCommand\@xa\gm@smarttilde
  \@xa{\@xa S\@xa{\all@stars~}}{%
    \IfValueTF{##1}{\nobreakspace{}}%
    {\ifdim\dimexpr\hsize-\leftskip-\rightskip
      -\ifdim\hangindent<\z@-\fi\hangindent % the last
      % parameter is used with respect to the \pk{floatflt} package.
      >%
        \ifdim\f@size pt>\dimexpr10pt-1sp\relax
          168dd
        \else
          144dd
        \fi
        \nobreakspace {}%
      \else
        \ %
      \fi
    }% of |\gm@ifstar|'s else,
  }% of |\gm@smarttilde|,
  \let~\gm@smarttilde
}% of |\TrzaskaTilde|.


\pdef\getprevdepth{%
  \endgraf
  \xdef\setprevdepth{\prevdepth=\the\prevdepth\relax}%
}

% \division{Storing the catcode of line end}
\def\StoreCatM{%
  \protected\edef\RestoreCatM{%
    \catcode`\@nx\^^M=\the\catcode`\^^M\relax}%
}

\pdef\RestoreCatM{\PackageE{gmutils}{first store the catcode of
    ^\empty^\empty M with \string\StoreCatM.}%
}

% \division{A~really empty page}
% Copied from Marcin Woliński's macros.
% 

\newcommand{\clearemptydoublepage}{%
        \newpage{\pagestyle{empty}\cleardoublepage}}


\DeclareCommand\setspaceskip{%
  A{}% optional factor for all three components
  O{\fontdimen2\font}%
 >is
 O{\fontdimen3\font}%
 >is
 O{\fontdimen4\font}}
{\spaceskip=#1#2plus#1#3minus#1#4\relax}

\foone\obeylines{% 
  \def\disobeylines{% for arguments in which line end is active to
    % simulate normal behaviour
    \ifnum\catcode`\^^M=\active%
      \pdef^^M{\@ifnextgroup{\ifhmode\unskip\space\fi}{\gmu@disMinner}}%
      \def\gmu@disMinner##1{%
        \ifx^^M##1\endgraf%
        \else\afterfi{\ifhmode\unskip\space\fi}\fi##1}%
    \fi}%
}


%^^A\def\gmu@lowstarfake{*}


\def\makestarlow{%
  \begingroup\lccode`\~=`\*\lowercase{%% \Define**
    \endgroup\def~{\gmu@lowstar}}% 2009/10/19  |\let| changed to
  % \inverb|\def| to allow redefinitions of \incmd\gmu@lowstar.
  \catcode`\*=\active
  \defLowStarFake
}

\DeclareCommand\defLowStarFake{%
  Q{+-0123456789,.}{0,5}% fraction of fontchar depth of the star glyph
}%
{%
  \def\gmu@lowstarfake{%
    \leavevmode\vbox{\hbox{*}\kern#1\fontchardp\font`*}%
  }%
}


\def\gmu@lowstarfake{*} % useful for next command where normal star is
% low.


% The |\*| \CS and active |*| should be defined different to make them
% distinguishable by tests, especially with |\gm@ifstar| in
% mind. 

\DeclareCommand\*{Q{0123456789}{1}}
% \label{def:gmu@star}
{\gmu@star@loop0{#1}}

\def\gmu@star@loop#1#2{% this is an expandable loop as in The
   % \eTeX\ Manual p.~9.
   \ifnum#1<\numexpr#2\relax%
     \gmu@lowstar
     \@xa\gmu@star@loop
     \@xa{\number\numexpr#1+1\@xa}%
     \@xa{\number#2\@xa}%
   \fi}


  
\endinput
%
% \ChangesGeneral
%
% \changes{v0.70}{06/10/20}{Package renamed to \pk{gmutils} from
% \pk{gmlpatch}. As my \protect\TeX\ Guru remarked rightly, the
% previous name might suggest there was sth.\ wrong with \LaTeX\ which
% was not my intention}
%
% \changes{v0.74}{2006/11/28}{Added macros to make sectioning commands
% of \pk{mwcls} and standard classes compatible. Now my sectionings
% allow two optionals in both worlds and with \pk{mwcls} if there's
% only one optional, it's the title to toc and running head not just
% to the latter}
%
% \changes{v0.76}{2007/03/10}{A~`fixing' of \cs{dots} was rolled back
% since it came out they were \acro{O.K.} and that was the \acro{QX} encoding that
% prints them very tight}
%
% \changes{v0.77}{2007/04/13}{\cs{afterfi} \& pals made two-argument
% as the Marcin Woli\nacute ski's analogoi are. At this occasion some
% redundant macros of that family are deleted}
% 
% \changes{v0.78}{2007/04/26}{\cs{@namelet} renamed to \cs{n@melet}
% to solve a~conflict with the \pk{beamer} class. The package contents
% regrouped}
%
% \changes{v0.85}{2007/11/16}{fixed behaviour of too clever headings
% with \pk{gmdoc} by adding an \cs{ifdim} test}
%
% \changes{v0.87}{2008/08/03}{the package goes \eTeX\ even more,
% making use of \cs{ifdefined} and the code using \acro{UTF-8} chars is
% wrapped in a~\XeTeX-condition}
%
% \changes{v0.89}{2008/08/04}{removed obsolete adjustment of \pk{pgf}
% for \XeTeX}
%
% \changes{v0.91}{2008/08/06}{removed \cs{jobnamewoe} since
% \cs{jobname} is always without extension. \cs{xiispace} forked to
% \cs{visiblespace} \cs{let} to \cs{xxt@visiblespace} of \pk{xltxtra}
% if available. The documentation driver integrated with the \file{.sty} file}
%
% \changes{v0.93}{2008/08/21}{A~couple of \cs{DeclareRobustCommand*}
% changed to \cs{pdef}}
%
% \changes{v0.93}{2008/08/29}{The numerical macros commented out as
% obsolete and never really used}
%
% \changes{v0.94}{2008/09/08}{\cs{bgroup} and \cs{egroup} in the
% macro storing commands and in \cs{foone} changed to \cs{begingroup}
% and \cs{endgroup} since the former produce an empty \cs{mathord} in
% math mode while the latter don't}
%
% \changes{v0.94}{2008/10/4}{The code from ancient \pk{xparse} (1999) of \TeX
% Live 2007 rewritten here}
%
% \changes{v0.94}{2008/10/4}{removed \cs{unex@namedef} and
% \cs{unex@nameuse}, probably never really used since they were
% incomplete: \cs{edef@other} undefined}
%
% \toCTAN{2008/11/21 v0.96}
%
%
% \PrintChanges\PrintIndex
%\NoEOF

% (For my GNU Emacs:)
%%% Local Variables: 
%%% mode: doctex
%%% coding: utf-8
%%% mode: flyspell
%%% ispell-local-dictionary: "british"
%%% End: 

% LocalWords:  xedekfraccplain dekfraccsimple doif ifnif sptoken xifnif lowstar
% LocalWords:  dc oC soC oarg parg Ps LocalWords ifnextgroup xifncat ifncat xaS
% LocalWords:  ifnextsingle seQuence activespace dofakeonum smarttilde prevdp
% LocalWords:  reserveda fileext filepart tempswatrue partsw tempswafalse gmu
% LocalWords:  tempswa filename filepartname partlist mainaux writeckpt nameuse
% LocalWords:  prependtomacro xefraccdef xefracc mmhbox selectfont cepstnof
% LocalWords:  reservedb tempd SMglobal smtempa SMglobalfalse MacroSt fontscale
% LocalWords:  quotedstring getfontdata getfontscale getfontstring fontstring
% LocalWords:  numeratorkern denominatorkern fracfontsetup maxnum minnum
% LocalWords:  extremnum firstofmany normalcr tempcnta currfont reservedc
% LocalWords:  maybestripcomma twocolumn thefnmark makefnmark ATfootnotes
% LocalWords:  reservedd reservede
