% Copyright (c) 2007-2011 Philipp Lehman.
% (c) 2015 Joseph Wright
%
% Permission is granted to copy, distribute and/or modify this
% software under the terms of the LaTeX Project Public License
% (LPPL), version 1.3c or any later version.
%
% This software is provided 'as is', without warranty of any kind,
% either expressed or implied, including, but not limited to, the
% implied warranties of merchantability and fitness for a
% particular purpose.
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{etoolbox}
[2015/08/02 v2.2a e-TeX tools for LaTeX (JAW)]
\begingroup
\@ifundefined{eTeXversion}
{\PackageError{etoolbox}
{Not running under e-TeX}
{This package requires e-TeX. Try compiling the document
with\MessageBreak 'elatex' instead of 'latex'. When using
pdfTeX, try 'pdfelatex'\MessageBreak instead of 'pdflatex'.
This is a fatal error. I'm aborting now.}%
\aftergroup\endinput}
{}
\endgroup
\ifdefined\extrafloats
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
{\RequirePackage{etex}}
\def\etb@catcodes{\do\&\do\|\do\:\do\-\do\=\do\<\do\>}
\def\do#1{\catcode\number`#1=\the\catcode`#1\relax}
\edef\etb@catcodes{\etb@catcodes}
\let\do\noexpand
\AtEndOfPackage{\etb@catcodes\undef\etb@catcodes}
\catcode`\&=3
\catcode`\|=3
\@makeother\:
\@makeother\-
\@makeother\=
\@makeother\<
\@makeother\>
\protected\def\etb@error{\PackageError{etoolbox}}
\protected\def\etb@warning{\PackageWarning{etoolbox}}
\protected\def\etb@info{\PackageInfo{etoolbox}}
\newcount\etb@tempcnta
% {<cstoken>}[<arguments>][<optarg default>]{<definition>}
\newcommand*{\newrobustcmd}{}
\protected\def\newrobustcmd{\@star@or@long\etb@new@command}
\def\etb@new@command#1{\@testopt{\etb@newcommand#1}0}
\def\etb@newcommand#1[#2]{%
\@ifnextchar[%]
{\etb@xargdef#1[#2]}
{\ifx\l@ngrel@x\relax
\let\l@ngrel@x\protected
\else
\protected\def\l@ngrel@x{\protected\long}%
\fi
\@argdef#1[#2]}}
\long\def\etb@xargdef#1[#2][#3]#4{%
\@ifdefinable#1{%
\expandafter\protected
\expandafter\def
\expandafter#1%
\expandafter{%
\expandafter\@testopt
\csname\string#1\endcsname{#3}}%
\expandafter\@yargdef\csname\string#1\endcsname\tw@{#2}{#4}}}
% {<cstoken>}[<arguments>][<optarg default>]{<definition>}
\newrobustcmd*{\renewrobustcmd}{\@star@or@long\etb@renew@command}
\def\etb@renew@command#1{%
\ifundef{#1}
{\etb@error{\string#1 undefined}\@ehc}
{}%
\let\@ifdefinable\@rc@ifdefinable
\etb@new@command#1}
% {<cstoken>}[<arguments>][<optarg default>]{<definition>}
\newrobustcmd*{\providerobustcmd}{\@star@or@long\etb@provide@command}
\def\etb@provide@command#1{%
\ifundef{#1}
{\def\reserved@a{\etb@new@command#1}}
{\def\reserved@a{\etb@renew@command\reserved@a}}%
\reserved@a}
% {<csname>}
\newrobustcmd*{\csshow}[1]{%
\begingroup\expandafter\endgroup
\expandafter\show\csname#1\endcsname}
% {<csname>}
\newcommand*{\csmeaning}[1]{%
\ifcsname #1\endcsname
\expandafter\meaning\csname #1\endcsname
\else
\detokenize{undefined}%
\fi}
% {<cstoken>}{<true>}{<false>}
\newcommand{\ifdef}[1]{%
\ifdefined#1%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% {<cstoken>}{<true>}{<false>}
\newcommand{\ifundef}[1]{%
\ifdefined#1%
\ifx#1\relax
\expandafter\expandafter
\expandafter\@firstoftwo
\else
\expandafter\expandafter
\expandafter\@secondoftwo
\fi
\else
\expandafter\@firstoftwo
\fi}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsdef}[1]{%
\ifcsname#1\endcsname
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsundef}[1]{%
\ifcsname#1\endcsname
\expandafter\ifx\csname#1\endcsname\relax
\expandafter\expandafter
\expandafter\@firstoftwo
\else
\expandafter\expandafter
\expandafter\@secondoftwo
\fi
\else
\expandafter\@firstoftwo
\fi}
% {<cstoken>}{<true}{<false>}
\newcommand{\ifdefmacro}{}
\long\edef\ifdefmacro#1{%
\noexpand\expandafter\noexpand\etb@ifdefmacro
\noexpand\meaning#1\detokenize{macro}:&}
\edef\etb@ifdefmacro{%
\def\noexpand\etb@ifdefmacro##1\detokenize{macro}:##2&}
\etb@ifdefmacro{\notblank{#2}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsmacro}[1]{%
\ifcsdef{#1}
{\expandafter\ifdefmacro\csname#1\endcsname}
{\@secondoftwo}}
% {<cstoken>}{<true}{<false>}
\newcommand{\ifdefprefix}[1]{%
\ifdefmacro{#1}
{\etb@ifdefprefix{#1}}
{\@secondoftwo}}
\long\edef\etb@ifdefprefix#1{%
\noexpand\expandafter\noexpand\etb@ifdefprefix@i
\noexpand\meaning#1\detokenize{macro}:&}
\edef\etb@ifdefprefix@i{%
\def\noexpand\etb@ifdefprefix@i##1\detokenize{macro}:##2&}
\etb@ifdefprefix@i{\notblank{#1}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsprefix}[1]{%
\ifcsdef{#1}
{\expandafter\ifdefprefix\csname#1\endcsname}
{\@secondoftwo}}
% {<cstoken>}{<true}{<false>}
\newcommand{\ifdefparam}{}
\long\edef\ifdefparam#1{%
\noexpand\expandafter\noexpand\etb@ifdefparam
\noexpand\meaning#1\detokenize{macro}:->&}
\edef\etb@ifdefparam{%
\def\noexpand\etb@ifdefparam##1\detokenize{macro}:##2->##3&}
\etb@ifdefparam{\notblank{#2}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsparam}[1]{%
\ifcsdef{#1}
{\expandafter\ifdefparam\csname#1\endcsname}
{\@secondoftwo}}
% {<cstoken>}{<true}{<false>}
\newcommand{\ifdefprotected}{}
\long\edef\ifdefprotected#1{%
\noexpand\expandafter\noexpand\etb@ifdefprotected
\noexpand\meaning#1\string\protected&}
\edef\etb@ifdefprotected{%
\def\noexpand\etb@ifdefprotected##1\string\protected##2&}
\etb@ifdefprotected{\notblank{#2}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsprotected}[1]{%
\ifcsdef{#1}
{\expandafter\ifdefprotected\csname#1\endcsname}
{\@secondoftwo}}
% {<cstoken>}{<true}{<false>}
\newrobustcmd{\ifdefltxprotect}[1]{%
\begingroup
\edef\etb@resrvda{%
\noexpand\protect\expandafter\noexpand
\csname\expandafter\@gobble\string#1 \endcsname}%
\expandafter\endgroup\ifx#1\etb@resrvda
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% {<csname>}{<true>}{<false>}
\newrobustcmd*{\ifcsltxprotect}[1]{%
\ifcsdef{#1}
{\expandafter\ifdefltxprotect\csname#1\endcsname}
{\@secondoftwo}}
% {<cstoken>}{<true>}{<false>}
\newcommand{\ifdefempty}[1]{%
\ifundef{#1}
{\@secondoftwo}
{\ifdefmacro{#1}
{\ifdefparam{#1}
{\@secondoftwo}
{\etb@ifdefempty{#1}}}
{\@secondoftwo}}}
\def\etb@ifdefempty#1{%
\expandafter\expandafter
\expandafter\ifblank
\expandafter\expandafter
\expandafter{%
\expandafter\strip@prefix\meaning#1}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsempty}[1]{%
\ifcsundef{#1}
{\@secondoftwo}
{\expandafter\ifdefparam\csname#1\endcsname
{\@secondoftwo}
{\expandafter\etb@ifdefempty\csname#1\endcsname}}}
% {<cstoken>}{<true>}{<false>}
\newcommand{\ifdefvoid}[1]{%
\ifundef{#1}
{\@firstoftwo}
{\ifdefmacro{#1}
{\ifdefparam{#1}
{\@secondoftwo}
{\etb@ifdefempty{#1}}}
{\@secondoftwo}}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsvoid}[1]{%
\ifcsundef{#1}
{\@firstoftwo}
{\expandafter\ifdefparam\csname#1\endcsname
{\@secondoftwo}
{\expandafter\etb@ifdefempty\csname#1\endcsname}}}
% {<cstoken1>}{<cstoken2>}{<true>}{<false>}
\newcommand{\ifdefequal}[2]{%
\ifundef{#1}
{\@secondoftwo}
{\ifundef{#2}
{\@secondoftwo}
{\ifx#1#2%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}}}
% {<csname1>}{<csname2>}{<true>}{<false>}
\newcommand*{\ifcsequal}[2]{%
\ifcsundef{#1}
{\@secondoftwo}
{\ifcsundef{#2}
{\@secondoftwo}
{\expandafter\ifx
\csname#1\expandafter\endcsname
\csname#2\endcsname
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}}}
% {<cstoken1>}{<cstoken2>}{<true>}{<false>}
\newrobustcmd{\ifdefstrequal}[2]{%
\ifdefmacro{#1}
{\ifdefmacro{#2}
{\begingroup
\edef\etb@tempa{\expandafter\strip@prefix\meaning#1}%
\edef\etb@tempb{\expandafter\strip@prefix\meaning#2}%
\ifx\etb@tempa\etb@tempb
\aftergroup\@firstoftwo
\else
\aftergroup\@secondoftwo
\fi
\endgroup}
{\@secondoftwo}}
{\@secondoftwo}}
% {<csname1>}{<csname2>}{<true>}{<false>}
\newcommand*{\ifcsstrequal}[2]{%
\ifcsundef{#1}
{\@secondoftwo}
{\ifcsundef{#2}
{\@secondoftwo}
{\expandafter\ifdefstrequal
\csname#1\expandafter\endcsname
\csname#2\endcsname}}}
% {<cstoken>}{<string>}{<true>}{<false>}
\newrobustcmd{\ifdefstring}[2]{%
\ifdefmacro{#1}
{\begingroup
\edef\etb@tempa{\expandafter\strip@prefix\meaning#1}%
\edef\etb@tempb{\detokenize{#2}}%
\ifx\etb@tempa\etb@tempb
\aftergroup\@firstoftwo
\else
\aftergroup\@secondoftwo
\fi
\endgroup}
{\@secondoftwo}}
% {<csname>}{<string>}{<true>}{<false>}
\newrobustcmd{\ifcsstring}[2]{%
\ifcsundef{#1}
{\@secondoftwo}
{\expandafter\ifdefstring\csname#1\endcsname{#2}}}
% {<cstoken>}{<true}{<false>}
\newcommand{\ifdefcounter}[1]{\etb@ifcounter#1&}
\long\def\etb@ifcounter#1#2&{%
\ifx\count#1%
\expandafter\@secondoftwo
\else
\expandafter\etb@ifcounter@i\meaning#1:%
\fi}
\edef\etb@ifcounter@i#1:#2\fi{\noexpand\fi
\noexpand\etb@ifcounter@ii#1\string\count&}
\edef\etb@ifcounter@ii{%
\def\noexpand\etb@ifcounter@ii##1\string\count##2&}
\etb@ifcounter@ii{\ifblank{#1}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcscounter}[1]{%
\ifcsdef{#1}
{\expandafter\ifdefcounter\csname#1\endcsname}
{\@secondoftwo}}
% {<name>}{<true>}{<false>}
\newcommand*{\ifltxcounter}[1]{%
\ifcsdef{c@#1}
{\expandafter\ifdefcounter\csname c@#1\endcsname}
{\@secondoftwo}}
% {<cstoken>}{<true}{<false>}
\newcommand{\ifdeflength}[1]{\etb@iflength#1&}
\long\def\etb@iflength#1#2&{%
\ifx\skip#1%
\expandafter\@secondoftwo
\else
\expandafter\etb@iflength@i\meaning#1:%
\fi}
\edef\etb@iflength@i#1:#2\fi{\noexpand\fi
\noexpand\etb@iflength@ii#1\string\skip&}
\edef\etb@iflength@ii{%
\def\noexpand\etb@iflength@ii##1\string\skip##2&}
\etb@iflength@ii{\ifblank{#1}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcslength}[1]{%
\ifcsdef{#1}
{\expandafter\ifdeflength\csname#1\endcsname}
{\@secondoftwo}}
% {<cstoken>}{<true}{<false>}
\newcommand{\ifdefdimen}[1]{\etb@ifdimen#1&}
\long\def\etb@ifdimen#1#2&{%
\ifx\dimen#1%
\expandafter\@secondoftwo
\else
\expandafter\etb@ifdimen@i\meaning#1:%
\fi}
\edef\etb@ifdimen@i#1:#2\fi{\noexpand\fi
\noexpand\etb@ifdimen@ii#1\string\dimen&}
\edef\etb@ifdimen@ii{%
\def\noexpand\etb@ifdimen@ii##1\string\dimen##2&}
\etb@ifdimen@ii{\ifblank{#1}}
% {<csname>}{<true>}{<false>}
\newcommand*{\ifcsdimen}[1]{%
\ifcsdef{#1}
{\expandafter\ifdefdimen\csname#1\endcsname}
{\@secondoftwo}}
% {<string1>}{<string2>}{<true>}{<false>}
\newrobustcmd{\ifstrequal}[2]{%
\begingroup
\edef\etb@tempa{\detokenize{#1}}%
\edef\etb@tempb{\detokenize{#2}}%
\ifx\etb@tempa\etb@tempb
\aftergroup\@firstoftwo
\else
\aftergroup\@secondoftwo
\fi
\endgroup}
% {<string>}{<true>}{<false>}
\newcommand{\ifstrempty}[1]{%
\expandafter\ifx\expandafter&\detokenize{#1}&%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% {<string>}{<true>}{<false>}
\newcommand{\ifblank}[1]{% from expl3
\expandafter\ifx\expandafter\relax\detokenize\expandafter{\@gobble#1?}\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\newcommand{\notblank}[1]{%
\expandafter\ifx\expandafter\relax\detokenize\expandafter{\@gobble#1?}\relax
\expandafter\@secondoftwo
\else
\expandafter\@firstoftwo
\fi}
% {<numexpr>}{<comp>}{<numexpr>}{<true>}{<false>}
\newcommand*{\ifnumcomp}[3]{%
\ifnum\numexpr#1\relax#2\numexpr#3\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% {<numexpr>}{<numexpr>}{<true>}{<false>}
\newcommand*{\ifnumequal}[1]{%
\ifnumcomp{#1}=}
\newcommand*{\ifnumgreater}[1]{%
\ifnumcomp{#1}>}
\newcommand*{\ifnumless}[1]{%
\ifnumcomp{#1}<}
% {<numexpr>}{<true>}{<false>}
\newcommand*{\ifnumodd}[1]{%
\ifodd\numexpr#1\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% {<dimexpr>}{<comp>}{<dimexpr>}{<true>}{<false>}
\newcommand*{\ifdimcomp}[3]{%
\ifdim\dimexpr#1\relax#2\dimexpr#3\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% {<dimexpr>}{<dimexpr>}{<true>}{<false>}
\newcommand*{\ifdimequal}[1]{%
\ifdimcomp{#1}=}
\newcommand*{\ifdimgreater}[1]{%
\ifdimcomp{#1}>}
\newcommand*{\ifdimless}[1]{%
\ifdimcomp{#1}<}
% {<expr>}{<true>}{<false>}
\newcommand{\ifboolexpe}[1]{%
\etb@be@beg\etb@be@bgroup#1(&\etb@be@end}
\let\etb@be@true\@empty
\def\etb@be@false{-\@ne}
\def\etb@be@beg{%
\ifnum\numexpr\z@\ifnum\numexpr\z@}
\def\etb@be@end{%
<\z@
\expandafter\etb@be@false
\fi
<\z@
\expandafter\@secondoftwo
\else
\expandafter\@firstoftwo
\fi}
\long\def\etb@be@bgroup#1(#2&{%
\etb@be@egroup#1)&%
\ifblank{#2}
{}
{\etb@be@beg
\etb@be@bgroup#2&}}
\long\def\etb@be@egroup#1)#2&{%
\etb@be@and#1and&%
\ifblank{#2}
{}
{\etb@be@end\etb@be@true\etb@be@false
\etb@be@egroup#2&}}
\long\def\etb@be@and#1and#2&{%
\etb@be@or#1or&%
\ifblank{#2}
{}
{<\z@
\expandafter\@firstofone
\else
\expandafter\@gobble
\fi
{=\z@\fi\ifnum\numexpr\m@ne}%
\ifnum\numexpr\z@
\etb@be@and#2&}}
\long\def\etb@be@or#1or#2&{%
\etb@be@not#1not&%
\ifblank{#2}
{}
{<\z@
\expandafter\@secondoftwo
\else
\expandafter\@firstoftwo
\fi
{=\z@\fi\ifnum\numexpr\z@
\ifnum\numexpr\@ne}
{=\z@\fi\ifnum\numexpr\z@
\ifnum\numexpr\z@}%
\etb@be@or#2&}}
\long\def\etb@be@not#1not#2&{%
\etb@be@togl#1togl&%
\ifblank{#2}
{}
{>\z@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\unless\ifnum\numexpr\m@ne}
{\unless\ifnum\numexpr\z@}%
\etb@be@not#2&}}
\long\def\etb@be@togl#1togl#2&{%
\etb@be@bool#1bool&%
\ifblank{#2}
{}
{\etb@be@togl@i#2&}}
\long\def\etb@be@togl@i#1#2&{%
\ifcsdef{etb@tgl@#1}
{\csname etb@tgl@#1\endcsname\etb@be@true\etb@be@false}
{\etb@be@err{Toggle '#1' undefined}{}}%
\etb@be@togl#2&}
\long\def\etb@be@bool#1bool#2&{%
\etb@be@test#1test&%
\ifblank{#2}
{}
{\etb@be@bool@i#2&}}
\long\def\etb@be@bool@i#1#2&{%
\ifcsundef{if#1}
{\etb@be@err{Boolean '#1' undefined}{}}
{\csname if#1\endcsname
\else
\etb@be@false
\fi}%
\etb@be@bool#2&}
\long\def\etb@be@test#1test#2&{%
\ifblank{#1}
{}
{\etb@be@err{The invalid part is: '\detokenize{#1}'}{}}%
\ifblank{#2}
{}
{\etb@be@test@i#2&}}
\long\def\etb@be@test@i#1#2&{%
#1\etb@be@true\etb@be@false
\etb@be@test#2&}
\long\def\etb@be@err#1#2{%
\expandafter\ifnum\the\numexpr
\expandafter\ifnum\the\currentiftype=-3
\expandafter\thr@@
\else
\expandafter\currentiftype
\fi
=\thr@@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{=\z@\fi
\etb@be@err{#1}{#2\ifnum\numexpr\m@ne}}
{\etb@err@expr{#1}#2}}
% {<expr>}{<true>}{<false>}
\newrobustcmd{\ifboolexpr}[1]{\etb@boolexpr{#1}}
\long\def\etb@boolexpr#1{%
\begingroup
\let\etb@br@neg\@firstoftwo
\etb@tempcnta\z@
\etb@br@beg
\etb@br@bgroup#1(&%
\etb@br@end
\etb@br@eval}
\def\etb@br@beg{%
\begingroup
\let\etb@br@neg\@firstoftwo
\etb@tempcnta\z@}
\def\etb@br@end{%
\etb@br@eval\etb@br@true\etb@br@false}
\def\etb@br@eval{%
\ifnum\etb@tempcnta<\z@
\aftergroup\@secondoftwo
\else
\aftergroup\@firstoftwo
\fi
\endgroup}
\def\etb@br@true{%
\advance\etb@tempcnta\etb@br@neg\z@\m@ne
\let\etb@br@neg\@firstoftwo}
\def\etb@br@false{%
\advance\etb@tempcnta\etb@br@neg\m@ne\z@
\let\etb@br@neg\@firstoftwo}
\long\def\etb@br@bgroup#1(#2&{%
\etb@br@egroup#1)&%
\ifblank{#2}
{}
{\etb@br@beg
\etb@br@bgroup#2&}}
\long\def\etb@br@egroup#1)#2&{%
\etb@br@and#1and&%
\ifblank{#2}
{}
{\etb@br@end
\etb@br@egroup#2&}}
\long\def\etb@br@and#1and#2&{%
\etb@br@or#1or&%
\ifblank{#2}
{}
{\ifnum\etb@tempcnta<\z@
\etb@tempcnta\m@ne
\else
\etb@tempcnta\z@
\fi
\etb@br@and#2&}}
\long\def\etb@br@or#1or#2&{%
\etb@br@not#1not&%
\ifblank{#2}
{}
{\ifnum\etb@tempcnta<\z@
\etb@tempcnta\z@
\else
\etb@tempcnta\@ne
\fi
\etb@br@or#2&}}
\long\def\etb@br@not#1not#2&{%
\etb@br@togl#1togl&%
\ifblank{#2}
{}
{\let\etb@br@neg\@secondoftwo
\etb@br@not#2&}}
\long\def\etb@br@togl#1togl#2&{%
\etb@br@bool#1bool&%
\ifblank{#2}
{}
{\etb@br@togl@i#2&}}
\long\def\etb@br@togl@i#1#2&{%
\ifcsdef{etb@tgl@#1}
{\csname etb@tgl@#1\endcsname\etb@br@true\etb@br@false}
{\etb@err@expr{Toggle '#1' undefined}\etb@br@false}%
\etb@br@togl#2&}
\long\def\etb@br@bool#1bool#2&{%
\etb@br@test#1test&%
\ifblank{#2}
{}
{\etb@br@bool@i#2&}}
\long\def\etb@br@bool@i#1#2&{%
\ifcsundef{if#1}
{\etb@err@expr{Boolean '#1' undefined}\etb@br@false}
{\csname if#1\endcsname
\etb@br@true
\else
\etb@br@false
\fi}%
\etb@br@bool#2&}
\long\def\etb@br@test#1test#2&{%
\ifblank{#1}
{}
{\etb@err@expr{The invalid part is: '\detokenize{#1}'}}%
\ifblank{#2}
{}
{\etb@br@test@i#2&}}
\long\def\etb@br@test@i#1#2&{%
\ignorespaces#1\etb@br@true\etb@br@false
\etb@br@test#2&}
\long\def\etb@err@expr#1{%
\etb@error
{Invalid boolean expression}
{#1.}}
% {<expr>}{<code>}
\newrobustcmd{\whileboolexpr}[2]{%
\etb@boolexpr{#1}{#2\whileboolexpr{#1}{#2}}{}}
% {<expr>}{<code>}
\newrobustcmd{\unlessboolexpr}[2]{%
\etb@boolexpr{#1}{}{#2\unlessboolexpr{#1}{#2}}}
% {<cstoken>}
\newcommand{\expandonce}[1]{%
\unexpanded\expandafter{#1}}
% {<csname>}
\newcommand*{\csexpandonce}[1]{%
\expandafter\expandonce\csname#1\endcsname}
% {<code>}
\newcommand*{\protecting}{}
\def\protecting#{%
\ifx\protect\@typeset@protect
\etb@protecting\@firstofone
\fi
\ifx\protect\@unexpandable@protect
\etb@protecting\etb@unexpandable
\fi
\ifx\protect\noexpand
\etb@protecting\unexpanded
\fi
\ifx\protect\string
\etb@protecting\detokenize
\fi
\relax\@firstofone}
\def\etb@protecting#1#2\relax\@firstofone{\fi#1}
\long\def\etb@unexpandable#1{\unexpanded{\protecting{#1}}}
% {<csname>}
\newrobustcmd*{\csdef}[1]{\expandafter\def\csname#1\endcsname}
\newrobustcmd*{\csedef}[1]{\expandafter\edef\csname#1\endcsname}
\newrobustcmd*{\csgdef}[1]{\expandafter\gdef\csname#1\endcsname}
\newrobustcmd*{\csxdef}[1]{\expandafter\xdef\csname#1\endcsname}
\newrobustcmd*{\protected@csedef}{\etb@protected\csedef}
\newrobustcmd*{\protected@csxdef}{\etb@protected\csxdef}
\def\etb@protected{%
\let\@@protect\protect
\let\protect\@unexpandable@protect
\afterassignment\restore@protect}
% {<csname>}{<cstoken>}
\newrobustcmd{\cslet}[2]{%
\expandafter\let\csname#1\endcsname#2}
% {<cstoken>}{<csname>}
\newrobustcmd{\letcs}[2]{%
\ifcsdef{#2}
{\expandafter\let\expandafter#1\csname#2\endcsname}
{\undef#1}}
% {<csname>}{<csname>}
\newrobustcmd*{\csletcs}[2]{%
\ifcsdef{#2}
{\expandafter\let
\csname#1\expandafter\endcsname
\csname#2\endcsname}
{\csundef{#1}}}
% {<csname>}
\newcommand*{\csuse}[1]{%
\ifcsname#1\endcsname
\csname#1\expandafter\endcsname
\fi}
% {<cstoken>}
\newrobustcmd{\undef}[1]{\let#1\etb@undefined}
% {<csname>}
\newrobustcmd*{\csundef}[1]{\cslet{#1}\etb@undefined}
% {<cstoken>}{<code>}
\newrobustcmd{\appto}[2]{%
\ifundef{#1}
{\edef#1{\unexpanded{#2}}}
{\edef#1{\expandonce#1\unexpanded{#2}}}}
\newrobustcmd{\eappto}[2]{%
\ifundef{#1}
{\edef#1{#2}}
{\edef#1{\expandonce#1#2}}}
\newrobustcmd{\gappto}[2]{%
\ifundef{#1}
{\xdef#1{\unexpanded{#2}}}
{\xdef#1{\expandonce#1\unexpanded{#2}}}}
\newrobustcmd{\xappto}[2]{%
\ifundef{#1}
{\xdef#1{#2}}
{\xdef#1{\expandonce#1#2}}}
\newrobustcmd*{\protected@eappto}{\etb@protected\eappto}
\newrobustcmd*{\protected@xappto}{\etb@protected\xappto}
% {<cstoken>}{<code>}
\newrobustcmd{\preto}[2]{%
\ifundef{#1}
{\edef#1{\unexpanded{#2}}}
{\edef#1{\unexpanded{#2}\expandonce#1}}}
\newrobustcmd{\epreto}[2]{%
\ifundef{#1}
{\edef#1{#2}}
{\edef#1{#2\expandonce#1}}}
\newrobustcmd{\gpreto}[2]{%
\ifundef{#1}
{\xdef#1{\unexpanded{#2}}}
{\xdef#1{\unexpanded{#2}\expandonce#1}}}
\newrobustcmd{\xpreto}[2]{%
\ifundef{#1}
{\xdef#1{#2}}
{\xdef#1{#2\expandonce#1}}}
\newrobustcmd*{\protected@epreto}{\etb@protected\epreto}
\newrobustcmd*{\protected@xpreto}{\etb@protected\xpreto}
% {<csname>}{<code>}
\newrobustcmd*{\csappto}[1]{\expandafter\appto\csname#1\endcsname}
\newrobustcmd*{\cseappto}[1]{\expandafter\eappto\csname#1\endcsname}
\newrobustcmd*{\csgappto}[1]{\expandafter\gappto\csname#1\endcsname}
\newrobustcmd*{\csxappto}[1]{\expandafter\xappto\csname#1\endcsname}
\newrobustcmd*{\protected@cseappto}{\etb@protected\cseappto}
\newrobustcmd*{\protected@csxappto}{\etb@protected\csxappto}
% {<csname>}{<code>}
\newrobustcmd*{\cspreto}[1]{\expandafter\preto\csname#1\endcsname}
\newrobustcmd*{\csepreto}[1]{\expandafter\epreto\csname#1\endcsname}
\newrobustcmd*{\csgpreto}[1]{\expandafter\gpreto\csname#1\endcsname}
\newrobustcmd*{\csxpreto}[1]{\expandafter\xpreto\csname#1\endcsname}
\newrobustcmd*{\protected@csepreto}{\etb@protected\csepreto}
\newrobustcmd*{\protected@csxpreto}{\etb@protected\csxpreto}
% {<cstoken>}{<numexpr>}
\newrobustcmd*{\numdef}[2]{%
\ifundef#1{\let#1\z@}{}%
\edef#1{\the\numexpr#2}}
\newrobustcmd*{\numgdef}[2]{%
\ifundef#1{\let#1\z@}{}%
\xdef#1{\the\numexpr#2}}
% {<csname>}{<numexpr>}
\newrobustcmd*{\csnumdef}[1]{%
\expandafter\numdef\csname#1\endcsname}
\newrobustcmd*{\csnumgdef}[1]{%
\expandafter\numgdef\csname#1\endcsname}
% {<cstoken>}{<dimexpr>}
\newrobustcmd*{\dimdef}[2]{%
\ifundef#1{\let#1\z@}{}%
\edef#1{\the\dimexpr#2}}
\newrobustcmd*{\dimgdef}[2]{%
\ifundef#1{\let#1\z@}{}%
\xdef#1{\the\dimexpr#2}}
% {<csname>}{<dimexpr>}
\newrobustcmd*{\csdimdef}[1]{%
\expandafter\dimdef\csname#1\endcsname}
\newrobustcmd*{\csdimgdef}[1]{%
\expandafter\dimgdef\csname#1\endcsname}
% {<cstoken>}{<glueexpr>}
\newrobustcmd*{\gluedef}[2]{%
\ifundef#1{\let#1\z@skip}{}%
\edef#1{\the\glueexpr#2}}
\newrobustcmd*{\gluegdef}[2]{%
\ifundef#1{\let#1\z@skip}{}%
\xdef#1{\the\glueexpr#2}}
% {<csname>}{<glueexpr>}
\newrobustcmd*{\csgluedef}[1]{%
\expandafter\gluedef\csname#1\endcsname}
\newrobustcmd*{\csgluegdef}[1]{%
\expandafter\gluegdef\csname#1\endcsname}
% {<cstoken>}{<muexpr>}
\newrobustcmd*{\mudef}[2]{%
\ifundef#1{\def#1{0mu}}{}%
\edef#1{\the\muexpr#2}}
\newrobustcmd*{\mugdef}[2]{%
\ifundef#1{\let#1\z@}{}%
\xdef#1{\the\muexpr#2}}
% {<csname>}{<muexpr>}
\newrobustcmd*{\csmudef}[1]{%
\expandafter\mudef\csname#1\endcsname}
\newrobustcmd*{\csmugdef}[1]{%
\expandafter\mugdef\csname#1\endcsname}
% {<counter>}{<numexpr>}
\newrobustcmd*{\defcounter}[2]{%
\ifcsundef{c@#1}
{\etb@noglobal\@nocounterr{#1}}%
{\csname c@#1\endcsname\numexpr#2\relax}}
% {<length>}{<glueexpr>}
\newrobustcmd*{\deflength}[2]{%
\ifundef{#1}
{\etb@noglobal\etb@err@nolen{#1}}%
{#1\glueexpr#2\relax}}
\protected\def\etb@err@nolen#1{%
\etb@error{Length '\string#1' undefined}\@eha}
% {<name>}
\newrobustcmd*{\newbool}[1]{%
\expandafter\@ifdefinable\csname if#1\endcsname{%
\expandafter\newif\csname if#1\endcsname}}
% {<name>}
\newrobustcmd*{\providebool}[1]{%
\ifcsundef{if#1}
{\expandafter\newif\csname if#1\endcsname}
{\begingroup
\edef\@tempa{\expandafter\meaning\csname if#1\endcsname}%
\ifx\@tempa\etb@isfalse
\else
\ifx\@tempa\etb@istrue
\else
\etb@error{\@backslashchar if#1 not a boolean}\@eha
\fi
\fi
\endgroup}}
% {<name>}{<true>|<false>}
\newrobustcmd*{\setbool}[2]{%
\ifcsundef{if#1}
{\etb@noglobal\etb@err@nobool{#1}}
{\ifcsundef{#1#2}
{\etb@noglobal\etb@err@boolval{#2}}
{\csname#1#2\endcsname}}}
% {<name>}
\newrobustcmd*{\booltrue}[1]{%
\ifcsundef{if#1}
{\etb@noglobal\etb@err@nobool{#1}}
{\csname#1true\endcsname}}
% {<name>}
\newrobustcmd*{\boolfalse}[1]{%
\ifcsundef{if#1}
{\etb@noglobal\etb@err@nobool{#1}}
{\csname#1false\endcsname}}
\edef\etb@istrue{\meaning\iftrue}
\edef\etb@isfalse{\meaning\iffalse}
\protected\def\etb@noglobal{\let\relax\relax}
% {<name>}{<true}{<false>}
\newcommand*{\ifbool}[1]{%
\ifcsundef{if#1}
{\etb@err@nobool{#1}\@gobbletwo}
{\csname if#1\endcsname
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}}
% {<name>}{<not true}{<not false>}
\newcommand*{\notbool}[1]{%
\ifcsundef{if#1}
{\etb@err@nobool{#1}\@gobbletwo}
{\csname if#1\endcsname
\expandafter\@secondoftwo
\else
\expandafter\@firstoftwo
\fi}}
\protected\def\etb@err@nobool#1{%
\etb@error{Boolean '\@backslashchar if#1' undefined}\@eha}
\def\etb@err@boolval#1{%
\etb@error
{Invalid boolean value '#1'}
{Valid boolean values are 'true' and 'false'.}}
% {<name>}
\newrobustcmd*{\newtoggle}[1]{%
\ifcsdef{etb@tgl@#1}
{\etb@error{Toggle '#1' already defined}\@eha}
{\cslet{etb@tgl@#1}\@secondoftwo}}
% {<name>}
\newrobustcmd*{\providetoggle}[1]{%
\ifcsdef{etb@tgl@#1}
{}
{\cslet{etb@tgl@#1}\@secondoftwo}}
% {<name>}{<true>|<false>}
\newrobustcmd*{\settoggle}[2]{%
\ifcsdef{etb@tgl@#1}
{\ifcsdef{etb@toggle#2}
{\csletcs{etb@tgl@#1}{etb@toggle#2}}
{\etb@noglobal\etb@err@boolval{#2}}}
{\etb@noglobal\etb@err@notoggle{#1}}}
% {<name>}
\newrobustcmd*{\toggletrue}[1]{%
\ifcsdef{etb@tgl@#1}
{\cslet{etb@tgl@#1}\etb@toggletrue}
{\etb@noglobal\etb@err@notoggle{#1}}}
% {<name>}
\newrobustcmd*{\togglefalse}[1]{%
\ifcsdef{etb@tgl@#1}
{\cslet{etb@tgl@#1}\etb@togglefalse}
{\etb@noglobal\etb@err@notoggle{#1}}}
\let\etb@toggletrue\@firstoftwo
\let\etb@togglefalse\@secondoftwo
% {<name>}{<true}{<false>}
\newcommand*{\iftoggle}[1]{%
\ifcsdef{etb@tgl@#1}
{\csname etb@tgl@#1\endcsname}
{\etb@err@notoggle{#1}\@gobbletwo}}
% {<name>}{<not true}{<not false>}
\newcommand*{\nottoggle}[1]{%
\ifcsdef{etb@tgl@#1}
{\csname etb@tgl@#1\endcsname\@secondoftwo\@firstoftwo}
{\etb@err@notoggle{#1}\@gobbletwo}}
\protected\def\etb@err@notoggle#1{%
\etb@error{Toggle '#1' undefined}\@eha}
% {<cstoken>}{<true}{<false>}
\protected\def\etb@ifscanable#1{%
\begingroup
\edef\etb@resrvda{%
\def\noexpand\etb@resrvda####1\detokenize{macro}:####2->####3&{%
####1\def\string\etb@resrvda####2{####3}}%
\edef\noexpand\etb@resrvda{\noexpand\etb@resrvda\meaning#1&}}%
\etb@resrvda
\makeatletter
\endlinechar\m@ne
\scantokens\expandafter{\etb@resrvda}%
\expandafter\endgroup\ifx#1\etb@resrvda
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
% {<cstoken>}{<search>}{<true}{<false>}
\protected\long\def\etb@ifpattern#1#2{%
\begingroup
\edef\etb@resrvda{%
\def\noexpand\etb@resrvda####1\detokenize{#2}####2&{%
\endgroup\noexpand\noexpand\noexpand\ifblank{####2}}%
\edef\noexpand\etb@resrvda{\noexpand\etb@resrvda
\expandafter\strip@prefix\meaning#1\detokenize{#2}&}%
\noexpand\etb@resrvda}%
\etb@resrvda\@secondoftwo\@firstoftwo}
% {<string>}{<true}{<false>}
\protected\long\def\etb@ifhashcheck#1{%
\begingroup
\edef\etb@resrvda{\detokenize{#1}}%
\expandafter\endgroup
\expandafter\etb@ifhashcheck@i\meaning\etb@resrvda&}
\edef\etb@ifhashcheck@i#1&{%
\noexpand\expandafter
\noexpand\etb@ifhashcheck@ii
\noexpand\strip@prefix#1\string#\string#&}
\edef\etb@ifhashcheck@ii{%
\def\noexpand\etb@ifhashcheck@ii##1\string#\string###2&}
\etb@ifhashcheck@ii{\ifblank{#2}}
% {<cstoken>}
\newrobustcmd*{\robustify}[1]{%
\ifundef{#1}
{\etb@error{\string#1 undefined}\@eha}
{\ifdefmacro{#1}
{\ifdefltxprotect{#1}
{\letcs\etb@resrvda{\expandafter\@gobble\string#1 }%
\@tempswatrue}
{\let\etb@resrvda#1%
\@tempswafalse}%
\ifdefparam\etb@resrvda
{\etb@ifscanable\etb@resrvda
{\etb@robustify\etb@resrvda
\let#1\etb@resrvda}
{\etb@error{Failed to robustify \string#1}
{The command is special and cannot be
handled by \string\robustify.}%
\@tempswafalse}}
{\protected\edef#1{\expandonce\etb@resrvda}}%
\if@tempswa
\ifcsdef{\string#1 }
{}
{\csundef{\expandafter\@gobble\string#1 }}%
\fi
\undef\etb@resrvda}
{\etb@error{\string#1 not a macro}\@eha}}}
\def\etb@robustify#1{%
\begingroup
\edef\etb@resrvdb{%
\def\noexpand\etb@resrvdb####1\detokenize{macro}:####2->####3&{%
\protected####1\def\string#1\space####2{####3}}%
\edef\noexpand\etb@resrvdb{%
\noexpand\etb@resrvdb\meaning#1&}}%
\etb@resrvdb
\etb@patchcmd@scantoks\etb@resrvdb}
% {<cstoken>}{<search>}{<true}{<false>}
% *{<cstoken>}{<true}{<false>}
\newrobustcmd{\ifpatchable}{%
\etb@dbg@trce\ifpatchable
\begingroup
\@makeother\#%
\@ifstar\etb@ifpatchable@i\etb@ifpatchable}
\long\def\etb@ifpatchable#1#2{%
\endgroup
\etb@dbg@init#1%
\ifundef{#1}
{\etb@dbg@fail{def}\@secondoftwo}
{\etb@dbg@info{def}%
\ifdefmacro{#1}
{\etb@dbg@info{mac}%
\etb@ifscanable{#1}
{\etb@ifhashcheck{#2}
{\etb@dbg@info{tok}%
\etb@ifpattern#1{#2}
{\etb@dbg@info{pat}%
\etb@dbg@info{pos}\@firstoftwo}
{\etb@dbg@fail{pat}\@secondoftwo}}
{\etb@dbg@fail{hsh}\@secondoftwo}}
{\etb@dbg@fail{tok}\@secondoftwo}}
{\etb@dbg@fail{mac}\@secondoftwo}}}
\long\def\etb@ifpatchable@i#1{%
\endgroup
\etb@dbg@init#1%
\ifundef{#1}
{\etb@dbg@fail{def}\@secondoftwo}
{\etb@dbg@info{def}%
\ifdefmacro{#1}
{\etb@dbg@info{mac}%
\ifdefparam{#1}
{\etb@dbg@info{prm}%
\etb@ifscanable{#1}
{\etb@dbg@info{tok}%
\etb@dbg@info{pos}\@firstoftwo}
{\etb@dbg@fail{tok}\@secondoftwo}}
{\etb@dbg@info{prl}%
\ifdefprotected{#1}
{\etb@dbg@info{pro}}
{}%
\etb@dbg@info{pos}\@firstoftwo}}
{\etb@dbg@fail{mac}\@secondoftwo}}}
% [<prefix>]{<cstoken>}{<search>}{<replace>}{<success>}{<failure>}
\newrobustcmd*{\patchcmd}{%
\etb@dbg@trce\patchcmd
\begingroup
\@makeother\#%
\etb@patchcmd}
\newcommand{\etb@patchcmd}[4][########1]{%
\etb@ifpatchable#2{#3}
{\etb@dbg@succ{ret}%
\begingroup
\edef\etb@resrvda{%
\def\noexpand\etb@resrvda####1\detokenize{macro:}####2->####3&{%
#1\def\string\etb@resrvda\space####2{\noexpand\etb@resrvdb####3&}}%
\def\noexpand\etb@resrvdb####1\detokenize{#3}####2&{%
####1\detokenize{#4}####2}%
\edef\noexpand\etb@resrvda{%
\noexpand\etb@resrvda\meaning#2&}}%
\etb@resrvda
\etb@patchcmd@scantoks\etb@resrvda
\let#2\etb@resrvda
\undef\etb@resrvda
\@firstoftwo}%
{\@secondoftwo}}
\def\etb@patchcmd@scantoks#1{%
\edef\etb@resrvda{\endgroup
\endlinechar\m@ne
\unexpanded{\makeatletter\scantokens}{#1}%
\endlinechar\the\endlinechar\relax
\catcode\number`\@=\the\catcode`\@\relax}%
\etb@resrvda}
% {<cstoken>}{<code>}{<success>}{<failure>}
\newrobustcmd*{\apptocmd}{%
\etb@dbg@trce\apptocmd
\begingroup
\@makeother\#%
\etb@hooktocmd\etb@append}
\newrobustcmd*{\pretocmd}{%
\etb@dbg@trce\pretocmd
\begingroup
\@makeother\#%
\etb@hooktocmd\etb@prepend}
\long\def\etb@hooktocmd#1#2#3{%
\endgroup
\etb@dbg@init#2%
\ifundef{#2}
{\etb@dbg@fail{def}\@secondoftwo}
{\etb@dbg@info{def}%
\ifdefmacro{#2}
{\etb@dbg@info{mac}%
\ifdefparam{#2}
{\etb@dbg@info{prm}%
\etb@ifscanable{#2}
{\etb@ifhashcheck{#3}
{\etb@dbg@info{tok}%
\etb@dbg@succ{ret}%
\etb@hooktocmd@i#1#2{#3}%
\@firstoftwo}
{\etb@dbg@fail{hsh}\@secondoftwo}}
{\etb@dbg@fail{tok}\@secondoftwo}}
{\etb@dbg@info{prl}%
\ifdefprotected{#2}
{\etb@dbg@info{pro}%
\etb@dbg@succ{red}%
\protected}
{\etb@dbg@succ{red}}%
\edef#2{#1{\expandonce#2}{\unexpanded{#3}}}%
\@firstoftwo}}
{\etb@dbg@fail{mac}\@secondoftwo}}}
\long\def\etb@hooktocmd@i#1#2#3{%
\begingroup
\edef\etb@resrvda{%
\def\noexpand\etb@resrvda####1\detokenize{macro}:####2->####3&{%
####1\def\string\etb@resrvda\space####2{#1{####3}{\detokenize{#3}}}}%
\edef\noexpand\etb@resrvda{%
\noexpand\etb@resrvda\meaning#2&}}%
\etb@resrvda
\etb@patchcmd@scantoks\etb@resrvda
\let#2\etb@resrvda
\undef\etb@resrvda}
\long\def\etb@append#1#2{#1#2}
\long\def\etb@prepend#1#2{#2#1}
\newrobustcmd*{\tracingpatches}{%
\etb@info{Enabling tracing}%
\input{etoolbox.def}%
\global\let\tracingpatches\relax}
\@onlypreamble\tracingpatches
\let\etb@dbg@trce\@gobble
\let\etb@dbg@init\@gobble
\let\etb@dbg@info\@gobble
\let\etb@dbg@succ\@gobble
\let\etb@dbg@fail\@gobble
% {<numeral>}
\newcommand{\rmntonum}[1]{%
\ifblank{#1}
{}
{\expandafter\etb@rti@end\number\numexpr
\expandafter\etb@rti@prs\detokenize{#1}&\relax}}
\def\etb@rti@prs#1#2{%
\ifx%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{#1#2}
{\ifx%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\etb@rti@chk#1+\etb@rti@num#1#2}
{\etb@rti@chk#1\etb@rti@chk#2%
\ifnum\etb@rti@num#1<\etb@rti@num#2 %
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{+\etb@rti@num#2-\etb@rti@num#1\etb@rti@prs}
{+\etb@rti@num#1\etb@rti@prs#2}}}}
\def\etb@rti@chk#1{%
\ifcsname etb@rmn@#1\endcsname
\else
\expandafter\etb@rti@brk
\fi}
\def\etb@rti@brk#1&{+\z@&-1}
\def\etb@rti@end#1\relax{\ifblank{#2}{#1}{#2}}
\def\etb@rti@num#1{\csname etb@rmn@#1\endcsname}
\chardef\etb@rmn@i=1
\chardef\etb@rmn@I=1
\chardef\etb@rmn@v=5
\chardef\etb@rmn@V=5
\chardef\etb@rmn@x=10
\chardef\etb@rmn@X=10
\chardef\etb@rmn@l=50
\chardef\etb@rmn@L=50
\chardef\etb@rmn@c=100
\chardef\etb@rmn@C=100
\mathchardef\etb@rmn@d=500
\mathchardef\etb@rmn@D=500
\mathchardef\etb@rmn@m=1000
\mathchardef\etb@rmn@M=1000
% {<numeral>}{<true>}{<false>}
\newcommand{\ifrmnum}[1]{%
\ifblank{#1}
{\@secondoftwo}
{\expandafter\etb@ifr@prs\detokenize{#1}\relax}}
\def\etb@ifr@prs#1{%
\ifx\relax#1%
\expandafter\@firstoftwo
\else
\ifcsname etb@rmn@#1\endcsname
\expandafter\expandafter
\expandafter\etb@ifr@prs
\else
\expandafter\expandafter
\expandafter\etb@ifr@brk
\fi
\fi}
\def\etb@ifr@brk#1\relax{\@secondoftwo}
% <*>{<command>}{<separator>}
\newrobustcmd*{\DeclareListParser}{%
\@ifstar
{\etb@defparser\etb@defparser@arg}
{\etb@defparser\etb@defparser@do}}
\def\etb@defparser#1#2#3{%
\@ifdefinable#2{#1{#2}{#3}}}
\def\etb@defparser@do#1#2{%
\begingroup
\edef\@tempa{\endgroup
\long\def\noexpand#1####1{%
\expandafter\noexpand
\csname etb@lst@\expandafter\@gobble\string#1\endcsname
\space####1\noexpand#2&}%
\long\csdef{etb@lst@\expandafter\@gobble\string#1}####1\noexpand#2####2&{%
\noexpand\etb@listitem\noexpand\do{####1}%
\noexpand\ifblank{####2}
{\noexpand\listbreak}
{\expandafter\noexpand
\csname etb@lst@\expandafter\@gobble\string#1\endcsname
\space####2}&}}%
\@tempa}
\def\etb@defparser@arg#1#2{%
\begingroup
\edef\@tempa{\endgroup
\long\def\noexpand#1####1####2{%
\expandafter\noexpand
\csname etb@lst@\expandafter\@gobble\string#1\endcsname
{####1}\space####2\noexpand#2&}%
\long\csdef{etb@lst@\expandafter\@gobble\string#1}####1####2\noexpand#2####3&{%
\noexpand\etb@listitem{####1}{####2}%
\noexpand\ifblank{####3}
{\noexpand\listbreak}
{\expandafter\noexpand
\csname etb@lst@\expandafter\@gobble\string#1\endcsname
{####1}\space####3}&}}%
\@tempa}
\long\def\etb@listitem#1#2{%
\ifblank{#2}
{}
{\expandafter\etb@listitem@i
\expandafter{\@firstofone#2}{#1}}}
\long\def\etb@listitem@i#1#2{#2{#1}}
\newcommand*{\listbreak}{}
\long\def\listbreak#1&{}
% {<item1>,<item2>,...} => \do{<item1>}\do{<item2>}...
\DeclareListParser{\docsvlist}{,}
% {<handler>}{<item1>,<item2>,...} => <handler>{<item1>}<handler>{<item2>}...
\DeclareListParser*{\forcsvlist}{,}
% {<listmacro>}{<string>}
\newrobustcmd{\listadd}[2]{%
\ifblank{#2}{}{\appto#1{#2|}}}
\newrobustcmd{\listeadd}[2]{%
\begingroup
\edef\etb@tempa{\endgroup\noexpand\ifblank{#2}}%
\etb@tempa{}{\eappto#1{#2|}}}
\newrobustcmd{\listgadd}[2]{%
\ifblank{#2}{}{\gappto#1{#2|}}}
\newrobustcmd{\listxadd}[2]{%
\begingroup
\edef\etb@tempa{\endgroup\noexpand\ifblank{#2}}%
\etb@tempa{}{\xappto#1{#2|}}}
% {<listcsname>}{<string>}
\newrobustcmd{\listcsadd}[1]{%
\expandafter\listadd\csname#1\endcsname}
\newrobustcmd{\listcseadd}[1]{%
\expandafter\listeadd\csname#1\endcsname}
\newrobustcmd{\listcsgadd}[1]{%
\expandafter\listgadd\csname#1\endcsname}
\newrobustcmd{\listcsxadd}[1]{%
\expandafter\listxadd\csname#1\endcsname}
% {<string>}{<listmacro>}{<true>}{<false>}
\newrobustcmd{\ifinlist}[2]{%
\begingroup
\def\etb@tempa##1|#1|##2&{\endgroup
\ifblank{##2}\@secondoftwo\@firstoftwo}%
\expandafter\etb@tempa\expandafter|#2|#1|&}
\newrobustcmd{\xifinlist}[1]{%
\begingroup
\edef\etb@tempa{\endgroup\ifinlist{#1}}%
\etb@tempa}
% {<string>}{<listcsname>}{<true>}{<false>}
\newrobustcmd{\ifinlistcs}[2]{%
\expandafter\etb@ifinlistcs@i\csname #2\endcsname{#1}}
\long\def\etb@ifinlistcs@i#1#2{\ifinlist{#2}{#1}}
\newrobustcmd{\xifinlistcs}[1]{%
\begingroup
\edef\etb@tempa{\endgroup\ifinlistcs{#1}}%
\etb@tempa}
% {<handler>}{<listmacro>} => <handler>{<item1>}<handler>{<item2>}...
\newcommand*{\forlistloop}[2]{%
\expandafter\etb@forlistloop\expandafter{#2}{#1}}
\long\def\etb@forlistloop#1#2{\etb@forlistloop@i{#2}#1|&}
\long\def\etb@forlistloop@i#1#2|#3&{%
\ifblank{#2}
{}
{#1{#2}}%
\ifblank{#3}
{\listbreak}
{\etb@forlistloop@i{#1}#3}%
&}
% {<handler>}{<listcsname>} => <handler>{<item1>}<handler>{<item2>}...
\newcommand*{\forlistcsloop}[2]{%
\expandafter\expandafter\expandafter\etb@forlistloop
\expandafter\expandafter\expandafter{\csname#2\endcsname}{#1}}
% {<listmacro>} => \do{<item1>}\do{<item2>}...
\newcommand*{\dolistloop}{\forlistloop\do}
% {<listcsname>} => \do{<item1>}\do{<item2>}...
\newcommand*{\dolistcsloop}{\forlistcsloop\do}
% {<code>}
\newrobustcmd*{\AtEndPreamble}{\gappto\@endpreamblehook}
\newcommand*{\@endpreamblehook}{}
\preto\document{%
\endgroup
\let\AtEndPreamble\@firstofone
\@endpreamblehook
\protected\def\AtEndPreamble{\@notprerr\@gobble}%
\undef\@endpreamblehook
\begingroup}
% {<code>}
\newrobustcmd*{\AfterPreamble}{\AtBeginDocument}
\AtEndPreamble{\let\AfterPreamble\@firstofone}
% {<code>}
\newrobustcmd*{\AfterEndPreamble}{\gappto\@afterendpreamblehook}
\newcommand*{\@afterendpreamblehook}{}
\appto\document{%
\let\AfterEndPreamble\@firstofone
\@afterendpreamblehook
\protected\def\AfterEndPreamble{\@notprerr\@gobble}%
\undef\@afterendpreamblehook
\ignorespaces}
\AtEndDocument{\let\AfterEndPreamble\@gobble}
% {<code>}
\newrobustcmd*{\AfterEndDocument}{\gappto\@afterenddocumenthook}
\newcommand*{\@afterenddocumenthook}{}
\patchcmd\enddocument
{\deadcycles}
{\let\AfterEndDocument\@firstofone
\@afterenddocumenthook
\deadcycles}
{}
{\AtEndDocument{%
\let\etb@@end\@@end
\def\@@end{%
\let\AfterEndDocument\@firstofone
\@afterenddocumenthook
\etb@@end}}}
% {<environment>}{<code>}
\newrobustcmd{\AtBeginEnvironment}[1]{%
\csgappto{@begin@#1@hook}}
\patchcmd\begin
{\csname #1\endcsname}
{\csuse{@begin@#1@hook}%
\csname #1\endcsname}
{}
{\etb@warning{%
Patching '\string\begin' failed!\MessageBreak
'\string\AtBeginEnvironment' will not work\@gobble}}
% {<environment>}{<code>}
\newrobustcmd{\AtEndEnvironment}[1]{%
\csgappto{@end@#1@hook}}
\patchcmd\end
{\csname end#1\endcsname}
{\csuse{@end@#1@hook}%
\csname end#1\endcsname}
{}
{\etb@warning{%
Patching '\string\end' failed!\MessageBreak
'\string\AtEndEnvironment' will not work\@gobble}}
% {<environment>}{<code>}
\newrobustcmd{\BeforeBeginEnvironment}[1]{%
\csgappto{@beforebegin@#1@hook}}
\pretocmd\begin
{\csuse{@beforebegin@#1@hook}}
{}
{\etb@warning{%
Patching '\string\begin' failed!\MessageBreak
'\string\BeforeBeginEnvironment' will not work\@gobble}}
% {<environment>}{<code>}
\newrobustcmd{\AfterEndEnvironment}[1]{%
\csgappto{@afterend@#1@hook}}
\patchcmd\end
{\if@ignore}
{\csuse{@afterend@#1@hook}%
\if@ignore}
{}
{\etb@warning{%
Patching '\string\end' failed!\MessageBreak
'\string\AfterEndEnvironment' will not work\@gobble}}
\endinput