diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex')
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmRCS.sty | 73 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmampulex.sty | 217 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmbase.sty | 2724 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmcommand.sty | 2164 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmenvir.sty | 141 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmlogos.sty | 221 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmmeta.sty | 295 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmmw.sty | 368 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmnotonlypream.sty | 93 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmparts.sty | 169 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmrelsize.sty | 84 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmtypos.sty | 2027 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmurl.sty | 306 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/gmutils/gmutils.sty | 7203 |
14 files changed, 8980 insertions, 7105 deletions
diff --git a/Master/texmf-dist/tex/latex/gmutils/gmRCS.sty b/Master/texmf-dist/tex/latex/gmutils/gmRCS.sty new file mode 100644 index 00000000000..814896937b8 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmRCS.sty @@ -0,0 +1,73 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmRCS.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `RCS') +%% +%% +%% 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{gmRCS} + [2010/10/24 v0.993 (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + + +\def\ParseRCSVersion$Id% +: #1.#2,v #3 #4 #5 #6 #7${% + \def\RCSFileName{#1}% + \def\RCSFileExt{#2}% + \def\RCSFile{#1.#2}% + \def\RCSVersion{#3}% + \def\RCSDate{#4}% + \def\RCSTime{#5}% + \def\RCSAuthor{#6}% +} + + +\def\defRCSeDatum +#1% datum name +#2% datum definition (basically |#|number) +{% + \@namedef{eRCS#1}$Id% + : ##1.##2,v ##3 ##4 ##5 ##6 ##7${#2}% +} + +\defRCSeDatum{File}{#1.#2} % |\eRCSFile| +\defRCSeDatum{Version}{#3}% |\eRCSVersion| +\defRCSeDatum{Date}{#4}% |\eRCSVDate| +\defRCSeDatum{Time}{#5}% |\eRCSVTime| +\defRCSeDatum{Author}{#6}% |\eRCSVAuthor| + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmRCS.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmampulex.sty b/Master/texmf-dist/tex/latex/gmutils/gmampulex.sty new file mode 100644 index 00000000000..432b2ee2201 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmampulex.sty @@ -0,0 +1,217 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmampulex.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `ampulex') +%% +%% +%% 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{gmampulex} + [2010/10/24 v0.993 Ampulex Compressa-like modifier of macros (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + +\RequirePackage{gmcommand} + +\DeclareCommand\ampulexlet\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. + T{\def\edef\gdef\xdef\pdef}{\def} % (2) (optional) kind of definition; if + % not specified, \incmd\def\ will be used. + m % (3) macro to be let to, + m % (4) macro to provide the definition, + O{} % (5) \cs{def}'s parameters string; empty by default, + O{} % (6) definition body's parameters to be taken in a~one-step + % expansion of the redefined macro; empty by default; the + % undelimited parameters should be double-braced here. + m % (7) start token(s), + m % (8) end token(s) + m % (9) the replacement of |#7|, |#8| and whatever between them. +}{%^^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 + % + \long\def\gmu@ampulexlet@resa + ##1#7% we put |#7| as a delimiter + ##2#8% we put |#8| as a delimiter + ##3\gmu@AmpulexDelimiter{% + % We use a special (undefined) \CS |\gmu@AmpulexDelimiter| as + % the final delimiter because standard \LaTeX's |\@nil| isn't + % probably a good idea since we + % want to ampulex deep \LaTeX's macros and other |\gmu@›…| + % macros too. + \gmu@ifempty{##3}% + }% + % Now |\gmu@ampulexlet@resa| is redefined to produce an open |\gmu@ifempty| + % depending on whether the start and end token(s) are found in the + % meaning of \inverb|#4|. + % + % Before we proceed, we deal with a difficulty with a special case + % when |#6| is “|#1|”, which occurs because of stripping braces of a + % single-brace argument. + \gmu@ifutokens{#6}{##1}% + {\def\ampulex@Args{{% + ####1}}% + }% + {\edef\ampulex@Args{\@nx\unexpanded{% + \unexpanded{#6}}}}% + \long \def\gmu@ampulexlet@resc##1{% + \@xa\@xa\@xa\@xa \@xa\@xa\@xa\gmu@ampulexlet@resa + \@xa\@xa\@xa#4% + \ampulex@Args + ##1% this parameter will be substituted with |#7#8| in + % line~\ref{resc1} and with emptiness in line~\ref{resc2}. + \gmu@AmpulexDelimiter + }% + % + \gmu@ampulexlet@resc{#7#8}%\label{resc1} % ^^V \gmu@ampulexlet@resb + % We've just applied the checker and it produces an open + % |\gmu@ifempty{⁄<some tokens>}| + % if the delimiters are found in the meaning of |#4| + % so, if \<some tokens> are none, we issue a warning + {% + \PackageWarning{gmampulex}{% + \@nx#4 doesn't contain tokens + \detokenize{#7} nor \detokenize{#8}. You better check if this is + what you want to redefine.^^J% + \@nx#4 is^^J% + \meaning#4^^J% + }}% + % and we proceed if they are really some + {% + % We define a~temporary + % macro with the parameters delimited with the `start' and `end' parameters + % of \incs{ampulexdef}. It has to stand a double |\edef|. + \edef\gmu@ampulexlet@resa{% + \long\def\@nx\gmu@ampulexlet@resa + ####1\unexpanded{#7}% + ####2\unexpanded{#8}% + ####3\@nx\gmu@AmpulexDelimiter{% + \@nx\unexpanded{####1}% + % we drop the part between the |#7| and |#8| delimiters + % (including delimiters) + \unexpanded{\unexpanded{#9}}% we replace the part of the + % redefined macro's meaning with the replacement text. + \@nx\unexpanded{####3}% + }% of inner |\gmu@ampulexlet@resa| + }% of outer |\gmu@ampulexlet@resa| + \gmu@ampulexlet@resa + % Now |\gmu@ampulexlet@resa| carries the modifier of |#4|'s + % definition. + % + % +\unless\ifx\czat#4% + \edef\gmu@ampulexlet@resb{% double definition for double hashes of expanded + % |\unexpanded{#1›…}| + #1#2% + \@nx#3\unexpanded{#5}{% + \gmu@ampulexlet@resc{}%\label{resc2} + % Here we are sure the tokens sequences + % |#7| and |#8| are in the one-level expansion of |#4| so we don't pass them + % as sentinels (which \ac{BTW} would totally spoil the redefinition, what it + % did indeed 2010/6/23). + }% of |#3|'s definition body + }% of inner |\gmu@ampulexlet@resb| + \gmu@ampulexlet@resb +\else + \gmu@ifxany#2{\gdef\xdef}{\global}{}% + #1\edef#3#5{\gmu@ampulexlet@resc{}}%\label{resc2} +\fi + }% of if the delimiters were found in the meaning. +}% of |\ampulexlet| + +\DeclareCommand\ampulexdef\long{% + % \chgs{2010/04/22 v0.994 rewritten not to use the arguments 7–9 + % explicitly not to wrap them in a temporary macros, and to accept + % single hashes (instead of quadruple) in arguments 5 and 6. The + % temporary macros renamed + % to \cmd\gmu@reserveda and \cmd\gmu@reservedb. The body moved to + % \cmd\ampulexlet with adding another \CS argument to let let a + % macro not necessarily redefine it itself and this command made a + % particular case of that new one} +#1 Q{\outer\long\global\protected}{} % (1) as |\ampulexlet| +#2 T{\def\edef\gdef\xdef\pdef}{\def} % (2) ad |\ampulexlet| +#3 m % (3) macro to be redefined, +#4 O{} % (4) as |\ampulexlet|'s |#5|, +#5 O{} % (5) as |\ampulexlet|'s |#6|, +#6 m % (6) start token(s), +#7 m % (7) end token(s), +#8 m % (8) the replacement +}{% + \DCUse\ampulexlet{#1}{#2}{#3}{#3}{#4}{#5}{#6}{#7}{#8}% +} + + + +\def\gmu@ENumLoop#1#2{% this is a~fully expandable loop generating |#2|${}-{}$|#1| + % space tokens (cf. The % \eTeX\ Manual p.~9). + \ifnum#1<#2 % + \gmu@tempa + \@xa\gmu@ENumLoop + \@xa{\number\numexpr#1+1\@xa}% + \@xa{\number#2\@xa}% + \fi}% of |\gmu@hashes|. + +\long\def\defENumLoop +#1% the loop macro's name +#2% the replacement of |\gmu@tempa| +{% + \ampulexlet#1\gmu@ENumLoop + [##1##2][{##1}{##2}]% + \gmu@tempa\@xa{#2\@xa}% + % + \ampulexdef#1% + [##1##2][{##1}{##2}]% + \gmu@ENumLoop\@xa{#1\@xa}% +} + +\edef\GenericInfoToTerminal{% + \unexpanded{% + \@XA{\ampulexlet\protected\long\GenericInfo}\csname + GenericInfo \endcsname[#1#2][{#1}{#2}]% + \write\m@ne % we replace the token between these with: + {\write\ifnum\tracingonline>\z@ \@unused\else\m@ne\fi}% + }% +} + +\ampulexdef\@starttoc[#1][#1]\makeatletter\@input{\makeatletter\NamedInput} + + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmampulex.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmbase.sty b/Master/texmf-dist/tex/latex/gmutils/gmbase.sty new file mode 100644 index 00000000000..9e0bba08753 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmbase.sty @@ -0,0 +1,2724 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmbase.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `base') +%% +%% +%% 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{gmbase} + [2010/10/24 v0.993 some tricky low-level macros (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + +\ifx\XeTeXversion\relax + \let\XeTeXversion\@undefined% If someone earlier used +\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. + +\let\@xa\expandafter +\let\@nx\noexpand + +\def\@xanx{\@xa\@nx} + +\long\def\@xadef#1{\@xa\def\@xa#1\@xa} + +\long\def\@csn#1{\csname #1\endcsname} + +\long\def\Name#1#2{\@xa#1\csname #2\endcsname} + +\long\def\@xau#1{\unexpanded\@xa{#1}} + +\def\gmu@firstandspace#1{#1 } + +\long\def\strip@bslash#1{% + \gmu@ifempty{#1}{}{% + \gmu@if {cat}{\@nx~\@nx#1}% this is specially for an active + % backslash (have you ever met it?). Thanks to this special case + % the inner macro declared for an active |\| by |\DeclareCommand| + % is |\\\| not |\\csname\endcsname\|. + {\string#1}% if |#1| is active + {% + \@xa\@xa\@xa\ifnum\@xa\@xa\@xa\escapechar + \@xa\@xa\@xa=\@xa\@xa\@xa`\@xa\gmu@firstandspace + \string#1\else\string#1\fi + }% if |#1| is not active + }% of if |#1| not empty +} + + + +\long\def\bslash@or@ac#1{% + \ifcat\@nx~\@nx#1% + \else + \bslash + \fi + \strip@bslash{#1}% +} + +\long\def\@xanxcs#1{% + \ifcat\@nx~\@nx#1% + \@nx#1% + \else + \@xa\@nx\csname #1\endcsname + \fi +} + +\long\def\@xaucs#1{% + \unexpanded\@xa\@xa\@xa{\csname #1\endcsname}% +} + +\long\def\@xanxtri#1{% + \ifcat\@nx~\@nx#1% + \@nx#1% + \else + \@xa\@nx\csname \strip@bslash{#1}\endcsname + \fi +} + +\def\pdef{\protected\def} + +\def\lpdef{\long\protected\def} +\let\pldef\lpdef + +\def\pedef{\protected\edef} + +\def\pxdef{\protected\xdef} + +\long\def\gobble#1{} +\let\@gobble\gobble +\let\gobbletwo\@gobbletwo % it's a \LaTeX's |\long| macro (in File d: + +\long\def\@gobbleeight#1#2#3#4#5#6#7#8{} + +\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 |\def|-assignment + % to absorb possible prefixes. + \@gobble} + +\def\pprovide{\protected\provide} + +\long\def\@nameedef#1#2{% \changes{v0.93}{2008/08/30}{added} + \@xa\edef\csname#1\endcsname{#2}} + + +\pdef\gmu@DefSymbol#1{% + \unless\ifdefined#1% + \def#1{#1}% + \fi +} + +\long\def\gmu@if#1#2{% + \ifnum\strcmp{incsname}{\detokenize{#1}}=\z@ + \@xa\@xa\@xa\ifincsname + \@gobble\fi % this |\fi| balances the conditional when false + \else + \csname if#1\@xa\endcsname + \fi + #2\@xa\@firstoftwo\else\@xa\@secondoftwo\fi +} + +\long\def\gmu@notif#1#2{% + \gmu@if {#1}{#2}% + \@secondoftwo\@firstoftwo +} + +\def\gmu@ifsw #1{\gmu@if {#1}{}} +\def\gmu@notsw #1{\gmu@notif {#1}{}} + +\long\def\gmu@unless #1#2{% + \ifnum\strcmp{incsname}{\detokenize{#1}}=\z@ + \@xa\@xa\@xa\unless \@xa\@xa\@xa\ifincsname + \@gobble\fi % this |\fi| balances the conditional when it's not + % |\ifincsname| + \else + \@xa\unless \csname if#1\@xa\endcsname + \fi + #2\@xa\@firstoftwo\else\@xa\@secondoftwo\fi +} + + +\lpdef\@iwru@EC#1#2#3{% + \@iwrum{#1»{#2}« »#3«}% + \gmu@passbraced{#1{#2}}{#3}% +} + +\long\def\gmu@generalCASE +#1% Testing macro (|\gmu@if| etc. +#2% |#1| of the testing macro +#3% |#2| of the testing macro +#4% |#3| of the testing macro (what if test satisfied)\\ +{% + #1{#2}{#3}% + {% + \gmu@EatCases{#4}}{}% +} + +\long\def\gmu@EatCases +#1% +#2\gmu@ESAC +{#1} + +\let\gmu@lastCASE\gmu@EatCases + +\def\gmu@CASE {\gmu@generalCASE \gmu@if } +\def\gmu@CASEnot {\gmu@generalCASE \gmu@notif } +\def\gmu@CASExany {\gmu@generalCASE \gmu@ifxany } +\def\gmu@CASExnone {\gmu@generalCASE \gmu@ifxnone } + +\long\def\gmu@reserved@firstofmany#1#2\gmu&nil{#1} + +\long\def\ifsingletoken#1{% ^^V \gmu &nil % such a strange delimiter to + % make it work both in letter and + % other |@| scopes etc.\ (|&| seems to + % me recatcoded rather seldom) + \ifnum \strcmp{\unexpanded{#1}}% + {\@xau{\gmu@reserved@firstofmany #1\blekotnizza@ \di \broccoli + \gmu&nil}% + }% of right text of |\strcmp| + =\z@ +} + +\long\def\gmu@predetokstring #1{% + \gmu@if {num} + {% + % After a couple of hours of debug I reached the proper test which + % is given below. The goal is to (expandably!) check whether |#1| + % is braced and/or begins with a blank space. In any of those + % cases we don't hit it('s first token) with |\string|. + % + % |\@firstofone| strips outermost pair of braces if any and + % gobbles the lading blank(s) if any so the detokenised strings + % will differ. + \strcmp + {\detokenize{#1x}}% + {\detokenize\@xa{\@firstofone #1x}}=\z@ + }% of test + {\@xa{\string#1}} + {{#1}}% +} + + +\long\def\ifstrings#1#2{% + \ifnum\strcmp + {\detokenize\gmu@predetokstring{#1x}}% + {\detokenize\gmu@predetokstring{#2x}}=\z@ +} + + +\long\def\ifstribs#1#2{% + \ifnum\strcmp{\strip@bslash{#1}}{\strip@bslash{#2}}=\z@ +} + + +\long\def\ifStrX#1#2{% + \gmu@CASEnot {x}{#1#2}% + {\iffalse}% if tokens are x-unequal, all is clear. + % + \gmu@CASEnot x {\@undefined#1} + {\iftrue}% + % + % some (i.e.\ \emph{both}) tokens are-x |\@undefined| or |\relax|, + % then + \gmu@CASE {strings}{#1#2}% + {\iftrue}% + % + \gmu@lastCASE + {\iffalse}% + \gmu@ESAC +} + +\long\def\firstofone#1{#1} + +\long\def\bracefirstofone#1{{#1}} + +\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\@twoofthree#1#2#3{#1#2} +\long\def\@secondoffive#1#2#3#4#5{#2} + +\long\def\@firstofmany#1#2\@nil{#1} + +\long\def\@secondofmany#1#2#3\@nil{#2} + +\long\def\@allbutfirstof#1#2\@nil{#2} + + + + +\def\longafterfi{% + \long\def\afterfi##1##2\fi{\fi##1}} +\longafterfi +\long\def\afterfifi#1#2\fi#3\fi{\fi\fi#1} +\long\def\afteriffifi#1#2\fi#3\fi{\fi#1} + +\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} + + +\long\def\foone#1{\begingroup#1\relax\egfirstofone} +\long\def\egfirstofone#1{\endgroup#1} + +\def\fooatletter{\foone\makeatletter} + +\newcommand*\@emptify[1]{\let#1=\@empty} +\@ifdefinable\emptify{\let\emptify\@emptify} + +\newcommand*\g@emptify{\global\@emptify} +\@ifdefinable\gemptify{\let\gemptify\g@emptify} + +\newcommand\@relaxen[1]{\let#1=\relax} +\@ifdefinable\relaxen{\let\relaxen\@relaxen} + +\newcommand*\g@relaxen{\global\@relaxen} +\@ifdefinable\grelaxen{\let\grelaxen\g@relaxen} + +\long\def\gmu@ifempty#1{%\ + \ifnum\strcmp{\detokenize{#1}}{}=\z@ + \@xa\@firstoftwo + \else\@xa\@secondoftwo + \fi +} + +\long\pdef\@ifnonempty#1#2#3{\gmu@ifempty{#1}{#3}{#2}} + + + +\long\def\gmu@ifexempty #1{% + \ifnum \strcmp{#1}{}=\z@ + \@xa\@firstoftwo + \else\@xa\@secondoftwo + \fi +} + +\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@{% + \gmu@ifempty{##2}\@secondoftwo\@firstoftwo}% + \gmu@among@#2#1\gmu@among@} + +\newif\ifgmu@ifxquant +\newtoks\gmu@ifxa@toks + +\long\pdef\gmu@ifxany +#1% a single token to be |\ifx| ed with each of |#2| +#2% counterpart to the above—a sequence of tokens to check |#1| +{% + \gmu@ifempty{#2}{\@secondoftwo}{% + % we wrap the iteration over |#2|'s tokens in |\gmu@ifempty| because + % we expect many empty |#2|'s in |\DeclareCommand|'s |\loop| + % arguments (such as |Q| and |U|) + \gmu@ifxquantfalse + \let\gmu@ifxa@aasiter\@@gmu@ifxa@aasiter + % + \edef\gmu@ifxa@aas{% edef and unexpanded to protect agains + % |#|\cat6 token(s) in |#1|. + \unexpanded{% + \ifx #1\gmu@ifxa@token + \gmu@ifxquanttrue + \let\gmu@ifxa@aas\gmu@ifxa@drainer + \else + \ifx \gmu@ifxa@Limit\gmu@ifxa@token + \emptify \gmu@ifxa@aasiter + \fi + \fi + \gmu@ifxa@aasiter + }%of |\unexpanded| + }% of |\gmu@ifxa@aas| + % + \gmu@ifxa@aasiter #2\gmu@ifxa@Limit + \gmu@if {gmu@ifxquant}{}% + }% of if |#2| nonempty +} + +\def\gmu@ifxa@drainer{% + \ifx\gmu@ifxa@Limit\gmu@ifxa@token + \emptify\gmu@ifxa@aasiter + \fi + \gmu@ifxa@aasiter +} + +\gmu@DefSymbol\gmu@ifxa@Limit + +\def\@@gmu@ifxa@aasiter{% + \afterassignment\gmu@ifxa@aas + \let\gmu@ifxa@token= }% thanks to this space it'll look also at + +\long\pdef\gmu@ifxnone +#1% token to be checked against +#2% list of tokens to \emph{not} find |#1| at +{% + \gmu@ifxany{#1}{#2}\@secondoftwo\@firstoftwo +} + +\long\def\gmu@foreach#1\gmu@foreach@delim#2{% + % + \long\def\gmu@forer##1{% + \gmu@if {strings} {\gmu@foreach@delim {##1}}% + {}% if we've met the delimiter, we stop. + {% otherwise we wrap |#1| in a macro to make it available to |#2| + \edefU\gmu@forarg{##1}% + #2% we execute |#2| and probably continue iteration (unless the + % loop isn't broken with the next macro). + \gmu@forer + }% + }% of forer. + \gmu@forer#1\gmu@foreach@delim +} + +\long\def\gmu@foreach@break +#1\gmu@foreach@delim{} + +\long\def\gmu@ifsXXany +#1% kind of test (|strings| or |stribs| so far) +#2% token to be checked against |#3| +#3% the list of tokens to be iterated over\\ +{% + \gmu@ifsXXany@{#1}{#2}#3\gmu@ifsXXany@end + \@firstoftwo\@secondoftwo +} + +\long\def\gmu@ifsXXany@ +#1% kind of test +#2% left side of comparison +#3% right side of comparison +{% + \gmu@if {#1}{#2#3}% + \gmu@ifsXXany@found + {% else + \gmu@if {#1}{#3\gmu@ifsXXany@end}% + \@secondoftwo + {\gmu@ifsXXany@{#1}{#2}}% if we didn't meet the sentinel, we iterate + }% +} + +\long\def\gmu@ifsXXany@found +#1\gmu@ifsXXany@end +{\@firstoftwo} + +\def\gmu@ifstrany{\gmu@ifsXXany {strings}} + +\def\gmu@ifsbany{\gmu@ifsXXany {stribs}} + +\def\gmu@ifStrXany{\gmu@ifsXXany {StrX}} + +\long\def\gmu@ifstrnone#1#2#3#4{% + \gmu@ifstrany{#1}{#2}{#4}{#3}% +} + +\long\def\gmu@ifsbnone#1#2#3#4{% + \gmu@ifsbany{#1}{#2}{#4}{#3}% +} + +\long\def\gmu@ifStrXnone#1#2#3#4{% + \gmu@ifStrXany{#1}{#2}{#4}{#3}% +} + +\lpdef\gmu@CASEstrany {\gmu@generalCASE \gmu@ifstrany } + +\lpdef\gmu@CASEstrnone {\gmu@generalCASE \gmu@ifstrnone } + +\lpdef\gmu@CASEsbany {\gmu@generalCASE \gmu@ifsbany } + +\lpdef\gmu@CASEsbnone {\gmu@generalCASE \gmu@ifsbnone } + + +\newtoks\degroup@toks + +\long\pdef\gmu@degroup +#1% text to be degrouped +{\degroup@toks={}% + \gmu@degroup@iter#1\gmu@degroup@end +} + +\long\def\gmu@degroup@afterlet{% + \gmu@if x{\degroup@lettoken\bgroup}% + {\degroup@drainanditer}% + {\gmu@if x{\degroup@lettoken\egroup}% + {\degroup@drainanditer}% + {\degroup@addanditer}% + }% +} + +\def\gmu@degroup@iter{% + \futurelet\degroup@lettoken\gmu@degroup@afterlet} + +\def\degroup@drainanditer{% + \afterassignment\gmu@degroup@iter + \let\gmu@drain= +} + +\def\degroup@addanditer{% + \gmu@if x{\degroup@lettoken\gmu@letspace}% + {\addtotoks\degroup@toks{ }% + \degroup@drainanditer + }{% + \degroup@addanditer@i + }% +} + +\long\def\degroup@addanditer@i +#1{% + \gmu@if {strings}{#1\gmu@degroup@end}% + {}% we've reached the end of iteration + {% it's sth.\ to add + \addtotoks\degroup@toks{#1}% + \gmu@degroup@iter + }% +} + +\pdef\IfIntersect +{\gmu@ifintersect \gmu@ifxany} + +\lpdef\gmu@ifintersect +#1% an iterating test (|\gmu@ifxany|, |\gmu@ifstrany| or +#2% one list to match +#3% another list to match +{% + \let\IfIntersect@next\@secondoftwo + \gmu@foreach #2\gmu@foreach@delim{% + \@xa #1\gmu@forarg{#3}% + {\let\IfIntersect@next\@firstoftwo + \gmu@foreach@break + }{}% + }% of |\gmu@foreach|'s |#2|. + \IfIntersect@next +} + +\pdef\gmu@ifstrintersect +{\gmu@ifintersect\gmu@ifstrany} + +\pdef\gmu@ifsbintersect +{\gmu@ifintersect\gmu@ifsbany} + + +\newtoks\@XAtoks + +\long\pdef\@XA#1{% + \@XAtoks={#1}% + \@xa\the\@xa\@XAtoks} + +\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›)}. % ^^A | + % 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}} + % + \@XA{\IfAmong#1\among}\@xa{#2}} + +\gmu@DefSymbol\defNoHash +\gmu@DefSymbol\defHashy +\gmu@DefSymbol\boolean +\gmu@DefSymbol\edim + +\def\gmu@geteschar{% + % A macro that edefines detokenised char of the charcode |\escapechar| + \edef\gmu@xiieschar{% + \gmu@CASE {num} {\escapechar <\z@} + {}% + % + \gmu@CASE {num}{\escapechar <32 } + {\@xa \@firstofmany \string \blekotnizza\@nil}% not firstthreeofmany!!!! + % + \gmu@CASE {num} {\escapechar=32 } + { }% space cannot be “first of…”. + \gmu@lastCASE + {\@xa \@firstofmany \string \blekotnizza \@nil}% + \gmu@ESAC + }% +} + +\long\def\gmu@IfBooleanMacro#1{% + \gmu@ifedetokens{\meaning#1}{macro:->true}% + {\@firstoftwo}% + {\gmu@ifedetokens{\meaning#1}{macro:->false}% + {\@firstoftwo}% + {\@secondoftwo}% + }% +} + +\pdef\IfIs +#1% a \CS +#2% |\dimen|, |\long|, |\toks|, |\skip|, |\count|, |\dimexpr|, + % |\numexpr|, |\glueexpr|, |\newif| for |\iffalse| and |\iftrue|, + % |\if| or |\conditional| for any Boolean test/switch, |\def| for a + % macro. + % + % This test tells us in particular what kind of assignment may be + % applied to |#1|. Therefore it turns true for |#1| being e.g.\ primitive + % \TeX's skip registers and |#2|==|\skip|. +{% + \PackageInfo{gmbase}{^^J% + Checking whether ***\string#1*** is a ***\string #2***^^J + If the next message you get is an error^^J% + ***missing number treated as 0***,^^J + then it's probably not^^J}% + \@tempswafalse + % + \gmu@CASE x{\defNoHash#2}% + {% case “def no hash” (hashless macro) + \@tempswatrue + \edef\gmu@IfIs@resa{% + \pdef\@nx\gmu@IfIs@resa + ####1\detokenize{macro:->}% + ####2\@nx\@nil{\@ifnonempty{####2}}% + % And we prepare applying thus defined macro to |#1|: + \unexpanded{\@xa\gmu@IfIs@resa\meaning#1}% + \detokenize{macro:->}\@nx\@nil + }% of |\edef| + }% of case hasless macro (“def no hash”) + % + % if not hashless + \gmu@CASE x {\defHashy#2}% + {% + % case hashy macro + \@tempswatrue + \edef\gmu@IfIs@resa{% + \pdef\@nx\gmu@IfIs@resa + ####1\detokenize{macro:}####2\xiihash1####3->% + ####4\@nx\@nil{\@ifnonempty{####4}}% + % And we prepare applying thus defined macro to |#1|: + \unexpanded{\@xa\gmu@IfIs@resa\meaning#1}% + \detokenize{macro:}\xiihash1->\@nx\@nil + }% of |\edef| + }% of case hashy macro + % + \gmu@CASE x {#2\boolean} + {% case Boolean + \@tempswatrue + \def\gmu@IfIs@resa{\gmu@IfBooleanMacro#1}% + % + }% of case Boolean + % + \gmu@CASEstrany #2{\dimexpr \numexpr \glueexpr \edim}% + {% case \eTeX\ expression + \@tempswatrue + \def\gmu@IfIs@resa{% if should be a macro expanding to + % expression contents + \IfIsExpression #1#2}% + }% of case expression + % + % The subsequent part of this huge test refers to |\meaning|s. We + % want to make it robust to possible (although rather seldom) + % changes of |\escapechar|. Therefore define an aux macro that + % expands to detokenised escape char. + % + % Assume that letters, icluding »e«, will not be used as the escape + % char: + \gmu@geteschar + % + % Now |\gmu@xiieschar| carries the detokenised escape char (is empty + % if |\escapechar|${}<0$). + % + % + \gmu@CASE x {\dimen#2}% + {% Case dimen. Let's check if it's special (inner \TeX's) + % or normal. + \gmu@ifxany#1{\prevdepth \pagegoal \pagetotal \pagestretch + \pagefilstretch \pagefillstretch \pagefilllstretch + \pageshrink \pagedepth + \hfuzz \vfuzz \overfullrule \emergencystretch \hsize \vsize + \maxdepth \splitmaxdepth \boxmaxdepth \lineskiplimit + \delimitershortfall \nulldelimiterspace \scriptspace + \mathsurround \predisplaysize \displaywidth + \displayindent \parindent \hangindent \hoffset \voffset + }% + {\@tempswatrue\let\gmu@IfIs@resa\@firstoftwo}% + {% subcase normal dimen + \def\gmu@IfIs@resa{% + \gmu@ifexempty {\gmu@xiieschar}% + {% + \pdef\gmu@IfIs@resa####1####2####3####4####5####6\@nil{% + \gmu@if {} + {1% + \if d####1\else0\fi + \if i####2\else0\fi + \if m####3\else0\fi + \if e####4\else0\fi + \if n####5\else0\fi + 1}% + }% of inner |\gmu@IfIs@resa|… + }% …if eschar negative + {% + \pdef\gmu@IfIs@resa####1####2####3####4####5####6####7\@nil{% + \gmu@if {} {1% + \if \gmu@xiieschar ####1\else0\fi + \if d####2\else0\fi + \if i####3\else0\fi + \if m####4\else0\fi + \if e####5\else0\fi + \if n####6\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar nonnegative + }% of outer |\gmu@IfIs@resa| + }% of if special dimen or not + }% of case dimen + % + \gmu@CASE x {\count#2}% + {% case count + \gmu@ifxany#1{\spacefactor \prevgraf \deadcycles + \insertpenalties + \pretolerance \tolerance \hbadness \vbadness \linepenalty + \hyphenpenalty \exhyphenpenalty \binoppenalty \relpenalty + \clubpenalty \widowpenalty \displaywidowpenalty + \brokenpenalty \predisplaypenalty \postdisplaypenalty + \interlinepenalty \floatingpenalty \outputpenalty + \doublehyphendemerits \finalhyphendemerits \adjdemerits + \looseness \pausing \holdinginserts \tracingonline + \tracingmacros \tracingstats \tracingparagraphs + \tracingpages \tracingoutput \tracinglostchars + \tracingcommands \tracingrestores \language \uchyph + \lefthyphenmin \righthyphenmin \globaldefs + \defaulthyphenchar \defaultskewchar \escapechar \endlinechar + \newlinechar \maxdeadcycles \hangafter \fam \mag + \delimiterfactor \time \day \month \year \showboxbreadth + \showboxdepth \errorcontextlines + \lastlinefit + }% + {% if special count register then: + \@tempswatrue\let\gmu@IfIs@resa\@firstoftwo}% + {% + % if normal count register then + \def\gmu@IfIs@resa{% + \gmu@ifexempty \gmu@xiieschar + {\pdef\gmu@IfIs@resa####1####2####3####4####5####6\@nil{% + \gmu@if {} {1% + \if c####1\else0\fi + \if o####2\else0\fi + \if u####3\else0\fi + \if n####4\else0\fi + \if t####5\else0\fi + 1% + }% of test + }% of inner |\gmu@IfIs@resa|… + }% … when eschar is negative + % + {% eschar not empty (nonnegative) + \pdef\gmu@IfIs@resa####1####2####3####4####5####6####7\@nil{% + \gmu@if {} {1% + \if \gmu@xiieschar####1\else0\fi + \if c####2\else0\fi + \if o####3\else0\fi + \if u####4\else0\fi + \if n####5\else0\fi + \if t####6\else0\fi + 1% + }% of test + }% of inner |\gmu@IfIs@resa|… + }% … when eschar nonnegative + }% of outer |\gmu@IfIs@resa| + }% of if normal count register + }% of case count + % + \gmu@CASE x {\skip#2}% + {% case skip + \gmu@ifxany#1{% + \baselineskip \lineskip \parskip \abovedisplayskip + \abovedisplayshortskip \belowdisplayskip + \belowdisplayshortskip \leftskip \rightskip \topskip + \splittopskip \tabskip \spaceskip \xspaceskip \parfillskip + }% + {% if special skip + \@tempswatrue\let\gmu@IfIs@resa\@firstoftwo}% + {% not special skip + \def\gmu@IfIs@resa{% + \gmu@ifexempty \gmu@xiieschar + {\pdef\gmu@IfIs@resa####1####2####3####4####5\@nil{% + \gmu@if {} {1% + \if s####1\else0\fi + \if k####2\else0\fi + \if i####3\else0\fi + \if p####4\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar nonnegative + % + {\pdef\gmu@IfIs@resa####1####2####3####4####5####6\@nil{% + \gmu@if {} {1% + \if \gmu@xiieschar ####1\else0\fi + \if s####2\else0\fi + \if k####3\else0\fi + \if i####4\else0\fi + \if p####5\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar nonnegative + }% of outer |\gmu@IfIs@resa| + }% of if skip but not special + }% of case skip + % + \gmu@CASE x {\toks#2} + {% case toks + \gmu@ifxany#1{% + \output \everypar \everymath \everydisplay \everyhbox + \everyvbox \everyjob \everycr \errhelp \everyeof}% + {% subcase special toks + \@tempswatrue\let\gmu@IfIs@resa\@firstoftwo}% + {% subcase normal toks + \def\gmu@IfIs@resa{% + \gmu@ifexempty \gmu@xiieschar + {\pdef\gmu@IfIs@resa####1####2####3####4####5\@nil{% + \gmu@if {} {1% + \if t####1\else0\fi + \if o####2\else0\fi + \if k####3\else0\fi + \if s####4\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar negative + {\pdef\gmu@IfIs@resa####1####2####3####4####5####6\@nil{% + \gmu@if {} {1% + \if \gmu@xiieschar ####1\else0\fi + \if t####2\else0\fi + \if o####3\else0\fi + \if k####4\else0\fi + \if s####5\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar nonnegative + }% of outer |\gmu@IfIs@resa| + }% of if toks but not special + }% of case toks + % + \gmu@CASE x {\long#2}% + % if a macro is |\long|, then these detokens open its meaning + % despite of possible |\outer|. + {% case long macro + \def\gmu@IfIs@resa{% + \gmu@ifexempty \gmu@xiieschar + {\pdef\gmu@IfIs@resa####1####2####3####4####5\@nil{% + \gmu@if {} {1% + \if l####1\else0\fi + \if o####2\else0\fi + \if n####3\else0\fi + \if g####4\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar negative + {\pdef\gmu@IfIs@resa####1####2####3####4####5####6\@nil{% + \gmu@if {} {1% + \ifnum \gmu@xiieschar ####1\else0\fi + \if l####2\else0\fi + \if o####3\else0\fi + \if n####4\else0\fi + \if g####5\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar nonnegative + }% of outer |\gmu@IfIs@resa| + }% of case |\long| + % Note that we also can put here a test whether the meaning + % begins with |macro| which would mean that a macro is + % short. + \gmu@CASE x {\newif#2}% + {% case |\newif| (Boolean switch) + \def\gmu@IfIs@resa{% + \gmu@ifexempty \gmu@xiieschar + {\pdef\gmu@IfIs@resa####1####2####3% + ####4####5####6####7####8\@nil{% + \gmu@unless {} {0% lazy disjunction + \gmu@if {} {1% lazy conjunction + \if i####1\else0\fi + \if f####2\else0\fi + \if f####3\else0\fi + \if a####4\else0\fi + \if l####5\else0\fi + \if s####6\else0\fi + \if e####7\else0\fi + 1% + }% + {}{0}% + \gmu@if {} {1% lazy conjunction + \if i####1\else0\fi + \if f####2\else0\fi + \if t####3\else0\fi + \if r####4\else0\fi + \if u####5\else0\fi + \if e####6\else0\fi + \if \relax####7\else0\fi + 1% + }% + {}{0}% + 0% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar nonnegative + % + {\pdef\gmu@IfIs@resa####1####2####3% + ####4####5####6####7####8####9\@nil{% + \gmu@unless {} {0% + \gmu@if {} {1% + \if \gmu@xiieschar ####1\else0\fi + \if i####2\else0\fi + \if f####3\else0\fi + \if f####4\else0\fi + \if a####5\else0\fi + \if l####6\else0\fi + \if s####7\else0\fi + \if e####8\else0\fi + 1% + }% + {}{0}% + \gmu@if {} {1% + \if \gmu@xiieschar ####1\else0\fi + \if i####2\else0\fi + \if f####3\else0\fi + \if t####4\else0\fi + \if r####5\else0\fi + \if u####6\else0\fi + \if e####7\else0\fi + \if \relax####8\else0\fi + 1% + }% + {}{0}% + 0% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar nonnegative + }% of outer |\gmu@IfIs@resa| + }% of case |\newif| (Boolean switch) + % + \gmu@CASE {x\@xa\@xa} {\csname if\endcsname#2}% + {% case |\if| test + \def\gmu@IfIs@resa{% + \gmu@ifexempty \gmu@xiieschar + {\pdef\gmu@IfIs@resa####1####2####3\@nil{% + \gmu@if {} {1% + \if i####1\else0\fi + \if f####2\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar negative + % + {\pdef\gmu@IfIs@resa####1####2####3####4\@nil{% + \gmu@if {} {1% + \if \gmu@xiieschar ####1\else0\fi + \if i####2\else0\fi + \if f####3\else0\fi + 1% + }% + }% of inner |\gmu@IfIs@resa|… + }% …when eschar nonnegative + }% of outer |\gmu@IfIs@resa| + }% of case |\if| + % + \gmu@lastCASE %^^A >>>>> ?????? + {false}{}{}% + \gmu@ESAC + % For the cases 1–$n$ we just launch their auxiliary macro: + \if@tempswa + \@xa\gmu@IfIs@resa + \else + % + % For the other cases their auxiliary macro defines “inner |@resa|” + % (protected) which perform the test on the meaning of |#1|. + \gmu@IfIs@resa + % + % now (new) |\gmu@IfIs@resa| it's defined as delimited + % with |#2| and |\@nil| (if |#1| may be one of kinds checked letter + % by letter). + % + \edef\gmu@IfIs@resb{% + \gmu@IfIs@resa\meaning#1% + \relax\relax\relax\relax\relax\relax\relax\relax %to provide + % something for gobbling tests. + \@xa\detokenize\@xa{\string#2}\@nx\@nil}% + \@xa\gmu@IfIs@resb + \fi +}% of |\IfIs| + +\unless\ifdefined\@tempskipa\newskip\@tempskipa\fi +\unless\ifdefined\@tempmuskipa\newmuskip\@tempmuskipa\fi + +\long\def\IfIsExpression +#1% the stuff to be examined +#2% |\dimexpr|, |\glueexpr|, |\numexpr| or |\muexpr| or |\edim| (added +{% + \ifx#2\numexpr\let\next\@tempcnta\fi + \ifx#2\glueexpr\let\next\@tempskipa\fi + \ifx#2\dimexpr\let\next\@tempdima\fi + \ifx#2\muexpr\let\next\@tempmuskipa\fi + \gmu@if {strings} {#2\edim} % in case of special (not necessarily + % defined) \CS\ |\edim| we gobble the + % |=\edim| tokens and put |\dimexpr| + % before the tested token. + {\def\next##1##2{\@tempdima=\dimexpr}}{}% + \afterassignment\gmu@testtopenalty + \next=#2#1\penalty +} + +\def\gmu@testtopenalty#1\penalty{% + \gmu@ifempty{#1}} + +\pdef\newgif#1{% + {\escapechar\m@ne + \global\let#1\iffalse + \@gif#1\iftrue + \@gif#1\iffalse + }} +\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} + + +\pdef\grefstepcounter#1{% + {\let\protected@edef=\protected@xdef\refstepcounter{#1}}} + +\pdef\hgrefstepcounter#1{% + \ifhmode\leavevmode\fi\grefstepcounter{#1}} + + +\pdef\hunskip{\ifhmode\unskip\fi} + + +\def\glet{\global\let} + + +\lpdef\addtomacro +#1% macro (has to be parameterless) +#2% stuff to be added +{\edef #1{\@xau #1\unexpanded{#2}}} + +\pdef\gaddtomacro{\global\addtomacro} + +\long\def\prependtomacro#1#2{% \changes{v0.94}{2008/09/15}{order of + % arguments reversed} + \edef#1{\unexpanded{#2}\@xa\unexpanded\@xa{#1}}} + +\lpdef\addtotoks#1#2{% + #1=\@xa{\the#1#2}} + +\lpdef\prependtotoks#1#2{% + \iffalse {\fi % hack to balance braces in definition + \@XA{% + #1=\bgroup#2% + }\the#1}% actually this brace closes the text opened by |\bgroup|. +} + +\long\def\addto@forlist +#1% a comma-separated list +#2% the element(s) added +{\ifx#1\@empty + \@xa\@gobble + \else\@xa\@firstofone + \fi + {\addtomacro#1{,}}% + \addtomacro#1{#2}% +} + +\lpdef\eaddtomacro +#1% a macro +#2% stuff to be added (will be fully expanded) +{\edef#1{\@xau#1#2}} + +\long\def\gmu@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 :-)} + % + \gmu@CASEnot {csname} {#1\endcsname}% defined… + {\@firstoftwo}% + % + \gmu@CASE {x\@xa\@xa} {\csname #1\endcsname\relax}% but only as |\relax|---then + % 2nd argument. + {\@firstoftwo}% + \gmu@lastCASE + {\@secondoftwo}% + \gmu@ESAC +} + +\long\def\gmu@ifdefined #1#2#3{% + \gmu@ifundefined {#1}{#3}{#2}} + + +\long\def \gmu@ifCSdefined#1{% + \gmu@CASEnot {defined} {#1} + {\@secondoftwo}% + % + \gmu@CASE x {\relax #1} + {\@secondoftwo}% + % + \gmu@EatCases + {\@firstoftwo}% + \gmu@ESAC +} + +\long\def\CSNameIf +#1% the name to check and probably execute +{% + \ifcsname #1\endcsname + \@xa\@twoofthree + \else\@xa\@thirdofthree + \fi + {\csname #1\endcsname}% +} + +\foone{\catcode`\_=8 } +{\let\subs=_} + +\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{_}} + +\foone{\@makeother\^^M}{\def\xiiM{ + }}% \chgs{2010/03/16 v0.992 added} + +\def\all@stars{*} +\foone{\catcode`\*=11 } +{\addtomacro\all@stars{*}} +\foone{\catcode`\*=13 } +{\addtomacro\all@stars{*}} + +\def\all@spaces{ } +\foone{\@makeother\ }{% +\addtomacro\all@spaces{ }% +} +\foone{\obeyspaces}{% +\addtomacro\all@spaces{ }% +} + +\foone\obeylines{% + \def\two@Ms{ + }} +\foone{\@makeother\^^M}{% + \addtomacro\two@Ms{ + }} + +\edef\spaces@and@Ms{\@xau{\all@spaces}\@xau{\two@Ms}} + +\ifdefined\XeTeXversion + \chardef\_="005F +\fi + +\foone{\@makeother\`}% +{\def\backquote{`}} + +\foone{\catcode`\[=1 \@makeother\{ + \catcode`\]=2 \@makeother\}}% +[% + \def\xiilbrace[{]% + \def\xiirbrace[}]% +]% of |\firstofone| + + +\foone{\catcode`\_=\active} +{% + \pdef\smartunder{% + \catcode`\_=\active + \def_{% + \ifincsname\xiiunder + \else + \ifmmode\subs + \else\_% + \fi + \fi}}}% We define it as \inverb|\_| not just as +\foone{\catcode`\!=0 + \@makeother\\} +{!newcommand*!xiibackslash{\}} + +\let\bslash=\xiibackslash + +\foone{\@makeother\%} +{\def\xiipercent{%}} + +\foone{\@makeother\&}% +{\def\xiiand{&}} + +\foone{\@makeother\ }% +{\def\xiispace{ }} + +\foone{\@makeother\#}% +{\def\xiihash{#}} + + +\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}} + +\pdef\makeblanksignored{% + \catcode`\^^M=9\relax + \catcode`\^^I=9\relax + \catcode`\ =9\relax} + +\pdef\fooblanksignored{% + \foone{\makeblanksignored}% +} + + +\long\pdef\edefU#1#2{% + \edef#1{\unexpanded{#2}}% +} + +\long\pdef\@ifnextcat#1#2#3{% + \edefU\reserved@d{#1}% + \edefU\reserved@a{#2}% + \edefU\reserved@b{#3}% + \futurelet\@let@token\@ifncat} + +\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}} +\pdef\spifletter{\@ifnextcat a{\space}{}} + +\long\pdef\@ifnextif#1#2#3{% + \def\reserved@d{#1}% + \def\reserved@a{#2}% + \def\reserved@b{#3}% + \futurelet\@let@token\@ifnif} + +\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} + +{\def\:{\let\@sptoken= } \: % this makes |\@sptoken| a space token. +\def\:{\@xifnif} \@xa\gdef\: {\futurelet\@let@token\@ifnif}} + +\long\pdef\@ifnextac#1#2{% + \@ifnextnotgroup + {\gmu@ifnac{#1}{#2}}% + {#2}} + +\long\def\gmu@ifnac#1#2#3{% + \ifcat\@nx~\@nx#3% + \@xa\@firstoftwo + \else\@xa\@secondoftwo + \fi{#1#3}{#2#3}} + + + +\pdef\gmu@lowstar{% + \iffontchar\font"22C6 \char"22C6 \else\gmu@lowstarfake\fi +}% we could define it to + + +\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\gmu@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}}% it's a bit hacky but O.K.: if the + % condition is not satisfied, the following brace is taken + {% + \@nx\@ifnextchar\@xa\@nx\gmu@tempb + {\@nx\@firstoftwo{##1}}% and again, if the condition is not + % satisfied, the second brace is taken. + {##2}% + }% of if not |*|\cat 12 + }% of |\gmu@ifstar|. +}\gmu@tempa + + +\long\pdef\@ifnextnotgroup#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. + \@ifnextnotgroup{#2}{#1}} + +\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}} + +\let\gmu@reserveda\*% +\def\*{% + \let\*\gmu@reserveda + \let\gmu@letspace= }% +\* % + + +\lpdef\gmu@peep@next #1{% + \let\@def@token\@undefined + \edefU\gmu@peepnext@inner {% + \gmu@CASE x {\@let@token\gmu@letspace}% + {\@ifnextchar\par + {#1} + {\let\@let@token= \gmu@letspace % note |=| and blank space + \@XA{#1}\space + }% + }% of if |\futurelet| detected a blank space + % + \gmu@CASE {condsalt} % if any of the conditions below: + {{ x {\@let@token\@undefined} + x {\@let@token\relax}}} % it's arg of disjunction + {\gmu@peep@hash{#1}}% + % + \gmu@lastCASE + {#1}% + \gmu@ESAC + }% + \futurelet\@let@token\gmu@peepnext@inner +} + +\lpdef\gmu@peep@hash +#1% stuff that probably tests |#2| somehow +#2% a single token, which we are sure is undefined or |\relax| (and +{% + \def\@def@token{#2}% + #1% + #2% +} + +\lpdef\gmu@ifpeeped +#1% kind of comparison +#2% stuff to compare +{% + \gmu@if {defined} {\@def@token} + {\@XA{\gmu@if {#1}}\@xa{\@def@token #2}} + {\gmu@if {#1} {\@let@token #2}}% +} + +\long\pdef\@ifnextspace +#1% if yes +#2% if not +{% + \gmu@peep@next + {\gmu@if x {\@let@token\gmu@letspace}{#1}{#2}}% +} + +\long\pdef\@ifnextcharRS +#1% a single token (will be |\ifx|ed) +#2% what if yes +#3% what if not +{% + \gmu@peep@next + {\gmu@if {defined} {\@def@token} + {\@XA{\gmu@if {StrX}}\@xa {\@def@token #1}}% of the special “null” + % case + % + {\gmu@if x {\@let@token #1}}% + {#2}{#3}% + }% of |\gmu@peep@next| +} + +\long\pdef\@ifnextanyRS +#1% list of tokens (any balanced text, will be |\let| token after token +#2% what if next is one of listed |#1| +#3% what if not +{\gmu@peep@next + {\gmu@if {defined} {\@def@token} + {\@xa \gmu@ifStrXany \@def@token } + % otherwise we are next to a defined and not |\relax| token so + {\gmu@ifxany {\@let@token}}% + {#1}{#2}{#3}% + }% of peep +} + + +\long\def\gmu@ifnextStrXany +#1% outer macro's tested list of tokens +#2% “if found” branch +#3% “if not found” branch +{\gmu@notif {condsalt} + {{ x {\@let@token\@undefined} x {\@let@token\relax}}}% + {#2}% + % + % Some (i.e.\ \emph{both}) |\@undefined| or |\relax|, then we + % compare strings + {\gmu@futureifany {#2}{#3}{#1}}% +} + +\long\def\gmu@futureifany +#1% what if \OK +#2% what if not \OK +#3% list of tokens +#4% token ot be checked against |#3| (and put back on the input) Note +{\gmu@ifstrany #4 {#3}{#1}{#2}#4} + +\long\pdef\@ifnextanyIS +#1% list of tokens (any balanced text, will be |\let| token after token +#2% what if next is one of listed in |#1| +#3% what if not +{% + \edefU\gmu@ifna@afterlet{% + \gmu@if x{\@let@token\gmu@letspace}% + {% if next is blank space, we drop it and retry: + \edefU\gmu@ifna@resa{\@ifnextanyIS{#1}{#2}{#3}}% + \afterassignment\gmu@ifna@resa + \let\gmu@drain= + }% + {% else we perform |\gmu@ifnextany| + \gmu@ifxany{\@let@token}{#1}{% + \gmu@ifnextStrXany {#1}{#2}{#3}% + }% + {#3}% + }% + }% of the after-let macro + \futurelet\@let@token\gmu@ifna@afterlet +}% of |\@ifnextanyIS| + +\long\pdef\@ifnextnoneRS +#1% list of tokens (any balanced text, will be |\let| token after token +#2% what if next is one of listed |#1| +#3% what if not +{% + \@ifnextanyRS{#1}{#3}{#2}% +} + +\long\pdef\@ifnextgroupRS #1#2{% + \gmu@peep@next + {\gmu@if x{\@let@token\bgroup}{#1}% + {\gmu@if x{\@let@token\egroup}{#1}{#2}}% + }% +} + +\long\pdef\@ifnextnotgroupRS#1#2{% + \@ifnextgroupRS{#2}{#1}} + + + +\foone\obeylines{% + \long\pdef\@ifnextMac#1#2{% + \@ifnextchar^^M{#1}{#2}}} + +\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} + +\def\@xiispaces#1 #2\@nil{% + #1% + \ifx\@xiispaces#2\@xiispaces + \else + \xiispace + \afterfi{\@xiispaces#2\@nil}% + \fi} + +\long\pdef\xiiEdetoke +#1% a scratch \CS +#2% stuff to be fully expanded and turned to catcode 12 including + % spaces. +{% + \edef#1{#2}% + \edef#1{% + \@xa\@xa\@xa\@xiispaces + \@xa\detokenize\@xa{#1} \@nil}% +} + +\long\def\@ifEUnextchar#1#2#3{% + % ‘if Edefed Unexpanded next char’ + \let\reserved@d=#1% + \edefU\reserved@a{#2}% + \edefU\reserved@b{#3}% + \futurelet\@let@token\@ifnch} + +\newcommand\gmu@storespecials[1][]{% 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}#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 +} + +\newif\ifgmu@SMglobal + +\pdef\SMglobal{\gmu@SMglobaltrue} + +\def\MakePrivateLetters{\makeatletter} + +\pdef\StoreMacro{% + \begingroup\MakePrivateLetters + \gmu@ifstar\egStore@MacroSt\egStore@Macro} + +\lpdef\egStore@Macro#1{\endgroup\Store@Macro{#1}} +\lpdef\egStore@MacroSt#1{\endgroup\Store@MacroSt{#1}} + +\pdef\StoreMacro@nocat +{% + \gmu@ifstar \Store@MacroSt \Store@Macro +} + +\def\gmu@storeprefix{/gmu/store} + +\lpdef\Store@Macro#1{% + \escapechar92 + \ifgmu@SMglobal\afterfi\global\fi + \@xa\let\csname \gmu@storeprefix/\bslash@or@ac{#1}\endcsname#1% + \global\gmu@SMglobalfalse +} + +\lpdef\Store@MacroSt#1{% + \edef\gmu@smtempa{% + \ifgmu@SMglobal\@xa\global\fi + \let\@xa\@nx\csname\gmu@storeprefix/\bslash@or@ac{#1}\@xa\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 + \ifcsname #1\endcsname % \chgs[\StoreMacro]{2010/04/16 v0.993 + % fixed asymmetry with the unstarred version: till today the + % unstarred version for an undefined \CS undefine the storage \CS + % and the starred version made it \cmd\relax. Now both undefine} + % If the argument \CS is undefined, we undefine the storage macro too. + \@xa\@nx\csname#1\endcsname + \else\@nx\@undefined + \fi + \global\gmu@SMglobalfalse}%% we wish the globality to be just + % once.\par + \gmu@smtempa +} + + +\lpdef\StoreMacros{\begingroup\MakePrivateLetters\egStore@Macros} + +\lpdef\egStore@Macros#1{\endgroup + \Store@Macros{#1}% +} + +\lpdef\Store@Macros #1{% + \gmu@setsetSMglobal + \let\gml@StoreCS\Store@Macro + \gml@storemacros#1.} + +\def\gmu@setsetSMglobal{% + \ifgmu@SMglobal + \let\gmu@setSMglobal\gmu@SMglobaltrue + \else + \let\gmu@setSMglobal\gmu@SMglobalfalse + \fi} + +\lpdef\gml@storemacros#1{% + \def\gmu@storemacros@resa{\@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@storemacros@resa.% a~dot finishes storing. + \global\gmu@SMglobalfalse + \else + \if\gmu@storemacros@resa,% 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 +} + +\lpdef\RestoreMacro{% + \begingroup\MakePrivateLetters\gmu@ifstar\egRestore@MacroSt\egRestore@Macro} + +\lpdef\egRestore@Macro#1{\endgroup\Restore@Macro{#1}} +\lpdef\egRestore@MacroSt#1{\endgroup\Restore@MacroSt{#1}} + +\lpdef\Restore@Macro#1{% + \escapechar92 + \gmu@ifstored#1{% + \ifgmu@SMglobal\afterfi\global\fi + \@xa\let\@xa#1\csname \gmu@storeprefix/\bslash@or@ac{#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{% + \gmu@ifundefined{\gmu@storeprefix/% + \bslash@or@ac{#1}}{#3}{#2}% +} + +\lpdef\gmu@storeifnotyet#1{% + \gmu@if {} {\relax\@nx#1}% we check if it's a~\CS + {\gmu@ifstored{#1}{}{\StoreMacro@nocat#1}}% + {}% +} + +\lpdef\Restore@MacroSt#1{% + \gmu@ifundefined{\gmu@storeprefix/\bslash@or@ac{#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@storeprefix/\bslash@or@ac{#1}\endcsname}% cf. the commentary + % in line \ref{SMbslash}. + \gmu@smtempa}% + \global\gmu@SMglobalfalse +} + +\lpdef\RestoreMacros{% + \begingroup\MakePrivateLetters + \egRestore@Macros} + +\lpdef\egRestore@Macros#1{\endgroup + \Restore@Macros{#1}% +} + +\lpdef\Restore@Macros #1{% + \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.} + +\pdef\ResetMacro{% restore possibly to |\@undefined| + % \chgs{2010/04/16 v0.993 added} + \begingroup\MakePrivateLetters\gmu@ifstar\egReset@MacroSt\egReset@Macro} + +\lpdef\egReset@Macro#1{\endgroup\Reset@Macro{#1}} +\lpdef\egReset@MacroSt#1{\endgroup\Reset@MacroSt{#1}} + +\lpdef\Reset@Macro#1{% + \escapechar92 + \ifgmu@SMglobal\@xa\global\fi + \ifcsname \gmu@storeprefix/\bslash@or@ac{#1}\endcsname + \@xa\let\@xa#1\csname \gmu@storeprefix/\bslash@or@ac{#1}\endcsname + \else + \let#1\@undefined + \fi + \global\gmu@SMglobalfalse +}% + +\lpdef\Reset@MacroSt#1{% + \ifcsname \gmu@storeprefix/\bslash@or@ac{#1}\endcsname + \ifgmu@SMglobal\@xa\global\fi + \@xa\let\csname#1\@xa\endcsname + \csname\gmu@storeprefix/\bslash@or@ac{#1}\endcsname % cf. the commentary + % in line \ref{SMbslash}. + \else + \@xa\let\csname#1\endcsname\@undefined + \fi + \global\gmu@SMglobalfalse +} + +\lpdef\ResetMacros{\begingroup\MakePrivateLetters\Reset@Macros} + +\lpdef\Reset@Macros#1{\endgroup + \gmu@setsetSMglobal + \let\gml@StoreCS\Reset@Macro% \gmhypertarget[letReset]{we} + % direct the core \CS towards restoring and call the same iterating + % macro as in line \ref{InnerStore}. + \gml@storemacros#1.} + +\pdef\StoredMacro{\begingroup\MakePrivateLetters\Stored@Macro} +\lpdef\Stored@Macro#1{\endgroup\Restore@Macro#1#1} + +\long\def\storedcsname#1{%% \changes{v0.88}{2008/08/03}{added} + \ifcsname \gmu@storeprefix/\bslash@or@ac{#1}\endcsname + \afterfi{% + \csname \gmu@storeprefix/\bslash@or@ac{#1}\endcsname}% + \else \@xa \@undefined + \fi +} + +\pdef\StoreEnvironment#1{% \label{StoreEnvironment} + \Store@MacroSt{#1}\Store@MacroSt{end#1}} + +\pdef\RestoreEnvironment#1{% + \Restore@MacroSt{#1}\Restore@MacroSt{end#1}} + +\pdef\StoringAndRelaxingDo{% + \gmu@SMdo@setscope + \long\def\do##1{% + \gmu@SMdo@scope + \@xa\let\csname \gmu@storeprefix/\bslash@or@ac{##1}\endcsname##1% + \gmu@SMdo@scope\let##1\relax}} + +\pdef\gmu@SMdo@setscope{% + \ifgmu@SMglobal\let\gmu@SMdo@scope\global + \else\let\gmu@SMdo@scope\relax + \fi + \global\gmu@SMglobalfalse +} + +\lpdef\RestoringDo{% + \gmu@SMdo@setscope + \long\def\do##1{% + \gmu@SMdo@scope + \@xa\let\@xa##1\csname + \gmu@storeprefix/\bslash@or@ac{##1}\endcsname}% +} + +\pdef\gmu@MakeScopePrefix +#1% \CS to be let |\global| or |\relax| +#2% a sequence of tokens +{% + \let#1\relax + \gmu@ifxany{\global}{#2}% + {\let#1\global}{}% +} + +\lpdef\gmu@namelet +#1% scope prefix (to be honest, \emph{any} sequence of tokens that may + % be passed as an argument: |\gmu@ifxany| will parse it) +#2% left side of the assignment +#3% right side of the assignment +{% + \gmu@MakeScopePrefix\gmu@namelet@scpref{#1}% + \gmu@if {csname} {#3\endcsname}% + {% + \@xa\gmu@namelet@scpref\@xa\let\csname#2\@xa\endcsname + \csname#3\endcsname}% + {% + \@xa\gmu@namelet@scpref + \@xa\let\csname#2\endcsname\@undefined}% +} + +\pdef\n@melet{\gmu@namelet\relax} + +\pdef\gn@melet{\gmu@namelet\global} + +\long\pdef\tri@let +#1% scope prefix(es) +#2% left side +#3% right side of the assignment +{% + \gmu@MakeScopePrefix\gmu@tri@let@scpref{#1}% + \ifcat\@nx~\@nx#2% + \def\next{\gmu@tri@let@scpref\let#2}% + \else \edef\next{\gmu@tri@let@scpref\let\@xanxtri{#2}}% + \fi + \ifcat\@nx~\@nx#3% + \next#3% + \else + \edef\next{% + \@xau\next + \ifcsname \strip@bslash{#3}\endcsname + \@xanxtri{#3}% + \else\@nx\@undefined + \fi + }% of next's edef + \next + \fi +}% + +\long\pdef\envirlet#1#2{% for |\let|ting environments. + \n@melet{#1}{#2}% + \n@melet{end#1}{end#2}% +} + +\long\pdef\glenvirlet#1#2{% for |\let|ting environments. + \gn@melet{#1}{#2}% + \gn@melet{end#1}{end#2}% +} + + + +\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}} + + +\@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}}} + + +\long\def\detoken@xa#1{\detokenize\@xa{#1}} + + \long\def\all@other#1{\@xa\gmu@gobmacro\meaning#1} + + % The |\gmu@gobmacro| macro above is applied to gobble the |\meaning|'s + % beginning, |long macro:->| all `other' that is. + % \Define\gmu@gobmacro + \edef\gmu@tempa{% + \def\@nx\gmu@gobmacro##1\@xa\@gobble\string\macro:##2->{}} + \gmu@tempa + + +\def\gmshowlists{% + \tracingonline=1 + \showboxdepth=1000 \showboxbreadth=1000 \showlists} + +\def\gmshowbox{% + \tracingonline=1 + \showboxdepth=10000 \showboxbreadth=10000 \showbox} + +\def\gmtracingoutput{% + \tracingoutput\@ne + \tracingonline=\@ne + \showboxdepth=10000 \showboxbreadth=10000 } + +\newif\ifgmu@debug@msgs + +\def\gmtron{% + \tracingonline=\@M + \tracingmacros=\@M + \tracingassigns=\@M + \tracingcommands=\@m + \gmu@debug@msgstrue + \let\let\let +} + +\def\gmtroff{% + \tracingonline=\m@ne + \tracingmacros\m@ne + \tracingassigns=\m@ne + \tracingcommands=\m@ne + \gmu@debug@msgsfalse + \let\let\let +} + +\newcommand\nameshow[1]{% + \ifcsname #1\endcsname + \@xa\show\csname#1\endcsname + \else \show\@undefined + \fi} + +\newcommand\nameshowthe[1]{% + \ifcsname #1\endcsname + \@xa\showthe\csname#1\endcsname + \else \showthe\@undefined + \fi} + +\newcommand\namemeaning[1]{% + \ifcsname #1\endcsname + \@xa\typeout{\@xa\meaning\csname#1\endcsname}% + \show\relax + \else \typeout{\meaning\@undefined}\show\relax + \fi} + +\def\secondclass{% + \newif\ifSecondClass + \SecondClasstrue + \@fileswithoptions\@clsextension}%|[outeroff,gmeometric]{gmdocc}|% + +\AtBeginDocument{% + \unless\ifdefined\@parindent + \newskip\@parindent + \@parindent=\parindent + \fi +} + +\def\balsmiley#1 {}% to balance parentheses and brackets in + % smileys. \balsmiley( ;-) \inverb|\balsmiley( ;-)| + +\long\def\scantnoline#1{% ‘rescan tokens without adding line at the end’ + {\endlinechar\m@ne\scantokens{#1}}} + +\pdef\getprevdepth{% to pass last depth through a group (e.g. |\end{envir.}|) + \endgraf + \xdef\setprevdepth{\prevdepth=\the\prevdepth\relax}% +} + +\pdef\getprevdepthlocal{% + \endgraf + \edef\setprevdepth{\prevdepth=\the\prevdepth\relax}% +} + +\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.}% +} + + +\RequirePackage{graphicx} + +\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 + + +\def\lastcentered{% + \lastlinefit\z@ + \parindent0sp\relax + \leftskip\dimexpr1\leftskip\relax plus 1fil\relax + \rightskip\dimexpr1\rightskip\relax plus -1fil\relax + \parfillskip0sp plus 2fil\relax +} + +\def\endlastcentered{\par\@endpetrue} + +\def\firstcentered{% + \lastlinefit\z@ + \parfillskip 0sp\relax + \rightskip0sp plus 1fil\relax + \leftskip0sp plus -1fil\relax + \parindent 0sp + \addtotoks\everypar{\hskip0sp plus 2fil\relax}% +} + +\let\endfirstcentered\endlastcentered + +\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}% +} + +\def\@xa@three#1#2{% reverses expansion of three tokens, two given as + % arguments. (third may be |{|^^A } + % ) + \@xa\@xa\@xa \@xa\@xa\@xa \@xa #1% + \@xa\@xa\@xa #2% + \@xa } + +\def\@xa@four#1#2#3{% reverses expansion of four tokens, three given as + % arguments. (fourth may be |{|^^A } + % ) + \@xa\@xa\@xa\@xa \@xa\@xa \@xa + \@xa\@xa\@xa\@xa \@xa\@xa\@xa\@xa #1% + \@xa\@xa\@xa\@xa \@xa\@xa \@xa #2 + \@xa\@xa\@xa #3% + \@xa } + + +\long\pdef\@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} + % \chgs{2010/06/02 v0.993 made \cmd\protected after an error at work} + \gmu@ifedetokens{\@currenvir}{#1}% +} + +\pdef\@ifjobname#1{\gmu@ifedetokens{\jobname}{#1}} + +\long\def\gmu@ifstrcmp +#1% wrapper for left side of comparison +#2% wrapper for right side of comparison +#3% left side of comparison (list of tokens) +#4% right —”— +{% + \ifnum\strcmp{#1{#3}}{#2{#4}}=\z@ + \@xa\@firstoftwo + \else + \@xa\@secondoftwo + \fi +} + +\def\gmu@ifdetokens +{% + \gmu@ifstrcmp\detokenize\detokenize +}% of |\gmu@ifdetokens| + +\def\gmu@ifutokens +{% + \gmu@ifstrcmp\unexpanded\unexpanded +} + +\def\gmu@ifedetokens{% + \gmu@ifstrcmp \@firstofone \@firstofone +} + +\@XA{\pdef\gmu@pifdetokens}\@xa{\gmu@ifdetokens} + +\@XA{\pdef\gmu@pifutokens}\@xa{\gmu@ifutokens} + +\@XA{\pdef\gmu@pifedetokens}\@xa{\gmu@ifedetokens} + + % \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} + + + +\def\gmu@HHashes#1#2{% this is a~fully expandable loop analogous to + % that of The % \eTeX\ Manual p.~9. + \ifnum#1<#2 % + ################\number#1 + \expandafter\gmu@HHashes + \expandafter{\number\numexpr#1+1\expandafter}% + \expandafter{\number#2\expandafter}% + \fi}% of |\gmu@HHashes|. + +\def\gmu@Hashes#1#2{% this is a~fully expandable loop analogous to + % that of The % \eTeX\ Manual p.~9. + % expanding in an |\edef| to |####›1›…####⁄<h.$2-1$>| (quadruple hashes' sequence) + \ifnum#1<#2 % + ########\number#1 + \expandafter\gmu@HHashes + \expandafter{\number\numexpr#1+1\expandafter}% + \expandafter{\number#2\expandafter}% + \fi}% of |\gmu@hashes|. + +\def\gmu@hashes#1#2{% this is a loop analogous to + \ifnum#1<#2% + ####\number#1 + \expandafter\gmu@hashes + \expandafter{\number\numexpr#1+1\expandafter}% + \expandafter{\number#2\expandafter}% + \fi +}% of |\gmu@hashes|. + +\def\gmu@HHashesbraced#1#2{% + \ifnum#1<#2% + {################\number#1}% + \expandafter\gmu@HHashesbraced + \expandafter{\number\numexpr#1+1\expandafter}% + \expandafter{\number#2\expandafter}% + \fi}% of |\gmu@hashesbraced|. + +\def\gmu@Hashesbraced#1#2{% + \ifnum#1<#2% + {########\number#1}% + \expandafter\gmu@HHashesbraced + \expandafter{\number\numexpr#1+1\expandafter}% + \expandafter{\number#2\expandafter}% + \fi}% of |\gmu@hashesbraced|. + +\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|. + +\def\gmu@hashesOut#1#2{% + \ifnum#1<#2% + \space\space\space\space + »\@nx\unexpanded{####\number#1}«% + \expandafter\gmu@hashesOut + \expandafter{\number\numexpr#1+1\expandafter}% + \expandafter{\number#2\expandafter}% + \fi +}% of |\gmu@hashesbraced|. + +\def\gmu@hashesOutU#1#2{% + \ifnum#1<#2% + \space\space\space\space + »\@nx\unexpanded{####\number#1}«% + \expandafter\gmu@hashesOut + \expandafter{\number\numexpr#1+1\expandafter}% + \expandafter{\number#2\expandafter}% + \fi +}% of |\gmu@hashesbraced|. + +\@tempcnta=1 +\@whilenum\@tempcnta<11\do{% 2010/4/15 + \@nameedef{gmu@hashes@\the\numexpr\@tempcnta-1\relax}% + {\gmu@hashes1\@tempcnta}% + % + \@nameedef{gmu@Hashes@\the\numexpr\@tempcnta-1\relax}% + {\gmu@Hashes1\@tempcnta}% + % + \@nameedef{gmu@HHashes@\the\numexpr\@tempcnta-1\relax}% + {\gmu@HHashes1\@tempcnta}% + % + \@nameedef{gmu@hashesbraced@\the\numexpr\@tempcnta-1\relax}% + {\gmu@hashesbraced1\@tempcnta}% + % + \@nameedef{gmu@Hashesbraced@\the\numexpr\@tempcnta-1\relax}% + {\gmu@Hashesbraced1\@tempcnta}% + % % + \@nameedef{gmu@HHashesbraced@\the\numexpr\@tempcnta-1\relax}% + {\gmu@HHashesbraced1\@tempcnta}% + % + \edef\gmu@eloops@resa{% + \long\def\@xanxcs{% ^^A >>>>>> printhashes + gmu@TOhashes@\romannumeral\numexpr\@tempcnta-1\relax}% + \gmu@hashes1\@tempcnta{% + \@nx\TypeOut{% + \gmu@hashesOut % ^^A2 + 1 \@tempcnta}% + }% of |\gmu@TOhashes@viii| etc. + % + }% of temporary macro + % + \gmu@eloops@resa + % Generates nine pairs of macros |\gmu@TOhashes@i|, + % |\gmu@TOUhashes@i|, |\gmu@TOhashes@ii|, |\gmu@TOUhashes@ii| + % etc. that print (type out) their arguments on the terminal, + % ^^A expanded or \textbf Unexpanded. + % unexpanded + % + \advance\@tempcnta\@ne +}% of |\@whilenum| + +\foone{\catcode`\ \active}% +{\newcommand*\gmobeyspaces{\let \ \catcode`\ \active}} + +\newcommand*\nohy{\leavevmode\kern0sp\relax} +\newcommand*\yeshy{\leavevmode\penalty\@M\hskip\z@skip} + +\long\pdef\gmu@EdefCurrnames#1{% + \xiiEdetoke\gmu@EdefCurrnames@resa{#1}% + \@xa \gmu@EdefCurrnames@ \gmu@EdefCurrnames@resa.tex.\@nil + % if no extension is present, |tex| is assumed. This couple of + % macros won't work well for files with dots in their names. +} + +\pdef\gmu@EdefCurrnames@ #1.#2.#3\@nil{% + \def\@currname{#1}% + \def\@currext{#2}% +} + +\def\NamedInput@prepare#1{% we wrap in a macro to use also in |\DocInput| + \@pushfilename + \gmu@EdefCurrnames {#1}% +} + +\let\NamedInput@finish=\@popfilename + +\pdef\NamedInput#1{% useful e.g.~in error handling + \NamedInput@prepare {#1}% + \@@input #1\relax + \NamedInput@finish +} + +\def\gmu@ifdim +#1% dimen specification +#2% comparison +#3% dimen specification +{% + \ifnum0\ifx#2≤1\fi\ifx#2≥1\fi\ifx#2≠1\fi=\@ne + \afterfi\unless + \fi + \ifdim#1\ifx#2≤>\fi\ifx#2≥<\fi\ifx#2≠=\fi + \ifx#2>>\fi\ifx#2<<\fi\ifx#2==\fi + \dimexpr(#3)*1\relax% parentheses are for closing all possible + % \eTeX pressions not to gobble that |\relax| + % by them but only by the outermost |\dimexpr| + % to avoid premature expansion of the + % following |\expandafter|. (2010/6/14) + \@xa\@firstoftwo + \else\@xa\@secondoftwo + \fi +} + +\def\gmu@ifskip +#1% glue specification +#2% comparison for natural part +#3% comparison for stretch part +#4% comparison for shrink part +#5% glue specification +{\ifnum + 0\gmu@ifdim{1\glueexpr#1}#2{1\glueexpr#5}10% + \gmu@ifdim{\gluestretch\glueexpr#1}#3{\gluestretch\glueexpr#5}10% + \gmu@ifdim{\glueshrink\glueexpr#1}#4{\glueshrink\glueexpr#5}10=111 + \@xa\@firstoftwo + \else\@xa\@secondoftwo + \fi +} + +\def\gmu@ifbox +#1% a box register number (e.g.~|\copy\z@|) +#2% comparison for heights +#3% comparison for depths +#4% comparison for widths +#5% a box register number +{% + \gmu@ifskip + {\glueexpr (\ht#1 plus \dp#1 minus\wd#1 )*1\relax}% + #2#3#4% + {\glueexpr (\ht#5 plus \dp#5 minus\wd#5 )*1\relax}% +} + +\def\greater@dim#1#2{% + \ifdim\dimexpr#1>\dimexpr(#2)*1\relax + #1% + \else #2% + \fi +} + +\long\pdef\gmu@removeelement +#1% element to be removed +#2% macro carrying a comma-separated list +#3% \CS to carry removed element. +{% + \let#3\@undefined% + \def\gmu@removeelement@resa##1,#1,##2\@nil{% + \gmu@ifempty{##2}% + {\edefU#2{##1}}% + {\edefU#2{##1,##2}% + \def#3{#1}% + \@xa\gmu@removeelement@resa#2\@nil + }% + % If |##2| is not empty, then we know |#1| was in the list so we + % have to remove its copy from the end of the list. + }% of |\gmu@removeelement@resa| + \@xa\gmu@removeelement@resa\@xa,#2,#1,\@nil + % We gobble the beginning comma + \@xa\@xa\@xa\ifx\@xa\@firstofmany#2\relax\@nil,% + \edef#2{\unexpanded + \@xa\@xa\@xa{\@xa\@gobble#2}}% + \fi +} + +\long\def\@nxcsn#1{% + \@xa\@nx\csname #1\endcsname} + + +\def\@listbegvskipping{% + \@topsepadd=\topsep + \ifvmode + \advance\@topsepadd by\partopsep + \fi + \par + \addvspace\@topsepadd +} + + +\def\foolc#1#2{% + \begingroup\lccode`#1=`#2\relax + \lcfirstofone +} + +\long\def\lcfirstofone#1{% + \lowercase{\endgroup#1}% +} + +\long\def\PackageWarning#1#2{% + \GenericWarning{% + (#1)\@spaces\@spaces\@spaces\@spaces + }{% + Package #1 Warning: #2% + }% +} + +\long\def\TypeOut#1{% + \edef\TO@resa{#1}% + \edef\TO@resa{\@xa\detokenize\@xa{\TO@resa}}% + \typeout{\TO@resa}} + +\long\def\ShowOut#1{% + \TypeOut{#1}% + \show\TO@resa +} + +\long\pdef\incsdef +#1% a CS or active char +#2% parameters string +#3% definition's body +{% + \def#1#2{% + \gmu@if {incsname}{}% + {\string#1}{#3}% + }% +} + + +\gmu@DefSymbol\gmu@CountTokens@end +\newcount\c@gmu@TokensCount + +\lpdef\gmu@CountTokens +#1% the tokens to be counted. +{% + \c@gmu@TokensCount=\m@ne + \let\gmu@CountToken@token\@undefined + \gmu@CountToken@iter + #1\gmu@CountTokens@end +} + +\def\gmu@CountToken@iter{% + \gmu@if x{\gmu@CountToken@token\gmu@CountTokens@end}% + {}% we've reached the end of iteration + {% + % We increase the counter and throw the iterator after next assignment + \advance\c@gmu@TokensCount\@ne + \afterassignment\gmu@CountToken@iter + \let\gmu@CountToken@token= + }% +}% + + +\long\def\gmu@passbraced +#1% the stuff to be put before |#2| +#2% the stuff we check and pass unbraced if single or braced otherwise +{% + \gmu@CountTokens{#2}% + \gmu@if {num}{\c@gmu@TokensCount=\@ne}% + {\gmu@if x{#2 }% + \@secondoftwo\@firstoftwo}% + \@secondoftwo + {#1#2}{#1{{#2}}}% +}% of |\gmu@passbraced| + +\long\def\MeaningOrUnex#1{% + \gmu@if {singletoken}{{#1}}% + {\meaning#1}{\unexpanded{#1}}% +} + +\pldef\@iwru#1{% + % + % as simple as possible not to put much output on the terminal if + % tracing is on. + % + \immediate \write \@unused {l.\the\inputlineno:\space #1}% +} + +\pldef\@iwruJ{\@iwru{^^J}} + +\pldef\@iwrum#1{% + \@iwru{»\unexpanded{#1}« is »\MeaningOrUnex{#1}«}% +} + +\pldef\@iwruif#1{% + \gmu@if {gmu@debug@msgs}{} + {\@iwru{#1}}{}% +} + +\long\pdef\IgnInfo +#1% package name +#2% description +#3% stuff we announce as ignored +{% + \PackageInfo{#1}{Item »\unexpanded{#3}« (\MeaningOrUnex{#3}) ignored^^J% + #2}% +} + +\pldef\@iwma{% + % (Added 2010/10/19) + % + % Note it takes a \emph{text} not an argument. + \immediate \write \@mainaux +} + +\def\stepnummacro +#1% a macro that expands to some numerical stuff +#2% +{\edef#1{\the\numexpr #1+#2}} + +\def\boolstobin +#1% a sequence of Boolean switches' names without »if« +{% + \numexpr \boolstobin@iter 0 #1 {}\gmu@delim % +} + +\def\boolstobin@iter +#1% expression so far +#2% the name of current switch (without »if«) +#3% tail of switches +\gmu@delim +{% + \gmu@ifempty{#3}% + {#1\relax}% |\relax| to close the num expression + {\boolstobin@iter + {(#1)*2+\csname if#2\endcsname 1\else 0\fi}% + #3\gmu@delim + }% +} + +\long\def\condstobin +#1% a sequence of conditionals' names without »if« followed by the condition +{% + \numexpr \condstobin@iter 0 #1 {}{}\gmu@delim % +} + +\long\def\condstobin@iter +#1% expression so far +#2% the name of current conditional (without »if«) +#3% the condition for |#2| +#4% tail of switches +\gmu@delim +{% + \gmu@ifempty{#3}% + {#1\relax}% |\relax| to close the num expression + {\condstobin@iter + {(#1)*2+\csname if#2\endcsname #31\else 0\fi}% + #4\gmu@delim + }% +} + +\long\def\condsalt +#1% a sequence of conditionals' names without »if« followed by the condition +{% + \numexpr \condsalt@iter 0 #1 {}{}\gmu@delim % +} + +\long\def\condsalt@iter +#1% expression so far +#2% the name of current conditional (without »if«) +#3% the condition for |#2| +#4% tail of switches +\gmu@delim +{% + \gmu@ifempty{#4}% + {#1\relax}% |\relax| to close the num expression + {\condsalt@iter + {#1+\csname if#2\endcsname #3 1\else 0\fi}% + #4\gmu@delim + }% +} + +\long\def\ifcondsalt #1{% + \ifnum \condsalt{#1}>\z@ +} + +\long\def\condsconj +#1% a sequence of conditionals' names without »if« followed by the condition +{% + \numexpr \condsconj@iter 1 #1 {}{}\gmu@delim % +} + +\long\def\condsconj@iter +#1% expression so far +#2% the name of current conditional (without »if«) +#3% the condition for |#2| +#4% tail of condition(al)s +\gmu@delim +{% + \gmu@ifempty{#4}% + {#1\relax}% |\relax| to close the num expression + {\condsconj@iter + {#1*\csname if#2\endcsname #3 1\else 0\fi}% + #4\gmu@delim + }% +} + +\long\def\ifcondsconj #1{% + \ifnum \condsconj {#1}>\z@ +} + +\long\def\sName #1#2 {\@xa#1\csname #2\endcsname} + +\long\def\sdName #1#2 {\@xa#1\csname \detokenize{#2}\endcsname} + +\long\def\dName #1#2{\@xa #1\csname \detokenize{#2}\endcsname} + +\long\def\@sN #1 {\csname #1\endcsname} +\long\def\@sdN #1 {\csname \detokenize{#1}\endcsname} + +\long\def\gmu@extreme +#1% kind of test (|num| or |dim|) +#2% inequality sign: |<| for minimum, |>| for maximum. +#3% left side of comparison +#4% right side of comparison +{% + \gmu@if {x\@xa\@xa}{\@firstofmany#4\@nil\relax} % this complicated test is to + % allow arguments beginning with some \incs{if⁄<…>} as in + % \incs{possvfil} e.g. + {#3}% + {% + \gmu@if {#1} {\csname #1expr\endcsname#3\relax + #2\csname #1expr\endcsname #4\relax } + {\gmu@extreme {#1}#2{#3}}% + {\gmu@extreme {#1}#2{#4}}% + }% +}% of |\gmu@extreme| + +\def\gmu@maxnum{\gmu@extreme {num}>} +\def\gmu@minnum{\gmu@extreme {num}<} + +\def\gmu@maxdim{\gmu@extreme {dim}>} +\def\gmu@mindim{\gmu@extreme {dim}<} + +\pdef\gmu@fitto +#1% scope (nothing, |\relax| or |\global|. +#2% left side of the assignment (must be a dimen able to be ”passive”) +#3% the comparison (if |#2#3#4| then reassign |#2|) +#4% right side of the assignment---any correct text for |\dimexpr|. +{% + \gmu@if {dim}{#2#3\dimexpr (#4)+\z@\relax\relax}% + {#1#2=\dimexpr (#4)+\z@\relax}% + {}% +} + +\pdef\gmu@g@enlargeto +#1% |#2| of the above +#2% |#4| of the above +{\gmu@fitto\global{#1}<{#2}} + +\pdef\discre#1#2#3{\leavevmode\kern\z@ + \discretionary{#1}{#2}{#3}\penalty\@M\hskip\z@skip} + +\pdef\discret#1{\discre{#1}{#1}{#1}} + +\pdef\gmu@flexhyphen{% + \discre{% before break + \ifnum\hyphenchar\font>\z@ + \char\hyphenchar\font + \fi + }% end of before break + {}%after break + {}% without break +} + +\def\:{% + \ifmmode\afterfi{\mskip\medmuskip}% + \else\afterfi{\discre{\null}{}{}}% \incs{null} to get + % \incs{hyphenpenalty} not \incs{exhyphenpenalty}. + \fi +} + +\lpdef\hboxreflected#1{% + \hbox{% + \reflectbox{#1}% + }% +} + +\pdef\gmu@ifSystemX{% the ‘If file exists” test is \emph{NOT} + % expandable since it involves opening some + % streams. Therefore we define this macro as protected. + \IfFileExists{/etc/passwd}% +} + +\def\hrule@zero{\hrule height\z@ width\z@ depth\z@} +\def\vrule@zero{\vrule height\z@ width\z@ depth\z@} + +\def\do#1#2{% (2010/10/11) + \Name \def{gmu@iflast#1}{% + \ifnum #2=\lastnodetype + \@xa\@firstoftwo + \else + \@xa\@secondoftwo + \fi + }% +} + +\do {glue}{11} +\do{kern}{12} +\do {penalty}{13} + +\def\gmu@dimratio +#1% numerator dim(en/expr) +#2% denominator dim(en/expr) +{\strip@pt + \dimexpr 1pt * + \numexpr\dimexpr (#1)*1\relax\relax / + \numexpr \dimexpr (#2)*1\relax \relax + \relax +} + +\def\falseifdefined #1{% + \ifcsname if#1\endcsname + \csn{#1false}% + \fi +} + +\def\trueifdefined #1{% + \ifcsname if#1\endcsname + \csn{#1true}% + \fi +} + + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmbase.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmcommand.sty b/Master/texmf-dist/tex/latex/gmutils/gmcommand.sty new file mode 100644 index 00000000000..77ea0839d87 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmcommand.sty @@ -0,0 +1,2164 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmcommand.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `command') +%% +%% +%% 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{gmcommand} + [2010/10/24 v0.993 definition of powerful \string \DeclareCommand \string &al. (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + +\RequirePackage{gmbase} % we require the tricky low-level macros. + +\unless\ifcsname ifgmu@quiet\endcsname +\Name\newif {ifgmu@quiet}% % it has to be at least (at highest) in + % \CH{2010/09/06 v0.993 moved here from + % % \pk{gmutils.sty} (a bug fix)} +\fi + + % + +\unless\ifdefined\@temptokenb +\newtoks\@temptokenb +\fi + +\newif\if@dc@alllong@ % for an option of all arguments long (it's + % stronger than |GroteLang| defined later (the + % latter is |\let| it). +\newif\if@dc@quiet@ % for suppressing the message of using of + +\newif\ifDCMessages % a~global switch to suppress the message about + +\newtoks\@dc@arguments % the register for storing parsed + % |\\command {#1}›…{⁄<n>}|. + +\newcount\c@dc@catchernum +\newcount\c@dc@argnum + +\newif\if@dc@ignore@ +\newif\if@dc@GroteNegere@ % for “gross” ignoring +\newif\if@dc@GroteLang@ % for “gross” longness + +\newif\if@dc@long@ + +\def\@dc@long@letter{% +\if@dc@long@ P\fi +} + +\newif\if@dc@xadefault + +\def\@nx@xa{\@nx\@xa} +\def\@xa@nx{\@xa\@nx} +\def\@xa@xa{\@xa\@xa} + +\newif\if@dc@xadefault@i@ +\newif\if@dc@xadefault@ii@ +\newif\if@dc@xaeacher@ + +\def\@dc@falsify@xadefaults{% + \@dc@xadefaultfalse + \@dc@xadefault@i@false + \@dc@xadefault@ii@false +} + +\lpdef\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} + % \chgs{2010/04/15 v0.993 implemented the \cmd\SameAs feature} + % + % + % +\@dc@alllong@true + \@dc@ResetParseAuxilia + % + \@dc@ParseNextSpecifier #2% + \@dc@buckstopshere% it's the sentinel of parsing. Doesn't have to be + % defined since the test performs a strings comparison. + \protected\edef#1{% + \@nx\@dc@ {\the\toks@}% + \@xanxcs{\@dc@InnerName{#1}}% + \@nx #1% + }% + \edef\gmu@DeclareCommand@resa{% + \long\def\@xanxcs{\@dc@InnerName{#1}}% + \@xau\@dc@innerhashes{% + \unexpanded{#3}}% + }% of resa + \gmu@DeclareCommand@resa +}% 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@ResetParseAuxilia{% + % + \emptify\@dc@ParsedSpecs{}% + % + \c@dc@catchernum\z@ % the count of catchers + \c@dc@argnum\z@ % the count of arguments (inner arity) (it may be + % smaller than the above if we ignore some arguments) + % + \toks@{}% in this register we will store the created sequence of + % argument catchers. + % + % And for the |M⁄m| specifiers: + \@dc@Mmode@false + % + \emptify\@dc@innerhashes % in this macro we will store the sequence of + % \inverb|#1#2…|. + % + \@dc@GroteNegere@false + \let\if@dc@GroteLang@\if@dc@alllong@ +} + +\newif \if@dc@Mmode@ +\def\@dc@Ms@num {\z@}% + +\def\@dc@Ms@init{% + \@dc@Mmode@true + \def\@dc@Ms@num {\z@}% + \edef\@dc@Ms@initial@listate{% + \@dc@Ms@listate + }% of edef +} + +\def\@dc@Ms@listate{% + \boolstobin{{@dc@long@}{@dc@ignore@}}% +} + +\def\@dc@Ms@shipout {% + \gmu@if {num} {\@dc@Ms@num>\z@}% + {\@xa\dc@addtoParsed@\@xa{\@dc@Ms@num}% + \def\@dc@Ms@num{\z@}% + \@dc@Mmode@false + }% + {}% +} + +\def\@dc@ResetStepAuxilia {% + % We set the local ignorance switch to its “gross” value + \let\if@dc@ignore@ =\if@dc@GroteNegere@ + \let\if@dc@long@ = \if@dc@GroteLang@ + % and reset the expandaftering switches + \@dc@falsify@xadefaults +} + +\def\@dc@argtypes{% + =\gobblespace \loop \lostwax \SameAs \Scope + AaBbCcDdGgKkMmOoQqSs*TtUuWw% + \drs +} + +\def\@dc@drses{\drs} + +\@ifXeTeX +{\addtomacro\@dc@argtypes{ďĎ}% + \addtomacro\@dc@drses{ďĎ}% +} +{} + +\def\@dc@ParseSpecifier #1{% The main inner macro parsing argument + \gmu@CASE {stribs}{{#1}\@dc@buckstopshere}% + {% + \@dc@Ms@shipout + \edef\@dc@innerhashes {% + \gmu@hashes 1{\numexpr\c@dc@argnum +\@ne}% + }% + }% + \gmu@CASE {stribs}{{#1}>}% + {% + \grab@prefix }% + \@XA{% + \gmu@CASEsbnone{#1}}\@xa{% + \@dc@argtypes + }% + {\IgnInfo{gmcommand}{while parsing arg specifiers}{#1}% + \@dc@ParseNextSpecifier }% + \gmu@CASE {stribs}{{#1}\SameAs}% + {\@dc@SameAs}% + \gmu@ifsbnone {#1}{Mm}% + {\@dc@Ms@shipout }% + {}% + \gmu@if {@dc@Mmode@}{}% + {}% + {% + \gmu@ifsbany{#1}{=\gobblespace}{\@dc@ignore@true}{}% + \gmu@if {@dc@long@} {} + {\@dc@addtospecs@bare{>P}} + {}% + % + \gmu@if {@dc@ignore@}{}% + {\@dc@addtoparsed@Ignore }% + {}% + % + \@dc@addtospecs@bare {#1}% + % + \@xa\addtotoks\@xa\toks@\@xa{% + \csname ArgumentCatcher@\@dc@long@letter + \strip@bslash{#1}% + \endcsname + }% of toks' text. + \advance\c@dc@catchernum\@ne + }% of if not |M|-mode + \gmu@notif {@dc@ignore@}{}% + {\@dc@addinnerhash }% \label{@dc@addinnerhash} + {}% (empty “not-else” branch of ignoring) + \gmu@CASEsbany {#1}{Mm}% + {\@dc@process@ms}% + \gmu@CASEsbany {#1}{Kk}% + {\@dc@define@K}% + \gmu@CASEsbany {#1}{\gobblespace}% + {\@dc@ParseNextSpecifier}% + \gmu@CASEsbany{#1}{=\Scope AaBbCcDdOoSs*}% + {\grab@optparam{#1}}% + \@XA{\gmu@CASEsbany{#1}}\@xa{\@dc@drses}% + {\grab@optparam{#1}}% + \gmu@CASEsbany{#1}{UuWw\lostwax}% + {\@dc@grab@Loop #1}% putting the specifier's letter as |#1| for the + % grabber suppresses adding it to the parsed specifiers' list. + \gmu@lastCASE + {% + \grab@twoparams{#1}}% + \gmu@ESAC + % +}% of |\@dc@ParseSpecifier| + +\def\@dc@addtoparsed@Ignore{% + \addtotoks\toks@{\@dc@ignorearg}% + \@dc@addtospecs@bare{>i}% +} + +\def\@dc@addinnerhash{% + \advance\c@dc@argnum\@ne +} + +\def\@dc@process@ms{% + \gmu@if {@dc@Mmode@}{}% + {\gmu@if {num}{\@dc@Ms@initial@listate=\@dc@Ms@listate}% + {\@dc@process@ms@grabnum }% of if the state has'nt been changed + {\@dc@Ms@shipout + % Remember however that we've increased number of arguments so now we + % set it back: + \advance\c@dc@argnum\m@ne + \@dc@ParseSpecifier m% + }% of if the state has been changed + }% of if |M|-mode + {\@dc@Ms@init + \@dc@process@ms@grabnum + }% of not if |M|-mode. +}% of \@dc@process@ms + +\def \@dc@process@ms@grabnum {% + \@ifnextanyIS {\bgroup \@ne \tw@ \thr@@ 123456789}% + {% + \@dc@process@ms@fin}% + {% + \@dc@process@ms@fin \@ne}% +} + +\def \@dc@process@ms@fin #1{% + \edef\@dc@processms@hash {\the\numexpr#1}% + \edef\@dc@processms@left {\the\numexpr 9-\c@dc@argnum+\@ne}% + % + \gmu@if {condsconj} {% + {% + {num} {\@dc@processms@hash >\z@} + {num} {\@dc@processms@hash <\numexpr + \@dc@processms@left+1 \relax }% + }% + }% + {\stepnummacro \@dc@Ms@num \@dc@processms@hash + \edef\@dc@hashgoal {% + \the\numexpr\c@dc@argnum +% + \@dc@processms@hash-1}% minus 1 because one + \@whilenum \c@dc@argnum<\@dc@hashgoal \do{% + \@dc@addinnerhash + }% + % + \@dc@ParseNextSpecifier }% + {\PackageError{gmcommand}{% + The argument to the M or m specifier, if any, has to be ^^J% + a number between 1 and \@dc@processms@left ^^J% + (there is/are \the\c@dc@argnum\space arg(s) declared + already).^^J% + I ignore this m/M.}% + {}% + \gmu@passbraced \@dc@ParseNextSpecifier {#1}% + }% +}% of |\@dc@process@ms| + +\def\@dc@ParseNextSpecifier{% + \@dc@ResetStepAuxilia + \@dc@ParseSpecifier +} + +\lpdef\@dc@AddAndParse#1{% + \dc@addtoParsed@{#1}% + \@dc@falsify@xadefaults + \@dc@ParseNextSpecifier +} + + +\def\grab@optparam #1{% arg specifier + \@ifnextchar\bgroup{\@dc@AddAndParse}% + {% + \edef\@dc@tempa{% + \gmu@if {csname}% + {@dc@optparam@deft@\strip@bslash{#1}\endcsname}% + {\@xaucs {@dc@optparam@deft@\strip@bslash{#1}}}% + {\@nx \NoValue}% + }% + \@xa\@dc@AddAndParse\@xa{\@dc@tempa}% + }% +} + + +\long\def\@dc@DeclareDefault #1#2{% + \uppercase{% + \Name\edefU{\strip@bslash{\@dc@optparam@deft@}\strip@bslash{#1}}{#2}}% + % + \lowercase{% + \Name\edefU{@dc@optparam@deft@\strip@bslash{#1}}{#2}}% +} + +\@dc@DeclareDefault D{0} + +\@dc@DeclareDefault Ď{0} + +\@xa\@dc@DeclareDefault \@xa\Scope\@xa{\all@stars} + +\@dc@DeclareDefault = {\@tempcnta} + + +\@dc@DeclareDefault Q {\NoValue} + +\@dc@DeclareDefault U {\NoValue} + +\long\def\@dc@maybe@expandafter #1{% + \gmu@if {@dc@xadefault}{}% + {\gmu@ifutokens{#1}{\NoValue}% + {\@secondoftwo}{\@firstoftwo}% + }% if we are to expandafter |#1|. + {\@secondoftwo}% if we don't expandafter |#1| +} + +\long\def\dc@addtotoks@ #1{% + \@dc@maybe@expandafter {#1}% + % + {\toks@\@xa\@xa\@xa{\@xa\the\@xa\toks@\@xa{#1}}}% + {\toks@\@xa{\the\toks@{#1}}}% +} + +\long\def\@dc@addtospecs #1{% + \@dc@maybe@expandafter {#1}% + {\@xa \addtomacro \@xa\@dc@ParsedSpecs\@xa{\@xa{#1}}% + }% + {\addtomacro\@dc@ParsedSpecs{{#1}}}% +} + +\long\def\dc@addtoParsed@ #1{% + \dc@addtotoks@{#1}% + \@dc@addtospecs{#1}% +} + +\long\def\@dc@addtospecs@bare #1{% + \addtomacro\@dc@ParsedSpecs{#1}% +} + +\long\def\@dc@addtotoks@bare #1{% + \addtotoks\toks@ {#1}% +} + +\long\def\@dc@addtoParsed@bare #1{% + \@dc@addtotoks@bare {#1}% + \@dc@addtospecs@bare {#1}% +} + +\long\def\grab@twoparams +#1% the specifier +#2% first parameter, which is mandatory +{% default default (when default is absent) + \if@dc@xadefault@i@\@dc@xadefaulttrue\fi + \dc@addtoParsed@{#2}% + \if@dc@xadefault@ii@ + \@dc@falsify@xadefaults\@dc@xadefaulttrue + \fi + \grab@optparam{#1}% +} + +\long\def\@dc@addargum#1{% + \addtotoks\@dc@arguments{#1}% +\@iwruif {@@@@@@ @dc@arguments: »\the\@dc@arguments«}% +} + +\Store@Macro\@dc@addargum + +\pdef\@dc@ignorearg{% + \long\def\@dc@addargum##1{% + \Restore@Macro\@dc@addargum}% +} + + +\def\grab@prefix@CASE{% jus a shorthand + \@xa\gmu@CASEsbany\gmu@forarg +} + +\long\def\grab@prefix #1{% + %% \CH{2010/07/26 v0.993 made for-eaching to make it behave as + %% expected, i.e.\ that latter settings prævalent over the former} + % + \gmu@foreach#1\gmu@foreach@delim{% + % + \grab@prefix@CASE + {\long!lL\par Pp}% + {\@dc@long@true}% + % + \grab@prefix@CASE + {Ii}% + {\@dc@ignore@true}% + % + \grab@prefix@CASE + {\@xa\expandafter}% + {\@dc@xadefaulttrue}% + % + \grab@prefix@CASE + {\@xa \@xa@nx \@xa@xa \expandafter \@xanx \xanx \xaxa}% + {\@dc@xadefault@i@true}% + % + \grab@prefix@CASE + {\@xa \@nx@xa \@xa@xa \expandafter \@nxxa \nxxa}% + {\@dc@xadefault@ii@true}% + % + \grab@prefix@CASE + {\@xaeacher \xaeacher \xaEacher \xaE }% + {\@dc@xadefault@ii@true}% + % + \grab@prefix@CASE + {\GroteNegere \GrossIgnore \GroteN \GrossI} + {\@dc@GroteNegere@true + \@dc@ignore@true}% + % + \grab@prefix@CASE + {\GroteNegereStop\GrossIgnoreStop + \GroteNStop\GrossIStop} + {\@dc@GroteNegere@false + \@dc@ignore@false}% + % + \grab@prefix@CASE + {\GroteLang\GrossLong\GroteL\GrossL} + {\@dc@GroteLang@true + \@dc@long@true}% + % + \grab@prefix@CASE + {\GroteLangStop\GrossLangStop + \GroteLStop\GrossLStop}% + {% + \let\if@dc@GroteLang@=\if@dc@alllong@ + \let\if@dc@long@=\if@dc@alllong@}% + % + \gmu@EatCases + {\IgnInfo{gmcommand}{while parsing arg specifiers}{#1}}% + \gmu@ESAC + % + }% of for each + \@dc@ParseSpecifier % +}% of |\grab@prefix| + +\long\def\dc@DefParseNext#1{% + % This is to allow hashes in the defaults. + \edefU\@dc@parse@next{#1}% +} + +\def\@dc@Alias +#1% |\lowercase| or |\firstofone| +#2% left side of the assignment +#3% right side of the assignment +#4% |Lower| or empty +{% + \gmu@if {csname}% + {ArgumentCatcher@\strip@bslash #3\endcsname}% + {#1{% + \@xa\let\csname\strip@bslash\ArgumentCatcher@ + \strip@bslash #2\@xa\endcsname}% + \csname ArgumentCatcher@\strip@bslash #3\endcsname + }{\PackageError{gmutils/gmcommand}{% + You're trying to #4Alias the »\unexpanded{#3}« catcher^^J% + but it is not defined!}{}% + }% +} + +\def\@dc@LowerAliases #1{% + % To provide lowercase aliases of the catchers: + \@dc@Alias \lowercase {#1}{#1}{Lower}% + \@dc@Alias \lowercase {\P#1}{\P#1}{Lower}% we provide »P« as a \CS + % to avoid lowercase'ing it. +} + +\def\@dc@AliasCatcher +#1% left side of the assignment +#2% right side of the assignment +{% + \@dc@Alias \firstofone {#1}{#2}{}% +} + +\def\@dc@AliasPLower +#1% specifier to alias +{\@dc@AliasCatcher {P#1}{#1}% + \@dc@LowerAliases{#1}% +} + +\long\def\ArgumentCatcher@B +#1% default value +#2% tail of args catchers. +\@dc@arguments % delimiter +{% + \@ifnextcat\bgroup + {\dc@DefParseNext{#2}\ArgumentCatcher@m@i }% + {\@dc@addargum {{#1}}#2\@dc@arguments }% +} + +\long\def\ArgumentCatcher@PB +#1% default value +#2% tail of args catchers. +\@dc@arguments % delimiter +{\@ifnextcat\bgroup + {\dc@DefParseNext{#2}\ArgumentCatcher@Pm@i }% + {\@dc@addargum {{#1}}#2\@dc@arguments }% +} + +\@dc@LowerAliases B + +\long\def\ArgumentCatcher@T@ % parsing of a~single \textbf Token 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 +{% + \gmu@ifStrXany #4{#1}% + {\@dc@addargum {{#4}}#3\@dc@arguments}% + {\@dc@addargum {{#2}}#3\@dc@arguments#4}% +} + +\long\def\ArgumentCatcher@T % parsing of a~ single \textbf Token. It's +#1% the list we search optional token on, +#2% the default value, +#3% the tail of args parser. +\@dc@arguments{% + \@ifnextnotgroup + % \label{dc@S:bgroup} + {\ArgumentCatcher@T@{#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. +} + +\@dc@AliasPLower T + + +\edef\ArgumentCatcher@S +#1% default value +{% + \@nx\ArgumentCatcher@T {\@xa\@nx\all@stars}{#1}}% the |s| arg spec is + +\@dc@AliasPLower S +\@dc@AliasCatcher * S + +\newif\if@debugacro@ + +\long\def\ArgumentCatcher@Loop %^^A >>>>>>>loop +#1% “sign” of match for iteration: |\any| or |\none| +#2% list of tokens |\@let@token| will be matched against with |#1| +#3% test for “drainers” (allowed values as for |#1|) +#4% list of “drainers”: if |\@let@token| satisfies the |#3| test, +#5% upper bound of number of items (may be empty or negative to turn +#6% default value (if empty sequence is parsed), |\NoValue| by default. +#7% an “eacher”—stuff to be put before each token/text added to the +#8% the tail of args parser +\@dc@arguments % delimiter +{% + \dc@DefParseNext{#8}% + \emptify\@dc@seQuence + \c@dc@Loop@bound=\numexpr(\gmu@ifempty{#5}{-1}{#5})*1\relax + \gmu@if {num}{\c@dc@Loop@bound<\z@}% + {\c@dc@Loop@bound=-\c@dc@Loop@bound + \let\@dc@Loop@countby\z@ + }% + {\let\@dc@Loop@countby\m@ne}% + % + \gmu@ifempty{#2}% + {\gmu@if {strings}{\none #1}% + {\@dc@Loop@iteralltrue}% it's an additional switch for better + % performance in a special case: when we wish + % only count the items and iterate over anything + {% + \Store@Macro\ArgumentCatcher@Loop@defcheck + \def\ArgumentCatcher@Loop@defcheck{% + \Restore@Macro\ArgumentCatcher@Loop@defcheck + \ArgumentCatcher@Loop@shipout}% + }% of if |#1| str-is |\any| + }% of if |#2| empty + {\@dc@Loop@iterallfalse}% when |#2| nonempty, we \emph{have} to + % perform matching. \rrthis + % + \gmu@ifempty{#4}% + {\gmu@if {strings} {\any #3}% + {\@dc@Loop@addallfalse\@dc@Loop@drainalltrue}% + {\@dc@Loop@addalltrue\@dc@Loop@drainallfalse}% + }% of if |#4| empty + {\@dc@Loop@addallfalse\@dc@Loop@drainallfalse}% when |#4| nonempty, + % we \emph{have} to perform matching. \rrthis + % + \edef\ArgumentCatcher@Loop@afterpeep{% + \gmu@if {@dc@Loop@iterall}{}% + {\firstoftwo}% + {\unexpanded{% + \@dc@Loop@test + #1{#2}% if the next token StrX-is/is not on |#2|, + % then… \label{h1.@let@token.h2} + }% of |\unexpanded| + }% of if we don't iterate over all (of preparation of iteration test) + {\gmu@if {@dc@Loop@addall}{}% + {\@nx \ArgumentCatcher@Loop@add}% + {\gmu@if {@dc@Loop@drainall}{}% + {\@nx \ArgumentCatcher@Loop@drain}% + {\unexpanded{% + \@dc@Loop@test + #3{#4}% if the next token satisfies |#3|-direction StrX + % match against |#4|, then we discard it, + % otherwise we add it. + \ArgumentCatcher@Loop@drain + \ArgumentCatcher@Loop@add + }% of |\unexpanded| + }% of not drain all + }% of if not add all + }% + {\gmu@if {@dc@Loop@iterall}{}% + {}% + {\@nx \ArgumentCatcher@Loop@shipout}% + }% + \unexpanded{{#6}{#7}}% + }% of |\ArgumentCatcher@Loop@afterpeep| + % + \ArgumentCatcher@Loop@defcheck {#6}{#7}% + \ArgumentCatcher@Loop@check +}% of |\ArgumentCatcher@Loop| + +\newcount\c@dc@Loop@bound + +\newif\if@dc@Loop@iterall +\newif\if@dc@Loop@addall +\newif\if@dc@Loop@drainall + +\long\def\@dc@Loop@test +#1% |\any| or |\none| +#2% list of tokens to match against +#3% what if \OK +#4% what if not \OK. +{% remember we are in the argument of |\gmu@peep@next| so we are after + % peep. + \gmu@if {defined}{\@def@token} + {\csname gmu@ifStrX\strip@bslash #1\@xa\endcsname + \@def@token }% + {\csname gmu@ifx\strip@bslash #1\endcsname + \@let@token }% + {#2}{#3}{#4}% +} + +\@dc@AliasCatcher {PLoop} {Loop} + +\long\def\ArgumentCatcher@Loop@defcheck +#1% default, +#2% “eacher” +{% + \edefU\ArgumentCatcher@Loop@check{% + \gmu@if {num}{\c@dc@Loop@bound>\z@} + {\advance \c@dc@Loop@bound \@dc@Loop@countby + \gmu@peep@next + \ArgumentCatcher@Loop@afterpeep } + {\ArgumentCatcher@Loop@shipout {#1}{#2}}% of if num bound reached + }% of |\ArgumentCatcher@Loop@check| +}% of |\ArgumentCatcher@Loop@defcheck| + +\lpdef\@dc@Loop@CareOfSpace +#1% a macro with all the arguments except last +{\gmu@ifpeeped x \gmu@letspace + {\edef\@dc@Loop@careofspace@aas{% + \unexpanded{#1{ }}% + }% edef unexpanded to allow |#| tokens in |#1| + \afterassignment\@dc@Loop@careofspace@aas + \let\gmu@drain= }% after |=| is a space. + {#1}% next not space, so just |#1| and let it process the next token + % its way. +} + + +\lpdef\@dc@Loop@CareOfSpaceAndGroup +#1% as in the previous macro +{\@iwruif {Care of both: @let@token: »\meaning\@let@token«}% + \@dc@Loop@CareOfSpace{% + \gmu@passbraced{#1}% + }% +}% of “take care of both” + +\long\def\ArgumentCatcher@Loop@add +#1% default +#2% eacher +{\@dc@Loop@CareOfSpaceAndGroup + {\ArgumentCatcher@Loop@add@{#2}}% +} + +\long\def\ArgumentCatcher@Loop@add@ +#1% eacher +#2% token/text to be added +{\addtomacro\@dc@seQuence{#1#2}% + \@iwruif {@@@@@@ Q-add: »\the\@dc@arguments«}% + \ArgumentCatcher@Loop@check +}% of |\ArgumentCatcher@Loop@add@| + +\long\def\ArgumentCatcher@Loop@drain +#1% default +#2% eacher +{% + \@iwruif{@@@@@@ Q-drain: »\the\@dc@arguments«}% + \@dc@Loop@CareOfSpaceAndGroup + {\@xa\ArgumentCatcher@Loop@check\@gobble}% +} + +\long\def\ArgumentCatcher@Loop@shipout +#1% default +#2% eacher +{% + \gmu@if x{\@dc@seQuence\@empty}% + {\def\@dc@seQuence{#1}% + \gmu@if x{\@dc@seQuence\@empty}% + {}{\prependtomacro\@dc@seQuence{#2}}% + }% + {}% if |\@dc@seQuence| is nonempty, we don't modify it. + \@xa\@dc@addargum\@xa{\@xa{\@dc@seQuence}}% + \@iwruif {@@@@@@ Q-finish: »\the\@dc@arguments«}% + \@dc@parse@next\@dc@arguments +}% of |\ArgumentCatcher@Loop@shipout| + +\long\def\ArgumentCatcher@Q +#1% list +#2% default (|\NoValue| by default, as in previous versions. +{% + \ArgumentCatcher@Loop + \any + { #1}% note the space before |#1|—settheory sum of |#1| and drainers. + \any + { }% we ignore spaces—it's a legacy setting, maybe we'll optionise + % it in the future + \m@ne % we allow any number of tokens + {#2}% default, by default |\NoValue|, as defined in line \ref{Q-arg deft.} + {}% empty eacher +}% + +\@dc@AliasPLower Q + +\def\ArgumentCatcher@D{% decimal argument (useful for dates e.g.) + \ArgumentCatcher@Q + {-+0123456789}% + % the default value will be delivered by the defaults' catcher +} + +\@dc@AliasPLower D + +\@ifXeTeX +{% + \def\ArgumentCatcher@Ď + #1% default value, 0 by default + {% decimal argument + \ArgumentCatcher@Loop + \any + {-+0123456789}% + \none + {}% + \m@ne + {#1}% + {}% + }% +} +{}% + +\@dc@AliasPLower Ď + +\@dc@AliasCatcher U {Loop} + +\@dc@AliasPLower U + +\@dc@AliasCatcher W {Loop} + +\@dc@AliasPLower W + +\@dc@AliasCatcher {lostwax} U + +\long\def\ArgumentCatcher@item +#1% “sign” of matching +#2% list to match against +#3% default value +#4% eacher (which in this case will be applied to \emph{the} (one) +{% + \ArgumentCatcher@Loop + #1% + {#2}% + \none {}% we add all that matches + 1 % at most one item + {#3}% + {#4}% +} + + +\long\def\ArgumentCatcher@genM +#1% the letter »P« (for long catcher) or nothing (for the short version) +#2% number of undelimited parametrs to catch (arabic) +#3% tail of parsers +\@dc@arguments{% + \dc@DefParseNext{#3}% + \csname ArgumentCatcher@#1m@% + \romannumeral#2% + \endcsname +} + + +\def\ArgumentCatcher@M{\ArgumentCatcher@genM {}} +\def\ArgumentCatcher@PM{\ArgumentCatcher@genM P} + +\@dc@AliasCatcher {m} {M} +\@dc@AliasCatcher {Pm} {PM} + +\@dc@AliasCatcher {ms} {M} +\@dc@AliasCatcher {Pms} {PM} + +\@tempcnta=\@ne +\@whilenum\@tempcnta<9\do{% + % + \edef\gmu@tempa{% + % + % The short catchers of mandatories: + \def\@xanxcs{% + ArgumentCatcher@m@\romannumeral\@tempcnta}% + \gmu@hashes1{\numexpr\@tempcnta+1}% + {\@nx\@dc@addargum{% + \gmu@hashesbraced 1{\numexpr\@tempcnta+1}}% + \@nx\@dc@parse@next\@nx\@dc@arguments + }% of \incs{ArgumentCatcher@m@\<rom.num>}. + % + % And the long ones: + \long \def\@xanxcs{% + ArgumentCatcher@Pm@\romannumeral\@tempcnta}% + \gmu@hashes1{\numexpr\@tempcnta+1}% + {\@nx\@dc@addargum{% + \gmu@hashesbraced 1{\numexpr\@tempcnta+1}}% + \@nx\@dc@parse@next\@nx\@dc@arguments + }% of \incs{ArgumentCatcher@Pm@\<rom.num>}. + % + }% of |\edef|. + \gmu@tempa + \advance\@tempcnta1\relax +}% of the loop. + +\if 1 1 +\@tempcnta\@ne +\@whilenum\@tempcnta<9\do{% + \typeout{\bslash ArgumentCatcher@m@\romannumeral\@tempcnta: ^^J% + \Name\meaning{ArgumentCatcher@m@\romannumeral\@tempcnta}^^J}% + \typeout{\bslash ArgumentCatcher@Pm@\romannumeral\@tempcnta : ^^J% + \Name\meaning + {ArgumentCatcher@Pm@\romannumeral\@tempcnta}^^J^^J^^J% + }% + \advance\@tempcnta\@ne +} + +\fi + +\def\ArgumentCatcher@m@ix +#1#2#3#4#5#6#7#8#9{% + \@dc@addargum{% + {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}% + \the \@dc@arguments +} + +\long\def\ArgumentCatcher@Pm@ix +#1#2#3#4#5#6#7#8#9{% + \@dc@addargum{% + {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}% + \the \@dc@arguments +} + +\long\def\ArgumentCatcher@K % a~Knuthian delimited or undelimited +#1% the particular Knuthian macro +#2% the tail of args parser. +\@dc@arguments % tail delimiter +{\dc@DefParseNext{#2}#1} + +\@dc@AliasPLower K + +\long\def\gmu@twostring#1#2{\string#1\string#2} + +\long\def\ArgumentCatcher@G@longorshort +#1% longness prefix (|\long| or nothing) +#2% left and right delimiters +#3% default value +#4% the tail of args parser. +\@dc@arguments % tail delimiter +{% + \edef\@dc@Gname{ArgumentCatcher@G\gmu@twostring#2}% + \gmu@if {csname}{\@dc@Gname \endcsname}% + {}% + {#1\Name\def{\@dc@Gname \@xa}% + \@dc@Gparams#2{\@dc@addargum{{##2}}##1\@dc@arguments}% + }% + \@xa\@ifEUnextchar\@firstoftwo#2% + {\def\dc@parse@next{#4}% we hide possible |\par|s. + \csname \@dc@Gname \endcsname\dc@parse@next}% + {\@dc@addargum{{#3}}#4\@dc@arguments}% +} + +\long\def\@dc@Gparams#1#2{##1#1##2#2} + +\lpdef\ArgumentCatcher@G % short general catcher +#1% left and right delimiters +#2% default value +{\ArgumentCatcher@G@longorshort{}{#1}{#2}} + +\lpdef\ArgumentCatcher@PG % long general catcher +#1% left and right delimiter +#2% default value +{\ArgumentCatcher@G@longorshort{\long}{#1}{#2}} + +\def\@dc@DefAsGeneral +#1% specifier +#2% delimiters +{\Name\lpdef{ArgumentCatcher@\strip@bslash{#1}}% + ##1% default value + {\ArgumentCatcher@G{#2}{##1}}% + \Name\lpdef{ArgumentCatcher@P\strip@bslash{#1}}% + ##1% default value + {\ArgumentCatcher@G{#2}{##1}}% + % + \gmu@if {cat}{a\@nx#1}% + {\@dc@LowerAliases #1}{}% +} + +\@dc@DefAsGeneral A{<>} + +\@dc@DefAsGeneral O{[]} + + +\def\DCnocoordinate{\@dc@DefAsGeneral C{()}} +\DCnocoordinate + +\edefU\DCcoordinate{% + % + \long\def\ArgumentCatcher@C + #1% default value + #2% tail of parsers + \@dc@arguments % tail's delimiter + {% + \@ifEUnextchar(%^^A) + {\dc@DefParseNext{#2}\ArgumentCatcher@c@}% + {\@dc@addargum{{#1}}#2\@dc@arguments}% + }% + % + \let\ArgumentCatcher@c\ArgumentCatcher@C + \let\ArgumentCatcher@Pc\ArgumentCatcher@PC + % + \long\def\ArgumentCatcher@PC#1#2\@dc@arguments{% + \@ifEUnextchar(%^^A) + {\dc@DefParseNext{#2}\ArgumentCatcher@Pc@}% + {\@dc@addargum{{#1}}#2\@dc@arguments}% + }% + % + \def\ArgumentCatcher@c@(#1){% + \gmu@ifxany,{#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){% + \gmu@ifxany,{#1}% + {\@xa\@dc@addargum\@dc@commasep#1\@dc@commasep}% + {\@dc@addargum{{#1}}}\@dc@parse@next\@dc@arguments + }% +} + + +\def\@dc@Scope@shipout#1{% + \ifx\@dc@seQuence\@empty\def\@dc@seQuence{#1}\fi + \@xa \gmu@ifxany\@xa \global\@xa{\@dc@seQuence}% + {\@dc@addargum{{\global}}}% + {\@dc@addargum{{\relax}}}% + \@dc@parse@next\@dc@arguments +} + +\def\ArgumentCatcher@Scope +#1% the separator(s) +{\let\@dc@seQuence@shipout@@\@dc@seQuence@shipout + \let\@dc@seQuence@shipout\@dc@Scope@shipout + \ArgumentCatcher@Q{\global\relax}{\relax}% + \let\@dc@seQuence@shipout\@dc@seQuence@shipout@@ + \@dc@ignorearg + \ArgumentCatcher@T{#1}{\NoValue}% +} + +\@dc@AliasCatcher {PScope} \Scope + + +\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} + % + % \chgs{2010/05/27 v0.993 bug fix: order of \cmd\NoValue and + % \cs{@firstofmany} reversed after a catastrophal |{11}{11}| argument} + \@xa\ifx\@xa\NoValue\@firstofmany#1\@empty\@nil \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}} + +\let\IfValueT\IfNoValueF + +\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@IfLong@resa{\detokenize{#1}}% + \edef\gmu@IfLong@resa{% + \IfAmong\string\par\@nx\among{\gmu@IfLong@resa}}% + \gmu@IfLong@resa} + + +\long\@namedef{ArgumentCatcher@=}% +#1% register used in the assignment +#2% the tail of args parser. +\@dc@arguments{% + \dc@DefParseNext{% + \@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, + +\n@melet{ArgumentCatcher@P=}{ArgumentCatcher@=} + + +\long\def\ArgumentCatcher@gobblespace +{\ArgumentCatcher@T {\dc@gobblespace@dummy}{\NoValue}} + +\let\ArgumentCatcher@Pgobblespace\ArgumentCatcher@gobblespace + +\def\dc@gobblespace@dummy{\dc@gobblespace@dummy} + +\let\gobblespace\dc@gobblespace@dummy + + +\errorcontextlines=100 + +\long\def\@dc@InnerName#1{% + \bslash@or@ac{#1}% + \bslash +}% + +%% \CH{2010/07/26 v0.993 This strikingly simple idea of storing the +%% specifiers' sequence in a macro came to my head only after some +%% three years of developing \cmd\DeclareCommand} +\long\edef\@dc@SpecsArName#1{% + Specs \string& arity of + \@nx\bslash@or@ac{#1}% +}% + +\pdef\@dc@messages {% + \gmu@notif {@dc@quiet@}{}% + {% + \gmu@if {DCMessages}{}% + {\PackageInfo{gmcommand}{^^J% + Parsing arguments for \dc@innername^^J% + [specified as: + \unexpanded + \@xa\@xa\@xa \@xa\@xa\@xa \@xa{% + \@xa\@xa\@xa\@secondofmany + % + % not |\@secondofthree| because first use of this definition is for + % |\DeclareCommand| not having its specifiers' carrier. + % + \csname \@dc@specsname\endcsname {}{}\@nil }% + \space ]^^J% + [in file: \@currname.\@currext\space ]}% of info message + }% of if \ac DC messages + {}% of if not |DCMessages| + }% of if not |@dc@quiet@| + {}% of if not not |@dc@quiet@| +}% of |\@dc@messages| + + +\edefU\@dc@DCbody {% +{% \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>)} + \edef\dc@innername {\@dc@InnerName #1}% we'll use it in |K|-type arg.\ catcher and + \edef\@dc@specsname {\@dc@SpecsArName{#1}}% + \gmu@ifCSdefined {#1}% + {\gmu@if{DCMessages}{}% + {\PackageWarning{gmcommand}{% + ^^J% + Redefining command \dc@innername\space + with \string\DeclareCommand}% + }% + {}% + }% + {\gmu@if {DCMessages}{}% + {\PackageInfo{gmcommand}{^^J% + \string\DeclareCommand-ing \dc@innername\space (new)^^J}% + }% + {}% + }% + \@dc@alllong@false + \@dc@quiet@false + % + \emptify\@dc@Specs@tempa + % + \gmu@ifsbintersect{#2}{\long!lL}{% + \addtomacro\@dc@Specs@tempa{\long}% + \@dc@alllong@true}% + {}% + % + \gmu@ifsbintersect{#2}{.qQ\quiet}{% + \addtomacro\@dc@Specs@tempa{\quiet}% + \@dc@quiet@true}% + {}% + % + \gmu@ifsbintersect{#2}{iIwW\sphack}% + {% if `invisibility' is specified: \UnDef + \addtomacro\@dc@Specs@tempa{\sphack}% + \def\@dc@bsphack@{\@nx\@bsphack}% \UnDef + \def\@dc@esphack@{\@nx\@esphack}% + }% + {\emptify\@dc@bsphack@ + \emptify\@dc@esphack@}% if `invisibility' is not specified. + % + \gmu@ifsbany\envhack{#2}% + {% but if we define an environment: + \addtomacro\@dc@Specs@tempa{\envhack}% + \emptify\@dc@bsphack@ + \emptify\@dc@esphack@ + \edef\@dc@setThrowArgs{% + \dc@ThrowArgs{\string#1}}% if our command is used + }% + {% and if we don't define an environment: + \emptify\@dc@setThrowArgs + }% + % + \relaxen\@dc@global@ + \relaxen\@dc@outer@ + % + \gmu@ifsbany\outer{#2}% + {\addtomacro\@dc@Specs@tempa{\outer}% + \let\@dc@outer@\outer}% + {}% + % + \gmu@ifsbany\global{#2}{% + \addtomacro\@dc@Specs@tempa {\IAmDeclaredGlobally}% + \let\@dc@global@\global}% + {}% + % + \@xa\Name \@xa\edefU + \@xa\@dc@specsname + \@xa{\@xa{\@dc@Specs@tempa}}% + \@dc@ResetParseAuxilia + % + \@dc@ParseNextSpecifier #3% + \@dc@buckstopshere % it's the sentinel of parsing. Since the test + % + \@xa \Name \@xa \addtomacro \@xa \@dc@specsname + \@xa {\@xa{\@dc@ParsedSpecs}}% + % + \@xa\Name\@xa\addtomacro\@xa\@dc@specsname + \@xa{\@xa{\the \c@dc@argnum}}% + % + \@dc@outer@\@dc@global@ % possibly the prefixes, +%%%%% +%%%%%% Here comes the definition of the coating macro, named the +%%%%%% same as the command: + \protected\edef#1{% always |\protected| \balsmiley( ;-) + \@dc@bsphack@ % perhaps |\@bsphack| + % + \@dc@messages + % + \@nx\@dc@{\the\toks@}% in the braces appear the argument catchers. + \@xanxcs{\dc@innername}% + \ifx\@dc@outer@\outer + \@xanxcs{\@xa\gobble\string#1 }% note the blank + \else \@nx #1% + \fi + }% of main coating macro's |\edef|. \UnDef + % + \edef\gmu@DeclareCommand@resa{% + \@dc@global@ % perhaps |\global| + \long\def\@xanxcs{\@dc@InnerName{#1}}% for a~command + \@xau\@dc@innerhashes % it's |#1#2#3…| + {% the body of the inner ‘|\\⁄<name>\|’ macro: + \@dc@setThrowArgs + \unexpanded{#4}% + \@dc@esphack@}% + }% of |\edef|. + \gmu@DeclareCommand@resa +}% of |\DeclareCommand|'s body. +} + +\def\@dc@DCprefixQlist{\global\protected\outer\long + \relax % for the very tricky case when |\@dc@global| may be + !lL.qQiIwW\sphack\envhack} + +\long\def\ShowCommand #1{% + \@iwruJ + \@iwru{»\string#1« is »\meaning#1«}% + \@iwruJ + \@iwru{»\Name\string{\@dc@InnerName{#1}}« is + »\Name\meaning{\@dc@InnerName{#1}}«}% + \@iwruJ + \@iwru{»\Name\string{\@dc@SpecsArName{#1}}« is + »\Name\meaning{\@dc@SpecsArName{#1}}«}% + \@iwruJ + \show\show +} + +\@XA{\DeclareCommand\DeclareCommand % This is the final version by now.\ +{ + #1 >Pm % command to be defined (may be \incs{par} if you + #2 >\@xa Q{\@dc@DCprefixQlist}{} %\ + #3 >Pm % arguments specification (may contain \incmd\par), + #4 >Pm % the definition body; may contain nearly anything including +}}\@dc@DCbody + + +\@XA{\DeclareCommand \DeclareCommand \long + {m >\@xa Q{\@dc@DCprefixQlist}{} mm}}% +\@dc@DCbody + + +\long\def\dc@EAName#1{% Env.\ arguments' toks' name + \if\bslash#1\else#1\fi's_args} + +\pdef\dc@ThrowArgs#1{% + \gmu@if{csname}{\dc@EAName{#1}\endcsname} + {}% if it's defined, we do nothing (we assume it's defined by us and + % is toks register.) + {% else we define it as a new toks + % \label{'s args} + \@xa\newtoks\csname\dc@EAName{#1}\endcsname + }% + \csname\dc@EAName{#1}\endcsname=% + \@xa\@xa\@xa{\@xa\@gobble\the\@dc@arguments}% +}% + + +\def\@dc@K@defaultrepl{##1} + +\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@{% + \@xanxcs{\dc@innername @K\the\c@dc@catchernum}% + }% + }% + % here we add to the parsers toks list a \CS\ named + % |\⁄<our command>@K⁄<num. of catcher>| (the particular Knuthian catcher) + }\gmu@tempa + % and define this macro: \nostanza + \edef\gmu@tempa{% + % And now we define that particular Knuthian catcher. + \def\@xanxcs{\dc@innername @K\the\c@dc@catchernum}% + \gmu@if {@dc@xadefault@i@}{}% + {\@xau{#1}}% + {\unexpanded{#1}}% + {% + \@nx\@dc@addargum{{% + \IfValueTF{#2}{% + \gmu@if{@dc@xadefault@ii@}{}% + {\@xau{#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@ParseNextSpecifier #3⁄<buck>|. + \if P\@dc@long@letter\relax\long\fi + \gmu@tempa + % Now we clean up and continue construction of arguments parser. \nostanza + \@dc@ParseNextSpecifier +}% of |\@dc@define@K| + +\DeclareCommand\@dc@grab@Loop \long {% + #1 T{\any \none Uu\U \u Ww\W \w \lostwax} % the “sign” of matching for adding; use of + % the letters suppresses adding them to the + % parsed specifiers' list, which is crucial for + % |\SameAs| copying of specifiers: the “until” and “while” loops + % don't shift their arguments. + % + #2 >Pm % list of tokens to match for/against iteration + % + >i T{\drain \drop \Drain \Drop} + #3 T{\any \none }{\none} % the “sign” of matching for draining + % + #4 b{} % list of drainers, empty by default + % + >i T{\count \ubound} + #5 D{\m@ne} % upper bound of iterations + % + >i T{\default \Default} + #6 b % default value (|\NoValue| by default) + % + #7 T{\eacher \Eacher \defEacher} % default is |\NoValue| and that's no + % harm since we test if |#7| == |\defEacher|. + #8 B{} % eacher, empty by default +}{% + % + \@dc@process@matchsign {#1} {##1}% + % + \dc@addtoParsed@{#2}% + % + \gmu@if {strings}{\lostwax#1}% + {\gmu@if {@dc@xadefault}{}% + {\@xa\edefU\@xa\@dc@LostWaxList\@xa{#2}}% + {\edefU\@dc@LostWaxList{#2}}% + }% + {}% + % + \@dc@process@matchsign {#3} {##3}% + % + \dc@addtoParsed@{#4}% + % + \@xa \@dc@addtospecs@bare \@xa{\the\numexpr #5}% + \@dc@addtotoks@bare{{#5}}% to ignore possible expandafter. + % + \dc@addtoParsed@ {#6}% + % + \gmu@if {strings}{\defEacher#7} + {% + \Name\def{\dc@innername/defdEacher/\the\c@dc@argnum}% + ##1{#8}% + % + \Name \dc@addtoParsed@ + {\dc@innername/defdEacher/\the\c@dc@argnum}% + } + {\gmu@if {@dc@xaeacher@}{} + {\@dc@xadefaulttrue}{\@dc@xadefaultfalse}% + \dc@addtoParsed@ {#8}% + }% + % + \gmu@if {strings}{\lostwax#1} + {\grab@LostWax} + {\@dc@ParseNextSpecifier}% +} + +\DeclareCommand\grab@LostWax { + >iT{\lost \Lost} + #1 b{\lostwax@NoValue} + >iT {\count \ubound} + #2 D{1} + >iT{\endlost \EndLost} +}{% + % We build an ignored “while” catcher. + % + \def\@dc@LostWaxA{>iw}% + % + \gmu@ifdetokens {\lostwax@NoValue}{#1} + {% + % if no particular value of the “lost wax” is provided, we assume + % the same as the “until” delimiter(s). + % + \prependtomacro\@dc@LostWaxA{>\@xa}% + \addtomacro\@dc@LostWaxA{\@dc@LostWaxList}% + }% + % + % Otherwise first we check whether “lost wax” provided has nonempty + % intersection with the “until” delimiters. + {% + \@xa\gmu@ifstrintersect + \@xa{\@dc@LostWaxList}{#1} + {\addtomacro\@dc@LostWaxA{{#1}}}% + {\PackageError{gmutils/gmcommand}{^^J% + You try to declare a "Lost Wax" catcher^^J% + with the "Lost" list disjoint with the "Until" list.^^J% + I assume sum of them}% + {}% + % + \@xa \addtomacro\@xa\@dc@LostWaxA + \@xa{\@xa{\@dc@LostWaxList #1}}% + }% + }% + % + \addtomacro\@dc@LostWaxA{ \count #2 \relax}% + % + \@xa\@dc@ParseNextSpecifier \@dc@LostWaxA +}% of |\grab@LostWax|. + +\def\@dc@process@matchsign +#1% the argument +#2% its numeral in human language (for the error message) +{% + \gmu@CASE {strings} {{#1}\any } + {\@dc@addtoParsed@bare {\any }}% + % + \gmu@CASEsbany {#1} {Ww} + {\@dc@addtotoks@bare {\any}}% + % + \gmu@CASE {strings} {{#1}\none} + {\@dc@addtoParsed@bare {\none }}% + % + \gmu@CASEsbany {#1} {Uu\lostwax } + {\@dc@addtotoks@bare {\none }}% + % + \gmu@lastCASE + {\PackageError{gmcommand}{% + You *have* to declare »\string\any« or »\string\none« ^^J% + as the #2 argument for the »\string\loop« catcher}{}% + }% + \gmu@ESAC +} + +\long\pdef\UnDeclareCommand#1{% + \let#1\@undefined + \ifcsname\@dc@InnerName{#1}\endcsname + \n@melet{\@dc@InnerName{#1}}{@undefined}% + \fi + \ifcsname\@dc@SpecsArName{#1}\endcsname + \n@melet{\@dc@SpecsArName{#1}}{@undefined}% + \fi +} + + +\edef\gmu@tempa{% + \def\@nx\gmu@ifHashless@##1% + \detokenize{macro:}##2->##3\@nx\@nil}% +\gmu@tempa +{\gmu@if {}{\gmu@ifempty{#2}{1}{0}\gmu@ifempty{#3}{2}{1}}} + +\long\edef\gmu@ifHashlessMacro +#1% a \CS, name or active char +{% + \edef\@nx\gmu@WHL@arg{\@nx\@xanxtri{#1}}% + \unexpanded{\@xa\@xa\@xa\gmu@ifHashless@ + \@xa\meaning\gmu@WHL@arg}% + \relax % to ensure that |#3| of |\gmu@ifHashless@| is nonempty + % if match for the delimiters is found earlier + \detokenize{macro:***->}\@nx\@nil % the sentinels +} + +\long\def\gmu@ifDeclared#1{% + % \begin{enumargs} + % \item a \CS or csname or an active char, + % \item true branch, + % \item false branch % + % \end{enumargs} + \let\gmu@ifDe@next\@secondoftwo + % + % + \gmu@CASEnot {csname} {\@dc@SpecsArName{#1}\endcsname}% + {}% + % + \gmu@CASEnot {csname}{\@dc@InnerName{#1}\endcsname}% + {}% + % + \gmu@EatCases + {\gmu@ifHashlessMacro{#1}% + {\edef\gmu@ifDe@resa{% + \@nx\gmu@ifxany\@xanxcs{\@dc@InnerName{#1}}% + {\unexpanded\@xa\@xa\@xa{\gmu@WHL@arg}}% + % Above: to get the contents of the outer macro we use the macro + % carrying conversion of possible name into a \CS and expand + % it twice. Then we freeze it with |\unexpanded|. + {\let\@nx\gmu@ifDe@next\@nx\@firstoftwo}% if the inner macro + % is present in the + % contents of |#1|, we take the first implicit argument + {}% otherwise we do nothing (taking the second implicit is + % already set) + }% of edef + \gmu@ifDe@resa + }% of if a hashless macro + {}% of if not a hasless macro + }% + % + \gmu@ESAC + \gmu@ifDe@next +}% of |\gmu@ifDeclared| + +\long\def\@dc@SameAs#1{% + \gmu@ifDeclared {#1}% + {% + \@xa\@xa\@xa \@xa\@xa\@xa \@xa + \@dc@ParseNextSpecifier + \@xa\@xa\@xa \@secondofthree + \csname \@dc@SpecsArName{#1}\endcsname + }% + {% + \PackageError{gmcommand}{% + Command \@nx#1 ^^J% + is not declared with \DeclareCommand. ^^J% + I can't repeat its parameters in current command declaration}% + {}% + }% +}% of |\@dc@SameAs| + +\DeclareCommand\DCUse{>Pm}{% ^^A with star we automatically pass the + \gmu@ifDeclared{#1}% + {% + \@dc@arguments\@xa{\@xa + \csname \@dc@InnerName{#1}\endcsname + }% + % + \csname ArgumentCatcher@Pm@\romannumeral + \@xa \@xa \@xa \@thirdofthree + \csname \@dc@SpecsArName{#1}\endcsname % of arity carrier + \endcsname % of the catcher + }% + {\PackageError{gmcommand}{% + Command \@nx#1 ^^J% + is not declared with \DeclareCommand. ^^J% + Therefore I can't use its inner macro (because of its nonexistence).^^J}% + {}% + }% +}% + + +\DeclareCommand\DeclareEnvironment \long +{ + #1--#4 \SameAs \DeclareCommand + % We repeat the specifiers, but the role of |#4| is slightly + % different here: here it's the |\begin| part definition. + % + m % (5) the end definition; it \emph{can} contain any + % \inverb|#|\<n>---the arguments of the environment are passed + % to it, too. +}{% + \def\gmu@DeclareEnvironment@resa{\envhack}% we add the information we define an + % environment. + \IfValueT{#2}% + {\addtomacro\gmu@DeclareEnvironment@resa{#2}}% we pass all the ‘prefixes’ to + % \incs{Decl\+are\+Comm\+and} + % \stanza + \@xa\DeclareCommand\csname#1\@xa\endcsname + \gmu@DeclareEnvironment@resa{#3}{#4}% + % + %\nostanza Now the begin definition is done. Let's get down to the + %end definition. \nostanza + % + \let\@dc@env@endglobal=\@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. + \edef\gmu@DeclareEnvironment@resb{% + \@nx\@xa + \@xanxcs{\bslash end#1}% + \@nx\the + \@xanxcs{\dc@EAName{#1}}% + }% of |\edef|. It reuslts in + % \[|\@xa \\end⁄<name> \the\\⁄<name>'s_args|\] + % which does not collide with the inner macro of the |\end›…| + % command, since the latter is |\\end›…\|. +\gmu@if{csname}{\dc@EAName{#1}\endcsname}{\gmu@namelet\global{\dc@EAName{#1}}{@undefined}}{}% + \edef\gmu@DeclareEnvironment@resa{% \UnDef + \@dc@global@\long\def % the inner end macro is always \incmd\long\ + % and perhaps defined \incmd\global ly. + \@xanxcs{\bslash end#1}% + \@xau\@dc@innerhashes % it's |#1#2#3›…|---the inner end macro takes the + % same number of parameters as the begin macro. + {% the definition body + \unexpanded{#5}}% + }% of |\edef›…@resa|. + \gmu@DeclareEnvironment@resa + \edef\gmu@DeclareEnvironment@resc{% + \DeclareCommand\@xanxcs{end#1}% + \@dc@env@endglobal + {}% no parameters + {\@xau {\gmu@DeclareEnvironment@resb + \@ignoretrue}% + }% + }% + \gmu@DeclareEnvironment@resc + % + % +}% of |\DeclareEnvironment| + +\DeclareCommand\NewCommand +{\SameAs\DeclareCommand} +{% + \gmu@ifCSdefined {#1} + {\DCUse\DeclareCommand#1{#2}{#3}{#4}}% + {\PackageError{gmcommand}% + {Command \@nx#1 already defined \on@line!}% + {}% + }% +} + +\DeclareCommand\RenewCommand +{\SameAs\DeclareCommand} +{% + \gmu@ifCSdefined {#1} + {\DCUse\DeclareCommand#1{#2}{#3}{#4}}% + {\PackageError{gmcommand}% + {Command \@nx#1 not yet defined \on@line!}% + {}% + }% +} + +\DeclareCommand\ProvideCommand +{\SameAs\DeclareCommand} +{% + \gmu@ifCSdefined {#1} + {} + {\DCUse\DeclareCommand#1{#2}{#3}{#4}}% +} + +\DeclareCommand\NewEnvironment +{\SameAs\DeclareEnvironment} +{% + \gmu@ifdefined{#1} + {\DCUse\DeclareEnvironment{#1}{#2}{#3}{#4}{#5}}% + {\PackageError{gmcommand} + {Environment #1 already defined \on@line!}{}% + }% +} + +\DeclareCommand\RenewEnvironment +{\SameAs\DeclareEnvironment} +{% + \gmu@ifdefined {#1} + {\DCUse\DeclareEnvironment{#1}{#2}{#3}{#4}{#5}}% + {\PackageError{gmcommand} + {Environment #1 not yet defined \on@line!}{}% + }% +} + + +\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}% + {% + \Store@Macro\verb + \StoreEnvironment{verbatim}% + \StoreEnvironment{verbatim*}% + }{}% + \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}% + {% + \Restore@Macro\verb + \RestoreEnvironment{verbatim}% + \RestoreEnvironment{verbatim*}% + }{}% + % + \AtBeginDocument{% + \@ifpackageloaded{gmlogos}{% + \Restore@Macro\LaTeX\Restore@MacroSt{LaTeX }% my version of the + % \LaTeX\ logo has been stored just + % after defining, in line \ref{SMLaTeX}. \ilrr + \Restore@Macro\eTeX}% + {}% + }% + % \stanza + \pdef\adddefaultfontfeatures##1{% + \addtomacro\zf@default@options{#1,}} + }% of |\@ifXeTeX|'s first argument, + {}% |\@ifXeTeX|'s second argument, +}% of |\XeTeXthree|'s body. + +\DeclareCommand\setspaceskip{% + A{1}% optional factor for all three components + O{\fontdimen2\font}% + >is + O{\fontdimen3\font}% + >is + O{\fontdimen4\font}} +{\spaceskip=\glueexpr\dimexpr#2*#1\relax plus\dimexpr #3*#1\relax + minus\dimexpr#4*#1\relax\relax} + +\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 + +\DeclareCommand\enoughpage{% + #1 D{\NoValue} % (optional short version (number of + % |\baselineskip|s)) Before 2010/9/10 the default + % value was the |D|-default, i.e., 0, which lead to + % improper working of this command. + #2 B{2\baselineskip}% (2) optional (formerly mandatory) long version of + % required room on a page + >is + #3 B{} % (3) what if the room is enough + >is + #4 B{\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} + \gmu@if {num} {% + \gmu@if {dim}{% + \dimexpr\pagegoal-\pagetotal<\dimexpr + (\IfValueTF{#1}{#1\baselineskip}{#2})*1\relax + } + 10% + \gmu@if {dim} {\pagegoal<\pagetotal} + 10% + >\z@ + } + {\typeout{@@@@@ not enough page \on@line}% + #4% + }% + {#3}% +} + +\long\def\gmu@LC@LetInners +#1% scope prefix (|\global| or |\relax| +#2% left side +#3% right side of the assignment +{% + \edef\gmu@LC@InnerLeft{\@dc@InnerName{#2}}% + \edef\gmu@LC@InnerRight{\@dc@InnerName{#3}}% + % + \gmu@namelet{#1}{\gmu@LC@InnerLeft}{\gmu@LC@InnerRight}% + \edef\gmu@LC@InnerLeft{\@dc@SpecsArName{#2}}% + \edef\gmu@LC@InnerRight{\@dc@SpecsArName{#3}}% + % + \gmu@namelet{#1}{\gmu@LC@InnerLeft}{\gmu@LC@InnerRight}% +} + +\long\def\gmu@CL@PrepareArg +#1% left/right +#2% |\@xa| or |\edef|, maybe sth.\ more in the future +#3% a \CS, text of a name or an active char +{% + \Name\let{gmu@CL@#1}\@undefined + \ifx\@xa#2\Name\edef{gmu@CL@#1}{\@xau{#3}}\fi + \ifx\edef#2\Name\edef{gmu@CL@#1}{#3}\fi + \unless\ifcsname gmu@CL@#1\endcsname + \Name\edef{gmu@CL@#1}{% + \gmu@if{cat}{\@nx~\@nx#3}% + {\@nx#3}{\strip@bslash{#3}}% + }% + \fi +} + +\DeclareCommand\CommandLet \long {% + \Scope % (1) + T{\@xa\edef} % (2) whether left side should be |\expandaftered| + m % (3) left side of assignment + >iT{=} % pro forma + T{\@xa\edef} % (4) whether right side should be |\expandaftered| + m % (5) right side of the asssignment +}{% + % + \gmu@CL@PrepareArg{left}#2{#3}% + \gmu@CL@PrepareArg{right}#4{#5}% + % + \@xa\gmu@ifDeclared\@xa{\gmu@CL@right}{% + \edef\gmu@LC@resa{% + \DeclareCommand % + \@xa\@xanxtri\@xa{\gmu@CL@left}% + #1% scope prefix + {\@nx\SameAs\@xa\@xanxtri\@xa{\gmu@CL@right}}% args. spec + {}% the body of the command will be |\let| via letting inners. + }% + % + \gmu@LC@resa + \@XA{\@xa\gmu@LC@LetInners\@xa#1% + \@xa{\gmu@CL@left}}\@xa{\gmu@CL@right}% + }% of if Declared + {% if not Declared, we just |\let|: +\if\@nx#3ѥ\typeout{@@@@@ »\@xa\@dc@InnerName\@xa{\gmu@CL@right}« is not + Declared?: \Name\meaning{\@xa\@dc@InnerName\@xa{\gmu@CL@right}}% +}% +\show\NotDeclared +\fi + \@XA{\@xa\tri@let\@xa#1% + \@xa{\gmu@CL@left}}\@xa{\gmu@CL@right}% + }% +} + +\DeclareCommand\envirlet \long{\Scope mm}{% for |\let|ting environments. + \CommandLet #1{#2}{#3}% + \CommandLet #1{end#2}{end#3}% +} + +\DeclareCommand\@fornum{% + m% (1) initial (least) num. value + m% (2) limit (last iterated over) num. value + O{1}% (3) step of iteration + m% (4) body of the loop +}% +{\edef\gmu@fornum@min{\the\numexpr #1}% + \edef\gmu@fornum@lim{\the\numexpr #2}% + \let\gmu@fornum@curr\gmu@fornum@min + \@whilenum\gmu@fornum@curr<\gmu@fornum@lim + \do{#4% + \edef\gmu@fornum@curr{% + \the\numexpr\gmu@fornum@curr+#3}% + }% of |\@whilenum|'s body. +}% of |\@fornum|. + +\pdef\StoreCommand{% + \begingroup + %\label{SC begr} + \MakePrivateLetters + \@StoreCommand +} + +\long\def\gmu@SC@StorageName +#1% a \CS, name or active char +#2% group level +{% + \gmu@storeprefix/% + \ifnum\numexpr#2>-1 \the\numexpr(#2)*1\relax\fi + \bslash@or@ac {#1}% +}% + +\def\gmu@SC@setgrouplevel +#1% |+›⁄|-⁄|\NoValue| +#2% a decimal number +{\edef\gmu@SC@grouplevel{% + \the\numexpr + \IfValueTF{#1}% + {\currentgrouplevel#1#2+1}{#2}% + }% of the grouplevel-carrying macro +} + +\DeclareCommand\@StoreCommand +{T{+-}% grouplevel shift indicator + d % group level or shift + >Pm% name or \CS +}{% + \endgroup %we close the group opened in line \ref{SC begr}. + \gmu@SC@setgrouplevel{#1}{#2}% + % + \edef\gmu@SC@resa{% + \gmu@SC@StorageName{#3}{\gmu@SC@grouplevel}}% + % + \let\gmu@SC@scope\relax + \ifnum\gmu@SC@grouplevel>\currentgrouplevel + \let\gmu@SC@scope\global + \fi + \@xa\CommandLet\@xa\gmu@SC@scope\@xa{\gmu@SC@resa}{#3}% +} + +\pdef\StoreEnvironment{% + \begingroup + \MakePrivateLetters + \@StoreEnvironment +} + +\def\@StoreEnvironment#1{% + \@StoreCommand{#1}% + \begingroup + \@StoreCommand{end#1}% +} + +\pdef\RestoreEnvironment{% + \begingroup + \MakePrivateLetters + \@RestoreEnvironment +} + +\def\@RestoreEnvironment#1{% + \endgroup + \RestoreCommand{#1}% + \RestoreCommand{end#1}% +} + +\pdef\UseStored{% + \begingroup + \MakePrivateLetters + \@UseStored} + + +\DeclareCommand\@UseStored \long{% + T{+-}% (1) indicator of grouplevel shift (in distiction from an absolute + % group level) + d % (2) optional grouplevel/shift (0 by default) + O{\@gobble}% (3) stuff to be put before the pair of \CS es, an + % assignment e.g. + m % (4) a \CS or csname +}{% \chgs{2010/06/23 v0.993 added} + \endgroup + \gmu@SC@setgrouplevel{#1}{#2}% + \edef\gmu@SC@grouplevel{% + \the\numexpr\gmu@SC@grouplevel+1}% for the first turn of loop + % + \loop + \edef\gmu@SC@grouplevel{% + % we decrease the group level number + \the\numexpr\gmu@SC@grouplevel-1}% + % + \edef\gmu@SC@currname{% + % define the cs' storage name for that level + \gmu@SC@StorageName{#4}{\gmu@SC@grouplevel}}% + \ifnum + % and check the conjunction of conditions: the group level is >=-1… + \unless\ifnum\gmu@SC@grouplevel<-1 1\else 0\fi + % and the csname remains not defined. + \unless\ifcsname \gmu@SC@currname \endcsname 1\else 0\fi + =11 + \repeat + \gmu@if{csname}{\gmu@SC@currname\endcsname}% + {% + % ^^A \s how\ExecutingTrueBranch + \@XA{#3{#4}}\csname \gmu@SC@currname\endcsname}% first + {% + % ^^A \s how\ExecutingFalseBranch + #3{#4}\@undefined}% second +}% of |\@UseStored| + +\DeclareCommand\RestoreCommand{\Scope d}{% + \UseStored #2[\CommandLet #1*]% +} + +\newbox\gmu@smashbox + +\DeclareCommand\set@smashbox{% + \Scope + T{hv}{h} +}{#1\setbox\gmu@smashbox =\csname #2box\endcsname }% + +\def\smash@box{\smash{\box\gmu@smashbox}} + + +\newbox\gmu@boxa +\newdimen\gmu@dima +\newdimen\gmu@dimb + +\DeclareCommand\gmu@extremebox { + #1 m % a dimen register (will be assigned the extr.\ value) or a + % \CS (will be defined as |\the| extreme value) + #2 T {\min\max}{\max} % kind of extreme + #3 T {\wd\ht\dp\totalheight}{\wd} % dimension to compare, the last two for total |\ht|+|\dp|. + #4 \lostwax {\global\relax} \eacher{\gmu@dimextreme@step} \lost{\relax} + #5 T{\global}{} % scope of assignment +}{% + \gmu@if x {\max#2} + {\gmu@dimb=-\maxdimen + \def\gmu@dimextreme@comp{<}% + } + {\gmu@dimb=\maxdimen + \def\gmu@dimextreme@comp{>}% + }% + % + \long \def\gmu@dimextreme@step ##1{% + \setbox\gmu@boxa=\hbox{##1}% + % + \gmu@dima= \gmu@if x {\totalheight#3} + {\dimexpr \ht\gmu@boxa +\dp\gmu@boxa\relax} + {#3\gmu@boxa}% + \relax + % + \gmu@if {dim} + {\gmu@dimb\gmu@dimextreme@comp \gmu@dima } + {\gmu@if {dim} {\gmu@dima>\z@} + {\gmu@dimb=\gmu@dima } + {}% + } + {}% + % + }% + % + #4% + \IfIs #1\dimen + {#5#1=\gmu@dimb} + {#5\edef #1{\the\gmu@dimb }}% +}% + + +\DeclareCommand\enlargefsize{ + #1 m % enlargement (dim(expr)) for font size + #2 b % enlargement (dim(expr)) for baselineskip (if absent, |#1| is used) +}{\edef\gmu@tempa{% + \@nx\fontsize{\the\dimexpr\f@size pt+#1}% + {\the\dimexpr 1\baselineskip+ \IfValueTF{#2}{#2}{#1}}% + }\gmu@tempa\selectfont +} + +\DeclareCommand\scalefsize { + #1 m % scale for font size + #2 b % scale for baselineskip (if absent, |#1| is used) + \gobblespace +}{\edef\gmu@tempa{% + \@nx\fontsize{\the\dimexpr #1\dimexpr\f@size pt\relax}% + {\the\dimexpr \IfValueTF{#2}{#2}{#1}\baselineskip}% + }\gmu@tempa\selectfont +} + +\let\gmu@discretionaryhyphen\- % for the cases when we don't redefine + % \incs\- but use \incs\UrlFix + +\DeclareCommand\bihyphen{ + O{*} % token that'll make the discretionary hyphen |\-| allow other break-points +}{% + \DeclareCommand\gmu@discretionaryhyphen{T{#1}ca}{% + \IfValueT{##2}{% + \gmu@ifempty{##2}{}{% + \def\gmu@bihyphen@char{##2}}% + }% + \IfValueT{##3}{% + \gmu@ifempty{##3}{}{% + \def\gmu@bihyphen@corr{##3}}% + }% + % + % Depending on |#1| we allow (if present, then we take |\discre|) + % hyphenation of the word's before- and + % after-parts or forbid it (if absent, then we take + % |\discretionary|). + \IfValueTF{##1}\discre\discretionary + {% before break + \IfValueTF{##2} + {% + \gmu@ifempty{##2}{\gmu@bihyphen@char}{##2}% + }% + {% + \ifnum\hyphenchar\font>\z@ + \char\hyphenchar\font + \fi}% + }% end of before break + {%after break + \IfValueT{##3}{% + \gmu@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. + \CommandLet\-\gmu@discretionaryhyphen + \CommandLet\@dischyph\gmu@discretionaryhyphen % to override + % \pk{framed.sty} + \pdef\gmu@flexhyphen{\gmu@discretionaryhyphen#1\relax}% +}% of |\bihyphen| + +\relaxen\gmu@bihyphen@corr + +\DeclareCommand\gmshowlists { + >iT{\depth} + Ď{1}% + >iT{\breadth} + Ď{10000000} +} +{\tracingonline=\@ne + \showboxdepth=#1\relax % how many levels of + % box nesting should be shown + \showboxbreadth=#2\relax % after how many elements »etc.« will be put + \showlists +} + +\DeclareCommand\gmtracingoutput { + \SameAs\gmshowlists +} +{\tracingonline=\@ne + \showboxdepth=#1\relax % how many levels of + % box nesting should be shown + \showboxbreadth=#2\relax % after how many elements »etc.« will be put + \tracingoutput=\@ne +} + + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmcommand.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmenvir.sty b/Master/texmf-dist/tex/latex/gmutils/gmenvir.sty new file mode 100644 index 00000000000..3348e8b0005 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmenvir.sty @@ -0,0 +1,141 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmenvir.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `envir') +%% +%% +%% 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{gmenvir} + [2010/10/24 v0.993 redefinition of \string \begin \space and \string \end (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + +\RequirePackage{gmbase, gmampulex} % the low-level macros + + + +\emptify\@envirstack + +\def\@pushenvir{% + %^^V\edef\@currenvir{\@currenvir}% is already expanded. + \xdef\@envirstack{% + {\@xa\detokenize\@xa{\@currenvir}}% + {\the\currentgrouplevel}% + {\@currenvline}% + \@envirstack + }% +} + +\def\@popenvir#1#2#3{% + \@XA{\@popenvir@#1#2#3}\@envirstack\@nil +} + +\def\@popenvir@#1#2#3#4#5#6#7\@nil{% + \gdef#1{#4}% |#1| carries last envir name + \gdef#2{#5}% |#2| carries last envir level + \gdef#3{#6}% |#3| carries last envir beginnig line + \gdef\@envirstack{#7}% and we update the stack +} + +\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}% + \@pushenvir % we put current envir to |\@envirstack|. + \csname #1\endcsname}% if the argument is a~command's name (an + +\def\begin{\gmu@ifstar{\@begnamedgroup}{% + \@begnamedgroup@ifcs}} + +\def\@begnamedgroup@ifcs#1{% + \ifcsname#1\endcsname\afterfi{\@begnamedgroup{#1}}% + \else\afterfi{\@latex@error{Environment #1 undefined}\@eha}% + \fi}% + + +\long\def\@fourthofmany#1#2#3#4#5\@nil{#4}% + +\lpdef\@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} + % \chgs{2010/06/09 v0.993 made use \cmd\@envirstack} + % + % % \CH{2010/09/23 v0.993 to be precise, it's not a change but + % % rather a staus quo action: \cmd\gmu@ifedetokens suddenly turned + % % to be expandable and un\cmd\protected so we make \emph{this} + % % macro \cmd\protected} + \gmu@ifedetokens + {\@xa\@fourthofmany\@envirstack\relax\relax\relax\relax\@nil}% + {#1}} + + +\def\@checkend#1{% + \@ifenvir{#1}% + {}% + {\@badend{#1}}% +} + +\ampulexdef\end[#1][#1]\endcsname\@checkend{% +\endcsname +\@popenvir\gmu@drain\gmu@drain\gmu@drain +\@checkend} + +\pdef\@endif#1{\@ifenvir{#1}{\end{#1}}{}} + +\pdef\@endifprev#1{\@ifprevenvir{#1}{\end{#1}}{}} + + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmenvir.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmlogos.sty b/Master/texmf-dist/tex/latex/gmutils/gmlogos.sty new file mode 100644 index 00000000000..f27a97c8150 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmlogos.sty @@ -0,0 +1,221 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmlogos.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `logos') +%% +%% +%% 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{gmlogos} + [2010/04/09 v0.993 TeX-related logos (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + +\RequirePackage{gmbase} + + +\let\oldLaTeX\LaTeX +\let\oldLaTeXe\LaTeXe + +\pdef\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} +\Store@Macro\TeX +\AtBeginDocument{\Restore@Macro\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@DeclareLogo@resa{\@xa\@gobble\string#2}% + \else + \def\gmu@DeclareLogo@resa{#1}% + \fi + \edef\gmu@DeclareLogo@resa{% + \@nx\DeclareTextCommand\@nx#2{PD1}{\gmu@DeclareLogo@resa}} + \gmu@DeclareLogo@resa + \DeclareTextCommandDefault#2{#3}% + \pdef#2{#3}% added for \XeTeX. +} + +\DeclareLogo\LaTeX{% + {% + 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}% + \gmlogos@hyphen + \TeX} + +\DeclareLogo\LaTeXe{\mbox{\m@th \if + b\expandafter\@car\f@series\@nil\boldmath\fi + \LaTeX\kern.15em2$_{\textstyle\varepsilon}$}} + +\Store@Macro\LaTeX +\Store@MacroSt{LaTeX } + +\DeclareLogo[(La)TeX]{\LaTeXpar}{% + {% + \setbox\z@\hbox{(}%) + \leavevmode % \chgs{2010/04/09 v0.993 added \cmd\leavevmode\ (a + % bug fix)} + \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@}\gmlogos@hyphen\TeX +} + +\gmu@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}} +\DeclareLogo[The TeX book]\TeXbook{\textsl{The \TeX\space 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 + +\Store@Macro\eTeX + +\DeclareLogo[pdfe-TeX]\pdfeTeX{pdf\gmlogos@hyphen\eTeX} + +\DeclareLogo\pdfTeX{pdf\gmlogos@hyphen\TeX} +\DeclareLogo\pdfLaTeX{pdf\gmlogos@hyphen\LaTeX} + +\gmu@ifundefined{XeTeX}{% + \DeclareLogo\XeTeX{X\kern-.125em\relax + \gmu@ifundefined{reflectbox}{% + \lower.5ex\hbox{E}\kern-.1667em\relax}{% + \lower.5ex\hbox{\reflectbox{E}}\kern-.1667em\relax}% + \TeX}}{} + +\gmu@ifundefined{XeLaTeX}{% + \DeclareLogo\XeLaTeX{X\kern-.125em\relax + \gmu@ifundefined{reflectbox}{% + \lower.5ex\hbox{E}\kern-.1667em\relax}{% + \lower.5ex\hbox{\reflectbox{E}}\kern-.1667em\relax}% + \LaTeX}}{} + +\DeclareLogo\XeTeXpar{% \chgs{2010/04/09 v0.993 added} + \setbox\z@\hbox{(}%) + \leavevmode + \copy\z@ + \kern-.2\wd\z@ + \smash{% the “Xe” part is copied from \pk{xltxtra} + X\lower0.5ex + \hbox{\kern-0.15em + \gmu@ifundefined{XeTeXversion}% + {\setbox0=\hbox{E}\dimen0=\ht0\advance\dimen0by\dp0% + \raise\dimen0\hbox{\rotatebox{180}{\box0}}% + }% of if not in \XeTeX, then in \XeTeX: + {\ifnum\XeTeXfonttype\font>0 + \ifnum\XeTeXcharglyph"018E>0 + \char"018E\relax + \else + \ifdim\fontdimen1\font=0pt + \reflectbox{E}% + \else + \XeTeXuseglyphmetrics=1% + \setbox0=\hbox{E}\dimen0=\ht0\advance\dimen0by\dp0% + \raise\dimen0\hbox{\rotatebox{180}{\box0}}% + \fi + \fi + \else + \setbox0=\hbox{E}\dimen0=\ht0\advance\dimen0by\dp0% + \raise\dimen0\hbox{\rotatebox{180}{\box0}}% + \fi}% of reversed E when in \XeTeX + }% of hbox + }% of smash ^^A( + \setbox\z@\hbox{)}% + \kern-.2\wd\z@ + \copy\z@ + \kern-0.15em + \TeX}% + +\DeclareLogo[LuaTeX]\LuaTeX{\textsc{Lua}\gmlogos@hyphen\TeX} + +\emptify\gmlogos@hyphen + +\def\HyphenateLogo#1{% + {\let\gmlogos@hyphen\-% + #1}% +} + + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmlogos.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmmeta.sty b/Master/texmf-dist/tex/latex/gmutils/gmmeta.sty new file mode 100644 index 00000000000..b6bc0b2207b --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmmeta.sty @@ -0,0 +1,295 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 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. + + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmmeta.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmmw.sty b/Master/texmf-dist/tex/latex/gmutils/gmmw.sty new file mode 100644 index 00000000000..78adfffac76 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmmw.sty @@ -0,0 +1,368 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmmw.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `mw') +%% +%% +%% 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{gmmw} + [2010/10/24 v0.993 improvements to the MWCLS classes (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% +\RequirePackage{gmcommand} + + +\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\gmu@hyperrefstepcounter{\refstepcounter{NoNumSecs}}% + \pdef\gmu@targetheading#1{% + \hypertarget{#1}{#1}}}% end of then + {\def\gmu@hyperrefstepcounter{}% + \def\gmu@targetheading#1{#1}}% end of else +}% of |\AtBeginDocument| + +\def\gmu@dontnumbersectionsoutofmainmatter{% + \if@mainmatter\else \HeadingNumberedfalse \fi} +\def\gmu@clearpagesduetoopenright{% + \if@openright\cleardoublepage\else \clearpage\fi} + +\long\def\@ifnotmw#1#2{\gmu@ifundefined{mw@sectionxx}{#1}{#2}} + +\@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 |\gmu@ifundefined| to make it work in classes + % other than \pk{mwbk}\nostanza + \gmu@ifundefined{if@mainmatter}{}{\gmu@dontnumbersectionsoutofmainmatter} + \fi +%% \ifHeadingNumbered +%% \refstepcounter{#1}% +%% \protected@edef\HeadingNumber{\csname the#1\endcsname\relax}% +%% \else +%% \let\HeadingNumber\@empty +%% \fi + \def\HeadingRHeadText{#2}% + \def\HeadingTOCText{#3}% + \def\HeadingText{#4}% + \def\mw@HeadingType{#1}% + \if\mw@HeadingBreakBefore + \if@specialpage\else\thispagestyle{closing}\fi + \gmu@ifundefined{if@openright}{}{\gmu@clearpagesduetoopenright}% + \if\mw@HeadingBreakAfter + \thispagestyle{blank}\else + \thispagestyle{opening}\fi + \global\@topnum\z@ + \fi% of |\if\mw@HeadingBreakBefore| +%% + \ifHeadingNumbered + \refstepcounter{#1}% + \protected@edef\HeadingNumber{\csname the#1\endcsname\relax}% + \else + \let\HeadingNumber\@empty + \gmu@hyperrefstepcounter % we step an auxiliary counter to make a + % hyperref's label/target. + \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| + } + + +\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}% + \gmu@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 + \gmu@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 + \gmu@ifempty{#3} + {\mw@secundef{#1#2}{#4}} + {\@namedef{#1#2}{#3}}} + +\def\mw@secundef#1#2{% + \gmu@ifundefined{#1}{% + \ClassError{mwcls/gm}{% + command \bslash#1 undefined \MessageBreak + after \bslash SetSectionFormatting!!!\MessageBreak}{% + Provide the #2 argument of \bslash SetSectionFormatting.}}{}} + +\def\addtoheading#1#2{% + \n@melet{gmu@addtoheading@resa}{#1@head}% + \edef\gmu@addtoheading@resa{\unexpanded{#2}\@xa\unexpanded{\gmu@addtoheading@resa}}% + \n@melet{#1@head}{gmu@addtoheading@resa}% +} + +}% of |\@ifnotmw|'s else. + + +\@ifnotmw{}{% We proceed only in \acro{MWCLS}. + +\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}} + +\def\gmu@checkaftersec{% + \gmu@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@checkaftersec@resa\mw@HeadingBreakAfter}% \UnDef + \if\mw@HeadingBreakBefore\def\gmu@checkaftersec@resa{11}\fi% if the + % current heading inserts page break before itself, all the play + % with vskips is irrelevant. + \if\gmu@checkaftersec@resa\else + \penalty10000\relax + \skip\z@=\csname\gmu@prevsec @postskip\endcsname\relax + \skip\tw@=\csname\mw@HeadingType @preskip\endcsname\relax + \gmu@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 |\gmu@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}} + +\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. + + +\@ifnotmw{}{% We define this declaration only when in \pk{mwcls}. +\DeclareCommand\WPheadings{T{\chapter}}{% + \SetSectionFormatting[breakbefore,wholewidth] + {part}{\z@\@plus1fill}{}{\z@\@plus3fill}% + % + \IfValueF{#1}{% + \gmu@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| + +\@ifnotmw{% we are not in \pk{mwcls} and want to + % handle \pk{mwcls}-like sectionings i.e., those written with two + % optionals. + \def\gmu@secini{gm@la}% + \Store@Macros{% + \partmark \chaptermark \sectionmark \subsectionmark + \subsubsectionmark \paragraphmark}% + % \Define\gmu@secxx + \def\gmu@secxx#1#2[#3]#4{% + \ifx\gmu@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}% + \Restore@MacroSt{#1mark}% after we've done what we + % wanted we restore original |\#1mark|.\ilrr + }% + \def\gmu@secstar{[#3]}% if |\gmu@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\gmu@secini#1\endcsname + \gmu@secstar{#4}}% +}{% 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\gmu@secini{gm@mw}% + % + \let\gmu@secmarkh\@gobble% in \pk{mwcls} there's no need to make + % tricks for special version to running headings. + % \Define\gmu@secxx + \def\gmu@secxx#1#2[#3]#4{% + \@xa\@xa\csname\gmu@secini#1\endcsname + \gmu@secstar[#2][#3]{#4}}% +} + +\def\gmu@sec#1{\@dblarg{\gmu@secx{#1}}} +\def\gmu@secx#1[#2]{% + \@ifnextchar[{\gmu@secxx{#1}{#2}}{\gmu@secxx{#1}{#2}[#2]}}% if + +\def\gmu@straightensec#1{% the parameter is for the command's name. + \gmu@ifundefined{#1}{}{% we don't change the ontological status of the + % command because someone may test it. + \n@melet{\gmu@secini#1}{#1}% + \@namedef{#1}{% + \gmu@ifstar{\def\gmu@secstar{*}\gmu@sec{#1}}{% + \def\gmu@secstar{}\gmu@sec{#1}}}}% +}% + +\let\do\gmu@straightensec +\do{part}\do{chapter}\do{section}\do{subsection}\do{subsubsection} +\@ifnotmw{}{\do{paragraph}}% this `straightening' of + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmmw.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmnotonlypream.sty b/Master/texmf-dist/tex/latex/gmutils/gmnotonlypream.sty new file mode 100644 index 00000000000..bb17a9e0eb3 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmnotonlypream.sty @@ -0,0 +1,93 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmnotonlypream.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `notonlypream') +%% +%% +%% 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{gmnotonlypream} + [2010/10/24 v0.993 modification of the 'only preamble' clause (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + +\RequirePackage{gmampulex} + + +\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 + +\not@onlypreamble\@pushfilename +\not@onlypreamble\@popfilename + +\not@onlypreamble\@currnamestack + + +\def\gmu@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\gmno@NotprerrMessage##1}\@nx\@eha}}% + \@preamblecmds} + +\def\gmno@NotprerrMessage#1{% + \PackageError{gmutils/LaTeX}% + {\@nx\string#1 \@nx\gmu@notprerr}{}% +} + + +\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] + \ifx + {\@onlypreamble\document}% + \iftrue} + +\AtBeginDocument{\gmu@nocite@ampulex}% + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmnotonlypream.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmparts.sty b/Master/texmf-dist/tex/latex/gmutils/gmparts.sty new file mode 100644 index 00000000000..1133a9a23d5 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmparts.sty @@ -0,0 +1,169 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmparts.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `parts') +%% +%% +%% 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{gmparts} + [2010/10/24 v0.993 modification of \string \include \space \string & in/excluding parts of main file (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + + +\RequirePackage{gmcommand} + +\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 + \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} + +\def\inclasthook{\thispagestyle{closing}} + +\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\gmu@filepart@resa:=\@partlist\do{% + \ifx\gmu@filepart@resa\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 + \deadcycles\z@ + \@nameuse{cp@\gmu@filepartname}% + \let\@auxout\@mainaux + \@xa\@secondoftwo + \fi + {\iftrue}% + {\let\endfilepart\fi + \csname gm@skipped@#1\endcsname + \def\next{\Restore@MacroSt {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 +} + +\Store@Macro\endfilepart + +\def\nofileparts{% + \let\filepart\@gobble + \DeclareCommand\endfilepart{b}{}% +} + + +\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} + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmparts.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmrelsize.sty b/Master/texmf-dist/tex/latex/gmutils/gmrelsize.sty new file mode 100644 index 00000000000..b32a63c38f4 --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmrelsize.sty @@ -0,0 +1,84 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmrelsize.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `relsize') +%% +%% +%% 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{gmrelsize} + [2010/04/09 v0.993 chosen macros from the relsize package and mine (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% +\protected\def\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 + \advance\@tempcnta#1\relax + \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}} + +\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}} +\protected\def\largerr{\relsize{+2}} +\protected\def\smallerr{\relsize{-2}} + + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmrelsize.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmtypos.sty b/Master/texmf-dist/tex/latex/gmutils/gmtypos.sty new file mode 100644 index 00000000000..3992e1af62b --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmtypos.sty @@ -0,0 +1,2027 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmtypos.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `typos') +%% +%% +%% 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{gmtypos} + [2010/10/24 v0.993 a collection of macros, mosltly typographical (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + +\RequirePackage{gmcommand, gmnotonlypream} + +\unless\ifcsname ifgmu@quiet\endcsname + \@xa\newif\csname ifgmu@quiet\endcsname +\fi + +\DeclareOption{quiet}{\gmu@quiettrue} + +\ProcessOptions + + + +\AtBeginDocument{% + \@ifpackageloaded{fontspec}{% + \pdef\udigits{% + \addfontfeature{Numbers=Uppercase}}% + }{% + \emptify\udigits}} + + +\def\Xedekfracc{\gmu@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{% + \gmu@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|. + \gmu@ifstar{\let\gmu@dekfracc\gmu@dekfraccsimple}{}% + } + +\def\gmu@xedekfraccplain{% `else' of the main |\gmu@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 + +\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} + + + +\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@@ +} + + + +\def\gmu@getfontstring{% + \xdef\gmu@fontstring{% + \gmu@fontstring@}} + +\def\gmu@fontstring@{% + \@xa\@xa\@xa\gmu@fontstring@@\@xa\meaning\the\font\@nil} + +\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% + \@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}% +} + + +\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). +}{% + \IfValueT{#1}{% + \DeclareMathVersion{#1}% this sets the defaults so no need to + % define them explicitly + }% 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 + \@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 + "##2\relax}% + \if\relax\@nx##1% + \gmu@ifstored{##1}{}{\Store@Macro##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 + `##1\relax}% + }% + \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]}% + {\@xanxcs{##6}}\relax + }\gmu@tempa + \@xa\@gobbletwo % if family |##6| is defined, we gobble the + % other branch + \fi + }% + \firstofone + {\if\relax\@nx##2% + \Restore@Macro##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 + `##1\relax}% + }% + \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}}{% + \Restore@Macro\mathchar@type% + % + \IfValueT{##1}{\mathversion{##1}}% + % + \edef\gmath@version{\PutIfValue{##1}}% + % + \@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 + \gmath@do)\mathclose + \gmath@do[\mathopen + \gmath@do]\mathclose + % + \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 + \gmath@do>\mathrel + \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)% + \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} + + +\@onlypreamble\gmathbase + +\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 + \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}}% + \do\{\mathopen + \do\}\mathclose + % + \def\={\mathbin{=}}% + \def\neqb{\mathbin{\neq}}% + \let\neb\neqb + \def\do##1{\gmu@storeifnotyet##1% + \edef\gma@tempa{% + \def\@xanxcs{\@xa\gobble\string##1r}{% + \@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 + +\Store@Macro\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} + + %^^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|. + + + +\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} + + +\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@} + + +\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. +}{%\ + % 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. + % + \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}}} + +\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 +} + +\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}% +} + +\def\gmu@calculateslant#1{% + \gmu@getslant + \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. + \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@cepstnof@resc##1:##2:\@nil{% + \ifx:##2:\else RawFeature={\gmu@maybestripcomma##2,,\@nil} \fi}% + % \stanza + \def\gmu@cepstnof@resd##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@cepstnof@rese##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@cepstnof@resa{% + % 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@cepstnof@resd\@xa\meaning\the\font//\@nil + {% font name doesn't contain a~slash + \@xa\@xa\@xa\gmu@cepstnof@rese\@xa\meaning\the\font::\@nil + {% nor does it contain a~colon + \def\@nx\gmu@cepstnof@resb\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@cepstnof@resb\detokenize{select font + "}####1:####2\detokenize{"}####3\@nx\@nil{% + \ifx\fontspec#3% + \@nx\@nx\@nx\fontspec[\@nx\gmu@cepstnof@resc####2::\@nx\@nil#4]{####1}% + \else + #3Font={####1}, #3Features={\@nx\gmu@cepstnof@resc####2::\@nx\@nil#4}% + \fi + }% + }% + }% of ‘no slash’ case + {% font name contains a~slash + \def\@nx\gmu@cepstnof@resb\detokenize{select font + "}####1/####2\detokenize{"}####3\@nx\@nil{% + \ifx\fontspec#3% + \@nx\@nx\@nx\fontspec[\@nx\gmu@cepstnof@resc####2::\@nx\@nil#4]{####1}% + \else + #3Font={####1}, #3Features={\@nx\gmu@cepstnof@resc####2::\@nx\@nil#4}% + \fi + }% of |\gmu@cepstnof@resb| + }% of ‘slash present’ case + }\gmu@cepstnof@resa + \xdef#1{\@xa\@xa\@xa\gmu@cepstnof@resb\@xa\meaning\the\font\@nil}% +}% + +\def\gmu@stripcomma#1,{#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 + % We ‘descale’ the current font:\nostanza + \gmu@cepstnof\fontspec[, Scale=1]\gmu@tempa + \@xa\let\@xa\gmu@currfont@descaled\the\font + \gmu@basefont + \gmu@cepstnof\fontspec[, Scale=1]\gmu@tempa + % \nostanza now also the base font is descaled. + \xdef\gmu@fontscale{% + \strip@pt + \dimexpr 1pt * + \numexpr\dimexpr#1\fontdimen#2\font\relax\relax / + \numexpr\fontdimen#2\gmu@currfont@descaled\relax + \relax}% + \endgroup} + + +\def\gmu@tilde{% + \leavevmode\lower.8ex\hbox{$\,\widetilde{\mbox{ }}\,$}} +\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}} + +\foone{\catcode`\^^M\active}% the comment signs here are crucial. +{\def\defobeylines{\catcode`\^^M=13 \def^^M{\par}}} + + +\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} + +\newcommand*{\TODO}[1][]{{% + \sffamily\bfseries\huge TO-DO!\if\relax#1\relax\else\space\fi#1}} + + +\newcommand*\twocoltoc{% + \RequirePackage{multicol}% + \def\@starttoc##1{% + \begin{multicols}{2}\makeatletter + \NamedInput % changed from |\@input| 2010/8/13. + {\jobname .##1}% + \if@filesw \@xa \newwrite \csname tf@##1\endcsname + \immediate \openout \csname tf@##1\endcsname \jobname .##1\relax + \fi + \@nobreakfalse\end{multicols}% + }% of |\starttoc| +} + +\@onlypreamble\twocoltoc + + +\pdef\equals{\hunskip${}={}$\ignorespaces} +\pdef\eequals{\hunskip${}=={}$\ignorespaces} + +\pdef\·{\hunskip${}·{}$\ignorespaces} + + +\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}} + + +\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}} + +\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. + \Store@Macro\*% + \def\*{\czer{\storedcsname{*}}}% + \def\+{\czer{†}}% + \newcommand*\nieczer[1]{\textcolor{black}{##1}}% +} + +\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}} + +\AtBeginDocument{% + \renewcommand*\gmu@RPfor[3][]{% + \unless\ifdefined#3% + \@ifpackageloaded{#2}{}{% + \typeout{^^J! Package `#2' not loaded!!! (\on@line)^^J}}% + \fi}} + +\pprovide\continuum{% + \gmu@RPfor{eufrak}\mathfrak\ensuremath{\mathfrak{c}}} + +\def\iteracro{% + \pdef\acro##1{% + \begingroup + \acropresetting + \gmu@acrospaces##1 \gmu@acrospaces + \endgroup + }% +} + +\emptify\acropresetting + +\iteracro + +\def\gmu@acrospaces#1 #2\gmu@acrospaces{% + \gmu@acroiter#1\gmu@acroiter + \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@acroiter#1{% + \gmu@notif {x\@xa\@xa} {\@firstofmany#1\@undefined\@nil \gmu@acroiter} + {\gmu@acrokernel{#1}% + % and iterate + \gmu@acroiter + }% of if sentinel or not + {}% +} + +\def\gmu@acrokernel#1{% + \gmu@if {cat} {a\@xanx\@firstofmany#1\@undefined\@nil} + {\gmu@if {num} {`#1=\uccode`#1\space }% a space to delimit numer + % (without it further macros were + % expanded which in this case are + % |\expandafter\@firstoftwo\else\@secondoftwo| and this made the test didn't work.) + {{\acrocore{#1}}}% + {{#1}}% tu było |\smallerr| + }% + {#1}% +} + +\pdef\acrocore{\smaller % was: |\scshape\lowercase| +} + + +\def\IMHO{\acro{IMHO}} +\def\AKA{\acro{AKA}} + +\pdef\usc#1{{\addfontfeature{Letters=UppercaseSmallCaps}#1}} + +\def\uscacro{\let\acrocore\usc} + + + +\def\gmu@dekfraccsimple#1/#2{\leavevmode\kern.1em + \raise.7ex\hbox{%^^A \udigits + \gmu@fracfontsetup#1}\gmu@numeratorkern + \dekfraccslash\gmu@denominatorkern + {%^^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, +\dekfraccsimple + + + +\newcommand*\ikern{\,\penalty\@M\hskip\z@skip\relax} + + +\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| + +\pdef\fakescaps#1{{\gmu@scapss#1\@nil}} + +\let\fakescapscore\gmu@scalematchX + +\def\tinycae{{\tiny\AE}}% to use in |\fakescaps[\tiny]{…}| + +\RequirePackage{calc} + + +\@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}}% + \gmu@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}% + \endgroup + \addfontfeature{Scale=\gmu@scscale}% + }}{\let\gmu@scalematchX\smallerr} + +\def\fakescextrascale#1{\def\fakesc@extrascale{#1}} + +\newcommand*\wyzejnizej[1]{% + \edef\gmu@tempa{\gmu@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 +} + + +\def\napapierkistretch{0,3pt}% It's quite much for 11/13pt leading. + +\def\napapierkicore{\advance\baselineskip% + by 0ptplus\napapierkistretch\relax} + +\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*| + +\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} + +\newenvironment*{luzniej}{\par\luzniejcore}{\par} + +\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 + +\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\ or not. + +\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–{\–}% + \addtomacro\dospecials{\do\–\do\—}% + \addtomacro\@sanitize{\@makeother\–\@makeother\—}% + \addtomacro\gmu@septify{\do\–13\do\—13\relax}% +}}} +\else +\relaxen\adashes +\fi + + +\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}} + +\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} + +\newenvironment*{tytulowa}{\newpage}{\par\thispagestyle{empty}\newpage} + +\def\nazwired{\quad\textsc} + + +\pdef\polskadata{% + \DeclareCommand\gmu@datefsl{% + ##1 Q{0123456789\bgroup}>iT{/-} % year + ##2 Q{0123456789\bgroup}>iT{/-} % month + ##3 Q{0123456789\bgroup} % day + ##4 T{,} + ##5 K{##1\gmu@datefsl} % 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 + +\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}. +}% + +\newif\ifdate +\pdef\bidate#1{% + \gmu@datefsl#1\gmu@datefsl +} + +\pdef\linedate{\gmu@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{\DateFont \bidate{#1}}% + \nopagebreak + \else%|%\ifnum\arabic{dateinsection}>0\dekbigskip\fi| + \addvspace{\bigskipamount}\possvfil + \fi}% end of |\linedate|. + +\newcommand*\DateFont{\footnotesize\itshape} + +\let\linedate@hook\@gobble + +\let\dateskipamount\medskipamount + +\pdef\rdate{\let\date@line\rightline \linedate} + +\def\date@left#1{\par{% + \raggedright#1% + \leftskip\z@skip + \@@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}} +\let\thedate\ldate + +\pdef\zwrobcy#1{\emph{#1}} %ostinato, allegro con moto, + %garden party etc., także kompliment + +\pdef\tytul#1{\emph{#1}} + +\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. + \Store@Macro\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 + \let\\\@normalcr} + +\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} + +\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} + \gobblespace + }{% + \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} + \gobblespace + }{% + \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{% + \def\restoreparindent{\parindent\@parindent}% + }% of \cmd\AtBeginDocument. +}% of \cs{twoparinit}. + + +\def\gmu@leftskipcorr{% + \kern1\leftskip + \ifcsname \@currenvir leftskip\endcsname + \kern-1\csname \@currenvir leftskip\endcsname + \fi +} + +\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{% + \kern1\leftskip + \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}% + \kern1\rightskip + }% of |\rightline|, + \setprevdepth + }% of |ValueF{#1}|, +}% of |\wherncore|. + +\DeclareCommand\whern@parbox{% + T {\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 + \gmu@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{% + \gmu@leftskipcorr + \IfValueTF{#2}{\whern@parbox\rightskip[b][#2]}% + {\whern@parbox\rightskip[b]}% + {#3}% + }% + \setprevdepth + \nopagebreak\relax + \@ifenvir{quote}{\noindent\ignorespaces}{}} + + +\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 + +\pdef\xathousep#1{\@xa\thousep\@xa{\the#1}} + +\def\shortthousep{% + \DeclareCommand\thous{ + D {\NoValue} % decimal argument + }{% + % 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|. + + +\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{% + \typeout{@@@@@^^J^^J\@nx#1^^J^^J% + @@@@ meaning:^^J\meaning#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\TrzaskaTilde{% + \@xa\DeclareCommand\@xa\gmu@smarttilde + \@xa{\@xa T\@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 |\gmu@ifstar|'s else, + }% of |\gmu@smarttilde|, + \let~\gmu@smarttilde +}% of |\TrzaskaTilde|. + + +\newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}} + +\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}% +} + + +\DeclareCommand\*{Q{0123456789}{1}} +{\gmu@flexhyphen + \gmu@star@loop0{#1}\relax +}% + +\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 + \gmu@flexhyphen + \@xa\gmu@star@loop + \@xa{\number\numexpr#1+1\@xa}% + \@xa{\number#2\@xa}% + \fi} + +\ifdefined\XeTeXversion + +\foone{% + \catcode`„\active + \catcode`”\active + \catcode`’\active + \catcode`—\active + \catcode`–\active +}{% + \def\activequotes{% + \incsdef„{}{\@ifnextchar—% + {\lv\llap{\string„}\pauzadial}{\string„}}% + \incsdef”{}{\string”\@ifnextanyRS{.,}{\quotkern}{}}% + \incsdef’{}{\string’\@ifnextanyRS{.,}{\quotkern}{}}% + \catcode`„\active + \catcode`”\active + }% + \def\activepunctsQ {„”’—–}% +} + +\catcode`ѥ\active + +\DeclareCommand\ac {b} {% + \IfValueTF{#1} + {% + \acro{#1}% + } + {\ac@u}% +} + +\def\ac@kernel#1{{\gmu@acrokernel {#1}}}% |#1| in braces because |\acrocore| + % valid in \ty{Dzienniczek} uses + % |\lowercase| (that requires braced text). + + +\@xa\def\@xa\@dc@basicdelims\@xa{% + \two@Ms \par \relax + \bgroup + \egroup \begingroup \endgroup + \begin \end + $% ^^A$ + \(\)\[\]% other math delims + &\\% tabular delims +} + +\let\@dc@basicdelimsp\@dc@basicdelims + +\@xa\addtomacro\@xa\@dc@basicdelimsp +\@xa{\all@spaces} + +\@xa\def\@xa\@dc@punctanddelims +\@xa{\@dc@basicdelims :,.;?!„”«»‹›"'`‘’}% + +\let \@dc@acpunctanddelims \@dc@punctanddelims + +\@xa\addtomacro\@xa\@dc@acpunctanddelims +\@xa{\activepunctsQ} + +\let \@dc@acpunctanddelimsp \@dc@punctanddelims + +\@xa\addtomacro\@xa\@dc@acpunctanddelimsp +\@xa{\all@spaces} + +\addtomacro\@dc@acpunctanddelimsp{~} + +\DeclareCommand\ac@u{ + >\@xa U{\@dc@acpunctanddelimsp ()[]<>ѥ} \default{} + \eacher {\ac@kernel} + >iW{ѥ} +} +{\text{#1}} + +\fi % of if \XeTeX\ of l.~\ref{12322}. + +\@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} + +\@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} + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmtypos.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmurl.sty b/Master/texmf-dist/tex/latex/gmutils/gmurl.sty new file mode 100644 index 00000000000..fa5dd76af8a --- /dev/null +++ b/Master/texmf-dist/tex/latex/gmutils/gmurl.sty @@ -0,0 +1,306 @@ +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmurl.sty” generated with the DocStrip utility. +%% +%% +%% The original source files were: +%% +%% gmutils/gmutils.gmd (with options: `url') +%% +%% +%% 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{gmurl} + [2010/10/24 v0.993 modifications to the url package (GM)] + + +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% + + +\RequirePackage{gmcommand} + + +\def\urladdstar{% + \AtBeginDocument{% + \@ifpackageloaded{hyperref}{% + \Store@Macro\url + \pdef\url{\gmu@ifstar{\nolinkurl}{\storedcsname{url}}}% + }{}}} + +\@onlypreamble\urladdstar + +\@ifXeTeX{% + \pdef\UrlFix{\AtBeginDocument{% + \@ifpackageloaded{url}{\gmu@UrlFix}{}}% + \relaxen\UrlFix}% + % + \AtBeginDocument{% + \pdef\UrlFix{% + \@ifpackageloaded{url}{\gmu@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\gmu@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}. + \gmu@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\gmu@UrlSetup{% + \medmuskip\Urlmuskip \thickmuskip\medmuskip \thinmuskip0mu% + \relpenalty\UrlBigBreakPenalty \binoppenalty\UrlBreakPenalty + \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}. + }% of |\gmu@UrlSetup|. + % \stanza + % + % \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} + \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{% + \@xanxcs{#1family}% + \def\@xanxcs{gmu@dbl\string\/kern}% + {\kern#2\relax}% + }% of |\UrlFont| + }% of |\url#1style| + \urlstyle{#1}% + }% of |\AtBeginDocument| +}% of |\UrlSlashKern| + +\def\DeclareUrlCommand#1#2{\pdef#1{\leavevmode\begingroup #2\Url}} + +\foolc ~ : {% + \@ifXeTeX{% + \def\metaat~{% + \penalty\@M \hskip\z@skip + \meta{аt}% it's a Cyrillic »a«! + \penalty\exhyphenpenalty + \hskip\z@skip + }% + % + \def\metadot~{% + \penalty\@M \hskip\z@skip + \meta{dоt}% it's a Cyrillic »o«! + \penalty\exhyphenpenalty + \hskip\z@skip + }% + }% of if \XeTeX + {% + \def\metaat~{\PackageError{gmurl}{Command \bslash metaat + works only in XeTeX}@}% + % + \def\metadot~{\PackageError{gmurl}{Command \bslash metaat + works only in XeTeX}.}% + }% of if not XeTeX +}% of |\foolc| + +%%% (For my GNU Emacs:) +%%% Local Variables: +%%% mode: doctex +%%% coding: utf-8 +%%% End: +\endinput +%% +%% End of file `gmurl.sty'. diff --git a/Master/texmf-dist/tex/latex/gmutils/gmutils.sty b/Master/texmf-dist/tex/latex/gmutils/gmutils.sty index 745e0f86f03..52afda5be49 100644 --- a/Master/texmf-dist/tex/latex/gmutils/gmutils.sty +++ b/Master/texmf-dist/tex/latex/gmutils/gmutils.sty @@ -1,3430 +1,126 @@ -% -% \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. +%% +%% \iffalse ^^A we skip the debug setting +\IfFileExists{\string~/bin/gen_and_xela}{\errorcontextlines=1000 }{} +%% \fi +%% ^^A $Id: TheUltimateMaster.gmd,v 0.250 2010/10/24 14:42:35 natror Exp natror $ +%% This is file “gmutils.sty” generated with the DocStrip utility. +%% %% -%% 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 +%% The original source files were: %% -%% LPPL status: "author-maintained".\par +%% gmutils/gmutils.gmd (with options: `utils') %% -%% Many thanks to my \TeX\ Guru Marcin Woliński for his \TeX nical ^^A -%% support. -% -%\end{copyrnote} %% +%% Copyright © 2005, 2006, 2007, 2008, 2009, 2010 +%% 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. %% -% \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 - +%% LPPL status: "author-maintained". +%% +%% +%% +%% For the documentation please refer to the file(s) +%% gmutils.{gmd,pdf}. +%% +%% \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. + [2010/10/24 v0.993 some rather TeXnical macros, some of them tricky (GM)] - -% 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} +%% +%% +%% ^^A\typeout{\unexpanded{#4}}%% - %\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 +\unless\ifdefined\Name + \def\Name#1#2{\expandafter#1\csname#2\endcsname} \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 -} +\unless\ifcsname ifgmu@quiet\endcsname +\Name\newif {ifgmu@quiet}% % it has to be at least (at highest) in \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} +\RequirePackage{xkeyval} -\long\def\ArgumentCatcher@Pm#1\@dc@arguments#2{% catcher of a~long mandatory. - \@dc@addargum{{#2}}#1\@dc@arguments} +\RequirePackage{gmbase} -\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}% +\DeclareOptionX{quiet}{\gmu@quiettrue + \PassOptionsToPackage{quiet}{gmtypos}% } - -\long\def\ArgumentCatcher@PG % general catcher -#1% left and right delimiter -#2% default value -#3% the tail of args parser. -\@dc@arguments % tail delimiter +\def\gmu@PackOptionX +#1% name of a package with or without leading “gm”. {% - \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}}% + % So we declare an OptionX that by default loads this package thanks + % to a special \CS having been defined to load it or do nothing. + \DeclareOptionX{#1}[on]{% + % ^^V \ifcsname gmu@Require@#1\endcsname + % ^^V \PackageError{gmutils}{Value clash for the ***#1*** package option}{}% + % ^^V \fi + \lowercase{\@xa\if\@gobble ##1\relax}% “off” given as the value + \@namedef{gmu@Require@#1}{}% + \else % “on” + \afterfi{% + \@namedef{gmu@Require@#1}{% + \IfFileExists{gm#1.sty}% + {\RequirePackage{gm#1}}% if there's a \pk{gm} package, we load + % it, else we load + {\RequirePackage{#1}}% + }% of namedef + }% of afterfi + \fi + }% of |\DeclareOptionX| + \IfFileExists{gm#1.sty}% + {\DeclareOptionX{gm#1}[on]{% + \ExecuteOptionsX{#1=####1}% }% - \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}% + }% of if yes. Else: + {}% + % } -\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{}} - + \gmu@PackOptionX{command} + \gmu@PackOptionX{ampulex} + \gmu@PackOptionX{envir} + \gmu@PackOptionX{relsize} + \gmu@PackOptionX{meta} % provides |\bihyphen|, |\discre|, |\discret| + \gmu@PackOptionX{logos} + \gmu@PackOptionX{notonlypream} + \gmu@PackOptionX{mw} -% \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. + \gmu@PackOptionX{typos} + \gmu@PackOptionX{parts} + \gmu@PackOptionX{url} + \gmu@PackOptionX{RCS} +\ExecuteOptionsX{command, envir, ampulex, relsize, meta, logos, + notonlypream, % ^^V mw=off, + typos, parts, url} -% \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}}} +\ProcessOptionsX -\not@onlypreamble\@preamblecmds -\not@onlypreamble\@ifpackageloaded -\not@onlypreamble\@ifclassloaded -\not@onlypreamble\@ifl@aded -\not@onlypreamble\@pkgextension +\def\doifdefined#1{\ifdefined#1\@xa#1\fi} -% And let's make the message of only preamble command's forbidden use -% informative a~bit: +\doifdefined\gmu@Require@command +\doifdefined\gmu@Require@envir +\doifdefined\gmu@Require@ampulex +\doifdefined\gmu@Require@relsize +\doifdefined\gmu@Require@meta +\doifdefined\gmu@Require@logos +\doifdefined\gmu@Require@notonlypream +\doifdefined\gmu@Require@mw +\doifdefined\gmu@Require@typos +\doifdefined\gmu@Require@parts +\doifdefined\gmu@Require@url +\doifdefined\gmu@Require@RCS -\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} @@ -3435,3714 +131,11 @@ pagella, trebuchet, cursor, fontspec=quiet]{gmdocc} \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: +%%% (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 +%%% End: +\endinput +%% +%% End of file `gmutils.sty'. |