% % \GetFileInfo{gmutils.sty} % \title{The \pk{gmutils} Package\thfileinfo} % \author{Grzegorz Murzynowski} % \maketitle % % \let\ty\emph % % \begin{copyrnote} % %%Written by Grzegorz Murzynowski, %% natror at o2 dot pl %% %% \copyright\,2005, 2006, 2007, 2008, 2009, 2010 by Grzegorz Murzynowski. %% %% This program is subject to the \LaTeX\ Project Public License. %% See ^^A %% \url{http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html} ^^A %% for the details of that license.\rrthis %% %% LPPL status: "author-maintained".\par %% %% Many thanks to my \TeX\ Guru Marcin Woliński for his \TeX nical ^^A %% support. % %\end{copyrnote} %% %% % \RecordChanges % \ChangesStart{}{1000/00/0} % % \chschange{v0.59}{06/09/04}{396} % \chschange{v0.61}{06/09/06}{432} % \chschange{v0.62}{06/9/7}{444} % \chschange{v0.65}{06/9/28}{700} % \chschange{v0.66}{06/10/5}{698} % \chschange{v0.67}{06/10/11}{739} % \chschange{v0.68}{06/10/12}{812} % \chschange{v0.69}{06/10/17}{844} % \chschange{v0.70}{06/10/20}{852} % \chschange{v0.71}{06/10/27}{876} % \chschange{v0.72}{06/11/14}{906} % \chschange{v0.74}{06/12/1}{1185} % \chschange{v0.76}{07/4/9}{1538} % \chschange{v0.77}{07/4/14}{1547} % \chschange{v0.78}{07/4/26}{1685} % \chschange{v0.80}{2007/4/29}{1689} % \chschange{v0.84}{2007/11/13}{2684} % \chschange{v0.85}{2007/11/16}{2795} % \chschange{v0.87}{2008/8/3}{4027} % \chschange{v0.88}{2008/8/3}{4040} % \chschange{v0.90}{2008/8/4}{4035} % \chschange{v0.91}{2008/8/6}{4055} % \chschange{v0.92}{2008/8/11}{4133} % \chschange{v0.93}{2008/8/21}{4140} % \chschange{v0.93}{2008/8/30}{4501} % \chschange{v0.94}{2008/10/4}{4880} % \chschange{v0.95}{2008/10/8}{4908} % \chschange{v0.96}{2008/11/21}{5363} % \toCTAN{2008/11/21 v0.96} % \chschange{v0.97}{2008/11/22}{5375} % \toCTAN{2008/11/22 v0.97} % \chschange{v0.98}{2008/11/30}{5429} % \chschange{v0.98}{2008/12/5}{5577}[\cs{DeclareCommand}] % \chschange{v0.98}{2008/12/5}{5627}[\cs{fakeonum}] % \chschange{v0.98}{2008/12/9}{6035}[\cs{DeclareCommand}, \cmd\arg] % \chschange{v0.98}{2008/12/10}{6129} % [\cmd\DeclareEnvironment] % \chschange{v0.98}{2008/12/10}{6147} % [\cmd\arg\ in verbatims] % \chschange{v0.98}{2008/12/12}{6535} % [\cmd\UrlFix] % \chschange{v0.98}{2008/12/14}{6656} % [type settings for \pk{gmdoc} (\cmd\narrativett) and for % \cmd\verbatimspecials] % \chschange{v0.991}{2010/3/4}{8257} % [some shorthands and major development of \cmd\DeclareCommand, % including ‘Knuthian’ and general optional arguments and % ‘\cmd\afterassignment’ pseudo-argument] % \toCTAN{2010/03/04 v0.991} % % \skiplines we skip the driver \ifnum\catcode`\@=12 \documentclass[debug, countalllines, codespacesgrey, outeroff, pagella, trebuchet, cursor, fontspec=quiet]{gmdocc} \usepackage{eufrak}% for |\continuum| in the commentary. \twocoltoc \begin{document} \DocInput{\jobname.sty} \PrintChanges \thispagestyle{empty} \typeout{% Produce change log with^^J% makeindex -r -s gmglo.ist -o \jobname.gls \jobname.glo^^J (gmglo.ist should be put into some texmf/makeindex directory.)^^J} \typeout{% Produce index with^^J% makeindex -r \jobname^^J} \afterfi{\end{document}} \fi% of driver pass %\endskiplines \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{gmutils} [2010/03/04 v0.991 some rather TeXnical macros, some of them tricky (GM)] % % \tableofcontents % % \division{Intro} % % The \pk{gmutils.sty} package provides some macros that are % analogous to the standard \LaTeX\ ones but extend their % functionality, such as |\@ifnextcat|, |\addtomacro| or |\begin(*)|. % The others are just conveniences I~like to use in all my TeX % works, such as |\afterfi|, |\pk| or |\cs|. % % I wouldn't say they are only for the package writers but I~assume % some nonzero \LaTeXpar-awareness of the user. % % For details just read the code part. % % \begin{gmlonely} % \subdivision{Installation} Unpack the \file{gmutils-tds.zip} % archive (this is an archive that conforms the \acro{TDS} standard, % see \file{CTAN/tds/tds.pdf}) in some texmf directory or just put % the \pk{gmutils.sty} somewhere in the \file{texmf/\:tex/\:latex} % branch. Creating a~\file{texmf/\:tex/\:latex/\:gm} directory may % be advisable if you consider using other packages written by me. % % Then you should refresh your \TeX\ distribution's files' database % most probably. % \end{gmlonely} % % \subdivision{Contents of the \pk{gmutils.zip} archive} % % The distribution of the \pk{gmutils} package consists of the % following three files and a~\acro{TDS}-compliant archive. % \begin{verse} % \pk{gmutils.sty}\\ % \pk{README}\\ % \pk{gmutils.pdf}\\ % \pk{gmutils.tds.zip} % \end{verse} % % \begin{gmlonely} % \subdivision{Compiling of the documentation} % % The last of the above files (the \pk{.pdf}, i.e., \emph{this % file}) is a~documentation compiled from the \pk{.sty} file by % running \LaTeX\ on the \pk{gmutils.sty} file twice % (|xelatex gmutils.sty| in the directory you wish the % documentation to be in, you don't have copy the \file{.sty} file % there, \TeX\ will find it), % then MakeIndex on the \file{gmutils.idx} file, and then \LaTeX\ % on \file{gmutils.sty} once more. % % MakeIndex shell command: % \[\hbox{|makeindex -r gmutilsDoc|}\] % The |-r| switch is to forbid MakeIndex to make implicit ranges since % the (code line) numbers will be hyperlinks. % % Compiling the documentation requires the packages: % \pk{gmdoc} (\pk{gmdoc.sty} and \pk{gmdocc.cls}), \pk{gmverb.sty}, % \pk{gmutils.sty}, \pk{gmiflink.sty} and also some standard packages: % \pk{hyperref.sty}, \pk{color.sty}, \pk{geometry.sty}, % \pk{multicol.sty}, \pk{lmodern.sty}, \pk{fontenc.sty} that should % be installed on your computer by default. % % If you had not installed the \pk{mwcls} classes (available on % CTAN and present in \TeX\ Live e.g.), the result of your % compilation might differ a~bit from the \pk{.pdf} provided in this % \pk{.zip} archive in formatting: If you had not installed % \pk{mwcls}, the standard \pk{article.cls} class would be used. % \end{gmlonely} % \ifx\XeTeXversion\relax \let\XeTeXversion\@undefined% If someone earlier used % \nlperc|\@ifundefined{XeTeXversion}| to test % whether the engine is \XeTeX, then \incs{XeTeXversion} \emph{is} defined % in the sense of \eTeX\ tests. In that case we |\let| it to something % really undefined. Well, we might keep sticking to \incs{@ifundefined}, % but it's a~macro and it eats its arguments, freezing their catcodes, % which is not what we want in line \ref{not@ifundef}. \fi \ifdefined\XeTeXversion \XeTeXinputencoding utf-8 % we use Unicode dashes later in this file. \fi% and if we are not in \XeTeX, we skip them thanks to \XeTeX-test. %^^A % \division{Ignoring spaces and line ends in packages and classes} %^^A % %^^A % Spurious spaces and line ends that convert to spaces are a~plague %^^A % for the package writers including me. On the other hand, changing %^^A % catcodes is dangerous and should be done with care. Therefore %^^A % I~provide a~declaration that reverts its effect at most at the end %^^A % of a~package or class. %^^A %^^A \def\package@ignorespaces{% %^^A \catcode`\ =9 %^^A \endlinechar-1 %^^A \AtEndOfPackage{\package@restorespace}} %^^A %^^A \def\package@restorespace{\catcode`\ =10 \endlinechar13 } %^^A % \division{Options} \newif\ifgmu@quiet \DeclareOption{quiet}{\gmu@quiettrue} \ProcessOptions % % \division{A~couple of abbreviations} % {\DoIndex{\@nx \@xa} \Define\@xa \Define\@nx \let\@xa\expandafter \let\@nx\noexpand \def\@xau#1{\unexpanded\@xa{#1}} %\changes{v0.94}{2008/10/4}{added} % \nostanza Note that there's only one |\expandafter|, after % |\unexpanded|. It's because |\unexpanded| expands expandable tokens % and gobbles |\relax|es while looking for an opening brace or |\bgroup|. % Note also that it \emph{requires} a text in braces. % % \chgs{2010/03/04 v0.991 made 1-parameter} % Note also that (since v0.991) this is a 1-parameter macro so doesn't % expand subsequent tokens until meets a \ but just % takes first single token or \. %} \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⁄›(true⁄|false›)| % \emph{does} work as expected. % \Define\grefstepcounter % \changes{v0.59}{06/09/04}{moved here from \pk{gmdoc}.} % There's a~trouble with |\refstepcounter|: defining |\@currentlabel| % is local. So let's |\def| a~|\global| version of |\refstepcounter|. % % Warning. I~use it because of very special reasons in \pk{gmdoc} and % in general it is probably not a~good idea to make |\refstepcounter| % global since it is contrary to the original \LaTeX\ approach. \pdef\grefstepcounter#1{% {\let\protected@edef=\protected@xdef\refstepcounter{#1}}} % Na\"\i{}ve first try |\globaldefs=\tw@| raised an error % |unknown command \reserved@e|. The matter was to globalize % |\protected@edef| of |\@currentlabel|.\rrthis % % Thanks to using the true |\refstepcounter| inside, it observes the % change made to |\refstepcounter| by \pk{hyperref}. % \dekmedskip % % 2008/08/10 I~spent all the night debugging \cs{penalty 10000} that % was added after a~hypertarget in vertical mode. I~didn't dare to % touch \pk{hyperref}'s guts, so I~worked it around with ensuring % every \cs{grefstepcounter} to be in hmode: \pdef\hgrefstepcounter#1{% \ifhmode\leavevmode\fi\grefstepcounter{#1}} % By the way I~read some lines from \TB\ and was reminded that % \cs{unskip} strips any last skip, whether horizontal or % vertical. And I~use \cs{unskip} mostly to replace a~blank space with % some fixed skip. Therefore define \pdef\hunskip{\ifhmode\unskip\fi} % Note the two macros defined above are \cs{protected}. I~think it's % a~good idea to make \cs{protected} all the macros that contain % assignments. There is one more thing with \cs{ifhmode}: it can be different % at the point of \cs{edef} and at the point of execution. % Another shorthand. It may decrease a~number of |\expandafter|s e.g. % \Define\glet \def\glet{\global\let} % \LaTeX\ provides a~very useful |\g@addto@macro| macro that adds its % second argument to the current definition of its first argument % (works iff the first argument is a~no argument macro). But I~needed % it some times in a~document, where |@| is not a~letter. So: % \Define\gaddtomacro \let\gaddtomacro=\g@addto@macro % The redefining of the first argument of the above macro(s) is % |\global|. What if we want it local? Here we are: % \long\def\addto@macro#1#2{% % \chgs{2008/12/7 v0.98 \cs{toks@} replaced with some % \cmd\expandafter s because use of \cs{toks@} here caused % a~disaster in \cs{DeclareCommand}} \edef#1{\@xa\unexpanded\@xa{#1}\unexpanded{#2}}% \incmd\edef\ and % \incmd\unexpanded\ to double the hashes. } % And for use in the very document, % \Define\addtomacro \let\addtomacro=\addto@macro % 2008/08/09 I~need to prepend something not add at the end---so \long\def\prependtomacro#1#2{% \changes{v0.94}{2008/09/15}{order of % arguments reversed} \edef#1{\unexpanded{#2}\@xa\unexpanded\@xa{#1}}} % Note that \cs{prependtomacro} can be prefixed. % \Define\addtotoks \long\def\addtotoks#1#2{% #1=\@xa{\the#1#2}} % \Define\emptify \newcommand*\@emptify[1]{\let#1=\@empty} \@ifdefinable\emptify{\let\emptify\@emptify} % Note the two following commands are in fact one-argument. %\Define\g@emptify \Define\gemptify \newcommand*\g@emptify{\global\@emptify} \@ifdefinable\gemptify{\let\gemptify\g@emptify} % \Define\relaxen \newcommand\@relaxen[1]{\let#1=\relax} \@ifdefinable\relaxen{\let\relaxen\@relaxen} % Note the two following commands are in fact one-argument. % \Define\g@relaxen \Define\grelaxen \newcommand*\g@relaxen{\global\@relaxen} \@ifdefinable\grelaxen{\let\grelaxen\g@relaxen} % \division{\cs{gm@ifundefined}---a~test that doesn't create any\ % hash entry unlike \cs{@ifundefined}} % I~define it under another name not redefine |\@ifundefined| because % I~can imagine an odd case when something works thanks to % |\@ifundefined|'s `relaxation’ effect. \long\def\gm@ifundefined#1{% not |\protected| because expandable. % \changes{v0.94}{2008/9/12}{added. All \cs{@ifundefined}s used by % me changed to this} % \changes{v0.94}{2008/10/03}{made robust to unbalanced \cs{if}s and % \cs{fi}s the same way as \LaTeX's \cs{@ifundefined} (after a~heavy % debug :-)} \ifcsname#1\endcsname% defined… \@xa\ifx\csname #1\endcsname\relax% but only as |\relax|---then % 2nd argument. \afterfifi\@firstoftwo% \else% defined and not |\relax|---then 3rd argument. \afterfifi\@secondoftwo% \fi \else% not defined---then 3rd. \afterfi\@firstoftwo% \fi} \long\def\gm@testdefined#1\iftrue{% This is a~macro that expands to % \incs{iftrue} or \incs{iffalse} depending on whether its argument % is defined in the \LaTeX\ sense. Its syntax requires an % \incs{iftrue} to force balancing \incs{if}s with \incs{fi}s. % \changes{v0.95}{2008/10/8}{added} \csname \ifdefined#1% \ifx#1\relax iffalse% \else iftrue% \fi \else iffalse% \fi\endcsname } \long\def\gm@testundefined#1\iftrue{% we expand the last macro two % levels. We repeat the parameter string to force the proper syntax. % \changes{v0.95}{2008/10/8}{added} \@xa\@xa\@xa\unless\gm@testdefined#1\iftrue} % \division{Some `other' and active stuff} % Here I~define a~couple of macros expanding to special chars made % `other'. It's important the \CS are expandable and therefore % they can occur e.g. inside |\csname›…\endcsname| unlike e.g.\ % \CS'es |\chardef|ed. % % \Define\subs \foone{\catcode`\_=8 } {\let\subs=_} % \Define\sups \foone{\catcode`\^=7 } {\let\sups=^} \foone{\@makeother\_} {\def\xiiunder{_}} \let\all@unders\xiiunder \foone{\catcode`\_=8 } {\addtomacro\all@unders{_}} \foone{\catcode`\_=11 } {\addtomacro\all@unders{_}} \foone{\catcode`\_=13 } {\addtomacro\all@unders{_}} % \nostanza Now |\all@unders| bears underscores of categories 8, 11, % 12 and 13. \def\all@stars{*} \foone{\catcode`\*=11 } {\addtomacro\all@stars{*}} \foone{\catcode`\*=13 } {\addtomacro\all@stars{*}} %\nostanza And |\all@stars| bears stars of categories 11, 12 and 13. \ifdefined\XeTeXversion \chardef\_="005F \fi \foone{\@makeother\`}% {\def\backquote{`}} \foone{\catcode`\[=1 \@makeother\{ \catcode`\]=2 \@makeother\}}% [% \def\xiilbrace[{]% \def\xiirbrace[}]% ]% of |\firstofone| % Note that \LaTeX's |\@charlb| and |\@charrb| are of catcode 11 % (`letter'), cf. The \LaTeXe\ Source file k, lines 129--130. % Now, let's define such a~smart |_| (underscore) which will be usual % |_|${}_8$ in the math mode and |_|\catother\ (`other') outside math. % \Define\smartunder % \changes{v0.60}{06/09/05}{\cs{\_} instead of \cs{xiiunder}} \foone{\catcode`\_=\active} {% \newcommand*\smartunder{% \catcode`\_=\active \def_{\ifmmode\subs\else\_\fi}}}% We define it as \inverb|\_| not just as % \inverb|\xiiunder| because some font encodings don't have \inverb|_| at the % \inverb|\char`\_| position. % % \CodeEscapeChar\! % \Define\bslash \Define\xiibackslash \foone{\catcode`\!=0 \@makeother\\} {!newcommand*!xiibackslash{\}} %^^A] balancing braces for Emacs % \CodeEscapeChar\\ \let\bslash=\xiibackslash % \begin{oldmc} \foone{\@makeother\%} {\def\xiipercent{%}} % \end{oldmc} \foone{\@makeother\&}% {\def\xiiand{&}} \foone{\@makeother\ }% {\def\xiispace{ }} \foone{\@makeother\#}% {\def\xiihash{#}} % We introduce \cs{visiblespace} from Will Robertson's \pk{xltxtra} if % available. It's not sufficient |\@ifpackageloaded{xltxtra}| since % \cs{xxt@visiblespace} is defined only unless |no-verb| option is % set. 2008/08/06 I~recognised the difference between \cs{xiispace} % which has to be plain `other' char (used in \cs{xiistring}) and % something visible to be printed in any font. \AtBeginDocument{% \ifdefined\xxt@visiblespace \let\visiblespace\xxt@visiblespace \def\xxt@visiblespace@fallback{{% \fontspec{Latin Modern Mono}\textvisiblespace}}% \else \let\visiblespace\xiispace \fi} \foone\obeyspaces{\def\gmu@activespace{ }} \foone\obeylines{\def\activeM{^^M}} % \division{\cs{@ifnextcat}, \cs{@ifnextac}, catcode-independent\ % \cs{gm@ifstar}, \cs{@ifnextsingle}, \cs{@ifnextgroup}} % % As you guess, we |\def| |\@ifnextcat| \agrave~la |\@ifnextchar|, see % \LaTeXe\ source dated 2003/12/01, file d, lines 253--271. The % difference is in the kind of test used: while |\@ifnextchar| does % |\ifx|, |\@ifnextcat| does |\ifcat| which means it looks not at the % meaning of a~token(s) but at their |\catcode|(s). As you (should) % remember from \TeXbook, the former test doesn't expand macros while % the latter does. But in |\@ifnextcat| the peeked token is protected % against expanding by |\noexpand|. Note that the first parameter is % not protected and therefore it shall be expanded if it's % expandable. Because an assignment is involved, you can't test % whether the next token is an active char. But you can test if the % next token is |{|$_1$ or |}|$_2$: |\@ifnextcat\bgroup›…|, % |\@ifnextcat\egroup›…|. \long\pdef\@ifnextcat#1#2#3{% % \changes{v0.75}{2007/01/01}{\cs{let} for \cs[\#]1 changed to % \cs{def} to allow things like \cs{noexpand\texttilde}} % \HideDef \def\reserved@d{#1}% \def\reserved@a{#2}% \def\reserved@b{#3}% \futurelet\@let@token\@ifncat} % \ResumeDef \def\@ifncat{% \ifx\@let@token\@sptoken \let\reserved@c\@xifncat \else \ifcat\reserved@d\@nx\@let@token \let\reserved@c\reserved@a \else \let\reserved@c\reserved@b \fi \fi \reserved@c} {\def\:{\let\@sptoken= } \global\: % this makes |\@sptoken| a space token. % \DefIndex\@xifncat \def\:{\@xifncat} \@xa\gdef\: {\futurelet\@let@token\@ifncat}} % Note the trick to get a~macro with no parameter and requiring % a~space after it. We do it inside a~group not to spoil the general % meaning of |\:| (which we extend later). % \dekmedskip % % \stanza The next command provides the real \cs{if} test for the next % token. \emph{It} should be called |\@ifnextchar| but that name is % assigned for the future \cs{ifx} text, as we know. Therefore we call % it \cs{@ifnextif}. % % \stanza % Having |\@ifnextcat| defined, let's apply it immediately. Similar % thing does probably the \pk{xspace} package. \def\spifletter{\@ifnextcat a{\space}{}} \long\pdef\@ifnextif#1#2#3{% % \changes{v0.75}{2007/01/01}{\cs{let} for \cs[\#]1 changed to % \cs{def} to allow things like \cs{noexpand\texttilde}} % \chgs{2010/3/4 v0.991 inner macro fixed to handle active chars more % properly (more as \cmd\if\ would do it)} % \HideDef % (the future token in |\noexpand|ed, unlike \inhash1) \def\reserved@d{#1}% \def\reserved@a{#2}% \def\reserved@b{#3}% \futurelet\@let@token\@ifnif} % \ResumeDef \def\@ifnif{% \ifx\@let@token\@sptoken \let\reserved@c\@xifnif \else \if\reserved@d\@nx\@let@token \let\reserved@c\reserved@a \else % |#1| of |\@ifnextif| is not |\if|-equivalent the future % token. But this may be because the future token is active % so it \emph{would} be |\if|-equivalent if not passed % through |\futurelet|. Let's manage this case. \begingroup \edef\gmu@tempa{% \lccode`\@nx~=`\reserved@d }\gmu@tempa \lowercase{\endgroup \ifx~}\@let@token \let\reserved@c\reserved@a \else \let\reserved@c\reserved@b \fi \fi \fi \reserved@c} % \UnDef {\def\:{\let\@sptoken= } \: % this makes |\@sptoken| a space token. % \UnDef \def\:{\@xifnif} \@xa\gdef\: {\futurelet\@let@token\@ifnif}} % \dekmedskip % % But how to peek at the next token to check whether it's an active % char? First, we look with |\@ifnextcat| whether there stands a~group % opener. We do that to avoid taking a~whole |{…}| as the argument % of the next macro, that doesn't use |\futurelet| but takes the next % token as an argument, tests it and puts back intact. % \changes{v0.75}{2007/01/11}{added} % \long\pdef\@ifnextac#1#2{% \@ifnextsingle {\gm@ifnac{#1}{#2}}% {#2}} \long\def\gm@ifnac#1#2#3{% \ifcat\@nx~\@nx#3% \@xa\@firstoftwo \else\@xa\@secondoftwo \fi{#1#3}{#2#3}} % Yes, it won't work for an active char |\let| to |{|${}_1$, but it ^^A~} % \emph{will} work for an active char |\let| to a~char of % catcode${}\neq1$. (Is there anybody on Earth who'd make an active % char working as |\bgroup| not just recatcode it to $_1$?) % % Having defined such tools, let's redefine |\gm@ifstar| to make it work % with whatever catcode |*| may be. % make a~version of |\gm@ifstar| that would work with % |*|\catletter. \pdef\gmu@lowstar{% \iffontchar\font"22C6 \char"22C6 \else\gmu@lowstarfake\fi}% we could define it to % be expandable (with \inverb|^^^^22c6|) but the only goal of it would % be allowing this low star in |\csname›…\endcsname|. But it would be % misleading (not everyone can easily distinguish |⁄string*| from |*|) % so \IMHO\ it's better to raise an error should such an active occur % in a~|\csname|. % This macro is intended to be |\let| to an active star only in % verbatims. For usual text there's % Commands around making star low (via |\active|ation) are defined in % line \ref{def:gmu@star} because they use |\DeclareCommand|. \def\gmu@tempa{*} \foone{\catcode`\*=\active} {\def\gmu@tempb{*}% it's defined in line \ref{active star} % to make |*| defined (when it was undefined, % \incmd\newcommand's \incs{gm@ifstar} test turned % true, the next undefined token was gobbled and raised an error). \let*=\gmu@lowstar} \edef\gmu@tempa{% \long\pdef\@nx\gm@ifstar##1##2{% \chgs{2008/12/16 v0.98 renamed from % \cs{@ifstar} since something % redefines \cs{@ifstar}}] \@nx\@ifnextif\gmu@tempa% {\@nx\@firstoftwo{##1}}% {% \@nx\@ifnextchar\@xa\@nx\gmu@tempb {\@nx\@firstoftwo{##1}}{##2}}% }% of |\gm@ifstar|. }\gmu@tempa %\stanza % A~test whether we can pick a~single token. We have to check whether % we are not next to |{| and whether we are not next to |}|. \long\pdef\@ifnextsingle#1#2{% \chgs{2008/12/11 v0.98 extracted from % \cs{@ifnextac}} This macro checks whether the next token is able % to be picked or is it a~braced list of tokens or is it a~group % closer so there's no token to be picked. \@ifnextcat\bgroup{#2}{% \@ifnextcat\egroup{#2}% \chgs{2008/12/11 v0.98 added test for % \cmd\egroup} {#1}}} \long\pdef\@ifnextgroup#1#2{% Note this macro turns true both before % a~group opener and before a~group closer. \@ifnextsingle{#2}{#1}} % now let's apply this to sth. useful (used in \pk{gmverse} and in % some typesetting, e.g.\ for prof.\ JSB. \pdef\ignoreactiveM{% \@ifnextgroup{}{\gmu@checkM}} \foone\obeylines{% we know it's a~single token since we use this macro % only in \incmd\@ifnextgroup's ‘else’. \long\pdef\gmu@checkM#1{% \ifx #1\@xa\ignoreactiveM% \else\@xa#1\fi}} % % \stanza Now, define a~test that checks whether the next token is % a~genuine space, | |${}_{10}$ that is. First define % a~\CS let such % a~space. The assignment needs a~little trick (\TeXbook\ appendix D) % since |\let|'s syntax includes one optional space after |=|. % \let\gmu@reserveda\*% \def\*{% \let\*\gmu@reserveda \let\gm@letspace= }% \* % % \Define\@ifnextspace \def\@ifnextspace#1#2{% \let\gmu@reserveda\*% \def\*{% \let\*\gmu@reserveda \ifx\@let@token\gm@letspace\afterfi{#1}% \else\afterfi{#2}% \fi}% \futurelet\@let@token\*} % First use of this macro is for an active |-| that expands to |---| % if followed by a~space. Another to make dot checking whether is % followed by |~| without gobbling the space if it occurs instead. % % \stanza % Now a~test if the next token is an active line end. I~use it in % \pk{gmdoc} and later in this package for active long dashes. \foone\obeylines{% \long\pdef\@ifnextMac#1#2{% \@ifnextchar^^M{#1}{#2}}} % \division{Storing and restoring the meanings of \CSs} % % First a~Boolean switch of globalness of assignments and % its verifier. \newif\ifgmu@SMglobal \pdef\SMglobal{\gmu@SMglobaltrue} % The subsequent commands are defined in such a~way that you can % `prefix' them with |\SMglobal| to get global (re)storing. % \stanza % A~command to store the current meaning of a~\CS in another macro to % temporarily redefine the \CS and be able to set its original meaning % back (when grouping is not recommended): % %\Define\StoreMacro %\changes{v0.61}{06/09/05}{added.} %\changes{v0.67}{06/10/11}{enriched with \cs{makeatletter}} \pdef\StoreMacro{% \begingroup\makeatletter\gm@ifstar\egStore@MacroSt\egStore@Macro} % The unstarred version takes a~\CS and the starred version % a~text, which is intended for special control sequences. For storing % environments there is a~special command in line \ref{StoreEnvironment}. \long\def\egStore@Macro#1{\endgroup\Store@Macro{#1}} \long\def\egStore@MacroSt#1{\endgroup\Store@MacroSt{#1}} \long\def\Store@Macro#1{% \escapechar92 \ifgmu@SMglobal\afterfi\global\fi \@xa\let\csname /gmu/store\string#1\endcsname#1% \global\gmu@SMglobalfalse} \long\def\Store@MacroSt#1{% \edef\gmu@smtempa{% \ifgmu@SMglobal\global\fi \@nx\let\@xa\@nx\csname/gmu/store\bslash#1\endcsname%\label{SMbslash} % we add backslash because to ensure compatibility between % \incs{(Re)StoreMacro} and \incs{(Re)StoreMacro*}, that is. to allow % writing e.g. \inverb|\StoreMacro\kitten| and then % \inverb|\RestoreMacro*{kitten}| to restore the meaning of % \incs{kitten}.\ilrr \@xa\@nx\csname#1\endcsname} \gmu@smtempa \global\gmu@SMglobalfalse}% we wish the globality to be just % once.\par % We make the |\StoreMacro| command a~three-step to allow usage of the % most inner macro also in the next command. % % The starred version, |\StoreMacro*| works with csnames (without the % backslash). It's first used to store the meanings of robust % commands, when you may need to store not only |\foo|, but also % |\csname foo \endcsname|. % % % The next command iterates over a~list of \CSs and stores each of % them. The \CS'es may be separated with commas but they don't have to. % \Define\StoreMacros \long\pdef\StoreMacros{\begingroup\makeatletter\Store@Macros} \long\def\Store@Macros#1{\endgroup \gmu@setsetSMglobal \let\gml@StoreCS\Store@Macro \gml@storemacros#1.} % \label{InnerStore} \def\gmu@setsetSMglobal{% \ifgmu@SMglobal \let\gmu@setSMglobal\gmu@SMglobaltrue \else \let\gmu@setSMglobal\gmu@SMglobalfalse \fi} % And the inner iterating macro: \long\def\gml@storemacros#1{% \def\gmu@reserveda{\@nx#1}% My \TeX\ Guru's trick to deal with |\fi| % and such, i.e., to hide |#1| from \TeX\ when it is processing a~test's % branch without expanding. \if\gmu@reserveda.% a~dot finishes storing. \global\gmu@SMglobalfalse \else \if\gmu@reserveda,% The list this macro is put before may % contain commas and that's O.K., we just continue the work. \afterfifi\gml@storemacros \else% what is else this shall be stored. \gml@StoreCS{#1}% we use a~particular \CS to may |\let| it both to % the storing macro as above and to the restoring one as % \gmiflink[letRestore]{below}. \afterfifi{\gmu@setSMglobal\gml@storemacros}% \fi \fi} % And for the restoring %\Define\RestoreMacro %\changes{v0.61}{06/09/05}{added.} %\changes{v0.67}{06/10/11}{enriched with \cs{makeatletter}} \pdef\RestoreMacro{% \begingroup\makeatletter\gm@ifstar\egRestore@MacroSt\egRestore@Macro} \long\def\egRestore@Macro#1{\endgroup\Restore@Macro{#1}} \long\def\egRestore@MacroSt#1{\endgroup\Restore@MacroSt{#1}} \long\def\Restore@Macro#1{% \escapechar92 \gmu@ifstored#1{% \ifgmu@SMglobal\afterfi\global\fi \@xa\let\@xa#1\csname /gmu/store\string#1\endcsname \global\gmu@SMglobalfalse}% {\unless\ifgmu@quiet \PackageWarning{gmutils}{\@nx#1 is not stored, I do nothing with it}% \fi }% } \long\def\gmu@ifstored#1#2#3{% \gm@ifundefined{/gmu/store% \if\relax\@nx#1\else\bslash\fi \string#1}{#3}{#2}% } \long\pdef\gmu@storeifnotyet#1{% \if\relax\@nx#1% we check if it's a~\CS \gmu@ifstored{#1}{}{\StoreMacro#1}% \fi} \long\def\Restore@MacroSt#1{% \gm@ifundefined{/gmu/store\bslash#1}% {\unless\ifgmu@quiet \PackageWarning{gmutils}{\bslash#1 is not stored. I~do nothing}% \fi}% {\edef\gmu@smtempa{% \ifgmu@SMglobal\global\fi \@nx\let\@xa\@nx\csname#1\endcsname \@xa\@nx\csname/gmu/store\bslash#1\endcsname}% cf. the commentary % in line \ref{SMbslash}. \gmu@smtempa}% \global\gmu@SMglobalfalse} % \Define\RestoreMacros \long\pdef\RestoreMacros{\begingroup\makeatletter\Restore@Macros} \long\def\Restore@Macros#1{\endgroup \gmu@setsetSMglobal \let\gml@StoreCS\Restore@Macro% \gmhypertarget[letRestore]{we} % direct the core \CS towards restoring and call the same iterating % macro as in line \ref{InnerStore}. \gml@storemacros#1.} % As you see, the |\RestoreMacros| command uses the same iterating % macro inside, it only changes the meaning of the core macro. % And to restore \emph{and} use immediately: %\changes{v0.67}{06/10/11}{enriched with \cs{makeatletter}} \def\StoredMacro{\begingroup\makeatletter\Stored@Macro} \long\def\Stored@Macro#1{\endgroup\Restore@Macro#1#1} % To be able to call a~stored \CS without restoring it. \def\storedcsname#1{%% \changes{v0.88}{2008/08/03}{added} \csname /gmu/store\bslash#1\endcsname} % 2008/08/03 we need to store also an environment. \pdef\StoreEnvironment#1{% \label{StoreEnvironment} % \changes{v0.88}{2008/08/03}{added} \StoreMacro*{#1}\StoreMacro*{end#1}} \pdef\RestoreEnvironment#1{% % \changes{v0.88}{2008/08/03}{added} \RestoreMacro*{#1}\RestoreMacro*{end#1}} % It happened (see the definition of |\@docinclude| in \pk{gmdoc.sty}) % that I~needed to |\relax| a~bunch of macros and restore them after % some time. Because the macros were rather numerous and I~wanted the % code more readable, I~wanted to |\do| them. After a~proper defining % of |\do| of course. So here is this proper definition of |\do|, % provided as a~macro (a~declaration). % % \Define\StoringAndRelaxingDo % \changes{v0.59}{06/09/04}{added for storing index-related macros in % \pk{gmdoc}'s \cs{DocInclude}.} % \changes{v0.61}{06/09/05}{renamed from \cs{MacroStoringDo} and the % storing cs's prefix changed from \cs[]{@gml@srs}.} \def\StoringAndRelaxingDo{% \gmu@SMdo@setscope \long\def\do##1{% \gmu@SMdo@scope \@xa\let\csname /gmu/store\string##1\endcsname##1% \gmu@SMdo@scope\let##1\relax}} \def\gmu@SMdo@setscope{% \ifgmu@SMglobal\let\gmu@SMdo@scope\global \else\let\gmu@SMdo@scope\relax \fi \global\gmu@SMglobalfalse} % And here is the counter-definition for restore. % % \Define\RestoringDo % \changes{v0.59}{06/09/04}{added for restoring index-related macros in % \pk{gmdoc}'s \cs{DocInclude}.} % \changes{v0.61}{06/09/05}{renamed from \cs{MacroRestoringDo} and % relaxing of the storing cs removed.} \long\def\RestoringDo{% \gmu@SMdo@setscope \long\def\do##1{% \gmu@SMdo@scope \@xa\let\@xa##1\csname /gmu/store\string##1\endcsname}} % Note that both |\StoringAndRelaxingDo| and |\RestoringDo| are % sensitive to the |\SMglobal| `prefix'. % And to store a~cs as explicitly named cs, i.e. to |\let| one csname % another (|\n@melet| not |\@namelet| because the latter is defined % in Till Tantau's \pk{beamer} class another way) (both arguments % should be text): \long\def\n@melet#1#2{% \edef\gmu@nl@reserveda{% \let\@xa\@nx\csname#1\endcsname \@xa\@nx\csname#2\endcsname}% \gmu@nl@reserveda} % The |\global| prefix doesn't work with |\n@melet| so we define the % alternative. \long\def\gn@melet#1#2{% \edef\gmu@nl@reserveda{% \global\let\@xa\@nx\csname#1\endcsname \@xa\@nx\csname#2\endcsname}% \gmu@nl@reserveda} \long\pdef\envirlet#1#2{% \n@melet{#1}{#2}% \n@melet{end#1}{end#2}% } % ^^A \StoreMacro\ch@ck % ^^A % \label{store:ch@ck} %\division{\cs{DeclareCommand} and \cmd\DeclareEnvironment} % The code of this section is based on the \pk{xparse} % package version 0.17 dated 1999/09/10, the version available in \TeX % Live 2007-13, in Ubuntu packages at least. Originally considered a~stub `im Erwartung' % (Schönberg) for the \LaTeX 3 bundle, it evolved to quite a~nice % tool I~think. % % I~rewrote the ancient \pk{xparse}'s code to use the usual % catcodes (only with |@| a~letter) and not to use the \pk{ldcsetup} % package (which caused an error of % undefined \CS\ |\KV@def|). % Then I~added the |\protected| prefix to the first macro. And I~added % my concept of |S|/|T| arg.\ spec. And of |b| and |B| spec. And the % |Q| argument type. And made \cmd\DeclareEnvironment\ makes the % arguments passed also to the end macro. % % After a~short deliberation I~rename the command to % \cs{DeclareCommand} which is much shorter than original % \cs{DeclareDocumentCommand} and more adequate at least % in my case: I~don't only use this powerful declaration for % ‘document’ commands. % % ^^A % After exchange of some mails with Morten H\o{}gholm and trying % ^^A % \pk{xparse} of 2008/08/03 svn 748 (which beautifully spoils the % ^^A % catcodes) I~wrap the % ^^A % ancient code in a~conditional to avoid name collision if someone % ^^A % loads \pk{xparse} before \pk{gmutils} % % In the args specification you can use: % \begin{itemize} % \item [\texttt{m}] for mandatory argument (braced or not), % \item [\env{O\arg{default}}] for optional argument (in square % brackets) with default value \ (which is passed as |#|\ % 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 |#|\. You can check it with % \possfil |\If›[No›]Value›(T⁄|F⁄|TF›){\#⁄}|, % \item [\texttt{s}] for optional star (if star is present, it becomes % respective |#|\, or else |\NoValue| is at the |#|\ (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 \ and % returns it on |#|\ 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 |#|\. 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 \; for the fundamental usage see line % \ref{Q-type}. More clearly, an argument specified with % |Q|\arg{tokens} is a~word over the alphabet % \${}\cup{\tt\visiblespace}$ where {\tt\visiblespace} % is ignored and shall not be passed in the respective \hash{\}. % % \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 |#|\ 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 \. % % \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 % |#|\. 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 \. The default \ 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, \ 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 |>›[{›]⁄›[}›]| % 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|{#⁄}|\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@|\ 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 % |#|\ and can test their presence and absence with % |\If›[No›]Value›(T⁄|F⁄|TF›){#⁄}| and if the argument was specified % with the |>P| prefix (allows |\par| in itself), you can test it % with |\IfLong{#⁄}|\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{\}'s) as the begin definition. Note however that there % is only one % specification of the arguments and both begin and end have to have 9 % parameters in total at most. % % \end{enumargs} % % \unless\ifdefined\@temptokenb \newtoks\@temptokenb \fi \newif\if@dc@alllong@ % for an option of all arguments long. \newif\if@dc@quiet@ % for suppressing the message of using of % declared command. \newif\IfDCMessages % a~global switch to suppress the message about % parsing. \def\@dc@long@yes{P} \newtoks\@dc@arguments \newcount\@dc@catchernum \newcount\@dc@argnum \newif\if@dc@ignore % \UnPdef \long\pdef\DeclareCommand#1#2#3{% ^^B It's the draft version just % ^^B~to declare the true one, which is defined in line \ref{DC:final}. % \begin{enumargs} % \item command to be defined, % \item arguments specification, % \item definition body. % \end{enumargs} % \chgs[\DeclareCommand]{2008/12/05 v0.98 added the \env{S}/\env{T} spec parsing, the % \env{s} spec parsing rewritten to be a~shorthand for % \env{S\{*\}}, unused code removed} % \@dc@catchernum\z@ \@dc@argnum\z@ \toks@{}% in this register we will store the created sequence of % argument catchers. % ^^A Later, in the working declared command, % ^^A % \incs{toks@} bears \inverb|{#1}{#2}{#3}…|. \@temptokena\toks@ % in this register we will store the sequence of \inverb|#1#2…|. \@temptokenb\toks@ % in this register we will store the sequences of % \inverb|m|'s. % ^^A \@temptokenc\toks@ % this register will bear the sequence of tests % ^^A % for `longness' of arguments. \emptify\@dc@long@ \@dc@ignorefalse \@dc#2X% |X| is the sentinel of parsing. \protected\edef#1{% \@nx\@dc@ {\the\toks@}% \@xa\@nx\csname\string#1\endcsname \@nx #1% }% \edef\gmu@reserveda{% \long\def\@xa\@nx\csname\string#1\endcsname \the\@temptokena{% % ^^A \the\@temptokenc \unexpanded{#3}}}% \gmu@reserveda}% of the ‘draft’ |\DeclareCommand|. \long\def\@dc@ #1% the argument catchers in a~pair of braces (their arguments % may contain \incmd\par\ so the macro is long). #2% |\\thecommand| #3% |\thecommand| {% \ifx\protect\@typeset@protect \@xa\@firstofone \else \protect#3\@xa\@gobble \fi {\@dc@arguments{#2}#1\the\@dc@arguments}} \def\@dc#1{% The main parsing macro. \ifx#1X% if we meet the sentinel we stop. Note there may be some % \inverb|m|'s in \incs{@temptokenb} and we might not to care about % them since % they denote mandatory arguments and as such they will % be grabbed by \nlperc|\\⁄|. However, if any of them % contains \incs{par} (while it shouldn't), then it wouldn't be % noticed since \inverb|\\⁄| 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›]⁄|. \@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@\@}. }% of |\edef|. \gmu@tempa \advance\@tempcnta1\relax }% of the loop. % The loop above defines 8 pairs of macros as we see thanks to the % code below: \if 1 1 \@tempcnta\@ne \@whilenum\@tempcnta<9\do{% \edef\gmu@ms{\romannumeral\numexpr\@tempcnta*1000}% \typeout{\bslash ArgumentCatcher@\gmu@ms:% ^^J\@xa\meaning\csname ArgumentCatcher@\gmu@ms\endcsname}% \typeout{\bslash ArgumentCatcher@\gmu@ms @:% ^^J\@xa\meaning\csname ArgumentCatcher@\gmu@ms @\endcsname}% \advance\@tempcnta\@ne } \fi % The code above produces on the terminal: %\begin{verbatim} % \ArgumentCatcher@m: % macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@m@ % \ArgumentCatcher@m@: % macro:#1->\addto@hook \@dc@arguments {{#1}}\@dc@parse@next \@dc@arguments % \ArgumentCatcher@mm: % macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mm@ % \ArgumentCatcher@mm@: % macro:#1#2->\addto@hook \@dc@arguments {{#1}{#2}}\@dc@parse@next \@dc@arguments % \ArgumentCatcher@mmm: % macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmm@ % \ArgumentCatcher@mmm@: % macro:#1#2#3->\addto@hook \@dc@arguments {{#1}{#2}{#3}}\@dc@parse@next \@dc@arguments % \ArgumentCatcher@mmmm: % macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmm@ % \ArgumentCatcher@mmmm@: % macro:#1#2#3#4->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}}\@dc@parse@next \@dc@arguments % \ArgumentCatcher@mmmmm: % macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmmm@ % \ArgumentCatcher@mmmmm@: % macro:#1#2#3#4#5->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}{#5}}\@dc@parse@next \to % ks@ % \ArgumentCatcher@mmmmmm: % macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmmmm@ % \ArgumentCatcher@mmmmmm@: % macro:#1#2#3#4#5#6->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}{#5}{#6}}\@dc@parse@ne % xt \@dc@arguments % \ArgumentCatcher@mmmmmmm: % macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmmmmm@ % \ArgumentCatcher@mmmmmmm@: % macro:#1#2#3#4#5#6#7->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}{#5}{#6}{#7}}\@dc@pa % rse@next \@dc@arguments % \ArgumentCatcher@mmmmmmmm: % macro:#1\@dc@arguments ->\def \@dc@parse@next {#1}\ArgumentCatcher@mmmmmmmm@ % \ArgumentCatcher@mmmmmmmm@: % macro:#1#2#3#4#5#6#7#8->\addto@hook \@dc@arguments {{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}\@ % dc@parse@next \@dc@arguments %\end{verbatim} \def\ArgumentCatcher@mmmmmmmmm\the\@dc@arguments #1#2#3#4#5#6#7#8#9{% yes, it has to be % delimited (well, actually: started) by \inverb|\the\@dc@arguments| not % only \incs{@dc@arguments}. And it doesn't need to be long and launch inner % short macro because there's nothing more to catch. \@dc@addargum{% {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}\the\@dc@arguments} \long\def\ArgumentCatcher@Pm#1\@dc@arguments#2{% catcher of a~long mandatory. \@dc@addargum{{#2}}#1\@dc@arguments} \long\def\ArgumentCatcher@K % a~Knuthian delimited or undelimited % arguments parsed and passed to the command's body in a~digest % (Knuthian replacement) #1% the particular Knuthian macro #2% the tail of args parser. \@dc@arguments % tail delimiter {\def\@dc@parse@next{#2}#1} \let\ArgumentCatcher@PK\ArgumentCatcher@K \long\def\gmu@twostring#1#2{\string#1\string#2} \long\def\ArgumentCatcher@G % general catcher #1% left and right delimiter #2% default value #3% the tail of args parser. \@dc@arguments % tail delimiter {% \edef\@dc@Gname{ArgumentCatcher@G\gmu@twostring#1}% \unless\ifcsname \@dc@Gname \endcsname \@xa\def\csname \@dc@Gname\@xa\endcsname \@dc@Gparams#1{\@dc@addargum{{##2}}##1\@dc@arguments}% \fi \@xa\@ifnextchar\@firstoftwo#1% {\def\dc@parse@next{#3}% we hide possible |\par|s. \csname\@dc@Gname\endcsname\dc@parse@next}% {\@dc@addargum{{#2}}#3\@dc@arguments}% } \long\def\ArgumentCatcher@PG % general catcher #1% left and right delimiter #2% default value #3% the tail of args parser. \@dc@arguments % tail delimiter {% \edef\@dc@Gname{ArgumentCatcher@PG\gmu@twostring#1}% \unless\ifcsname \@dc@Gname \endcsname \long\@xa\def\csname \@dc@Gname\@xa\endcsname \@dc@Gparams#1{\@dc@addargum{{##2}}##1\@dc@arguments}% \fi \@xa\@ifnextchar\@firstoftwo#1% {\csname\@dc@Gname\endcsname{#3}}% {\@dc@addargum{{#2}}#3\@dc@arguments}% } \long\def\@dc@Gparams#1#2{##1#1##2#2}% expands to parameters string % with \inhash1 delimited with first argument and \inhash2 delimited % with second. In fact it's intended to pass \inhash1 further (it will % always be braced) and to catch an argument put in a~pair of tokens % given \incmd\@dc@Gparams\ as the arguments. \long\def\ArgumentCatcher@A{\ArgumentCatcher@G{<>}} \long\def\ArgumentCatcher@PA{\ArgumentCatcher@PG{<>}} \long\def\ArgumentCatcher@a{\ArgumentCatcher@G{<>}{\NoValue}} \long\def\ArgumentCatcher@Pa{\ArgumentCatcher@PG{<>}{\NoValue}} \def\NoValue{-NoValue-} \long\def\IfNoValueTF#1{% % \chgs{2008/12/1 v0.98 the \pk{xparse} tests for % the presence of value redefined and much simplified (43 \CS'es % less). Moreover, they are now fully expandable: \cmd\IfNoValueTF, % \cmd\IfNoValueT, \cmd\IfNoValueF, \cmd\IfValueTF, \cmd\IfValueT, % \cmd\IfValueF} % \@xa\ifx\@firstofmany#1\@empty\@@nil\NoValue \afterfi\@firstoftwo \else\afterfi\@secondoftwo \fi} \long\def\IfNoValueT#1#2{\IfNoValueTF{#1}{#2}\@empty} \long\def\IfNoValueF#1#2{\IfNoValueTF{#1}\@empty{#2}} \long\def\IfValueTF#1#2#3{\IfNoValueTF{#1}{#3}{#2}} \long\def\PutIfValue#1{\IfValueT{#1}{#1}} % \Define\IfValueT \let\IfValueT\IfNoValueF % \Define\IfValueF \let\IfValueF\IfNoValueT \long\pdef\IfLong#1{%\ % \begin{enumargs} % \item the argument to check for |\par|, % \item what if |\par| found, % \item what if |\par| not found. % \end{enumargs} % \edef\gmu@reserveda{\detokenize{#1}}% \edef\gmu@reserveda{% \IfAmong\string\par\@nx\among{\gmu@reserveda}}% \gmu@reserveda} % |\afterassignment| pseudo-argument \long\@namedef{ArgumentCatcher@\detokenize{\afterassignment}}% #1% register used in the assignment #2% the tail of args parser. \@dc@arguments{% \def\@dc@parse@next{% \@dc@addargum\NoValue % to make ignoring mechanism work #2\@dc@arguments}% \afterassignment\@dc@parse@next #1}% optional space and |=| is left at user's discretion. In fact, % \inhash1 may be empty and then each % time our command is used the left side of the assignment has to % be given explicitly and may even be different each time. \n@melet{ArgumentCatcher@P\detokenize{\afterassignment}} {ArgumentCatcher@\detokenize{\afterassignment}} % |\gobblespace| pseudo-argument: useful between optional and % Knuthian-type arguments and after all parsing. Equivalent % |>iT{\somedummymacro}|. At first I wanted mark it |\ignorespaces| % but the gobbling doesn't expand macros: it doesnt't use % |\ignorespaces| but |\@ifnextchar|'s space trick. \long\@namedef{ArgumentCatcher@\detokenize{\gobblespace}}% {\ArgumentCatcher@S{\dc@gobblespace@dummy}{\NoValue}} \n@melet{ArgumentCatcher@P\detokenize{\gobblespace}} {ArgumentCatcher@\detokenize{\gobblespace}} \def\dc@gobblespace@dummy{\dc@gobblespace@dummy} \let\gobblespace\dc@gobblespace@dummy % end of catchers' definitions \DeclareCommand\DeclareCommand % This is the final version by now.\ % Note we introduce the ‘prefixes’ at the \inhash2 position only at \ % this point so we have yet to prefix every argument specifier\ % separately. Note also we only here ‘teach’ |\DeclareCommand| to % pass the name of its main argument in the |\dc@bsname| macro. {>Pm % (1) command to be defined (may be \incs{par} if you % really wish), Q{\global\protected\outer\long!lL.qQiIwW\sphack\envhack}%\ % \label{Q-type} % (2) an optional % se\textbf Quence of \eTeX's prefixes and/or |!| or |l| or |L| % for ‘all % long’ and/or |.| or |q| or % |Q| for `quiet' (message about calling the command is % suppressed) and/or % |i| or |I| as ‘invisible’ or |W| or |w| as % ‘white’ or |\sphack| to make the command ‘invisible’ in % the leading with the \incs{@bsphack}…\incs{@esphack}\qfootnote{To % deal with an ‘invisible’ environment, there is one more % acceptable value of this argument: \cmd\envhack, which % suppresses placing \cs{@bsphack}---\cs{@esphack} and places % \cs{@ignoretrue} instead in the end macro.}, >Pm % (3) arguments specification (may contain \incmd\par), >Pm % (4) the definition body; may contain nearly anything including % \incmd\par\ and tests for presence/absence of arguments % \nlperc|\If›[No›]Value›(T⁄|F⁄|TF›)| and for their longness \incmd\IfLong; % you refer to the arguments with \inverb|#|\. }{% \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 \)} % % ^^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|\⁄@K⁄| \@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|#|\---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|\ macro to be % \[|\expandafter\\end⁄\\⁄(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{⁄}{⁄}|\] and % \[|\@ifedetokens{⁄}{⁄}|\] 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 % \ 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 \ % in \TeXbook. So I~repeat it here. The inner |\meta| macro is % copied verbatim from \pk{doc}'s v2.1b documentation dated 2004/02/09 % because it's so beautifully crafted I~couldn't resist. I~only don't % make it |\long|. % \dekmedskip % % \begin{quotation} % The new implementation fixes this problem by defining % |\meta| in a radically different way: we prevent hyphenation by defining a |\language| % which has no patterns associated with it and use this to typeset the words within % the angle brackets. % \end{quotation} %^^A~\DefIndex\l@nohyphenation %^^A~\ifx\l@nohyphenation\undefined %^^A~ \newlanguage\l@nohyphenation %^^A~\fi \pdef\meta#1{% % \begin{quotation} % Since the old implementation of |\meta| could be used in math we better ensure % that this is possible with the new one as well. So we use |\ensuremath| around % |\langle| and |\rangle|. However this is not enough: if |\meta@font@select| below % expands to |\itshape| it will fail if used in math mode. For this reason we hide % the whole thing inside an |\nfss@text| box in that case. % \end{quotation} {\meta@fontsetting\ensuremath\langle}% \ifmmode\@xa\nfss@text\fi {% this has to be a~begin-group because \incmd{\nfss@text} becomes % \incmd\hbox\ in math mode. \gmu@activespaceblank \meta@font@select % Need to keep track of what we changed just in case the user changes font inside % the argument so we store the font explicitly. % ^^A~% \DefIndex\meta@hyphen@restore % ^^A \edef\meta@hyphen@restore{% % ^^A \hyphenchar\the\font\the\hyphenchar\font}% % ^^A \hyphenchar\font\m@ne % ^^A \language\l@nohyphenation #1\/% % ^^A~ \meta@hyphen@restore }% {\meta@fontsetting\ensuremath\rangle}% }% of |\meta|. \pdef\gmu@activespaceblank{% \@xa\def\gmu@activespace{\space\ignorespaces}% note the % subtle perversity of this definition: if we meet more than one % subsequent active spaces, then the first of them will % typeset \incmd\space and its \incmd\ignorespaces\ will % gobble \incmd\space\ of the second and will stop at % \incs{ignorespaces} and this \incs{ignorespaces} will gobble % the next \incs{space} and so on. } \def\meta@fontsetting{\color{red!50!black}} \def\meta@font@select{\meta@fontsetting\it} % \changes {v0.76}{06/9/21}{\cs{itshape} changed to an explicit and % violent \cs{it} to work as expected in \cs{cs}'s argument} % But I~define |\meta@font@select| as the brutal and explicit |\it| % instead of the original |\itshape| to make it usable e.g.\ in the % \pk{gmdoc}'s |\cs| macro's argument. % The below |\meta|'s drag\qfootnote{Think of the drags that transform % a~very nice but rather standard `auntie' (`Tante' in Deutsch) into % \balsmiley( a~most adorable Queen ;-)\,.} is a~version of % \TeXbook's one. \Define*[\<⁄kern⁄string-3pt›…>]{\<›…>} \def\<#1>{\meta{#1}} \pdef\metachar#1{\begingroup\metacharfont #1\endgroup} \def\metacharfont{\meta@fontsetting\rm} % ^^A\gmshowlists % \division{Macros for printing macros and filenames} % % First let's define three auxiliary macros analogous to |\dywiz| from % \pk{polski.sty}: a~shorthands for |\discretionary| that'll stick to % the word not spoiling its hyphenability and that'll won't allow % a~line break just before nor just after themselves. The % |\discretionary| \TeX\ primitive has three arguments: |#1| `before % break', |#2| `after break', |#3| `without break', remember? % \Define\discre \Define\discret \pdef\discre#1#2#3{\leavevmode\kern0sp% \discretionary{#1}{#2}{#3}\penalty10000\hskip0sp\relax} \pdef\discret#1{\discre{#1}{#1}{#1}} % A~tiny little macro that acts like |\-| outside the math mode and % has its original meaning inside math. \def\:{% \ifmmode\afterfi{\mskip\medmuskip}% \else\afterfi{\discre{\null}{}{}}% \incs{null} to get % \incs{hyphenpenalty} not \incs{exhyphenpenalty}. \fi} \let\gmu@discretionaryhyphen\- % for the cases when we don't redefine % \incs\- but use \incs\UrlFix \DeclareCommand\bihyphen{O{*}}{% a~redefinition of |\-| that makes it % optional-argument to allow further hyphenation \DeclareCommand\gmu@discretionaryhyphen{T{#1}ca}{% \IfValueT{##2}{% \@ifempty{##2}{}{% \def\gmu@bihyphen@char{##2}}% }% \IfValueT{##3}{% \@ifempty{##3}{}{% \def\gmu@bihyphen@corr{##3}}% }% \IfValueTF{##1}\discre\discretionary {% before break \IfValueTF{##2}{% \@ifempty{##2}{\gmu@bihyphen@char}{##2}% }{% \ifnum\hyphenchar\font>\z@ \char\hyphenchar\font \fi}}% end of before break {%after break \IfValueT{##3}{% \@ifempty{##3}{\gmu@bihyphen@corr}{##3}% }% }% {% without break }% almost as in \TB: unlike \TB, we allow hyphenchars % $\ge255$ as we are \XeTeX. }% of |\DeclareCommand\-| \gmu@storeifnotyet\-% original |\-| is a~\TeX's % primitive, therefore we should store it. \let\-\gmu@discretionaryhyphen \let\@dischyph\gmu@discretionaryhyphen % to override \pk{framed.sty} }% of |\bihyphen| \relaxen\gmu@bihyphen@corr \pdef\vs{\discre{\visiblespace}{}{\visiblespace}} % Then we define a~macro that makes the spaces visible even if used in % an argument (i.e., in a~situation where re|\catcode|ing has no % effect). % \def\printspaces#1{{\let~=\vs \let\ =\vs \gm@pswords#1 \@@nil}} % \DefIndex\gm@pswords \def\gm@pswords#1 #2\@@nil{% \ifx\relax#1\relax\else#1\fi \ifx\relax#2\relax\else\vs\penalty\hyphenpenalty\gm@pswords#2\@@nil\fi}% note % that in the recursive call of \incs{gm@pswords} the argument string is % not extended with a~sentinel space: it has been already by % \incs{printspaces}.\ilrr \pdef\sfname#1{\textsf{\printspaces{#1}}} \def\gmu@discretionaryslash{\discre{/}{\hbox{}}{/}}% the second % pseudo-argument nonempty to get % \incs{hyphenpenalty} not \incs{exhyphenpenalty}.\ilrr \pdef\file#1{\gmu@printslashes#1/\gmu@printslashes} \def\gmu@printslashes#1/#2\gmu@printslashes{% \sfname{#1}% \ifx\gmu@printslashes#2\gmu@printslashes \else \textsf{\gmu@discretionaryslash}% \afterfi{\gmu@printslashes#2\gmu@printslashes}\fi} % it allows the spaces in the filenames (and prints % them as \vs). % The macro defined below I~use to format the packages' names. \pdef\pk#1{\textsf{#1}} % \changes{v0.96}{2008/11/13}{\cs{textup} removed to allow slanting % the name in titles (that are usually typeset in Italic font)} % Some (if not all) of the below macros are copied from \pk{doc} % and/or \pk{ltxdoc}. % % A~macro for printing control sequences in arguments of % a~macro. Robust to avoid writing an explicit |\| into a~file. It % calls |\ttfamily| not |\tt| to be usable in headings which are % boldface sometimes. % % \DeclareCommand\cs{O{\type@bslash\penalty\@M\hskip\z@skip}}{%\ % \begin{enumargs} % \dc O{\bslash} the control sequence's prefix, by default it's % \inverb|\| allowing hyphenation of subsequent word, % \dc m the control sequence or anything to be typeset in % typewriter font. % ^^A this argument is long to allow \inverb|\cmd\par| % ^^A % that expands to |\cs{\string\par}| or so. % \end{enumargs} % \chgs{2008/12/12 v0.98 added \cs{verbatim@specials}} % \chgs{2008/12/12 v0.98 made \cmd\- switch to \cmd\normalfont\ % because \IMHO\ this underlines the fact that a~\CS\ belongs to the % narrative. \cmd\hyphenchar\ set to 45 as in usual texts} \begingroup \ifdefined\verbatim@specials\verbatim@specials\fi \edef\-{\discretionary{% \ifdefined\gmv@hyphen\gmv@hyphen \else\unexpanded{{\normalfont-}}% \fi}{}{}}% \def\{{\type@lbrace\yeshy}\def\}{\char`\}}% \narrativett \edef\narrativett@storedhyphenchar{\the\hyphenchar\font}% \hyphenchar\font=\ifdefined\gmv@hyphenchar\gmv@hyphenchar \else "A6 \fi \cs@inner{#1}} \pdef\cs@inner#1#2{% #1#2% \hyphenchar\font=\narrativett@storedhyphenchar\relax \endgroup} \def\narrativett{\ttfamily}% such name because I~introduce it to % distinguish the narrative verbatims from the code in \pk{gmdoc}. \long\pdef\env{\cs[]} % \changes{v0.66}{06/09/29}{the braces removed} % And for the special sequences like |^^A|:\nostanza \foone{\@makeother\^} {\pdef\hathat{\cs[^^]}} \AtBeginDocument{% \@ifpackageloaded{gmdoc}{\def\hash{\cs[\#]}}{}} % And one for encouraging line breaks e.g., before long verbatim words. \def\possfil{\hfil\penalty1000\hfilneg} \def\possvfil{\vfil \penalty\numexpr \gmu@minnum{\clubpenalty+\widowpenalty}{9999}% %^^A\gmu@maxnum %^^A {\ifnum\widowpenalty<\@M %^^A \gmu@minnum{\widowpenalty+1}{9999}\relax %^^A \else1000% %^^A \fi}% %^^A {\ifnum\clubpenalty<\@M %^^A \gmu@minnum{\clubpenalty+1}{9999}\relax %^^A \else1000% %^^A \fi}% \relax % eaten by |\gmu@maxnum| \relax % eaten by |\numexpr| \vfilneg} \long\def\gmu@extremnum#1#2#3{%\ % \begin{enumargs} % \item inequality sign % \item left side of comparison % \item right side of comparison % \end{enumargs} \@xa\ifx\@firstofmany#3\@@nil\relax % this complicated test is to % allow arguments beginning with some \incs{if⁄<…>} as in % \incs{possvfil} e.g. \@xa\@firstoftwo \else\@xa\@secondoftwo \fi {#2}% {% \ifnum\numexpr#2\relax#1\numexpr#3\relax \@xa\@firstoftwo \else\@xa\@secondoftwo \fi {\gmu@extremnum#1{#2}}% {\gmu@extremnum#1{#3}}% }% } \def\gmu@maxnum{\gmu@extremnum>} \def\gmu@minnum{\gmu@extremnum<} % \division{Typesetting arguments and commands} % % We define a~conditional and iterating command \TextUsage\arg\ that % in math mode does what it used to do was in math and outside math it % typesets mandatory, optional and picture (parenthesed) and angled % arguments and optional stars. You can % write \[|\arg[gefilte]*(mit){baigele}|\] to get % \[\hbox{\arg[gefilte]*{fisz}(mit){bajgele}}\] % or even % \[|\verb+\MoltoAdagio⁄⁄arg*{Dankgesang}[die Gottheit]+|\] % (where |⁄⁄| is the escape char in verbatims) to % get \[|\MoltoAdagio⁄arg*{Dankgesang}[die Gottheit]|\] (in % der lydischen Tonart). % % For more complicated arguments configurations consider using % \pk{gmdoc}'s environment \env{enumargs}. % \stanza % The five macros below are taken from the \pk{ltxdoc.dtx}. % % \begin{quotation}|\cmd{\foo}| Prints |\foo| verbatim. It may be used inside moving % arguments. |\cs{foo}| also prints |\foo|, for those who prefer that % syntax. (This second form may even be used when |\foo| is % |\outer|).\end{quotation} % \long\def\cmd#1{\@xa\cs\@xa{\@xa\cmd@to@cs\string#1}}% it has to be % un\incs{protected}! It has so many \incmd\expandafter s to allow % \inverb|\cmd\par| and still keep the \incmd\cs\ command ‘short’. \def\cmd@to@cs#1#2{\char\number`#2\relax} % \nostanza It can be short since it never gets actual control % sequence as an argument only a~string of ‘other’ tokens (and maybe spaces). % |\marg{text}| prints \marg{text}, `mandatory argument'. % \Define\marg \pdef\marg#1{{\narrativett\type@lbrace}\meta{#1}{\narrativett\char`\}}} % |\oarg{text}| prints \oarg{text}, `optional argument'. % Also |\oarg[text]| does that. % \HideAllDefining % \Define\oarg \pdef\oarg{\@ifnextchar[\@oargsq\@oarg} %^^A] \pdef\@oarg#1{{\narrativett[}\meta{#1}{\narrativett]}} \pdef\@oargsq[#1]{\@oarg{#1}} % |\parg{te,xt}| prints \parg{te,xt}, `picture mode argument'. % \Define\parg \pdef\parg{\@ifnextchar(\@pargp\@parg} %^^A) \def\@parg#1{{\narrativett(}\meta{#1}{\narrativett)}} \def\@pargp(#1){\@parg{#1}} \pdef\aarg{\@ifnextchar<\@aarga\@aarg} \def\@aarg#1{{\narrativett<}\meta{#1}{\narrativett>}} \def\@aarga<#1>{\@aarg{#1}} \def\@verbaarga#1#2>{\@aarg{#2}\arg@dc} \foone{\catcode`>\active}{% \def\@verbaargact#1#2>{\@aarg{#2}\arg@dc}% } \foone{\@makeother\{\@makeother\}% \catcode`[=\@ne\catcode`]=\tw@} [% ^^A{ \def\@verbmargm#1#2}[% for an argument in curly braces in a verbatim, where % the braces are not groupers and not necessary ‘other’. We'll know % by \incmd{\@ifnextif} that the future token is an opening % brace. Note this macro has 2nd parameter delimited with ‘other’ % closing brace (so may not act correctly when braces are nested % (then hide them with special verbatim groupers)). \marg[#2]% \arg@dc ]% ]% of |\foone| % \ResumeAllDefining \DeclareCommand\arg@dc!{% % \chgs{200/03/04 v0.991 added rcognising of verbatim braces and % angles} s % (1) o % (2) c % (3) b % (4) a % (5) S{\arg} % (6) just gobbled (for backwards compatibility) }{% This command iterates while it % has arguments and typesets them in brackets, parentheses or curly % braces. Note it gobbles subsequent |\arg|s and just iterates. \def\next{0}% \IfValueT{#1}% {\metachar[\scanverb{*}\metachar]\def\next{1}}% \IfValueT{#2}{\@oarg{#2}\def\next{1}}% \IfValueT{#3}{\@parg{#3}\def\next{1}}% \IfValueT{#4}{\marg{#4}\def\next{1}}% \IfValueT{#5}{\aarg{#5}\def\next{1}}% \@ifnextchar\egroup{\endgroup}{% \if1\next\@xa\arg@dc \else % it's crucial that we look for verbatim braces \emph{after} % we checked there were no \inhash4, otherwise there would % be an error. \def\next{% \@ifnextif\xiilbrace{\@verbmargm}% {% not active or other lbrace \@ifnextif<{% then we look for angles \ifnum\catcode`>=\active \@xa\@verbaargact \else\@xa\@verbaarga \fi}% {% and if not angles neither verbatim braces, then \endgroup % if we have no more arguments to typeset, we % close the group opened in line \ref{queer.group} }% }% }% \@xa \next \fi }% of not egroup }% of |\arg@dc| % Now define the front-end macro of the |\arg| command:\nostanza \foone{\obeylines}{% \AtBeginDocument{% \let\math@arg\arg % \pdef\arg{\ifmmode\math@arg % % \chgs{200/03/04 v0.991 added rcognising of verbatim braces and angles} \else\afterfi{% \begingroup % % \label{queer.group} \ifdefined\@ifQueerEOL\@ifQueerEOL{% \def^^M{\unskip\space}% in the ‘queer’ \ac{EOL}s scope we % keep line end active in case we have % \incmd\arg\nlpercent\arg{arg.} ending a~line: the next % char peeper touches line end or, if the line end was $_5$, % gobbles the space it turns into so the comment layer would % ‘leak’ to the code layer. }{}\fi % \arg@dc}% \fi}% of |\arg|, }% of |\AtBeginDocument|, }% of |\foone|. % \chgs{2008/12/07 v0.98 made iterating thanks to \cmd\DeclareCommand\cs{arg@dc}} % Now you can write %\begin{verse} % |\arg{mand.\ arg} [opt.\ arg] (pict.\ arg)| \\ % to get \arg{mand.\ arg} [opt.\ arg] (pict.\ arg). (Yes, with only one |\arg|!)\\ % And |$\arg(1+i) = \pi/4$| for $\arg(1+i) = \pi/4$. % \end{verse} % \DeclareCommand\cat{Q{'"0123456789ABCDEF}}{% ${}_{\the\numexpr#1}\m@th$\@ifnextcat a\space{}} % \division{Not only preamble!} % Let's remove some commands from the list to erase at begin document! % Primarily that list was intended to save memory not to forbid % anything. Nowadays, when memory is cheap, the list of only-preamble % commands should be rethought \IMHO. % \Define\not@onlypreamble % \changes{v0.79}{2007/04/28}{All the actions are done in a~group and % therefore \cs{xdef} used instead of \cs{edef} because this command % has to use \cs{do} (which is contained in the \cs{@preamblecmds} % list) and \cs{not@onlypreamble} itself should be able to be let to % \cs{do}} \newcommand\not@onlypreamble[1]{{% \def\do##1{\ifx#1##1\else\@nx\do\@nx##1\fi}% \xdef\@preamblecmds{\@preamblecmds}}} \not@onlypreamble\@preamblecmds \not@onlypreamble\@ifpackageloaded \not@onlypreamble\@ifclassloaded \not@onlypreamble\@ifl@aded \not@onlypreamble\@pkgextension % And let's make the message of only preamble command's forbidden use % informative a~bit: \def\gm@notprerr{ can be used only in preamble (\on@line)} \AtBeginDocument{% \def\do#1{\@nx\do\@nx#1}% \edef\@preamblecmds{% \def\@nx\do##1{% \def##1{\@nx\PackageError{gmutils/LaTeX}% {\@nx\string##1 \@nx\gm@notprerr}\@nx\@eha}}% \@preamblecmds}} % A~subtle error raises: the \LaTeX\ standard |\@onlypreamble| and % what |\document| does with |\@preamblecmds| makes any two of `only % preamble' \CS's |\ifx|-identical inside \env{document}. And my % change makes any two \CS's |\ifx|-different. The first it % causes a~problem with is standard \LaTeX's |\nocite| that checks % |\ifx\@onlypreamble\document|. So hoping this is a~rare problem, we % circumvent it. 2008/08/29 a~bug is reported by Edd Barrett that % with \pk{natbib} an `extra \}' error occurs so we wrap the fix in % a~conditional. % % \changes[\nocite]{v0.93}{2008/08/29}{a~bug fixed: with \pk{natbib} % an `extra \}' error. Now it fixes only the standard version of % \cs{nocite}} \def\gmu@nocite@ampulex{% we wrap the stuff in a~macro to hide an open % \incs{if}. And not to make the begin-input hook too large. % \label{ampulexset} the first optional argument is the % parameters string and the second the argument for one-level % expansion of \incs{nocite}. Both hash strings are doubled to pass % the % first \incs{def}. \ampulexdef\nocite[####1][{{####1}}]% note the double brace % around \inhash3. \ifx {\@onlypreamble\document}% \iftrue} \AtBeginDocument{\gmu@nocite@ampulex}% % \division{Third person pronouns} % % Is a~reader of my documentations `she' or 'he' and does it make % a~difference? % % Previous versions of this documentation were consequently % alternating ’he’ and ’she’ and provided specific macros for that % purpose. Now I'm not that queer and gender so I take what is % normally used, ’they’ that is. % % (The issue of human sexes and genders (certainly much more numerous % than 2) is complex and delicate and a \TeX\ macro package is % probably not the best place to discuss it.) % ^^A % Not to favour any gender in the personal pronouns, define % ^^A % commands that'll print alternately masculine and feminine % ^^A % pronoun of third person. By `any' I~mean not only typically % ^^A % masculine and typically feminine but the entire amazingly rich % ^^A % variety of people's genders, \emph{including} those who do not % ^^A % describe themselves as `man' or `woman'. % ^^A % % ^^A % One may say two pronouns % ^^A % is far too little to cover this variety but I~could point Ursula's % ^^A % K.\ LeGuin's \textit{The Left Hand Of Darkness} as another acceptable % ^^A % answer. In that moody and moderate \acro{SF} novel the androgynous % ^^A % persons are usually referred to as `mister', `sir' or `he': the % ^^A % meaning of reference is extended. Such an extension also my % ^^A % automatic pronouns do suggest. It's \emph{not} political % ^^A % correctness, it's just respect to people's diversity. % ^^A % \DefIndex*{gm@PronounGender} % ^^A % \let\do\Define % ^^A % \do\gm@atppron \do\heshe \do\hisher \do\himher \do\hishers % ^^A % \do\HeShe \do\HisHer \do\HimHer \do\HisHers % ^^A \newcounter{gm@PronounGender} ^^A ^^A % ^^A \newcommand*\gm@atppron[2]{% % ^^A % ^^A \stepcounter{gm@PronounGender}% remember |\stepcounter| is global. % ^^A \ifodd\value{gm@PronounGender}#1\else#2\fi} % ^^A \newcommand*\heshe{\gm@atppron{he}{she}} % ^^A \newcommand*\hisher{\gm@atppron{his}{her}} % ^^A \newcommand*\himher{\gm@atppron{him}{her}} % ^^A \newcommand*\hishers{\gm@atppron{his}{hers}} % ^^A \newcommand*\HeShe{\gm@atppron{He}{She}} % ^^A \newcommand*\HisHer{\gm@atppron{His}{Her}} % ^^A \newcommand*\HimHer{\gm@atppron{Him}{Her}} % ^^A \newcommand*\HisHers{\gm@atppron{His}{Hers}} \def\heshe{they} \def\hisher{their} \def\himher{them} \def\hishers{theirs} \def\HeShe{They} \def\HisHer{Their} \def\HimHer{Them} \def\HisHers{Theirs} % \division{Improvements to \pk{mwcls} sectioning commands} % % That is, `Expe-ri-mente'\footnote{A.\ Berg, \textit{Wozzeck}.} mit MW % sectioning \& \cs{refstepcounter} to improve \pk{mwcls}'s cooperation % with \pk{hyperref}. They shouldn't make any harm if another class % (non-\pk{mwcls}) is loaded. % % We |\refstep| sectioning counters even if the sectionings are not % numbered, because otherwise % \begin{enumerate} % \item \pdfTeX\ cried of multiply defined |\label|s, % \item e.g.\ in a~table of contents the hyperlink % || 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{\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 \. \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[⁄]| 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}\ \arg[=] \ \ \ \DeclareCommand\gmathFams{o % the name of math version C{\NoValue} % ‘rescue’ font. Will be accessible via % \inverb|\symgmathRoman⁄| (math family) and % \inverb|\gmath@fontt⁄| (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{}\s and \cs{}\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 \ 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 |\⁄|. % \end{enumargs} % ^^A % \begin{enumargs} % ^^A % \item a~type information macro that expands to |\gobble{⁄«penalty»}|, % ^^A % \item the char, given as |\⁄|. % ^^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 |\⁄|), % \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 \ % if leading is narrower that 3\dekfracc1/2 \, $ 3\dekfracc1/2 × 48$dd, % then hanging letters are allowed, which also applies to 8 and 6 dd % \ in less than 3 \ leading. I~treat this % recommendation not strictly but as an inspiration, that is % I~translate »dd« to »pt«. \def\TrzaskaTilde{% \@xa\DeclareCommand\@xa\gm@smarttilde \@xa{\@xa S\@xa{\all@stars~}}{% \IfValueTF{##1}{\nobreakspace{}}% {\ifdim\dimexpr\hsize-\leftskip-\rightskip -\ifdim\hangindent<\z@-\fi\hangindent % the last % parameter is used with respect to the \pk{floatflt} package. >% \ifdim\f@size pt>\dimexpr10pt-1sp\relax 168dd \else 144dd \fi \nobreakspace {}% \else \ % \fi }% of |\gm@ifstar|'s else, }% of |\gm@smarttilde|, \let~\gm@smarttilde }% of |\TrzaskaTilde|. \pdef\getprevdepth{% \endgraf \xdef\setprevdepth{\prevdepth=\the\prevdepth\relax}% } % \division{Storing the catcode of line end} \def\StoreCatM{% \protected\edef\RestoreCatM{% \catcode`\@nx\^^M=\the\catcode`\^^M\relax}% } \pdef\RestoreCatM{\PackageE{gmutils}{first store the catcode of ^\empty^\empty M with \string\StoreCatM.}% } % \division{A~really empty page} % Copied from Marcin Woliński's macros. % \newcommand{\clearemptydoublepage}{% \newpage{\pagestyle{empty}\cleardoublepage}} \DeclareCommand\setspaceskip{% A{}% optional factor for all three components O{\fontdimen2\font}% >is O{\fontdimen3\font}% >is O{\fontdimen4\font}} {\spaceskip=#1#2plus#1#3minus#1#4\relax} \foone\obeylines{% \def\disobeylines{% for arguments in which line end is active to % simulate normal behaviour \ifnum\catcode`\^^M=\active% \pdef^^M{\@ifnextgroup{\ifhmode\unskip\space\fi}{\gmu@disMinner}}% \def\gmu@disMinner##1{% \ifx^^M##1\endgraf% \else\afterfi{\ifhmode\unskip\space\fi}\fi##1}% \fi}% } %^^A\def\gmu@lowstarfake{*} \def\makestarlow{% \begingroup\lccode`\~=`\*\lowercase{%% \Define** \endgroup\def~{\gmu@lowstar}}% 2009/10/19 |\let| changed to % \inverb|\def| to allow redefinitions of \incmd\gmu@lowstar. \catcode`\*=\active \defLowStarFake } \DeclareCommand\defLowStarFake{% Q{+-0123456789,.}{0,5}% fraction of fontchar depth of the star glyph }% {% \def\gmu@lowstarfake{% \leavevmode\vbox{\hbox{*}\kern#1\fontchardp\font`*}% }% } \def\gmu@lowstarfake{*} % useful for next command where normal star is % low. % The |\*| \CS and active |*| should be defined different to make them % distinguishable by tests, especially with |\gm@ifstar| in % mind. \DeclareCommand\*{Q{0123456789}{1}} % \label{def:gmu@star} {\gmu@star@loop0{#1}} \def\gmu@star@loop#1#2{% this is an expandable loop as in The % \eTeX\ Manual p.~9. \ifnum#1<\numexpr#2\relax% \gmu@lowstar \@xa\gmu@star@loop \@xa{\number\numexpr#1+1\@xa}% \@xa{\number#2\@xa}% \fi} \endinput % % \ChangesGeneral % % \changes{v0.70}{06/10/20}{Package renamed to \pk{gmutils} from % \pk{gmlpatch}. As my \protect\TeX\ Guru remarked rightly, the % previous name might suggest there was sth.\ wrong with \LaTeX\ which % was not my intention} % % \changes{v0.74}{2006/11/28}{Added macros to make sectioning commands % of \pk{mwcls} and standard classes compatible. Now my sectionings % allow two optionals in both worlds and with \pk{mwcls} if there's % only one optional, it's the title to toc and running head not just % to the latter} % % \changes{v0.76}{2007/03/10}{A~`fixing' of \cs{dots} was rolled back % since it came out they were \acro{O.K.} and that was the \acro{QX} encoding that % prints them very tight} % % \changes{v0.77}{2007/04/13}{\cs{afterfi} \& pals made two-argument % as the Marcin Woli\nacute ski's analogoi are. At this occasion some % redundant macros of that family are deleted} % % \changes{v0.78}{2007/04/26}{\cs{@namelet} renamed to \cs{n@melet} % to solve a~conflict with the \pk{beamer} class. The package contents % regrouped} % % \changes{v0.85}{2007/11/16}{fixed behaviour of too clever headings % with \pk{gmdoc} by adding an \cs{ifdim} test} % % \changes{v0.87}{2008/08/03}{the package goes \eTeX\ even more, % making use of \cs{ifdefined} and the code using \acro{UTF-8} chars is % wrapped in a~\XeTeX-condition} % % \changes{v0.89}{2008/08/04}{removed obsolete adjustment of \pk{pgf} % for \XeTeX} % % \changes{v0.91}{2008/08/06}{removed \cs{jobnamewoe} since % \cs{jobname} is always without extension. \cs{xiispace} forked to % \cs{visiblespace} \cs{let} to \cs{xxt@visiblespace} of \pk{xltxtra} % if available. The documentation driver integrated with the \file{.sty} file} % % \changes{v0.93}{2008/08/21}{A~couple of \cs{DeclareRobustCommand*} % changed to \cs{pdef}} % % \changes{v0.93}{2008/08/29}{The numerical macros commented out as % obsolete and never really used} % % \changes{v0.94}{2008/09/08}{\cs{bgroup} and \cs{egroup} in the % macro storing commands and in \cs{foone} changed to \cs{begingroup} % and \cs{endgroup} since the former produce an empty \cs{mathord} in % math mode while the latter don't} % % \changes{v0.94}{2008/10/4}{The code from ancient \pk{xparse} (1999) of \TeX % Live 2007 rewritten here} % % \changes{v0.94}{2008/10/4}{removed \cs{unex@namedef} and % \cs{unex@nameuse}, probably never really used since they were % incomplete: \cs{edef@other} undefined} % % \toCTAN{2008/11/21 v0.96} % % % \PrintChanges\PrintIndex %\NoEOF % (For my GNU Emacs:) %%% Local Variables: %%% mode: doctex %%% coding: utf-8 %%% mode: flyspell %%% ispell-local-dictionary: "british" %%% End: % LocalWords: xedekfraccplain dekfraccsimple doif ifnif sptoken xifnif lowstar % LocalWords: dc oC soC oarg parg Ps LocalWords ifnextgroup xifncat ifncat xaS % LocalWords: ifnextsingle seQuence activespace dofakeonum smarttilde prevdp % LocalWords: reserveda fileext filepart tempswatrue partsw tempswafalse gmu % LocalWords: tempswa filename filepartname partlist mainaux writeckpt nameuse % LocalWords: prependtomacro xefraccdef xefracc mmhbox selectfont cepstnof % LocalWords: reservedb tempd SMglobal smtempa SMglobalfalse MacroSt fontscale % LocalWords: quotedstring getfontdata getfontscale getfontstring fontstring % LocalWords: numeratorkern denominatorkern fracfontsetup maxnum minnum % LocalWords: extremnum firstofmany normalcr tempcnta currfont reservedc % LocalWords: maybestripcomma twocolumn thefnmark makefnmark ATfootnotes % LocalWords: reservedd reservede