%%%
%%%
%%% Parts of LaTeX: Slightly changed/simplified in places.
%%% Changes 
%%%    Copyright 1996-2022 David Carlisle LaTeX3 Project
%%% Original Code
%%%    Copyright 1993-1996 LaTeX3 Project and original authors
%%%
%%%  Problems relating to this fileshould not be sent to the LaTeX bugs address,
%%%  or any other LaTeX related support address.
%%%
%%% Problems should be reported as issues at
%%% https://github.com/davidcarlisle/graphics-pln/issues
%%% 
%%%
%%% This file may be distributed under the terms of the LPPL, see
%%% README.txt for details.

%  1996/01/29 initial version
%  1996/05/09 a few missing commands added
%  1996/11/21 fixed @ catcode handling
%  2010/01/02 import LaTeX's current \filename@parse [KB/DC]
% (http://sourceforge.net/projects/asymptote/forums/forum/409349/topic/3405573)
%  2010/01/07 import was incomplete [KB]
%  2010/02/03 accept *-form of \ProcessOptions [KB/DL]
%  2016/08/17 fix catcode @ handling (again), document github address [DC]
%  2017/06/01 assorted updates to cover updated latex drivers
%  2019/07/20 more updates for latex drivers
%  2020/03/02 move to own git repository and add newcommand fix from issue #2
%  2021/11/15 Define \@backslashchar for issue #4
%  2022/06/13 Define \@ehd error help (usedby color errors)
%             Define fallback \mathcolor so color package does not require expl3
%  2022/09/28 Make \newdimen non-\outer for new .def files
%  2023/11/09Guard against \@hash@ already being let to #

\edef\resetatcatcode{\catcode`\noexpand\@\the\catcode`\@\relax}

\def\makeatletter{\catcode`\@11\relax}
\def\makeatother{\catcode`\@12\relax}
\makeatletter


% 2016/08/17 move after \makeatletter
% so \input graphicx \input color works.
\ifx\miniltx\undefined\else\endinput\fi
\let\miniltx\box

\def\@makeother#1{\catcode`#1=12\relax}


\def\@ifnextchar#1#2#3{%
  \let\reserved@d=#1%
  \def\reserved@a{#2}\def\reserved@b{#3}%
  \futurelet\@let@token\@ifnch}
\def\@ifnch{%
  \ifx\@let@token\@sptoken
    \let\reserved@c\@xifnch
  \else
    \ifx\@let@token\reserved@d
      \let\reserved@c\reserved@a
    \else
      \let\reserved@c\reserved@b
    \fi
  \fi
  \reserved@c}
\begingroup
\def\:{\global\let\@sptoken= } \:  % this makes \@sptoken a space token
\def\:{\@xifnch} \expandafter\gdef\: {\futurelet\@let@token\@ifnch}
\endgroup



\def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
\long\def\@dblarg#1{\@ifnextchar[{#1}{\@xdblarg{#1}}}
\long\def\@xdblarg#1#2{#1[{#2}]{#2}}

\long\def \@gobble #1{}
\long\def \@gobbletwo #1#2{}
\long\def \@gobblefour #1#2#3#4{}
\long\def\@firstofone#1{#1}
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}

\edef\@backslashchar{\expandafter\@gobble\string\\}

