diff options
author | Karl Berry <karl@freefriends.org> | 2017-06-05 23:15:19 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-06-05 23:15:19 +0000 |
commit | caef61ed4952aee5804397dbdc93deb54f043a98 (patch) | |
tree | 1e573ee472800ed59f289b3df677b55760cd333a /Master/texmf-dist/tex/latex/bxbase/bxtoolbox.def | |
parent | 2709e0f96ccfa1759997b079880998184fc725cf (diff) |
bxbase (30may17)
git-svn-id: svn://tug.org/texlive/trunk@44481 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/bxbase/bxtoolbox.def')
-rw-r--r-- | Master/texmf-dist/tex/latex/bxbase/bxtoolbox.def | 1078 |
1 files changed, 1078 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/bxbase/bxtoolbox.def b/Master/texmf-dist/tex/latex/bxbase/bxtoolbox.def new file mode 100644 index 00000000000..07dae477f10 --- /dev/null +++ b/Master/texmf-dist/tex/latex/bxbase/bxtoolbox.def @@ -0,0 +1,1078 @@ +%% +%% This is file 'bxtoolbox.def'. +%% + +%% file declaration +\NeedsTeXFormat{LaTeX2e} +\ProvidesFile{bxtoolbox.def}[2017/05/29 v1.1] +\providecommand*\bxtb@pkgname{BXtoolbox}% bundle name + +%% check intergrity +\edef\bxtb@tmpa{\@currname.\@currext}\def\bxtb@tmpb{bxtoolbox.def} +\ifx\bxtb@tmpa\bxtb@tmpb\else + \PackageError\bxtb@pkgname{Illegal load sequence}\@eha +\expandafter\endinput\fi\relax + +%% code guards +\edef\bxtb@restore@codes{% + \catcode33=\the\catcode33% + \catcode34=\the\catcode34% + \catcode39=\the\catcode39% + \catcode45=\the\catcode45% + \catcode46=\the\catcode46% + \catcode47=\the\catcode47% + \catcode58=\the\catcode58% + \catcode60=\the\catcode60% + \catcode62=\the\catcode62% + \catcode63=\the\catcode63% + \catcode96=\the\catcode96% +\relax} +\catcode33=12 % <!> +\catcode34=12 % <"> +\catcode39=12 % <'> +\catcode45=12 % <-> +\catcode46=12 % <.> +\catcode47=12 % </> +\catcode58=12 % <:> +\catcode60=12 % <<> +\catcode62=12 % <>> +\catcode63=12 % <?> +\catcode96=12 % <`> +\AtEndOfPackage{% + \bxtb@restore@codes + \let\bxtb@restore@codes\@undefined} + +%--------------------------------------- 0. Prologue + +%% variables +\newif\ifbxOk % general-purpose switch +\let\bxRes\relax % result container + +%% unique tokens +\def\bxtb@uniq{\bxtb@uniq@} + +%% error messages +\def\bxtb@error{\PackageError\bxtb@pkgname} +\def\bxtb@warn{\PackageWarningNoLine\bxtb@pkgname} + +%--------------------------------------- 1. Engine-independent stuffs + +%% \bxtb@@bs +\let\bxtb@@bs\@backslashchar + +%%<+> \bxIfcsundefX{<csname>}{<T>}{<F>} +\newcommand*\bxIfcsundefX{} +\let\bxIfcsundefX\@ifundefined + +%%<+> \bxCsuseX{<csname>} +\newcommand*\bxCsuseX[1]{% + \@ifundefined{#1}{}{\csname#1\endcsname}} + +%% \bxtb@listmake@do +\def\bxtb@listmake@do{\let\do\bxtb@lm@do} +\def\bxtb@lm@do{\noexpand\do\noexpand} +\def\bxtb@csdo#1{\expandafter\do\csname#1\endcsname} + +%% \bxtb@letcs\CSA{<csnameB>} +%% \bxtb@cslet{<csnameA>}\CSB +%% \bxtb@csletcs{<csnameA>}{<csnameB>} +% Same as \letcs, \cslet, \csletcs in etoolbox. +% They are defined here since subsequent stuffs use them. +\def\bxtb@letcs#1#2{% + \expandafter\let\expandafter#1\csname #2\endcsname} +\def\bxtb@cslet#1#2{% + \expandafter\let\csname #1\endcsname#2} +\def\bxtb@csletcs#1#2{% + \expandafter\let\csname #1\expandafter\endcsname\csname #2\endcsname} + +%% \bxtb@ifprimitive\CS{<T>}{<F>} +% Core of \bxIfPrimitive. +\def\bxtb@ifprimitive#1{% + \edef\bxtb@tmpa{\string#1}\edef\bxtb@tmpb{\meaning#1}% + \ifx\bxtb@tmpa\bxtb@tmpb \expandafter\@firstoftwo + \else \expandafter\@secondoftwo \fi} + +%% \bxtb@ifstrempty{<str>}{<T>}{<F>} +% Core of \ifstrempty. +\def\bxtb@ifstrempty#1{% + \ifx\bxtb@empty@uniq#1\bxtb@empty@uniq + \expandafter\@firstoftwo + \else \expandafter\@secondoftwo \fi} +\def\bxtb@empty@uniq{\bxtb@empty@uniq@} + +%%<+> \ifbxineTeX (if-token) +%%<+> \bxIfineTeX{<T>}{<F>} +%%<+> \ifbxinpdfTeX / \ifbxinLuaTeX / \ifbxinOmega / \ifbxinAleph +%%<+> \ifbxinXeTeX / \ifbxinpTeX / \ifbxinupTeX / \ifbxinjTeX +%%<+> \bxIfinpdfTeX / \bxIfinLuaTeX / \bxIfinOmega / \bxIfinAleph +%%<+> \bxIfinXeTeX / \bxIfinpTeX / \bxIfinupTeX / \bxIfinjTeX +%% Engine check. +\def\bxtb@do#1#2{% + \bxtb@ifprimitive#2% + {\let\bxtb@tmpa\@firstoftwo}{\let\bxtb@tmpa\@secondoftwo}% + \bxtb@cslet{bxIfin#1}\bxtb@tmpa + \bxtb@csletcs{ifbxin#1}{if\bxtb@tmpa{true}{false}}} +\bxtb@do{eTeX}{\eTeXversion} +\bxtb@do{pdfTeX}{\pdftexversion} +\bxtb@do{LuaTeX}{\luatexversion} +\bxtb@do{Omega}{\OmegaVersion} +\bxtb@do{Aleph}{\AlephVersion} +\bxtb@do{XeTeX}{\XeTeXversion} +\bxtb@do{pTeX}{\kanjiskip} +\bxtb@do{upTeX}{\enablecjktoken} +\bxtb@do{jTeX}{\jintercharskip} + +%%<+> \bxPreamble\CSX[*]\CSY +% Prefix used for preamble-only commands. +% \CSX can be \def, \newcommand, \DeclareRobustCommand, etc. +\@onlypreamble\bxPreamble +\newcommand*\bxPreamble[2]{% + \ifx *#2\def\bxtb@args{{#1*}}% + \else \def\bxtb@args{#1#2}% + \fi \expandafter\bxtb@preamble@a\bxtb@args} +\@onlypreamble\bxtb@preamble@a +\def\bxtb@preamble@a#1#2{% + \@onlypreamble#2#1#2} + +%%<+> \bxConstBool +\newcommand*\bxConstIfToken[2]{% + \bxtb@cslet{if#1}{if#2}} + +%% \bxtb@skip@new@cmd...{<text>} +% Gobbles a following whole macro definition sentence. +\def\bxtb@skip@new@cmd#1#{\@gobble} + +%% \bxtb@name@cs\CS +\def\bxtb@name@cs{% + \expandafter\bxtb@name@cs@a\string\$\@gobble\@empty\@nil} +\def\bxtb@name@cs@a#1#2#3#4\@nil#5{% + \expandafter#3\string#5} + +%% \bxtb@let@name\CSX\CSY +\def\bxtb@let@name#1#2{% + \edef#1{\bxtb@name@cs#2}} + +%%<+> \bxIf{<test>}{<T>}{<F>} +%%<+> \bxIfcat{<test>}{<T>}{<F>} +%%<+> \bxIfx{<test>}{<T>}{<F>} +%%<+> \bxIfdim{<test>}{<T>}{<F>} +%%<+> \bxIfnum{<test>}{<T>}{<F>} +% Primitive if-tests rendered in LaTeX format. +\let\bxtb@bumper\noindent % primitive other than \relax +\bxPreamble\def\bxtb@defifmacro@noarg#1#2#3{% + \@gobble{\if}% if-match hack + \def#1{#2\expandafter\@firstoftwo + \else\expandafter\@secondoftwo\fi}} +\bxPreamble\def\bxtb@defifmacro#1#2#3{% + \@gobble{\if}% if-match hack + \def#1##1{#2##1\expandafter\@firstoftwo + \else\expandafter\@secondoftwo\fi}} +\bxPreamble\def\bxtb@defifmacro@val#1#2#3{% + \@gobble{\if}% if-match hack + \def#1##1{\expandafter\@gobble + #2##1\bxtb@bumper\expandafter\@firstoftwo + \else \bxtb@bumper\expandafter\@secondoftwo \fi}} +\bxtb@defifmacro\bxIf\if\fi +\bxtb@defifmacro\bxIfcat\ifcat\fi +\bxtb@defifmacro\bxIfx\ifx\fi +\bxtb@defifmacro@val\bxIfdim\ifdim\fi +\bxtb@defifmacro@val\bxIfnum\ifnum\fi + +%%<+> \bxIfInMovingArg{<T>}{<F>} +% Moving argument check. Note that it actually expands to <T> or +% <F> prepended with some unexpandable garbles with no effect. +% For that reason, this macro is not suitable for switching +% implementation. Instead it is intended for error check for +% use in moving arguments. +\long\def\bxIfInMovingArg#1#2{% + \let\bxtb@ifinmovarg@a\bxtb@ifinmovarg@a\bxtb@ifinmovarg@c{#1}% + #2\bxtb@ifinmovarg@end} +\def\bxtb@ifinmovarg@a#1{% + \bxtb@ifinmovarg@dummy\relax \bxtb@ifinmovarg@b} +\def\bxtb@ifinmovarg@b#1#2#3\bxtb@ifinmovarg@end{#2} +\def\bxtb@ifinmovarg@c#1#2\bxtb@ifinmovarg@end{#2} +\let\bxtb@ifinmovarg@end\@empty +\let\bxtb@ifinmovarg@dummy\relax + +%%<+> \bxMessageToken{<str>}{<text>} +% Executes <text> where #1 is replaced by control sequence \<str>. +% The meaning of \<str> is unchanged. +% (In <text> # must be doubled.) +\def\bxMessageToken#1{% + \begingroup + \xdef\bxtb@g@tmpa{\noexpand\bxtb@tmpa + \expandafter\noexpand\csname #1\endcsname}% + \endgroup + \afterassignment\bxtb@g@tmpa \long\def\bxtb@tmpa##1} + +%%<+> \bxCheckForMovingArg{<text>} +% When in moving arguments, it raises an error in the form of +% undefined conrol sequence; otherwise expands to <text>. +%%<+> \bxCheckForMovingArgForTest{\SOMETEST{<arg>}}{<T>}{<F>} +% When in moving arguments, it raises an error in the form of +% undefined conrol sequence and expands to <F>; otherwise +% it expands to \SOMETEST{<arg>}{<T>}{<F>}. +\bxMessageToken{ ERROR: Use in wrong place!}{% + \def\bxCheckForMovingArg{\bxIfInMovingArg{#1}}% + \def\bxCheckForMovingArgForTest{% + \bxIfInMovingArg{#1\@secondoftwo}}% +} + +%% \bxtb@ifnewdefok\CS{<T>}{<F>} +%% \bxtb@ifrenewdefok\CS{<T>}{<F>} +%% \bxtb@ifprovidedefok\CS{<T>}{<F>} +\def\bxtb@ifnewdefok#1{% + \newcommand#1{\bxtb@uniq}\bxtb@ifnewdefok@a#1} +\def\bxtb@ifrenewdefok#1{% <F> is never executed + \renewcommand#1{\bxtb@uniq}\let#1\@undefined \@firstoftwo} +\def\bxtb@ifprovidedefok#1{% + \providecommand#1{\bxtb@uniq}\bxtb@ifnewdefok@a#1} +\def\bxtb@ifnewdefok@a#1{% + \ifx#1\bxtb@ifdefok@probe + \let#1\@undefined \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi} +\long\def\bxtb@ifdefok@probe{\bxtb@uniq} + +%% \bxtb@detokenize{<text>} +% Resource consuming version of \detokenize ;) +%% \bxtb@stringify{<text>} +% Expands <text> and then detokenizes the result. +\def\bxtb@detokenize{% + \romannumeral-`a\bxtb@detok@pre@a\bxtb@detok@lop@a} +\def\bxtb@stringify{% + \romannumeral-`a\bxtb@detok@pre@a\bxtb@edetok@lop@a} +\def\bxtb@detok@pre@a#1#2{% + \expandafter\bxtb@detok@ppst@a + \csname\bxtb@nonce@pfx"#1#2\bxtb@detok@enda + {} \bxtb@detok@endb\endcsname} +\def\bxtb@detok@enda{\bxtb@detok@enda@} +\def\bxtb@detok@endb{\bxtb@detok@endb@} +\begingroup + \catcode`\(=12 \lccode`\(=`\{ \catcode`\)=12 \lccode`\)=`\} + \lowercase{\gdef\bxtb@detok@brc@a#1#2{(#1#2)}} +\endgroup +\def\bxtb@detok@lop@a#1 #2\bxtb@detok@endb{% + \bxtb@ifstrempty{#1}% + { \bxtb@detok@lop@a}{\bxtb@detok@lop@b#1 }% + #2\bxtb@detok@endb} +\def\bxtb@detok@lop@b#1#{% + \bxtb@ifstrempty{#1}% + {\bxtb@detok@brc@a\bxtb@detok@lop@a}{\bxtb@detok@lop@c#1}} +\def\bxtb@detok@lop@c#1{% + \bxIfx{#1\bxtb@detok@enda}{\bxtb@detok@pst@a}{% + \bxIfcat{\noexpand#1\relax}{\bxtb@format@cs#1}{\string#1}% + \bxtb@detok@lop@a}} +\def\bxtb@edetok@lop@a#1 #2\bxtb@detok@endb{% + \bxtb@ifstrempty{#1}% + { \bxtb@edetok@lop@a}{\bxtb@edetok@lop@b#1 }% + #2\bxtb@detok@endb} +\def\bxtb@edetok@lop@b#1#{% + \bxtb@ifstrempty{#1}% + {\bxtb@detok@brc@a\bxtb@edetok@lop@a}{\bxtb@edetok@lop@c#1}} +\def\bxtb@edetok@lop@c#1{% + \bxIfx{#1\bxtb@detok@enda}{\bxtb@detok@pst@a}% + {\bxtb@edetok@lop@d#1}} +\def\bxtb@edetok@lop@d#1{% + \bxtb@ifdefmacro#1{\expandafter\bxtb@edetok@lop@a#1}% + {\expandafter\bxtb@edetok@lop@e\romannumeral-`\a#1}} +\def\bxtb@edetok@lop@e#1{% + \bxIfcat{\noexpand#1\relax}{\bxtb@format@cs#1}{\string#1}% + \bxtb@edetok@lop@a} +\def\bxtb@detok@pst@a#1\bxtb@detok@endb{} +\def\bxtb@detok@ppst@a#1{% + \expandafter\bxtb@detok@ppst@b\string#1\@nil} +\def\bxtb@detok@ppst@b#1#2"#3\@nil{\space#3} + +%% \bxtb@format@cs\CS +% Detokenizes control sequence \CS with an optional space +% appended just in \write. +\def\bxtb@format@cs{% + \expandafter\bxtb@format@cs@a\string\$% + \bxtb@format@cs@c\bxtb@format@cs@b\@nil} +\def\bxtb@format@cs@a#1#2#3#4\@nil#5{% + \expandafter#3\string#5\@nil} +\def\bxtb@format@cs@b{\bxtb@format@cs@c\@empty} +\def\bxtb@format@cs@c#1#2#3\@nil{% + #1#2#3\ifcat_#3_\ifnum\catcode`#2=11 \space \fi\else\space\fi} + +%% \bxtb@return@true +\def\bxtb@return@true#1\bxtb@esac{% + \fi\@firstoftwo} +\def\bxtb@return@false#1\bxtb@esac{% + \fi\@secondoftwo} + + +%--------------------------------------- 2. Dummy if-token definitions. + +%% \bxtb@make@dummy@if@setter +\bxPreamble\def\bxtb@make@dummy@if@setter#1#2{% + \begingroup + \def\bxtb@bval{#1}% + \@for\bxtb@bname:=#2\do{\bxtb@make@dummy@if@setter@a}% + \endgroup} +\bxPreamble\def\bxtb@make@dummy@if@setter@a{% + \expandafter\ifx\csname if\bxtb@bname\endcsname\relax + \bxtb@make@dummy@if@setter@appto\bxtb@set@dummy@ifs{% + \let \expandafter\noexpand\csname if\bxtb@bname\endcsname + \expandafter\noexpand\csname if\bxtb@bval\endcsname}% + \bxtb@make@dummy@if@setter@appto\bxtb@unset@dummy@ifs{% + \let \expandafter\noexpand\csname if\bxtb@bname\endcsname + \noexpand\@undefined}% + \fi} +\bxPreamble\def\bxtb@make@dummy@if@setter@appto#1#2{% + \edef\bxtb@tmpx{#2}% + \expandafter\g@addto@macro\expandafter#1% + \expandafter{\bxtb@tmpx}} +\let\bxtb@set@dummy@ifs\@empty +\let\bxtb@unset@dummy@ifs\@empty +\bxtb@make@dummy@if@setter{false}{% + % e-TeX if-tokens + fontchar,defined,csname,incsname,% + % pdfTeX if-tokens + pdfprimitive,pdfabsdim,pdfabsnum,% + % LuaTeX if-tokens + absdim,absnum,primitive,% + % pTeX if-tokens + tdir} +\bxtb@make@dummy@if@setter{true}{% + % pTeX if-tokens + ydir} + +%%<+> \bxSetDummyIfs +%%<+> \bxUnsetDummyIfs +\newcommand*\bxSetDummyIfs{} +\let\bxSetDummyIfs\bxtb@set@dummy@ifs +\newcommand*\bxUnsetDummyIfs{} +\let\bxUnsetDummyIfs\bxtb@unset@dummy@ifs + +%% dummy-ifs are enabled in this file +\bxSetDummyIfs + +\bxPreamble\def\bxtb@defifmacro@engdep#1{% + \expandafter\bxtb@defifmacro@engdep@a + \csname bxIf#1\expandafter\endcsname + \csname if#1\expandafter\endcsname + \csname iftrue\expandafter\endcsname\csname iffalse\endcsname} +\bxPreamble\def\bxtb@defifmacro@engdep@a#1#2#3#4{% + % be careful that #2,#3,#4 are \if-tokens + \bxtb@defifmacro@noarg#1#2\relax \chardef\bxtb@tmpa\z@ + \ifx#2#3\chardef\bxtb@tmpa\@ne \fi + \ifx#2#4\chardef\bxtb@tmpa\tw@ \fi + \ifcase\bxtb@tmpa\relax + \or \let#1\@firstoftwo + \or \let#1\@secondoftwo + \fi} +\bxPreamble\def\bxtb@make@engdep@test#1{% + \@for\bxtb@bname:=#1\do{% + \bxtb@defifmacro@engdep\bxtb@bname}} +% this must be done in \bxSetDummyIfs effective +\bxtb@make@engdep@test{% + ydir,tdir% +} + +%--------------------------------------- 3. Macrodef prefix operations + +%% \bxtb@all@prefix +\def\bxtb@all@prefix{\do{protected}\do{long}\do{outer}} + +%% \bxtb@set@prefix{<name>} +%% \bxtb@unset@prefix{<name>} +%% \bxtb@unset@all@prefix{<name>} +\def\bxtb@set@prefix#1{\bxtb@cslet{bxtb@PFX/#1}{T}} +\def\bxtb@unset@prefix#1{\bxtb@cslet{bxtb@PFX/#1}{F}} +\def\do{\noexpand\bxtb@unset@prefix} +\edef\bxtb@unset@all@prefix{\bxtb@all@prefix} + +%% \bxtb@clear@prefix +\def\bxtb@clear@prefix{% + \def\bxtb@savepfx@dummy{}\let\bxtb@savepfx@dummy\relax} + +%% \bxtb@render@prefix +\def\do{\noexpand\bxtb@render@prefix@a} +\edef\bxtb@render@prefix{\bxtb@all@prefix} +\def\bxtb@render@prefix@a#1{% + \bxIf{\csname bxtb@PFX/#1\endcsname T}{\csname #1\endcsname}{}} + +%% \bxtb@save@prefix +\def\bxtb@save@prefix{% + \def\bxtb@savepfx@dummy{}% prefixes applied to this definition + \bxtb@unset@all@prefix + \begingroup \escapechar`\\ + \expandafter\bxtb@savepfx@prs@a\meaning\bxtb@savepfx@dummy\@nil + %\endgroup already done +} + +%% some internal stuffs +\begingroup \escapechar\m@ne +\xdef\bxtb@g@args{{\string\macro:}{\space}{\string\\}} +\endgroup +\def\bxtb@do#1#2#3{% + \def\bxtb@savepfx@prs@a##1#1##2\@nil{% + \endgroup + \let\bxtb@savepfx@dummy\relax + \bxIfcat{_##1_}{}{\bxtb@savepfx@prs@b##1\@nil}} + \def\bxtb@savepfx@prs@b##1##2#2##3\@nil{% + \bxtb@savepfx@prs@c##2#3#3} + \def\bxtb@savepfx@prs@c##1#3{% + \bxIfcat{_##1_}{}% + {\bxtb@set@prefix{##1}\bxtb@savepfx@prs@c}} + \def\bxtb@ifdefmacro##1{% + \expandafter\bxtb@ifdefmacro@a\meaning##1#1\@nil} + \def\bxtb@ifdefmacro@a##1#1##2\@nil##3##4{% + \bxIfcat{_##2_}{##4}{##3}} +} +\expandafter\bxtb@do\bxtb@g@args + +%--------------------------------------- 4. pdfTeX primitives + +%%<+> \ifbxPrimitive +% The primitive equivalent to pdfTeX's \ifpdfprimitive; if the +% primitive is not available, this is \let'd to \iffalse. +%%<+> \bxIfHasIfPrimitive{<T>}{<F>} +% Whether \ifbxPrimitive has a valid definition. +\bxtb@cslet{ifbxPrimitive}\@undefined +\expandafter\bxtb@ifprimitive\csname ifpdfprimitive\endcsname{%then + \let\bxIfHasIfPrimitive\@firstoftwo + \bxtb@csletcs{ifbxPrimitive}{ifpdfprimitive}% +}{%else + \expandafter\bxtb@ifprimitive\csname ifprimitive\endcsname{%then + \let\bxIfHasIfPrimitive\@firstoftwo + \bxtb@csletcs{ifbxPrimitive}{ifprimitive}% + }{%else + \let\bxIfHasIfPrimitive\@secondoftwo + \bxtb@csletcs{ifbxPrimitive}{iffalse}% +}} + +%%<+> \bxPrimitive +% The primitive equivalent to pdfTeX's \pdfprimitive; if the +% primitive is not available, this is defined to be empty. +\bxtb@ifprimitive\pdfprimitive{%then + \let\bxPrimitive\pdfprimitive +}{%else + \bxtb@ifprimitive\primitive{%then + \let\bxPrimitive\primitive + }{%else + \let\bxPrimitive\@empty +}} + +%%<+> \bxStrcmp +% The primitive equivalent to pdfTeX's \pdfstrcmp; if the +% primitive is not available, this is left undefined. +\let\bxStrcmp\@undefined +\bxtb@ifprimitive\pdfstrcmp{%then + \let\bxStrcmp\pdfstrcmp +}{%else + \bxtb@ifprimitive\strcmp{%then + \let\bxStrcmp\strcmp + }{%else +}} +\ifbxinLuaTeX %----<*LuaTeX> + \ifdefined\luatexluaescapestring + \unless\ifdefined\bxStrcmp + \directlua0{% + function bxtoolbox_strcmp(A, B) + if A == B then tex.write("0") + elseif A < B then tex.write("-1") + else tex.write("1") + end + end + } + \long\def\bxStrcmp#1#2{\directlua0{% + bxtoolbox_strcmp("\luatexluaescapestring{#1}", + "\luatexluaescapestring{#2}") + }} + \fi + \fi +\fi %----</LuaTeX> + +%--------------------------------------- 5. non etoolbox stuffs + +%%<+> \bxRobustdef\CS +%%<+> \bxRobustgdef\CS +%%<+> \bxRobustedef\CS +%%<+> \bxRobustxdef\CS +\ifbxineTeX %<*etex> +\def\bxRobustdef{\protected\def} +\def\bxRobustgdef{\protected\gdef} +\def\bxRobustedef{\protected\edef} +\def\bxRobustxdef{\protected\xdef} +\else %<*!etex> +\def\bxRobustdef{\bxtb@robustdef\def} +\def\bxRobustgdef{\bxtb@robustdef\gdef} +\def\bxRobustedef{\bxtb@robustdef\edef} +\def\bxRobustxdef{\bxtb@robustdef\xdef} +\def\bxtb@robustdef#1#2{% + \bxtb@save@prefix + \let#2\@undefined \DeclareRobustCommand*#2{}% + \bxtb@let@name\bxtb@tmpb#2% + \bxtb@render@prefix + \expandafter#1\csname \bxtb@tmpb\space \endcsname} +\fi %</etex> + +%% \bxtb@robustlet\CSA\CSB +\ifbxineTeX %<*etex> +\def\bxtb@robustlet#1#2{% + \protected\def#1{#2}} +\else %<*!etex> +\def\bxtb@robustlet#1{% + \expandafter\bxtb@robustlet@a + \csname\bxtb@name@cs#1\space\endcsname#1} +\def\bxtb@robustlet@a#1#2#3{% + \DeclareRobustCommand*#2{}\let#1#3} +\fi + +%%<+> \bxIfPdfOutput{<T>}{<F>} +%%<+> \bxIfPdfOutputNow{<T>}{<F>} +\newcommand*\bxIfPdfOutputNow{% + \ifx\pdfoutput\@undefined \bxtb@return@false \fi + \ifx\pdfoutput\relax \bxtb@return@false \fi + \ifnum\pdfoutput>\z@ \bxtb@return@true + \else \bxtb@return@false \fi + \bxtb@esac} +\newcommand*\bxIfPdfOutput{} +\bxIfPdfOutputNow +{\let\bxIfPdfOutput\@firstoftwo + \bxtb@letcs\ifbxPdfOutput{iftrue}}% +{\let\bxIfPdfOutput\@secondoftwo + \bxtb@letcs\ifbxPdfOutput{iffalse}}% + +%%<+> \bxIfPrimitive\CS +%%<+> \bxCSIfPrimitive{<csname>} +\newcommand*\bxIfPrimitive{} +\bxtb@robustlet\bxIfPrimitive\bxtb@ifprimitive +\def\bxtb@ifcsprimitive@a#1{% + \expandafter\bxIfPrimitive\csname #1\endcsname} +\ifbxineTeX %<*etex> +\def\bxIfCsPrimitive#1{% + \unless\ifcsname#1\endcsname \let\bxtb@tmpx\@secondoftwo + \else \def\bxtb@tmpx{\bxtb@ifcsprimitive@a{#1}}% + \fi \bxtb@tmpx} +\else %<*!etex> +\def\bxIfCsPrimitive#1{% + \begingroup\expandafter\endgroup + \expandafter\ifx\csname #1\endcsname\@undefined + \let\bxtb@tmpx\@secondoftwo + \else \def\bxtb@tmpx{\bxtb@ifcsprimitive@a{#1}}% + \fi \bxtb@tmpx} +\fi %</etex> +% use \ifbxPrimitive if available +\bxIfHasIfPrimitive{% +\bxtb@defifmacro\bxIfPrimitive\ifbxPrimitive\fi +}{} + +%%<+> \bxIfPrimitiveX\CS +%% TODO: for e-TeX, TeX +% use \ifpdfprimitive if available +\bxIfHasIfPrimitive\@tempswatrue\@tempswafalse +\if@tempswa %---- +\let\bxIfPrimitiveX\bxIfPrimitive +\else %---- +\def\bxIfPrimitiveX#1{% + \bxIfcat{\noexpand#1\relax}% + {\bxtb@ifdefmacro#1{\@secondoftwo}{\bxtb@ifprimitive@x@a#1}}% + {\@secondoftwo}} +\def\bxtb@ifprimitive@x@a#1{% + \expandafter\bxtb@ifprimitive@x@b\meaning#1\bxtb@cmp@endb#1} +\def\bxtb@ifprimitive@x@b#1\bxtb@cmp@endb#2{% + \expandafter\bxtb@ifprimitive@x@c\string#1\@bxtb@cmp@enda + #2\bxtb@cmp@endb} +\def\bxtb@do#1{% + \def\bxtb@ifprimitive@x@b##1\bxtb@cmp@endb##2{% + \expandafter\bxtb@ifprimitive@x@c\string##1\@bxtb@cmp@enda + ##2\bxtb@cmp@endb#1\@nil}} +\def\bxtb@ifprimitive@x@c#1 #2\@nil{% + \bxtb@ifstrempty{#2}{\bxtb@ifeq@pstr#1}% + {\@secondoftwo}} +\fi %---- + +%%<+> \bxIfExpToEqual{<text1>}{<text2>}{<T>}{<F>} +\newcommand*\bxIfExpToEqual{} +\bxRobustdef\bxIfExpToEqual#1#2{% + \bxCheckForMovingArgForTest{% + \bxtb@edef@detokenized\bxtb@tmpx{#1}% + \bxtb@edef@detokenized\bxtb@tmpy{#2}% + \bxIfx{\bxtb@tmpx\bxtb@tmpy}}} +% use \bxStrcmp if available +\ifx\bxStrcmp\@undefined\else +\def\bxIfExpToEqual#1#2{% + \bxIfnum{\bxStrcmp{#1}{#2}=\z@}} +\fi + +%%<+> \bxIfExpToEqualX{<text1>}{<text2>}{<T>}{<F>} +\def\bxIfExpToEqualX#1#2{% + \bxtb@ifeq@text#1\bxtb@cmp@enda#2\bxtb@cmp@endb} +% use \bxStrcmp if available +\ifx\bxStrcmp\@undefined\else +\let\bxIfExpToEqualX\bxIfExpToEqual +\fi + +%% \bxtb@ifstrequal@pdftex{<str1>}{<str2>}{<T>}{<F>} +% a version of \ifstrequal using \bxStrcmp +\ifx\bxStrcmp\@undefined\else +\def\bxtb@ifstrequal@pdftex#1#2{% + \bxIfnum{\bxStrcmp{\detokenize{#1}}{\detokenize{#2}}=\z@}} +\AtEndOfPackage{% override the definition in etoolbox + \let\bxIfstrequal\bxtb@ifstrequal@pdftex} +\fi + +%% \bxIfstrequalX{<str1>}{<str2>}{<T>}{<F>} +\newcommand*\bxIfstrequalX{} +\def\bxIfstrequalX#1#2{% + \bxtb@ifeq@str#1\bxtb@cmp@enda#2\bxtb@cmp@endb} +% use \bxStrcmp if available +\ifx\bxStrcmp\@undefined\else +\let\bxIfstrequalX\bxtb@ifstrequal@pdftex +\fi + +%% \bxtb@nonce@pfx +\def\bxtb@nonce@pfx{bxtb@?@\string\$} + +%%<+> \bxDetokenize{<text>} +\bxIfineTeX +{\let\bxDetokenize\detokenize} +{\let\bxDetokenize\bxtb@detokenize} +%%<+> \bxStringify{<text>} +\let\bxStringify\bxtb@stringify + +%% \bxtb@def@detokenized\CS{<text>} +%% \bxtb@edef@detokenized\CS{<text>} +\ifbxineTeX %<*etex> +\def\bxtb@def@detokenized#1#2{% + \edef#1{\detokenize{#2}}} +\def\bxtb@edef@detokenized#1#2{% + \edef\bxtb@args{\noexpand#1{#2}}% + \expandafter\bxtb@def@detokenized\bxtb@args} +\else %<*!etex> +\def\bxtb@def@detokenized{\bxtb@defdetok@a\def} +\def\bxtb@edef@detokenized{\bxtb@defdetok@a\edef} +\def\bxtb@defdetok@a#1#2#3{% + #1\bxtb@tmpa{#3}% + \expandafter\bxtb@defdetok@b\meaning\bxtb@tmpa\@nil#2} +\def\bxtb@defdetok@b#1>#2\@nil#3{\def#3{#2}} +\fi %</etex> + +%% \bxtb@ifeq@text +\def\bxtb@ifeq@text#1\bxtb@cmp@enda#2\bxtb@cmp@endb{% + \expandafter\expandafter\expandafter\bxtb@ifeqtx@a + \bxtb@stringify@ss{#2}\bxtb@cmp@endb#1\bxtb@cmp@enda} +\def\bxtb@ifeqtx@a#1\bxtb@cmp@endb#2\bxtb@cmp@enda{% + \expandafter\expandafter\expandafter\bxtb@ifeq@pstr + \bxtb@stringify@ss{#2}\bxtb@cmp@enda#1\bxtb@cmp@endb} + +%% \bxtb@ifeq@str#1#2 +\def\bxtb@ifeq@str#1\bxtb@cmp@enda#2\bxtb@cmp@endb{% + \expandafter\expandafter\expandafter\bxtb@ifeqstr@a + \bxtb@detokenize@ss{#2}\bxtb@cmp@endb#1\bxtb@cmp@enda} +\def\bxtb@ifeqstr@a#1\bxtb@cmp@endb#2\bxtb@cmp@enda{% + \expandafter\expandafter\expandafter\bxtb@ifeq@pstr + \bxtb@detokenize@ss{#2}\bxtb@cmp@enda#1\bxtb@cmp@endb} + +%% \bxtb@ifeq@pstr +\def\bxtb@ifeq@pstr#1\bxtb@cmp@enda#2\bxtb@cmp@endb{% + \bxtb@ifstrempty{#1}% + {\bxtb@ifstrempty{#2}}% + {\bxtb@ifstrempty{#2}{\@secondoftwo}% + {\bxtb@ifeqps@a#1\bxtb@cmp@enda#2\bxtb@cmp@endb}}} +\def\bxtb@ifeqps@a#1#2\bxtb@cmp@enda#3#4\bxtb@cmp@endb{% + \bxIfx{#1#3}% + {\bxtb@ifeq@pstr#2\bxtb@cmp@enda#4\bxtb@cmp@endb}% + {\@secondoftwo}} +\def\bxtb@cmp@enda{\bxtb@cmp@enda@} +\def\bxtb@cmp@endb{\bxtb@cmp@endb@} + +%% \bxtb@space@subst +\def\bxtb@space@subst#1 #2\bxtb@ss@endb{% + \bxtb@ifstrempty{#2}{\bxtb@spcsub@a#1\bxtb@ss@endb}% + {\bxtb@space@subst#1\space#2\bxtb@ss@endb}} +\def\bxtb@spcsub@a#1\bxtb@ss@enda#2\bxtb@ss@endb{\space#1} +\def\bxtb@ss@enda{\bxtb@ss@enda@} +\def\bxtb@ss@endb{\bxtb@ss@endb@} + +%% \bxtb@combine@ss +\def\bxtb@combine@ss#1#2{% + \expandafter\expandafter\expandafter\bxtb@space@subst + #1{#2}\bxtb@ss@enda{} \bxtb@ss@endb} +\def\bxtb@detokenize@ss{% + \romannumeral-`\a\bxtb@combine@ss\bxDetokenize} +\def\bxtb@stringify@ss{% + \romannumeral-`\a\bxtb@combine@ss\bxStringify} + +%%<+> \bxCsNoexpand{<csname>} +\newcommand*\bxCsNoexpand[1]{% + \expandafter\noexpand\csname#1\endcsname} + +%--------------------------------------- 6. Import from etoolbox + +%% \bxtb@import{\CSA \CSB ...} +% [e-TeX] Aliases each of macros to a new name with 'bx' prefixed. +% [non-e-TeX] Adds the prefixed name to the function check list. +\bxPreamble\def\bxtb@import#1{% + \bxtb@listmake@do + \@tfor\bxtb@tmpa:=#1\do{\expandafter\bxtb@importcmd\bxtb@tmpa}} +\bxPreamble\def\bxtb@importcmd#1{% + \begingroup + \expandafter\bxtb@importcmd@a\string#1\@nil + \endgroup} +\bxPreamble\def\bxtb@importcmd@a#1#2#3\@nil{% + \@tempcnta`#2 \@tempcntb\@tempcnta + \ifnum 96<\@tempcntb \ifnum 123>\@tempcntb + \advance\@tempcntb-32 \fi\fi + \uccode\@tempcnta\@tempcntb + \uppercase{\edef\bxtb@tmpa{#2}}% + \expandafter\bxtb@importcmd@b\csname bx\bxtb@tmpa#3% + \expandafter\endcsname\csname #2#3\endcsname} + +%% \bxtb@provide{\CSA \CSB ...} +% [e-TeX] Does nothing. +% [non-e-TeX] Adds the name to the function check list. +\bxPreamble\def\bxtb@provide#1{% + \bxtb@listmake@do + \@tfor\bxtb@tmpa:=#1\do{\expandafter\bxtb@providecmd\bxtb@tmpa}} + +\ifbxineTeX %<*etex> +%% Load etoolbox. +\RequirePackage{etoolbox}\relax +%% +\bxPreamble\def\bxtb@importcmd@b#1#2{\global\let#1#2} +\bxPreamble\def\bxtb@providecmd#1{} + +\else %<*!etex> +%% +\bxPreamble\let\bxtb@provided\@empty +\bxPreamble\def\bxtb@importcmd@b#1#2{% + \xdef\bxtb@provided{\bxtb@provided\do#1}} +\bxPreamble\def\bxtb@providecmd#1{% + \xdef\bxtb@provided{\bxtb@provided\do#1}} + +\fi %</etex> + +\bxtb@import{% +%%==== Here is a list of commands imported to bx* namespace. +%% For such commands, bxtoolbox provides compatible but not equivalent +%% commands when e-TeX extension is not available, under the same +%% 'bx'-prefixed name. + \newrobustcmd \renewrobustcmd \providerobustcmd %2.1 + \robustify %2.2 + \csuse \csshow %3.1.1 + \ifcsdef \ifcsundef %3.6.1 +} +\bxtb@provide{% +%% For the following commands, bxtoolbox provides equivalent commands +%% for non-e-TeX environment under the same name as in etoolbox. + \AfterPreamble \AtEndPreamble \AfterEndPreamble %2.5 + \AfterEndDocument + \csdef \csgdef \csedef \csxdef %3.1.1 + \cslet \letcs \csletcs \undef \csundef + \appto \gappto \eappto \xappto %3.3.1 + \csappto \csgappto \cseappto \csxappto + \preto \gpreto \epreto \xpreto %3.3.2 + \cspreto \csgpreto \csepreto \csxpreto + \newbool \providebool \booltrue \boolfalse %3.5.1 + \setbool \ifbool \notbool + \newtoggle \providetoggle \toggletrue \togglefalse %3.5.2 + \settoggle \iftoggle \nottoggle + \ifdef \ifundef %3.6.1 + \ifstrequal \ifstrempty %3.6.2 +} + +\ifbxineTeX %<*etex> +%% When the engine is eTeX, stop reading here. +\bxUnsetDummyIfs +\expandafter\endinput +\fi %</etex> +%--------------------------------------- 7. etoolbox compatible functions + +%% error messages +\def\bxtb@err@ukbool#1{\bxtb@error + {\bxtb@@bs if#1 undefined}\@eha} +\def\bxtb@err@ukbval#1{\bxtb@error + {Invalid boolean value '#1'}\@eha} +\def\bxtb@err@aetgl#1{\bxtb@error + {Toggle '#1' already defined}\@eha} +\def\bxtb@err@uktgl#1{\bxtb@error + {Toggle '#1' undefined}\@eha} +\def\bxtb@err@nomcr#1{\bxtb@error + {\string#1 is not a macro}\@eha} + +%%<+> \cslet +%%<+> \letcs +%%<+> \csletcs +\bxtb@robustlet\cslet\bxtb@cslet +\bxtb@robustlet\letcs\bxtb@letcs +\bxtb@robustlet\csletcs\bxtb@csletcs + +%%<+> \bxNewrobustcmd +%%<+> \bxRenewrobustcmd +%%<+> \bxProviderobustcmd +\newcommand\bxNewrobustcmd{} +\DeclareRobustCommand*\bxNewrobustcmd{% + \bxtb@dclrobustcmd@a\bxtb@ifnewdefok} +\def\bxtb@dclrobustcmd@a#1{% + \@ifstar{\bxtb@dclrobustcmd@b#1{*}}{\bxtb@dclrobustcmd@b#1{}}} +\def\bxtb@dclrobustcmd@b#1#2#3{% + #1#3{\DeclareRobustCommand#2#3}{\bxtb@skip@new@cmd}} +\bxNewrobustcmd*\bxRenewrobustcmd{% + \bxtb@dclrobustcmd@a\bxtb@ifrenewdefok} +\bxNewrobustcmd*\bxProviderobustcmd{% + \bxtb@dclrobustcmd@a\bxtb@ifprovidedefok} + +%%<+> \bxRobustify +\bxNewrobustcmd*\bxRobustify[1]{% + \ifundef{#1}{\bxtb@err@nomcr#1} + {\bxtb@ifdefmacro{#1}% + {\begingroup + \expandafter\bxtb@robustify@a + \csname\bxtb@name@cs#1\space\endcsname#1}% + {\bxtb@err@nomcr#1}}} +\def\bxtb@robustify@a#1#2{% + \global\let\bxtb@rbf@do\@empty + \let\bxtb@tmpa#2\let#2\@undefined + \let\bxtb@tmpb#1\let#1\@undefined + \DeclareRobustCommand*#2{}% + \ifx#2\bxtb@tmpa + \bxtb@warn{\string#2 is already robust}% + \else\ifx\bxtb@tmpb\relax + \global\let\bxtb@rbf@tmpa#2% + \gdef\bxtb@rbf@do{\let#1#2\let#2\bxtb@rbf@tmpa}% + \else \bxtb@error{Failed to robustify \string#1}\@ehc + \fi\fi + \endgroup \bxtb@rbf@do} + +%%<+> \csdef +%%<+> \csedef +%%<+> \csgdef +%%<+> \csxdef +\bxNewrobustcmd*\csdef[1]{\expandafter\def\csname #1\endcsname} +\bxNewrobustcmd*\csedef[1]{\expandafter\edef\csname #1\endcsname} +\bxNewrobustcmd*\csgdef[1]{\expandafter\gdef\csname #1\endcsname} +\bxNewrobustcmd*\csxdef[1]{\expandafter\xdef\csname #1\endcsname} + +%%<+> \undef +%%<+> \csundef +\bxNewrobustcmd*\undef[1]{\let#1\@undefined} +\bxNewrobustcmd*\csundef[1]{% + \expandafter\let\csname #1\endcsname\@undefined} + +%%<+> \ifdef\CS{<T>}{<F>} +%%<+> \ifundef\CS{<T>}{<F>} +%%<+> \bxIfcsdef{<csname>}{<T>}{<F>} +%%<+> \bxIfcsundef{<csname>}{<T>}{<F>} +\newcommand*\ifdef[1]{% + \ifx#1\@undefined \expandafter\@secondoftwo + \else \expandafter\@firstoftwo + \fi} +\newcommand*\ifundef[1]{% + \ifx#1\@undefined \expandafter\@firstoftwo + \else \expandafter\bxtb@ifundef@a\expandafter#1% + \fi} +\def\bxtb@ifundef@a#1{% + \ifx#1\relax \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi} +\newcommand*\bxIfcsdef[1]{% + \bxCheckForMovingArgForTest{% + \begingroup\expandafter\endgroup + \expandafter\ifx\csname #1\endcsname\@undefined + \expandafter\@secondoftwo + \else \expandafter\@firstoftwo + \fi}} +\newcommand*\bxIfcsundef[1]{% + \bxCheckForMovingArgForTest{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname #1\endcsname\relax + \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi}} + +%%<+> \bxCsuse +\bxNewrobustcmd*\bxCsuse[1]{% + \bxIfcsdef{#1}{\csname #1\endcsname}{}} + +%%<+> \bxCsshow +\bxNewrobustcmd*\bxCsshow[1]{% + \bxIfcsdef{#1}{\expandafter\show\csname #1\endcsname}{}} + +%%<+> \appto +%%<+> \gappto +%%<+> \eappto +%%<+> \xappto +\bxNewrobustcmd*\appto{\bxtb@appto\@empty} +\bxNewrobustcmd*\gappto{\bxtb@appto\global} +\bxNewrobustcmd*\eappto{\bxtb@eappto\@empty} +\bxNewrobustcmd*\xappto{\bxtb@eappto\global} +\bxNewrobustcmd*\csappto[1]{\expandafter\appto\csname#1\endcsname} +\bxNewrobustcmd*\csgappto[1]{\expandafter\gappto\csname#1\endcsname} +\bxNewrobustcmd*\cseappto[1]{\expandafter\eappto\csname#1\endcsname} +\bxNewrobustcmd*\csxappto[1]{\expandafter\xappto\csname#1\endcsname} +\def\bxtb@eappto#1#2#3{% + \edef\bxtb@args{\noexpand#1\noexpand#2{#3}}% + \expandafter\bxtb@appto\bxtb@args} +\def\bxtb@appto#1#2#3{% + \begingroup + \ifx#2\@undefined \let#2\@empty \fi + \toks@\expandafter{#2#3}\xdef\bxtb@g@tmpa{\the\toks@}% + \endgroup #1\let#2\bxtb@g@tmpa} + +%%<+> \preto +%%<+> \gpreto +%%<+> \epreto +%%<+> \xpreto +\bxNewrobustcmd*\preto{\bxtb@preto\@empty} +\bxNewrobustcmd*\gpreto{\bxtb@preto\global} +\bxNewrobustcmd*\epreto{\bxtb@epreto\@empty} +\bxNewrobustcmd*\xpreto{\bxtb@epreto\global} +\bxNewrobustcmd*\cspreto[1]{\expandafter\preto\csname#1\endcsname} +\bxNewrobustcmd*\csgpreto[1]{\expandafter\gpreto\csname#1\endcsname} +\bxNewrobustcmd*\csepreto[1]{\expandafter\epreto\csname#1\endcsname} +\bxNewrobustcmd*\csxpreto[1]{\expandafter\xpreto\csname#1\endcsname} +\toksdef\bxtb@toksa=2 +\def\bxtb@epreto#1#2#3{% + \edef\bxtb@args{\noexpand#1\noexpand#2{#3}}% + \expandafter\bxtb@preto\bxtb@args} +\def\bxtb@preto#1#2#3{% + \begingroup + \ifx#2\@undefined \let#2\@empty \fi + \toks@\expandafter{#2}\bxtb@toksa{#3}% + \xdef\bxtb@g@tmpa{\the\bxtb@toksa\the\toks@}% + \endgroup #1\let#2\bxtb@g@tmpa} + +%%<+> \newbool +%%<+> \providebool +\bxNewrobustcmd*\newbool[1]{% + \expandafter\bxtb@newbool@a\csname if#1\endcsname} +\def\bxtb@newbool@a#1{\@ifdefinable#1{\newif#1}} +\bxNewrobustcmd*\providebool[1]{% + \@ifundefined{if#1}% + {\expandafter\newif\csname if#1\endcsname}{}} + +%%<+> \booltrue +%%<+> \boolfalse +%%<+> \setbool +% NB: Here \bxIfcsundef cannot be used because otherwise the use +% with \global would fail. +\bxNewrobustcmd*\booltrue[1]{% + \bxIfcsundefX{if#1}{\bxtb@clear@prefix\bxtb@err@ukbool{#1}}% + {\csname #1true\endcsname}} +\bxNewrobustcmd*\boolfalse[1]{% + \bxIfcsundefX{if#1}{\bxtb@clear@prefix\bxtb@err@ukbool{#1}}% + {\csname #1false\endcsname}} +\bxNewrobustcmd*\setbool[2]{% + \bxIfcsundefX{if#1}{\bxtb@clear@prefix\bxtb@err@ukbool{#1}}% + {\bxIfcsundefX{#1#2}{\bxtb@clear@prefix\bxtb@err@ukbval{#2}}% + {\csname #1#2\endcsname}}} + +%%<+> \ifbool +%%<+> \notbool +\@gobble{\if\if}% if-match hack +\newcommand*\ifbool[1]{% + \bxIfcsundefX{if#1}{\bxtb@err@ukbool{#1}\@gobbletwo}% + {\csname if#1\endcsname\expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi}} +\newcommand*\notbool[1]{% + \bxIfcsundefX{if#1}{\bxtb@err@ukbool{#1}\@gobbletwo}% + {\csname if#1\endcsname\expandafter\@secondoftwo + \else \expandafter\@firstoftwo + \fi}} + +%%<+> \newtoggle +%%<+> \providetoggle +\bxNewrobustcmd*\newtoggle[1]{% + \bxIfcsdef{bxtb@TG/#1}{\bxtb@err@aetgl{#1}}% + {\cslet{bxtb@TG/#1}\bxtb@tgl@@false}} +\bxNewrobustcmd*\providetoggle[1]{% + \bxIfcsdef{bxtb@TG/#1}{}{\cslet{bxtb@TG/#1}\bxtb@tgl@@false}} +\let\bxtb@tgl@@true\@firstoftwo +\let\bxtb@tgl@@false\@secondoftwo + +%%<+> \toggletrue +%%<+> \togglefalse +%%<+> \settoggle +% NB: Here \bxIfcsdef cannot be used because otherwise the use +% with \global would fail. +\bxNewrobustcmd*\toggletrue[1]{% + \bxIfcsundefX{bxtb@TG/#1}{\bxtb@clear@prefix\bxtb@err@uktgl{#1}}% + {\cslet{bxtb@TG/#1}\bxtb@tgl@@true}} +\bxNewrobustcmd*\togglefalse[1]{% + \bxIfcsundefX{bxtb@TG/#1}{\bxtb@clear@prefix\bxtb@err@uktgl{#1}}% + {\cslet{bxtb@TG/#1}\bxtb@tgl@@false}} +\bxNewrobustcmd*\settoggle[2]{% + \bxIfcsundefX{bxtb@TG/#1}{\bxtb@clear@prefix\bxtb@err@uktgl{#1}}% + {\bxIfcsundefX{bxtb@tgl@@#2}{\bxtb@clear@prefix\bxtb@err@ukbval{#2}}% + {\csletcs{bxtb@TG/#1}{bxtb@tgl@@#2}}}} + +%%<+> \iftoggle +%%<+> \nottoggle +\newcommand*\iftoggle[1]{% + \bxIfcsundefX{bxtb@TG/#1}{\bxtb@err@uktgl{#1}\@gobbletwo}% + {\csname bxtb@TG/#1\endcsname}} +\newcommand*\nottoggle[1]{% + \bxIfcsundefX{bxtb@TG/#1}{\bxtb@err@uktgl{#1}\@gobbletwo}% + {\csname bxtb@TG/#1\endcsname\@secondoftwo\@firstoftwo}} + +%%<+> \ifstrequal{<str1>}{<str2>}{<T>}{<F>} +\newcommand*\ifstrequal{} +\bxRobustdef\ifstrequal#1#2{% + \bxCheckForMovingArgForTest{% + \bxtb@def@detokenized\bxtb@tmpx{#1}% + \bxtb@def@detokenized\bxtb@tmpy{#2}% + \bxIfx{\bxtb@tmpx\bxtb@tmpy}}} + +%%<+> \ifstrempty{<str>}{<T>}{<F>} +\newcommand*\ifstrempty{} +\let\ifstrempty\bxtb@ifstrempty + +%% internal stuffs needed for hook commands +\bxPreamble\def\bxtb@prepare@bdhook#1#2{% + \bxNewrobustcmd*#1{\gappto#2}% + \newcommand*#2{}} +\def\bxtb@dispatch@bdhook#1#2{% + \let#1\@firstofone #2% + \bxRobustdef#1{\@notprerr\@gobble}\undef#2} + +%%<+> \AtEndPreamble +%%<+> \AfterPreamble +%%<+> \AfterEndPreamble +%%<+> \AfterEndDocument +\bxtb@prepare@bdhook\AtEndPreamble\@endpreamblehook +\bxtb@prepare@bdhook\AfterEndPreamble\@afterendpreamblehook +\bxtb@prepare@bdhook\AfterEndDocument\@afterenddocumenthook +\bxNewrobustcmd*\AfterPreamble{\AtBeginDocument} +\AtEndPreamble{\let\AfterPreamble\@firstofone} +\AfterEndPreamble{\undef\bxtb@dispatch@bdhook} +% +\preto\document{\endgroup + \bxtb@dispatch@bdhook\AtEndPreamble\@endpreamblehook + \begingroup} +\appto\document{% + \bxtb@dispatch@bdhook\AfterEndPreamble\@afterendpreamblehook + \ignorespaces} +% patch to \enddocument +\bxPreamble\def\bxtb@patch@enddocument{% + \expandafter\bxtb@patch@ed@a\enddocument\deadcycles\bxtb@end} +\bxPreamble\def\bxtb@patch@ed@a#1\deadcycles#2\bxtb@end{% + \bxtb@ifstrempty{#2}{\bxtb@patch@ed@fail}% + {\def\bxtb@tmpa{#1}\bxtb@patch@ed@b#2\bxtb@end}} +\bxPreamble\def\bxtb@patch@ed@b#1\deadcycles#2\bxtb@end{% + \bxtb@ifstrempty{#2}{\bxtb@patch@ed@c{#1}}% + {\bxtb@patch@ed@fail}} +\bxPreamble\def\bxtb@patch@ed@c#1{% + \appto\bxtb@tmpa{\let\AfterEndDocument\@firstofone + \@afterenddocumenthook + \deadcycles#1}% + \let\bxtb@org@enddocument\enddocument + \let\enddocument\bxtb@tmpa} +\bxPreamble\def\bxtb@patch@ed@fail{% + \bxtb@warn{\string\AfterEndDocument\space is set disabled}% + \bxRobustdef\AfterEndDocument##1{\bxtb@error + {\string\AfterEndDocument\space is now disabled}\@eha}} +\bxtb@patch@enddocument + +%--------------------------------------- 8. Epilogue +\def\do#1{% + \ifx#1\@undefined \bxtb@warn{\string#1 not yet implemented}\fi} +\bxtb@provided +\bxUnsetDummyIfs +\endinput +%% EOF |