% \iffalse meta-comment
%
% Copyright (C) 1998-2015 by Rolf Niepraschk <Rolf.Niepraschk@gmx.de>
% -------------------------------------------------------------------
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in:
%
%    http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
%
% This work has the LPPL maintenance status "author-maintained".
%
% Please send error reports and suggestions for improvements to
%   Rolf Niepraschk <Rolf.Niepraschk@gmx.de>.
%
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[2020/10/01]
%<package>\ProvidesPackage{eso-pic}
%<package>   [2023/05/03 v3.0c eso-pic (RN)]
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage{eso-pic,array}
\EnableCrossrefs\CodelineIndex\RecordChanges
\begin{document}
  \DocInput{eso-pic.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{758}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
% \providecommand\env[1]{\textsf{#1}}
% \providecommand\clsname[1]{\textsf{#1}}
% \providecommand\pkgname[1]{\textsf{#1}}
% \providecommand\optname[1]{\textsf{#1}}
% \providecommand\progname[1]{\textsf{#1}}
%
% \setlength\emergencystretch{3em}
%
%  \changes{v0.4}{1998/06/02}{Initial version}
%  \changes{v0.5}{1998/07/11}{Some bug corrections}
%  \changes{v0.6}{2000/05/13}{Some corrections for compatibility with
%     the \pkgname{html} package suggested by Ross Moore and a licence note}
%  \changes{v0.7}{2001/07/20}{New command \cmd{\AddToShipoutPicture*}}
%  \changes{v1.0}{2002/07/03}{New commands \cmd{\LenToUnit},%
%    \cmd{\AtPageUpperLeft}, \cmd{\AtPageCenter}, \cmd{\AtTextUpperLeft},
%    and \cmd{\AtTextCenter}.}
% \changes{v1.0c}{2002/10/30}{New command \cmd{\AtTextLowerLeft} and
%    corrections to \cmd{\AtTextUpperLeft}.}
%  \changes{v1.1}{2002/11/07}{New commands and package options for
%    background grids.}
%  \changes{v1.1b}{2002/11/16}{New package options "texcoord" and "pscoord"}
%  \changes{v1.1b}{2002/11/16}{New command \cmd{\AtPageLowerLeft}}
%
% \GetFileInfo{eso-pic.sty}
%
% \DoNotIndex{\newcommand,\newenvironment}
%
% \title{The \pkgname{eso-pic} package\thanks{This document
%   corresponds to \pkgname{eso-pic}~\fileversion, dated \filedate.}}
% \author{Rolf Niepraschk \\ \texttt{Rolf.Niepraschk@gmx.de}}
%
% \date{}
%
% \maketitle
%
% \section{Introduction}
%
%  This package makes it easy to add some picture commands to every page
%  at absolute positions.
% \section{Usage}
%   See also the example \LaTeX\ documents (|eso-*.tex|).
%
%  \subsection{Basic commands for adding \LaTeX{} stuff to the page background}
%  \DescribeMacro{\AddToShipoutPictureBG} All the picture commands which are
%  parameters of an \cs{AddToShipoutPictureBG} command will be added to the
%  internal macro \cs{ESO@HookIBG}. This macro is part of a
%  zero-length \texttt{picture} environment with basepoint at the lower left
%  corner of the page (default) or at the upper left corner
%  (package option ``texcoord''). The \texttt{picture} environment will be
%  shipped out at every new page.
%
%  \DescribeMacro{\AddToShipoutPictureBG*} \cs{AddToShipoutPictureBG*} works like
%  \cs{AddToShipoutPictureBG} but only for the current page. It used the internal
%  macro \cs{ESO@HookIIBG} which contents will be removed
%  automatically.
%
%  For compatibility the macros \cs{AddToShipoutPicture} and
%  \cs{AddToShipoutPicture*} are aliases for \cs{AddToShipoutPictureBG}
%  and \cs{AddToShipoutPictureBG*}.
%
%  \DescribeMacro{\AddToShipoutPictureFG}
%  \DescribeMacro{\AddToShipoutPictureFG*} Works like
%  \cs{AddToShipoutPictureBG} but the picture commands are on the top
%  of the normal document content.
%
%  \DescribeMacro{\ClearShipoutPictureBG} A call of
%  \cs{ClearShipoutPictureBG}
%  clears the contents of \cs{ESO@HookIBG}.
%
%  For compatibility the macro \cs{ClearShipoutPicture}
%  is an alias for \cs{ClearShipoutPictureBG}.
%
%  \DescribeMacro{\ClearShipoutPictureFG} A call of
%  \cs{ClearShipoutPictureFG}
%  clears the contents of \cs{ESO@HookIFG}.
%
%   \DescribeMacro{\LenToUnit} [Allows a length as parameter to a picture
%    command.] Note that this macro exist only for compatibility to older 
%    versions of this package. A recent \LaTeX\ version allows dimensions 
%    in picture commands.
%
%  \DescribeMacro{\gridSetup}
%   \cmd{\gridSetup}\oarg{gridunitname}\marg{gridunit}\marg{labelfactor}^^A
%     \marg{griddelta} \marg{gridDelta}\marg{gap}. For details see the
%     implementation section.\par\clearpage
%  \DescribeMacro{\AtPageUpperLeft}
%  \DescribeMacro{\AtPageLowerLeft}
%  \DescribeMacro{\AtPageCenter}
%  \DescribeMacro{\AtTextUpperLeft}
%  \DescribeMacro{\AtTextLowerLeft}
%  \DescribeMacro{\AtTextCenter}
%  \DescribeMacro{\AtStockUpperLeft}
%  \DescribeMacro{\AtStockLowerLeft}
%  \DescribeMacro{\AtStockCenter}
%    Helper macros for easier positioning on the page.
%
%  \subsection{Package options}
%  \begin{center}
%  \begin{tabular}{@{}>{\ttfamily}llp{.5\textwidth}@{}}
%    \textnormal{Option} & Value & Comments \\ \hline
%    pscoord & empty or \textit{true}, \textit{false} & The zero point of
%      the coordinate system is the lower left corner of the page
%      (the default). \\
%    texcoord & empty or \textit{true}, \textit{false} & The zero point of
%      the coordinate system is the upper left corner of the page. \\
%    grid & empty or \textit{true}, \textit{false} & A grid is drawing;
%      default: false. \\
%    gridBG & empty or \textit{true}, \textit{false} & Put the grid in the
%      background; default: false.\\
%    gridunit & \textit{mm}, \textit{in}, \textit{bp}, \textit{pt} & Distance
%      between gridlines are multiples of \texttt{gridunit}. default: mm.\\
%    gridcolor & a valid color name & Color of the main gridlines;
%                                     default: black \\
%    subgridcolor & a valid color name & Color of the subgridlines;
%                                     default: black. \\
%    subgridstyle & \textit{solid} or \textit{dotted} & `dotted' is very slow!
%      default: solid. \\
%    colorgrid & empty or \textit{true}, \textit{false} & Shortcut for
%          `grid=true', `gridcolor=red' and `subgridcolor=green';
%          default: false.\\
%    dvips        & empty or \textit{true}, \textit{false} & Is also true
%      if the package option \texttt{dvips} is
%      used by \pkgname{color} or \pkgname{graphics}. If true package
%      \pkgname{eepic} is loaded for better performance of dotted lines.
%
%  \end{tabular}
%  \end{center}
%
% \StopEventually{\PrintChanges\PrintIndex}
%
% \section{Implementation}
%
% \subsection{The main functionality}
%
% \begin{macro}{\LenToUnit}
%  \changes{v1.0d}{2006/07/14}{Using \cmd{\providecommand} instead of
%   \cmd{\newcommand} for \cmd{\LenToUnit}}
%  \changes{v2.0f}{2015/07/14}{Changed definition for better compatibility
%    with package \pkgname{curve2e} suggested by Claudio Beccari.}
%  Only for compatibility
% \changes{v3.0a}{2020/10/14}{No more used. (RN).}
%    \begin{macrocode}
\providecommand*\LenToUnit[1]{#1}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
\newdimen\ESO@tempdima
\newdimen\ESO@tempdimb
%    \end{macrocode}
% \begin{macro}{\ESO@isMEMOIR}
%    Support for the \clsname{memoir} class.
%    \begin{macrocode}
\newcommand\ESO@isMEMOIR[2]{#2}
\@ifclassloaded{memoir}{\renewcommand\ESO@isMEMOIR[2]{#1}}{}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtPageUpperLeft}
%    \begin{macrocode}
\newcommand\AtPageUpperLeft[1]{%
  \put(0,-\ESO@yoffsetI){#1}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtPageLowerLeft}
%    \begin{macrocode}
\newcommand\AtPageLowerLeft[1]{\AtPageUpperLeft{%
  \put(0,-\paperheight){#1}}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtPageCenter}
%    \begin{macrocode}
\newcommand\AtPageCenter[1]{\AtPageUpperLeft{%
  \put(.5\paperwidth,-.5\paperheight){#1}}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtStockLowerLeft}
%  \changes{v2.0a}{2009/10/07}{New}
%    \begin{macrocode}
\newcommand\AtStockLowerLeft{}
\ESO@isMEMOIR{%
  \renewcommand\AtStockLowerLeft[1]{%
    \begingroup
      \ESO@tempdima=-\stockwidth
      \advance\ESO@tempdima\trimedge
      \advance\ESO@tempdima\paperwidth
      \if@twoside\ifodd\c@page\else
        \ESO@tempdima=-\trimedge
      \fi\fi
      \ESO@tempdimb=-\stockheight
      \advance\ESO@tempdimb\paperheight
      \advance\ESO@tempdimb\trimtop
      \AtPageLowerLeft{%
        \put(\ESO@tempdima,\ESO@tempdimb){#1}%
      }%
    \endgroup
  }
}{%
  \let\AtStockLowerLeft=\AtPageLowerLeft
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtStockUpperLeft}
%  \changes{v2.0a}{2009/10/07}{New}
%    \begin{macrocode}
\newcommand\AtStockUpperLeft{}
\ESO@isMEMOIR{%
  \renewcommand\AtStockUpperLeft[1]{%
    \AtStockLowerLeft{%
      \put(0,\stockheight){#1}%
    }%
  }%
}{%
  \let\AtStockUpperLeft=\AtPageUpperLeft
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtStockCenter}
%  \changes{v2.0a}{2009/10/07}{New}
%    \begin{macrocode}
\newcommand\AtStockCenter{}
\ESO@isMEMOIR{%
  \renewcommand\AtStockCenter[1]{%
    \AtStockLowerLeft{%
      \put(.5\stockwidth,.5\stockheight){#1}%
    }%
  }%
}{%
  \let\AtStockCenter=\AtPageCenter
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtTextUpperLeft}
%  \changes{v2.0a}{2009/10/07}{Works now for class \clsname{memoir}}
%  \changes{v2.0e}{2014/04/20}{Wrong horizontal position in one-column mode}
%  \changes{v3.0c}{2023/05/03}{Wrong horizontal position in  memoir one-side
%     mode (issue \#5)}
%    \begin{macrocode}
\ESO@isMEMOIR{%
  \newcommand\AtTextUpperLeft[1]{%
    \begingroup
      \if@twoside
        \ifodd\c@page
          \ESO@tempdima=\spinemargin
        \else
          \ESO@tempdima=\paperwidth
          \advance\ESO@tempdima-\textwidth
          \advance\ESO@tempdima-\spinemargin
        \fi
      \else
        \ESO@tempdima=\spinemargin
      \fi
      \ESO@tempdimb=-\uppermargin
      \AtPageUpperLeft{%
        \put(\ESO@tempdima,\ESO@tempdimb){#1}%
      }%
    \endgroup
  }%
}{%
  \newcommand\AtTextUpperLeft[1]{%
    \begingroup
      \ESO@tempdima=1in\relax
      \if@twoside
        \ifodd\c@page
          \advance\ESO@tempdima\oddsidemargin
        \else
          \advance\ESO@tempdima\evensidemargin
        \fi
      \else
        \advance\ESO@tempdima\oddsidemargin
      \fi
      \ESO@tempdimb=-1in\relax
      \advance\ESO@tempdimb-\topmargin
      \advance\ESO@tempdimb-\headheight
      \advance\ESO@tempdimb-\headsep
      \AtPageUpperLeft{%
        \put(\ESO@tempdima,\ESO@tempdimb){#1}%
      }%
    \endgroup
  }
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtTextLowerLeft}
%    \begin{macrocode}
\newcommand\AtTextLowerLeft[1]{\AtTextUpperLeft{%
  \put(0,-\textheight){#1}}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\AtTextCenter}
%    \begin{macrocode}
\newcommand\AtTextCenter[1]{\AtTextUpperLeft{%
  \put(.5\textwidth,-.5\textheight){#1}}}
%    \end{macrocode}
% \end{macro}
% \DescribeMacro{\ESO@HookIBG}\DescribeMacro{\ESO@HookIIBG}
% \DescribeMacro{\ESO@HookIIIBG}\DescribeMacro{\ESO@HookIFG}
% \DescribeMacro{\ESO@HookIIFG}\DescribeMacro{\ESO@HookIIIFG}
% \changes{v2.0g}{2015/07/21}{New macro \cmd{\ESO@HookIIIFG} for foreground grid.}
%    \begin{macrocode}
\newcommand{\ESO@HookIBG}{}
\newcommand{\ESO@HookIIBG}{}
\newcommand{\ESO@HookIIIBG}{}
\newcommand{\ESO@HookIFG}{}
\newcommand{\ESO@HookIIFG}{}
\newcommand{\ESO@HookIIIFG}{}
\newcommand{\ESO@HookI}{}
\newcommand{\ESO@HookII}{}
\newcommand{\ESO@HookIII}{}
\let\ESO@HookI=\ESO@HookIBG
\let\ESO@HookII=\ESO@HookIIBG
\let\ESO@HookIII=\ESO@HookIIIBG
%    \end{macrocode}
% \begin{macro}{\AddToShipoutPictureBG}
% \begin{macro}{\AddToShipoutPictureFG}
% \changes{v2.0b}{2010/06/08}{New command \cmd{\AddToShipoutPictureFG}}
%    \begin{macrocode}
\newcommand{\AddToShipoutPictureBG}{%
  \@ifstar{\g@addto@macro\ESO@HookIIBG}{\g@addto@macro\ESO@HookIBG}}
\newcommand{\AddToShipoutPicture}{}
\let\AddToShipoutPicture=\AddToShipoutPictureBG
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\AddToShipoutPictureFG}
%    \begin{macrocode}
\newcommand{\AddToShipoutPictureFG}{%
  \@ifstar{\g@addto@macro\ESO@HookIIFG}{\g@addto@macro\ESO@HookIFG}}
%    \end{macrocode}
% \end{macro}
% \changes{v3.0a}{2020/10/14}{LaTeX's shipout hooks instead of `atbegshi' (RN).}
% \begin{macro}{\ClearShipoutPictureBG}
% \begin{macro}{\ClearShipoutPicture}
% \begin{macro}{\ClearShipoutPictureFG}
% \changes{v1.0a}{2002/10/07}{Changed \cmd{\let} to
%   \cmd{\global}\cmd{\let} (suggested by Alberto Lusiani).}
%    \begin{macrocode}
\newcommand{\ClearShipoutPictureBG}{\global\let\ESO@HookIBG\@empty}
\newcommand{\ClearShipoutPicture}{}
\let\ClearShipoutPicture=\ClearShipoutPictureBG
\newcommand{\ClearShipoutPictureFG}{\global\let\ESO@HookIFG\@empty}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \changes{v2.0c}{2010/10/06}{bugfix for memoir class
%   (reported by YI Hoze)}
%    \begin{macrocode}
\ESO@isMEMOIR{%
  \newcommand*\ESO@MEMOIR@corr{%
    \ESO@tempdima=-\trimedge
    \advance\ESO@tempdima-\paperwidth
    \advance\ESO@tempdima\stockwidth
    \if@twoside\ifodd\c@page\else
      \advance\ESO@tempdima2\trimedge
      \advance\ESO@tempdima\paperwidth
      \advance\ESO@tempdima-\stockwidth
    \fi\fi
    \ESO@tempdimb=\ESO@yoffsetI
    \advance\ESO@tempdimb-\trimtop
  }
  \nointerlineskip
  \AddToHook{shipout/background}{%
    \ESO@MEMOIR@corr
    \put(\ESO@tempdima,\ESO@tempdimb){%
      \ESO@HookIIIBG\ESO@HookIBG\ESO@HookIIBG
      \global\let\ESO@HookIIBG\@empty
    }%
  }%
  \AddToHook{shipout/foreground}{%
    \ESO@MEMOIR@corr
    \put(\ESO@tempdima,\ESO@tempdimb){%
      \ESO@HookIFG\ESO@HookIIFG\ESO@HookIIIFG
      \global\let\ESO@HookIIFG\@empty
    }%
  }%
}{%
  \nointerlineskip
  \AddToHook{shipout/background}{%
    \put(0,\ESO@yoffsetI){%
      \ESO@HookIIIBG\ESO@HookIBG\ESO@HookIIBG
      \global\let\ESO@HookIIBG\@empty
    }%
  }%
  \AddToHook{shipout/foreground}{%
    \put(0,\ESO@yoffsetI){%
      \ESO@HookIFG\ESO@HookIIFG\ESO@HookIIIFG
      \global\let\ESO@HookIIFG\@empty
    }%
  }%
}
%    \end{macrocode}
% \subsection{The background grid}
%    \begin{macrocode}
\RequirePackage{keyval}
%    \end{macrocode}
%  Initialising some macros
% \changes{v2.0g}{2015/07/21}{New \cmd{\ifESO@gridBG} for foreground/background grid.}
%    \begin{macrocode}
\newif\ifESO@dvips\ESO@dvipsfalse \newif\ifESO@grid\ESO@gridfalse
\newif\ifESO@texcoord\ESO@texcoordfalse \newif\ifESO@gridBG\ESO@gridBGfalse
\newcommand*\ESO@gridunitname{}
\newcommand*\ESO@gridunit{}
\newcommand*\ESO@labelfactor{}
\newcommand*\ESO@griddelta{}\newcommand*\ESO@griddeltaY{}
\newcommand*\ESO@gridDelta{}\newcommand*\ESO@gridDeltaY{}
\newcommand*\ESO@gridcolor{}
\newcommand*\ESO@subgridcolor{}
\newcommand*\ESO@subgridstyle{dotted}% ???
\newcommand*\ESO@gap{}
\newcommand*\ESO@yoffsetI{}\newcommand*\ESO@yoffsetII{}
\newcommand*\ESO@gridlines{\thinlines}
\newcommand*\ESO@subgridlines{\thinlines}
\newcommand*\ESO@hline[1]{\ESO@subgridlines\line(1,0){#1}}
\newcommand*\ESO@vline[1]{\ESO@subgridlines\line(0,1){#1}}
\newcommand*\ESO@Hline[1]{\ESO@gridlines\line(1,0){#1}}
\newcommand*\ESO@Vline[1]{\ESO@gridlines\line(0,1){#1}}
\newcommand\ESO@fcolorbox[3]{\fbox{#3}}
\newcommand\ESO@color[1]{}
\newcommand\ESO@colorbox[2]{%
  \begingroup
    \fboxrule=\z@\fbox{#2}%
  \endgroup
}
%    \end{macrocode}
% \begin{macro}{\gridSetup}
%    \begin{macrocode}
\newcommand\gridSetup[6][]{%
  \edef\ESO@gridunitname{#1}\edef\ESO@gridunit{#2}
  \edef\ESO@labelfactor{#3}\edef\ESO@griddelta{#4}
  \edef\ESO@gridDelta{#5}\edef\ESO@gap{#6}}
%    \end{macrocode}
% \end{macro}
%  All the key-value options
% \changes{v2.0g}{2015/07/21}{New option `gridBG'.}
%    \begin{macrocode}
\define@key{ESO}{texcoord}[true]{\csname ESO@texcoord#1\endcsname}
\define@key{ESO}{pscoord}[true]{\csname @tempswa#1\endcsname
  \if@tempswa\ESO@texcoordfalse\else\ESO@texcoordtrue\fi}
\define@key{ESO}{dvips}[true]{\csname ESO@dvips#1\endcsname}
\define@key{ESO}{grid}[true]{\csname ESO@grid#1\endcsname
  \setkeys{ESO}{gridcolor=black,subgridcolor=black}}
\define@key{ESO}{gridBG}[true]{\csname ESO@gridBG#1\endcsname}
\define@key{ESO}{colorgrid}[true]{\csname ESO@grid#1\endcsname
  \setkeys{ESO}{gridcolor=red,subgridcolor=green}}
\define@key{ESO}{gridcolor}{\def\ESO@gridcolor{#1}}
\define@key{ESO}{subgridcolor}{\def\ESO@subgridcolor{#1}}
\define@key{ESO}{subgridstyle}{\def\ESO@subgridstyle{#1}}%
\define@key{ESO}{gridunit}{%
  \def\@tempa{#1}
  \def\@tempb{bp}
  \ifx\@tempa\@tempb
    \gridSetup[\@tempa]{1bp}{1}{10}{50}{2}
  \else
    \def\@tempb{pt}
    \ifx\@tempa\@tempb
      \gridSetup[\@tempa]{\p@}{1}{10}{50}{2}
    \else
      \def\@tempb{in}
      \ifx\@tempa\@tempb
        \gridSetup[\@tempa]{.1in}{.1}{2}{10}{.5}
      \else
        \gridSetup[mm]{1mm}{1}{5}{20}{1}
      \fi
    \fi
  \fi
}
\setkeys{ESO}{subgridstyle=solid,pscoord=true,gridunit=mm}
%    \end{macrocode}
%  \changes{v2.0h}{2018/04/12}{\cmd\@classoptionslist must not be \cmd\relax}
%    \begin{macrocode}
\providecommand*\@classoptionslist{}
%    \end{macrocode}
%    \begin{macro}{\ProcessOptionsWithKV}
%    This macro can process package options using `key=value' syntax.
%    \begin{macrocode}
\def\ProcessOptionsWithKV#1{%
  \let\@tempc\@empty
  \@for\CurrentOption:=\@classoptionslist\do{%
    \@ifundefined{KV@#1@\CurrentOption}%
    {}{\edef\@tempc{\@tempc,\CurrentOption,}}}%
  \edef\@tempc{%
    \noexpand\setkeys{#1}{\@tempc\@ptionlist{\@currname.\@currext}}}%
  \@tempc
  \AtEndOfPackage{\let\@unprocessedoptions\relax}}%
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\ProcessOptionsWithKV{ESO}%
%    \end{macrocode}
%    \begin{macro}{\ESO@div}
%  Divides length |#1| by |#2| \(\times\) \cmd{\ESO@gridunit} and adds one.
%  Result is in \cmd{\@tempcnta}.
%    \begin{macrocode}
\newcommand\ESO@div[2]{%
  \ESO@tempdima=#1\relax\ESO@tempdimb=\ESO@gridunit\relax
  \ESO@tempdimb=#2\ESO@tempdimb\divide\ESO@tempdima by \ESO@tempdimb
  \@tempcnta\ESO@tempdima\advance\@tempcnta\@ne}
%    \end{macrocode}
%    \end{macro}
%  \changes{v1.1c}{2005/12/24}{Remove the disadvantageous check of
%    `pdfTeX'. Now using with Xe\LaTeX\ should be possible.}
%  \changes{v2.0a}{2009/10/07}{Better test of color/xcolor}
%  \changes{v2.0d}{2013/10/06}{Improved color commands}
%  \changes{v3.0b}{2023/03/23}{More code inside \cmd{\AtBeginDocument}}
%    \begin{macrocode}
\@ifundefined{colorbox}{%
  \IfFileExists{xcolor.sty}{\RequirePackage{xcolor}}%
    {\RequirePackage{color}}%
}{}%
\let\ESO@color=\color
\renewcommand\ESO@colorbox[2]{%
  \begingroup
    \fboxsep=.4ex %
    \colorbox{#1}{#2}%
  \endgroup
}
\renewcommand\ESO@fcolorbox[3]{%
  \begingroup
    \fboxsep=.5ex %
    \fcolorbox{#1}{#2}{#3}%
  \endgroup
}
\AtBeginDocument{%
  \ESO@dvipsfalse
  \@ifundefined{Gin@driver}{}%
  {%
    \ifx\Gin@driver\@empty\else%
      \filename@parse{\Gin@driver}\def\reserved@a{dvips}%
      \ifx\filename@base\reserved@a\ESO@dvipstrue\fi
    \fi
  }%
  \ifESO@dvips\def\@tempb{eepic}\else\def\@tempb{epic}\fi
  \def\@tempa{dotted}%\def\ESO@gap{6\@wholewidth}%
  \ifx\@tempa\ESO@subgridstyle
    \IfFileExists{\@tempb.sty}%
    {%
      \RequirePackage{\@tempb}
      \renewcommand*\ESO@hline[1]{\ESO@subgridlines\dottedline{\ESO@gap}%
        (0,0)(##1,0)}
      \renewcommand*\ESO@vline[1]{\ESO@subgridlines\dottedline{\ESO@gap}%
        (0,0)(0,##1)}
    }{}
  \else
    \ifx\ESO@gridcolor\ESO@subgridcolor
      \renewcommand*\ESO@gridlines{\thicklines}
    \fi
  \fi
% \changes{v3.0b}{2023/03/23}{More code inside \cmd{\AtBeginDocument}}
  \ifESO@texcoord
    \def\ESO@yoffsetI{\z@}\def\ESO@yoffsetII{-\paperheight}
    \edef\ESO@griddeltaY{-\ESO@griddelta}\edef\ESO@gridDeltaY{-\ESO@gridDelta}
  \else
    \def\ESO@yoffsetI{-\paperheight}\def\ESO@yoffsetII{\z@}
    \edef\ESO@griddeltaY{\ESO@griddelta}\edef\ESO@gridDeltaY{\ESO@gridDelta}
  \fi
}
%    \end{macrocode}
%    \begin{macro}{\ESO@gridpicture}
%    \begin{macrocode}
\newcommand\ESO@gridpicture{%
  \begingroup
    \setlength\unitlength{\ESO@gridunit}%
    \ESO@color{\ESO@subgridcolor}%
%    \end{macrocode}
%    --- horizontal subgrid lines ---
%    \begin{macrocode}
    \ESO@div{\paperheight}{\ESO@griddelta}%
    \multiput(0,0)(0,\ESO@griddeltaY){\@tempcnta}%
      {\ESO@hline{\paperwidth}}%
%    \end{macrocode}
%    --- vertical subgrid lines ---
%    \begin{macrocode}
    \ESO@div{\paperwidth}{\ESO@griddelta}%
    \multiput(0,\ESO@yoffsetII)(\ESO@griddelta,0){\@tempcnta}%
      {\ESO@vline{\paperheight}}%
    \ESO@color{\ESO@gridcolor}%
%    \end{macrocode}
%    --- horizontal grid lines ---
%    \begin{macrocode}
    \ESO@div{\paperheight}{\ESO@gridDelta}%
    \multiput(0,0)(0,\ESO@gridDeltaY){\@tempcnta}%
      {\ESO@Hline{\paperwidth}}%
%    \end{macrocode}
%    --- vertical grid lines ---
%    \begin{macrocode}
    \ESO@div{\paperwidth}{\ESO@gridDelta}%
    \multiput(0,\ESO@yoffsetII)(\ESO@gridDelta,0){\@tempcnta}%
      {\ESO@Vline{\paperheight}}%
%    \end{macrocode}
%    --- horizontal numbers ---
%  \changes{v1.1a}{2002/11/09}{Font setting added.}
%    \begin{macrocode}
    \fontsize{10}{12}\normalfont%
    \ESO@div{\paperwidth}{\ESO@gridDelta}%
    \multiput(0,\ESO@gridDeltaY)(\ESO@gridDelta,0){\@tempcnta}{%
      \@tempcntb=\@tempcnta\advance\@tempcntb-\@multicnt
      \ifnum\@tempcntb>1\relax
        \multiply\@tempcntb by \ESO@gridDelta\relax
        \ESO@tempdima=\@tempcntb sp\ESO@tempdima=\ESO@labelfactor\ESO@tempdima
        \@tempcntb=\ESO@tempdima%
        \makebox(0,0)[c]{\ESO@colorbox{white}{\the\@tempcntb}}%
      \fi}%
%    \end{macrocode}
%    --- vertical numbers ---
%    \begin{macrocode}
    \ifx\ESO@gridunitname\@empty\def\@tempa{0}\else\def\@tempa{1}\fi
    \ESO@div{\paperheight}{\ESO@gridDelta}%
    \multiput(\ESO@gridDelta,0)(0,\ESO@gridDeltaY){\@tempcnta}{%
      \@tempcntb=\@tempcnta\advance\@tempcntb-\@multicnt%
      \ifnum\@tempcntb>\@tempa\relax
        \multiply\@tempcntb by \ESO@gridDelta\relax%
        \ESO@tempdima=\@tempcntb sp\ESO@tempdima=\ESO@labelfactor\ESO@tempdima
        \@tempcntb=\ESO@tempdima
        \makebox(0,0)[c]{\ESO@colorbox{white}{\the\@tempcntb}}%
      \fi
    }%
%    \end{macrocode}
%    --- the unit label ---
%    \begin{macrocode}
    \ifx\ESO@gridunitname\@empty\else
      \thicklines\fboxrule=\@wholewidth
      \put(\ESO@gridDelta,\ESO@gridDeltaY){\makebox(0,0)[c]{%
        \ESO@fcolorbox{\ESO@gridcolor}{white}{%
          \textbf{\ESO@gridunitname}}}}%
    \fi
    \normalcolor%
  \endgroup
}
%    \end{macrocode}
%    \end{macro}
%  Add the grid to the shipout picture (\cmd{\ESO@HookIIIFG} or
%  \cmd{\ESO@HookIIIBG}) is independed from the user commands
%  \cmd{\AddToShipoutPictureBG} and \cmd{\AddToShipoutPictureBG*}).
%  \changes{v2.0d}{2013/10/06}{grid should be in foreground}
%  \changes{v2.0g}{2015/07/21}{Foreground/background grid.}
%    \begin{macrocode}
\ifESO@grid
  \ifESO@gridBG
    \g@addto@macro\ESO@HookIIIBG{\ESO@gridpicture}%
  \else
    \g@addto@macro\ESO@HookIIIFG{\ESO@gridpicture}%
  \fi
\fi
%    \end{macrocode}
%
% \Finale
\endinput