\def\NeedsTeXFormat#1{\@ifnextchar[\@needsf@rmat\relax}
\def\@needsf@rmat[#1]{}
\def\ProvidesPackage#1{\@ifnextchar[%
    {\@pr@videpackage{#1}}{\@pr@videpackage#1[]}}
\def\@pr@videpackage#1[#2]{\wlog{#1: #2}}
\let\ProvidesFile\ProvidesPackage
\def\PackageInfo#1#2{{%
   \newlinechar`\^^J\def\MessageBreak{^^J#1: }%
   \wlog{#1: #2}}}

\let\DeclareOption\@gobbletwo
\def\ProcessOptions{\@ifstar\relax\relax}

\def\RequirePackage{%
  \@fileswithoptions\@pkgextension}
\def\@fileswithoptions#1{%
  \@ifnextchar[%]
    {\@fileswith@ptions#1}%
    {\@fileswith@ptions#1[]}}
\def\@fileswith@ptions#1[#2]#3{%
  \@ifnextchar[%]
  {\@fileswith@pti@ns#1[#2]#3}%
  {\@fileswith@pti@ns#1[#2]#3[]}}

\def\@fileswith@pti@ns#1[#2]#3[#4]{%
    \def\reserved@b##1,{%
      \ifx\@nil##1\relax\else
        \ifx\relax##1\relax\else
         \noexpand\@onefilewithoptions##1[#2][#4]\noexpand\@pkgextension
        \fi
        \expandafter\reserved@b
      \fi}%
      \edef\reserved@a{\zap@space#3 \@empty}%
      \edef\reserved@a{\expandafter\reserved@b\reserved@a,\@nil,}%
  \reserved@a}

\def\zap@space#1 #2{%
  #1%
  \ifx#2\@empty\else\expandafter\zap@space\fi
  #2}

\def\strip@prefix#1>{}

\let\@empty\empty
\def\@pkgextension{sty}

\def\@onefilewithoptions#1[#2][#3]#4{%
  \input #1.#4 }



\def\typein{%
  \let\@typein\relax
  \@testopt\@xtypein\@typein}
\def\@xtypein[#1]#2{%
  \message{#2}%
  \advance\endlinechar\@M
  \read\@inputcheck to#1%
  \advance\endlinechar-\@M
  \@typein}
\def\@namedef#1{\expandafter\def\csname #1\endcsname}
\def\@nameuse#1{\csname #1\endcsname}
\def\@cons#1#2{\begingroup\let\@elt\relax\xdef#1{#1\@elt #2}\endgroup}
\def\@car#1#2\@nil{#1}
\def\@cdr#1#2\@nil{#2}
\def\@carcube#1#2#3#4\@nil{#1#2#3}
\def\@preamblecmds{}

\def\@star@or@long#1{%
  \@ifstar
   {\let\l@ngrel@x\relax#1}%
   {\let\l@ngrel@x\long#1}}

\let\l@ngrel@x\relax
\def\newcommand{\@star@or@long\new@command}
\def\new@command#1{%
  \@testopt{\@newcommand#1}0}
\def\@newcommand#1[#2]{%
  \@ifnextchar [{\@xargdef#1[#2]}%
                {\@argdef#1[#2]}}
\long\def\@argdef#1[#2]#3{%
   \@ifdefinable #1{\@yargdef#1\@ne{#2}{#3}}}
\long\def\@xargdef#1[#2][#3]#4{%
  \@ifdefinable#1{%
     \expandafter\def\expandafter#1\expandafter{%
          \expandafter
          \@protected@testopt
          \expandafter
          #1%
          \csname\string#1\expandafter\endcsname
          {#3}}%
       \expandafter\@yargdef
          \csname\string#1\endcsname
           \tw@
           {#2}%
           {#4}}}
\def\@testopt#1#2{%
  \@ifnextchar[{#1}{#1[#2]}}
\def\@protected@testopt#1{%%
  \ifx\protect\@typeset@protect
    \expandafter\@testopt
  \else
    \@x@protect#1%
  \fi}
\let\@hash@\relax
\long\def\@yargdef#1#2#3{%
  \@tempcnta#3\relax
  \advance \@tempcnta \@ne
  \let\@hash@\relax
  \edef\reserved@a{\ifx#2\tw@ [\@hash@1]\fi}%
  \@tempcntb #2%
  \@whilenum\@tempcntb <\@tempcnta
     \do{%
         \edef\reserved@a{\reserved@a\@hash@\the\@tempcntb}%
         \advance\@tempcntb \@ne}%
  \let\@hash@##%
  \l@ngrel@x\expandafter\def\expandafter#1\reserved@a}
\long\def\@reargdef#1[#2]#3{%
  \@yargdef#1\@ne{#2}{#3}}
\def\renewcommand{\@star@or@long\renew@command}
\def\renew@command#1{%
  {\escapechar\m@ne\xdef\@gtempa{{\string#1}}}%
  \expandafter\@ifundefined\@gtempa
     {\@latex@error{\string#1 undefined}\@ehc}%
     {}%
  \let\@ifdefinable\@rc@ifdefinable
  \new@command#1}
\long\def\@ifdefinable #1#2{%
      \edef\reserved@a{\expandafter\@gobble\string #1}%
     \@ifundefined\reserved@a
         {\edef\reserved@b{\expandafter\@carcube \reserved@a xxx\@nil}%
          \ifx \reserved@b\@qend \@notdefinable\else
            \ifx \reserved@a\@qrelax \@notdefinable\else
              #2%
            \fi
          \fi}%
         \@notdefinable}
\let\@@ifdefinable\@ifdefinable
\long\def\@rc@ifdefinable#1#2{%
  \let\@ifdefinable\@@ifdefinable
  #2}
\def\newenvironment{\@star@or@long\new@environment}
\def\new@environment#1{%
  \@testopt{\@newenva#1}0}
\def\@newenva#1[#2]{%
   \@ifnextchar [{\@newenvb#1[#2]}{\@newenv{#1}{[#2]}}}
\def\@newenvb#1[#2][#3]{\@newenv{#1}{[#2][#3]}}
\def\renewenvironment{\@star@or@long\renew@environment}
\def\renew@environment#1{%
  \@ifundefined{#1}%
     {\@latex@error{Environment #1 undefined}\@ehc
     }{}%
  \expandafter\let\csname#1\endcsname\relax
  \expandafter\let\csname end#1\endcsname\relax
  \new@environment{#1}}
\long\def\@newenv#1#2#3#4{%
  \@ifundefined{#1}%
    {\expandafter\let\csname#1\expandafter\endcsname
                         \csname end#1\endcsname}%
    \relax
  \expandafter\new@command
     \csname #1\endcsname#2{#3}%
     \l@ngrel@x\expandafter\def\csname end#1\endcsname{#4}}

\def\providecommand{\@star@or@long\provide@command}
\def\provide@command#1{%
  {\escapechar\m@ne\xdef\@gtempa{{\string#1}}}%
  \expandafter\@ifundefined\@gtempa
    {\def\reserved@a{\new@command#1}}%
    {\def\reserved@a{\renew@command\reserved@a}}%
   \reserved@a}%

% Missing \x@protect definition added 2020/03/02
\def\x@protect#1{%
  \ifx\protect\@typeset@protect\else
    \@x@protect#1%
  \fi
}
\def\@x@protect#1\fi#2#3{%
  \fi\protect#1%
}
\let\@typeset@protect\relax

\def\@ifundefined#1{%
  \expandafter\ifx\csname#1\endcsname\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}

\chardef\@xxxii=32
\mathchardef\@Mi=10001
\mathchardef\@Mii=10002
\mathchardef\@Miii=10003
\mathchardef\@Miv=10004

\newcount\@tempcnta
\newcount\@tempcntb
\newif\if@tempswa\@tempswatrue
\newdimen\@tempdima
\newdimen\@tempdimb
\newdimen\@tempdimc
\newbox\@tempboxa
\newskip\@tempskipa
\newskip\@tempskipb
\newtoks\@temptokena

\long\def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax
     #2\relax}\fi}
\long\def\@iwhilenum#1{\ifnum #1\expandafter\@iwhilenum
         \else\expandafter\@gobble\fi{#1}}
\long\def\@whiledim#1\do #2{\ifdim #1\relax#2\@iwhiledim{#1\relax#2}\fi}
\long\def\@iwhiledim#1{\ifdim #1\expandafter\@iwhiledim
        \else\expandafter\@gobble\fi{#1}}
\long\def\@whilesw#1\fi#2{#1#2\@iwhilesw{#1#2}\fi\fi}
\long\def\@iwhilesw#1\fi{#1\expandafter\@iwhilesw
         \else\@gobbletwo\fi{#1}\fi}
\def\@nnil{\@nil}
\def\@empty{}
\def\@fornoop#1\@@#2#3{}
\long\def\@for#1:=#2\do#3{%
  \expandafter\def\expandafter\@fortmp\expandafter{#2}%
  \ifx\@fortmp\@empty \else
    \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}
\long\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
       #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi}
\long\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
       \expandafter\@fornoop \else
      #4\relax\expandafter\@iforloop\fi#2\@@#3{#4}}
\def\@tfor#1:={\@tf@r#1 }
\long\def\@tf@r#1#2\do#3{\def\@fortmp{#2}\ifx\@fortmp\space\else
    \@tforloop#2\@nil\@nil\@@#1{#3}\fi}
\long\def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
       \expandafter\@fornoop \else
      #4\relax\expandafter\@tforloop\fi#2\@@#3{#4}}
\long\def\@break@tfor#1\@@#2#3{\fi\fi}
\def\@removeelement#1#2#3{%
  \def\reserved@a##1,#1,##2\reserved@a{##1,##2\reserved@b}%
  \def\reserved@b##1,\reserved@b##2\reserved@b{%
    \ifx,##1\@empty\else##1\fi}%
  \edef#3{%
    \expandafter\reserved@b\reserved@a,#2,\reserved@b,#1,\reserved@a}}

\let\ExecuteOptions\@gobble

\def\on@line{ on input line \the\inputlineno}
\ifx\@ehc\@undefined\def\@ehc{}\fi
% 2022/06/13
\ifx\@ehd\@undefined\def\@ehd{}\fi

\def\PackageError#1#2#3{{%
  \newlinechar`\^^J\def\MessageBreak{^^J\space\space#1: }%
  \errhelp{#3}\errmessage{#1: #2}}}
\def\@latex@error#1#2{\bgroup%
  \newlinechar`\^^J\def\MessageBreak{^^J\space\space#1: }%
  \edef\reserved@a{\egroup\errhelp{#2}\errmessage{#1}}%
  \reserved@a}


\bgroup\uccode`\!`\%\uppercase{\egroup
\def\@percentchar{!}}

% protect against loops in formats other than plain. 1999/04/27
\ifx\@@input\@undefined
 \let\@@input\input
\fi

\def\input{\@ifnextchar\bgroup\@iinput\@@input}
\def\@iinput#1{\@@input#1 }

\ifx\filename@parse\@undefined
  \def\reserved@a{./}\ifx\@currdir\reserved@a
    \wlog{^^JDefining UNIX/DOS style filename parser.^^J}
    \def\filename@parse#1{%
      \let\filename@area\@empty
      \expandafter\filename@path#1/\\}
    \def\filename@path#1/#2\\{%
      \ifx\\#2\\%
         \def\reserved@a{\filename@simple#1.\\}%
      \else
         \edef\filename@area{\filename@area#1/}%
         \def\reserved@a{\filename@path#2\\}%
      \fi
      \reserved@a}
  \else\def\reserved@a{[]}\ifx\@currdir\reserved@a
    \wlog{^^JDefining VMS style filename parser.^^J}
    \def\filename@parse#1{%
      \let\filename@area\@empty
      \expandafter\filename@path#1]\\}
    \def\filename@path#1]#2\\{%
      \ifx\\#2\\%
         \def\reserved@a{\filename@simple#1.\\}%
      \else
         \edef\filename@area{\filename@area#1]}%
         \def\reserved@a{\filename@path#2\\}%
      \fi
      \reserved@a}
  \else\def\reserved@a{:}\ifx\@currdir\reserved@a
    \wlog{^^JDefining Mac style filename parser.^^J}
    \def\filename@parse#1{%
      \let\filename@area\@empty
      \expandafter\filename@path#1:\\}
    \def\filename@path#1:#2\\{%
      \ifx\\#2\\%
         \def\reserved@a{\filename@simple#1.\\}%
      \else
         \edef\filename@area{\filename@area#1:}%
         \def\reserved@a{\filename@path#2\\}%
      \fi
      \reserved@a}
  \else
    \wlog{^^JDefining generic filename parser.^^J}
    \def\filename@parse#1{%
      \let\filename@area\@empty
      \expandafter\filename@simple#1.\\}
  \fi\fi\fi
  \def\filename@simple#1.#2\\{%
    \ifx\\#2\\%
       \let\filename@ext\relax
    \else
       \edef\filename@ext{\filename@dot#2\\}%
    \fi
    \edef\filename@base{#1}}
  \def\filename@dot#1.\\{#1}
\else
  \wlog{^^J^^J%
    \noexpand\filename@parse was defined in texsys.cfg:^^J%
    \expandafter\strip@prefix\meaning\filename@parse.^^J%
    }
\fi

\long\def \IfFileExists#1#2#3{%
  \openin\@inputcheck#1 %
  \ifeof\@inputcheck
    \ifx\input@path\@undefined
      \def\reserved@a{#3}%
    \else
      \def\reserved@a{\@iffileonpath{#1}{#2}{#3}}%
    \fi
  \else
    \closein\@inputcheck
    \edef\@filef@und{#1 }%
    \def\reserved@a{#2}%
  \fi
  \reserved@a}
\long\def\@iffileonpath#1{%
  \let\reserved@a\@secondoftwo
  \expandafter\@tfor\expandafter\reserved@b\expandafter
             :\expandafter=\input@path\do{%
    \openin\@inputcheck\reserved@b#1 %
    \ifeof\@inputcheck\else
      \edef\@filef@und{\reserved@b#1 }%
      \let\reserved@a\@firstoftwo%
      \closein\@inputcheck
      \@break@tfor
    \fi}%
  \reserved@a}
\long\def \InputIfFileExists#1#2{%
  \IfFileExists{#1}%
    {#2\@addtofilelist{#1}\@@input \@filef@und}}

\chardef\@inputcheck0

\let\@addtofilelist \@gobble


\def\@defaultunits{\afterassignment\remove@to@nnil}
\def\remove@to@nnil#1\@nnil{}

\newdimen\leftmarginv
\newdimen\leftmarginvi

\newdimen\@ovxx
\newdimen\@ovyy
\newdimen\@ovdx
\newdimen\@ovdy
\newdimen\@ovro
\newdimen\@ovri
\newdimen\@xdim
\newdimen\@ydim
\newdimen\@linelen
\newdimen\@dashdim


\long\def\mbox#1{\leavevmode\hbox{#1}}


\let\DeclareRobustCommand\newcommand
\let\@onlypreamble\@gobble


\def\AtBeginDocument#1{#1}
\let\protect\relax


\newdimen\fboxsep
\newdimen\fboxrule

\fboxsep = 3pt
\fboxrule = .4pt

\def\@height{height} \def\@depth{depth} \def\@width{width}
\def\@minus{minus}
\def\@plus{plus}
\def\hb@xt@{\hbox to}


\long\def\@begin@tempboxa#1#2{%
   \begingroup
     \setbox\@tempboxa#1{\color@begingroup#2\color@endgroup}%
     \def\width{\wd\@tempboxa}%
     \def\height{\ht\@tempboxa}%
     \def\depth{\dp\@tempboxa}%
     \let\totalheight\@ovri
     \totalheight\height
     \advance\totalheight\depth}
\let\@end@tempboxa\endgroup

\let\set@color\relax
\let\color@begingroup\relax
\let\color@endgroup\relax
\let\color@setgroup\relax
\let\normalcolor\relax
\let\color@hbox\relax
\let\color@vbox\relax
\let\color@endbox\relax

%  1996/05/09  \setlength and \strip@pt needed for some 
%              \includegraphics options (Thierry Bouche)

\def\setlength#1#2{#1#2\relax}

\begingroup
  \catcode`P=12
  \catcode`T=12
  \lowercase{
    \def\x{\def\rem@pt##1.##2PT{##1\ifnum##2>\z@.##2\fi}}}
  \expandafter\endgroup\x
\def\strip@pt{\expandafter\rem@pt\the}

% 1996/11/13 \AtBeginDvi used in driver files for including headers.
%              \@input added.


\def\AtBeginDvi#1{#1}

\def\@input#1{%
  \IfFileExists{#1}{\@@input\@filef@und}{\message{No file #1.}}}

% 1996/11/21
\def\@warning{\immediate\write16}

% 2019/07/20
\def\quote@name#1{"\quote@@name#1\@gobble""}
\def\quote@@name#1"{#1\quote@@name}
\def\unquote@name#1{\quote@@name#1\@gobble"}

\ifx\set@curr@file\@undefined
 \def\set@curr@file#1{\xdef\@curr@file{#1}}
\fi

% 2022/06/13
\ifx\mathcolor\@undefined
  % simplified version of \mathcolor
% 2022/12/02
  \csname protected\endcsname\def\mathcolor{\begingroup\@ifnextchar[\mlx@mathcolora\mlx@mathcolorb}
  \long\def\mlx@mathcolora[#1]#2#3{\color[#1]{#2}#3\endgroup}
  \long\def\mlx@mathcolorb#1#2{\color{#1}#2\endgroup}
\fi

% 2022/09/28
% remove outerness
\expandafter\def\expandafter\newdimen\expandafter{\newdimen}

% 2024/06/19
% more latex emulation
\providecommand\DeclareRelease[3]{}
\providecommand\DeclareCurrentRelease[2]{}
\providecommand\@spaces{\space\space\space\space}