%% 
%% \iffalse ^^A we skip the debug setting
\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{}
%% \fi
%% ^^A $Id: TheUltimateMaster.gmd,v 0.297 2011/02/02 18:13:11 natror Exp natror $
%% This is file “gmmeta.sty” generated with the DocStrip utility.
%% 
%%
%% The original source files were:
%%
%% gmutils/gmutils.gmd  (with options: `meta')
%%
%% 
%% Copyright ©  
%% by Grzegorz ‘Natror’ Murzynowski
%% natror (at) o2 (dot) pl
%% 
%% This program is subject to the LaTeX Project Public License.
%% See http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
%% for the details of that license.
%%
%% LPPL status: "author-maintained".
%%
%% 
%% 
%% For the documentation please refer to the file(s)
%% gmutils.{gmd,pdf}.
%% 
%% 
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{gmmeta}
    [2010/10/24 v0.993 meta-symbols for typesetting macros and arguments (GM)]


%%
%%
%%     ^^A\typeout{\unexpanded{#4}}%%
\RequirePackage{gmcommand}
\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.
    #1\/%
  }%
  {\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!85!black}}

\def\meta@font@select{\meta@fontsetting\it}

\def\<#1>{\meta{#1}}

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

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

\def\printspaces#1{{\let~=\vs \let\ =\vs \gmu@pswords#1 \@nil}}
\def\gmu@pswords#1 #2\@nil{%
  \ifx\relax#1\relax\else#1\fi
  \ifx\relax#2\relax\else\vs\penalty\hyphenpenalty\gmu@pswords#2\@nil\fi}% note

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

\def\gmu@discretionaryslash{\discre{/}{\hbox{}}{/}}% the second

\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}


\pdef\pk#1{\textsf{#1}}

\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.
  % \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}%
}% of |\cs|

\pdef\cs@inner#1#2{%
  #1#2%
  \endgroup}

\def\narrativett{\ttfamily}% such name because I~introduce it to

\long\pdef\env{\cs[]}

\foone{\@makeother\^}
  {\pdef\hathat{\cs[^^]}}

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

\def\possfil{\hfil\penalty1000\hfilneg}

\def\possvfil{\vfil
  \penalty\numexpr
  \gmu@minnum{\clubpenalty+\widowpenalty}{9999}%
  \relax % eaten by |\gmu@maxnum|
  \relax % eaten by |\numexpr|
  \vfilneg}


\long\def\cmd#1{\@xa\cs\@xa{\@xa\cmd@to@cs\string#1}\spifletter}% it has to be

\def\cmd@to@cs#1#2{\char\number`#2\relax}

\pdef\marg#1{{\narrativett\type@lbrace}\arg@wrap{#1}{\narrativett\char`\}}}

\pdef\oarg{\@ifnextchar[\@oargsq\@oarg}
\pdef\@oarg#1{{\narrativett[}\arg@wrap{#1}{\narrativett]}}
\pdef\@oargsq[#1]{\@oarg{#1}}

\pdef\parg{\@ifnextchar(\@pargp\@parg}
\def\@parg#1{{\narrativett(}\arg@wrap{#1}{\narrativett)}}
\def\@pargp(#1){\@parg{#1}}

\pdef\aarg{\@ifnextchar<\@aarga\@aarg}
\def\@aarg#1{{\narrativett<}\arg@wrap{#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|

\def\arg@wrap{\meta}

\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)
  T{\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 lines \ref{queer.group} and \ref{queer.group2}.
            \spifletter
          }%
        }%
      }%
      \@xa \next
    \fi
  }% of not egroup
}% of  |\arg@dc|

\foone{\obeylines\@makeother\^^C}{%
  \AtBeginDocument{%
    \let\math@arg\arg %
    \pdef\arg{% This is |\arg| for meta-arguments.
      \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|,
  %
  % \stanza
  % And this is arg-typesetting command for verbatim arguments.
  \pdef\argv{%
    \begingroup %
    % \label{queer.group2}
    \@makeother\^^C%
    \pdef\arg@wrap##1{%
      \narrativett{##1}%
    }%
    \ifdefined\@ifQueerEOL\@ifQueerEOL{%
        \def^^M{\unskip\space}% in the ‘queer’ \ac{EOL}s scope we
        % keep line end active… as above
      }{}%
    \fi % of |\ifdefined|
    \arg@dc}%
}% of |\foone|.


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

\pdef\CS{% \changes{v0.99n}{2008/08/30}{added}
  \acro{CS}%
  \@ifnextcat a{ }{}}% we put a~space if the next token is

\pdef\CSs{\CS{}es\@ifnextcat a{ }{}}% for pluralis.
\pdef\CSes{\CS{}es\@ifnextcat a{ }{}}% for pluralis.


\endinput
%%
%% End of file `gmmeta.sty'.
