%% Copyright (C) 2011-2025 by Martin Scharrer <martin.scharrer@web.de>
%% -------------------------------------------------------------------
%% This work 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 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainer of this work is Martin Scharrer.
%%
%% This work consists of the files trimclip.dtx, adjustbox.ins
%% and the derived files trimclip.sty,
%% tc-dvips.def, tc-pdftex.def, tc-luatex.def, tc-pgf.def and tc-xetex.def.
%% Further author information are located in the .def files.
%%
\ProvidesPackage{trimclip}[%
    2025/02/21
    v1.2a
    Trim and clip general TeX material]
\def\tc@driver{tc-\Gin@driver}
\DeclareOption{pgf}{\def\tc@driver{tc-pgf.def}\AtEndOfPackage{\RequirePackage{pgf}}}
\DeclareOption{pdftex}{\def\tc@driver{tc-pdftex.def}\PassOptionsToPackage{pdftex}{graphicx}}
\DeclareOption{luatex}{\def\tc@driver{tc-luatex.def}\PassOptionsToPackage{luatex}{graphicx}}
\DeclareOption{xetex}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}}
\DeclareOption{dvips}{\def\tc@driver{tc-dvips.def}\PassOptionsToPackage{dvips}{graphicx}}
\DeclareOption{dvipdfm}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}}
\DeclareOption{dvipdf}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}}
\DeclareOption*{%
    \@ifpackageloaded{graphics}{%
        \edef\tc@driver{tc-\CurrentOption.def}%
        \begingroup
        \edef\@tempa{\CurrentOption.def}%
        \ifx\@tempa\Gin@driver\else
            \let\on@line\@gobble
            \PackageWarning{trimclip}{%
                A different clipping driver was requested than the\MessageBreak
                one used for 'graphics/x'! This is not recommended\MessageBreak
                and can lead to defect output files.%
            }%
        \fi
        \endgroup
    }{%
        \def\tc@driver{tc-\Gin@driver}%
        \PassOptionsToPackage\CurrentOption{graphicx}%
    }%
}
\ProcessOptions*\relax
\RequirePackage{graphicx}[1999/02/16]
\RequirePackage{collectbox}[2011/08/22]
\RequirePackage{adjcalc}
\def\tc@readvalues#1{%
    \tc@@readvalues#1 {} {} {} \\%
}
\def\tc@@readvalues#1 #2 #3 #4 #5\\{%
  \adjsetlengthdefault\tc@llx{#1}%
  \ifx\@nnil#2\@nnil
    \tc@lly\tc@llx
    \tc@urx\tc@llx
    \tc@ury\tc@llx
  \else
    \adjsetlengthdefault\tc@lly{#2}%
    \ifx\@nnil#3\@nnil
      \tc@urx\tc@llx
      \tc@ury\tc@lly
    \else
      \adjsetlengthdefault\tc@urx{#3}%
      \adjsetlengthdefault\tc@ury{#4}%
    \fi
  \fi
}%
\newdimen\tc@llx
\newdimen\tc@lly
\newdimen\tc@urx
\newdimen\tc@ury
\newcommand\trimbox{%
    \collectboxcheckenv{trimbox}%
    \@ifstar
        \trimbox@s
        \trimbox@
}
\def\trimbox@#1{%
    \collectbox{\@trimclip\@trimbox{#1}}%
}
\def\trimbox@s#1{%
    \collectbox{\@trimclip\@viewportbox{#1}}%
}
\expandafter\newcommand\expandafter*\csname trimbox*\endcsname{%
    \@collectboxisenv{trimbox*}%
    \trimbox@s
}
\newcommand\clipbox{%
    \collectboxcheckenv{clipbox}%
    \@ifstar
        \clipbox@s
        \clipbox@
}
\def\clipbox@#1{%
    \collectbox{\@trimclip\@clipbox{#1}}%
}
\def\clipbox@s#1{%
    \collectbox{\@trimclip\@clipvpbox{#1}}%
}
\expandafter\newcommand\expandafter*\csname clipbox*\endcsname{%
    \@collectboxisenv{clipbox*}%
    \clipbox@s
}
\newcommand\marginbox{%
    \collectboxcheckenv{marginbox}%
    \@ifstar
        \marginbox@s
        \marginbox@
}
\def\marginbox@#1{%
    \@collectbox{\@trimclip\@marginbox{#1}}%
}
\def\marginbox@s#1{%
    \@collectbox{\@trimclip\@marginraisebox{#1}}%
}
\expandafter\newcommand\expandafter*\csname marginbox*\endcsname{%
    \@collectboxisenv{marginbox*}%
    \marginbox@s
}
\def\@trimclip#1#2{%
    \tc@readvalues{#2}%
    #1%
        \collectedbox
        \tc@llx
        \tc@lly
        \tc@urx
        \tc@ury
    \usebox\collectedbox
}
\def\tc@correctbaseline#1{%
    \ifdim\dp#1<\z@
        \raise\dp#1%
    \else
    \ifdim\ht#1<\z@
        \lower\ht#1%
    \fi\fi
    \box#1%
}%
\def\tc@correctdims#1{%
    \ifdim\dp#1<\z@ \dp#1=\z@ \fi
    \ifdim\wd#1<\z@ \wd#1=\z@ \fi
    \ifdim\ht#1<\z@ \ht#1=\z@ \fi
}
\def\@trimbox#1#2#3#4#5{%
    \setbox#1=\hbox{%
        %
        \tc@llx=#2\relax
        \tc@lly=#3\relax
        \advance\tc@lly-\dp#1%
        \tc@urx=#4\relax
        \advance\tc@urx-\wd#1%
        \tc@ury=#5\relax
        \advance\tc@ury-\ht#1%
        %
        % Set dimensions now.
        % This allows that the arguments can refer
        % to the original dimensions without issues.
        \hskip-\tc@llx
        \dp#1-\tc@lly
        \wd#1-\tc@urx
        \ht#1-\tc@ury
        %
        \tc@correctbaseline{#1}%
    }%
    \tc@correctdims{#1}%
}
\def\@marginbox#1#2#3#4#5{%
    \setbox#1=\hbox{%
        %
        \tc@llx=#2\relax
        \tc@lly=#3\relax
        \advance\tc@lly\dp#1%
        \tc@urx=#4\relax
        \advance\tc@urx\wd#1%
        \tc@ury=#5\relax
        \advance\tc@ury\ht#1%
        %
        % Set dimensions now.
        % This allows that the arguments can refer
        % to the original dimensions without issues.
        \hskip\tc@llx
        \dp#1\tc@lly
        \wd#1\tc@urx
        \ht#1\tc@ury
        %
        \box#1%
    }%
    \tc@correctdims{#1}%
}
\def\@marginraisebox#1#2#3#4#5{%
    \setbox#1=\hbox{%
        %
        \tc@llx=#2\relax
        \tc@lly=#3\relax
        \tc@urx=#4\relax
        \advance\tc@urx\wd#1%
        \tc@ury=#5\relax
        \advance\tc@ury\ht#1%
        %
        % Set dimensions now.
        % This allows that the arguments can refer
        % to the original dimensions without issues.
        \hskip\tc@llx
        \wd#1\tc@urx
        \ht#1\tc@ury
        % Copy original tty values (ury is taken as temp dimension)
        \tc@ury=\tc@lly
        \advance\tc@lly\dp#1%
        \dp#1\tc@lly
        % Raise bu original tty value (now in ury)
        \raise\tc@ury\box#1%
    }%
    \tc@correctdims{#1}%
}
\def\@viewportbox#1#2#3#4#5{%
    \setbox#1=\hbox{%
        %
        % Assign values
        \tc@llx=#2\relax
        \tc@lly=#3\relax
        \tc@urx=#4\relax
        \tc@ury=#5\relax
        %
        % Set dimensions now.
        % This allows that the arguments can refer
        % to the original dimensions without issues.
        \hskip-\tc@llx
        \dp#1-\tc@lly
        \wd#1\tc@urx
        \ht#1\tc@ury
        %
        \tc@correctbaseline{#1}%
    }%
    \tc@correctdims{#1}%
}
\def\@clipbox#1#2#3#4#5{%
    \@trimbox{#1}{#2}{#3}{#4}{#5}%
    \@cliptoboxdim{#1}%
}
\def\@clipvpbox#1#2#3#4#5{%
    \@viewportbox{#1}{#2}{#3}{#4}{#5}%
    \@cliptoboxdim{#1}%
}
\def\tc@bezfacn{0.44771525}%
\InputIfFileExists{\tc@driver}{%
    {\let\on@line\@gobble
    \PackageInfo{trimclip}{Using driver '\tc@driver'.}}%
}{%
    \input{tc-pgf.def}%
    {\let\on@line\@gobble
    \PackageInfo{trimclip}{No clipping driver '\tc@driver' available.\MessageBreak Using fall-back PGF driver.}}%
}
\endinput
%%
%% End of file `trimclip.sty'.
