%
% gentombow.sty
% written by Hironobu Yamashita (@aminophen)
%
% This package is part of the gentombow bundle.
% https://github.com/aminophen/gentombow
%

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{gentombow}
    [2022/09/10 v0.9m Generate crop mark 'tombow']
\def\pxgtmb@pkgname{gentombow}
\@namedef{ver@pxgentombow.sty}{}% fake

%% error status
\chardef\pxgtmb@errlevel=\z@

%% supported engines
% case 2: pdfLaTeX etc.
% case 1: pLaTeX2e <2018-04-01>+2 or older
% case 0: pLaTeX2e <2018-05-20> or newer
% --- checked plcore.ltx in platex 2020/09/28 v1.3g
\ifx\pfmtname\@undefined
  \@ifpackageloaded{luatexja}{}{\chardef\pxgtmb@errlevel=\tw@}
\fi
\ifnum\pxgtmb@errlevel<\tw@
  \ifx\@tombowreset@@paper\@undefined
    \chardef\pxgtmb@errlevel=\@ne
  \fi
\fi
\ifcase\pxgtmb@errlevel
  \let\pxgtmb@sel@twoone\@gobble
  \let\pxgtmb@sel@two@one\@gobbletwo
  \let\pxgtmb@sel@two\@gobble
\or
  \let\pxgtmb@sel@twoone\@firstofone
  \let\pxgtmb@sel@two@one\@secondoftwo
  \let\pxgtmb@sel@two\@gobble
\or
  \let\pxgtmb@sel@twoone\@firstofone
  \let\pxgtmb@sel@two@one\@firstoftwo
  \let\pxgtmb@sel@two\@firstofone
\else
  \PackageError{\pxgtmb@pkgname}{%
    This cannot happen!
    Please report to package author}\@ehc
  \expandafter\endinput
\fi
\@onlypreamble\pxgtmb@sel@twoone
\@onlypreamble\pxgtmb@sel@two@one
\@onlypreamble\pxgtmb@sel@two

%%%%% EMULATION BEGIN

% required for patching \@outputpage
\pxgtmb@sel@twoone{\RequirePackage{etoolbox}}

% patch \@outputpage
\begingroup
\def\pxgtmb@emu@status{0}
\let\pxgtmb@emu@outputpage\@outputpage
\pxgtmb@sel@two@one
{%% case 2 begin
 \patchcmd\pxgtmb@emu@outputpage % try first patch
  {\reset@font\normalsize\normalsfcodes}%
  {\@tombowreset@@paper
   \reset@font\normalsize\normalsfcodes}%
  {}{\def\pxgtmb@emu@status{1}}
 \patchcmd\pxgtmb@emu@outputpage % try second patch
  {\@begindvi \vskip \topmargin}%
  {\@begindvi \@outputtombow \vskip \@@topmargin}%
  {}{\def\pxgtmb@emu@status{1}}
}%% case 2 end
{%% case 1 begin
 \patchcmd\pxgtmb@emu@outputpage % try patch
  {%
   \@@topmargin\topmargin
   \iftombow
     \@@paperwidth\paperwidth \advance\@@paperwidth 6mm\relax
     \@@paperheight\paperheight \advance\@@paperheight 16mm\relax
     \advance\@@topmargin 1in\relax \advance\@themargin 1in\relax
   \fi
   \reset@font\normalsize\normalsfcodes}
  {\@tombowreset@@paper
   \reset@font\normalsize\normalsfcodes}%
  {}{\def\pxgtmb@emu@status{1}}
}%% case 1 end
% commit the change only when successful; otherwise
% tombow feature is never enabled, exit right away
\pxgtmb@sel@twoone
{%% case 2 and 1 begin
 \if 0\pxgtmb@emu@status\relax
  \global\let\@outputpage\pxgtmb@emu@outputpage
 \else
  \PackageError{\pxgtmb@pkgname}{%
    Failed in patching \string\@outputpage!\MessageBreak
    Sorry, I can't proceed anymore...}\@ehc
  \expandafter\expandafter\expandafter\endinput\expandafter
 \fi
}%% case 2 and 1 end
\endgroup
%

% provides equivalent for plcore.ltx
\pxgtmb@sel@two
{%% case 2 begin
\newif\iftombow \tombowfalse
\newif\iftombowdate \tombowdatetrue
\newdimen\@tombowwidth
\setlength{\@tombowwidth}{.1\p@}
}%% case 2 end
\pxgtmb@sel@twoone
{%% case 2 and 1 begin
\setlength{\@tombowwidth}{.1\p@}
\def\@tombowbleed{3mm}
\def\@tombowcolor{\normalcolor}
}%% case 2 and 1 end
\pxgtmb@sel@two
{%% case 2 begin
\newbox\@TL\newbox\@Tl
\newbox\@TC
\newbox\@TR\newbox\@Tr
\newbox\@BL\newbox\@Bl
\newbox\@BC
\newbox\@BR\newbox\@Br
\newbox\@CL
\newbox\@CR
\font\@bannerfont=cmtt9
\newtoks\@bannertoken
\@bannertoken{}
}%% case 2 end
\pxgtmb@sel@twoone
{%% case 2 and 1 begin
\def\maketombowbox{% hide \yoko from all boxes
  \setbox\@TL\hbox to\z@{\csname yoko\endcsname\hss
      \vrule width\dimexpr 10mm+\@tombowbleed\relax height\@tombowwidth depth\z@
      \vrule height10mm width\@tombowwidth depth\z@
      \iftombowdate
        \raise4pt\hbox to\z@{\hskip5mm\@bannerfont\the\@bannertoken\hss}%
      \fi}%
  \setbox\@Tl\hbox to\z@{\csname yoko\endcsname\hss
      \vrule width10mm height\@tombowwidth depth\z@
      \vrule height\dimexpr 10mm+\@tombowbleed\relax width\@tombowwidth depth\z@}%
  \setbox\@TC\hbox{\csname yoko\endcsname
      \vrule width10mm height\@tombowwidth depth\z@
      \vrule height10mm width\@tombowwidth depth\z@
      \vrule width10mm height\@tombowwidth depth\z@}%
  \setbox\@TR\hbox to\z@{\csname yoko\endcsname
      \vrule height10mm width\@tombowwidth depth\z@
      \vrule width\dimexpr 10mm+\@tombowbleed\relax height\@tombowwidth depth\z@\hss}%
  \setbox\@Tr\hbox to\z@{\csname yoko\endcsname
      \vrule height\dimexpr 10mm+\@tombowbleed\relax width\@tombowwidth depth\z@
      \vrule width10mm height\@tombowwidth depth\z@\hss}%
  \setbox\@BL\hbox to\z@{\csname yoko\endcsname\hss
      \vrule width\dimexpr 10mm+\@tombowbleed\relax depth\@tombowwidth height\z@
      \vrule depth10mm width\@tombowwidth height\z@}%
  \setbox\@Bl\hbox to\z@{\csname yoko\endcsname\hss
      \vrule width10mm depth\@tombowwidth height\z@
      \vrule depth\dimexpr 10mm+\@tombowbleed\relax width\@tombowwidth height\z@}%
  \setbox\@BC\hbox{\csname yoko\endcsname
      \vrule width10mm depth\@tombowwidth height\z@
      \vrule depth10mm width\@tombowwidth height\z@
      \vrule width10mm depth\@tombowwidth height\z@}%
  \setbox\@BR\hbox to\z@{\csname yoko\endcsname
      \vrule depth10mm width\@tombowwidth height\z@
      \vrule width\dimexpr 10mm+\@tombowbleed\relax depth\@tombowwidth height\z@\hss}%
  \setbox\@Br\hbox to\z@{\csname yoko\endcsname
      \vrule depth\dimexpr 10mm+\@tombowbleed\relax width\@tombowwidth height\z@
      \vrule width10mm depth\@tombowwidth height\z@\hss}%
  \setbox\@CL\hbox to\z@{\csname yoko\endcsname\hss
      \vrule width10mm height.5\@tombowwidth depth.5\@tombowwidth
      \vrule height10mm depth10mm width\@tombowwidth}%
  \setbox\@CR\hbox to\z@{\csname yoko\endcsname
      \vrule height10mm depth10mm width\@tombowwidth
      \vrule height.5\@tombowwidth depth.5\@tombowwidth width10mm\hss}%
}
\def\@outputtombow{%
  \iftombow
  \vbox to\z@{\kern-\dimexpr 10mm+\@tombowbleed\relax\relax
    \boxmaxdepth\maxdimen
    \moveleft\@tombowbleed \vbox to\@@paperheight{%
    \color@begingroup
      \@tombowcolor
      \hbox to\@@paperwidth{\hskip\@tombowbleed\relax
         \copy\@TL\hfill\copy\@TC\hfill\copy\@TR\hskip\@tombowbleed}%
      \kern-10mm
      \hbox to\@@paperwidth{\copy\@Tl\hfill\copy\@Tr}%
      \vfill
      \hbox to\@@paperwidth{\copy\@CL\hfill\copy\@CR}%
      \vfill
      \hbox to\@@paperwidth{\copy\@Bl\hfill\copy\@Br}%
      \kern-10mm
      \hbox to\@@paperwidth{\hskip\@tombowbleed\relax
         \copy\@BL\hfill\copy\@BC\hfill\copy\@BR\hskip\@tombowbleed}%
    \color@endgroup
    }\vss
  }%
  \fi
}
}%% case 2 and 1 end
\pxgtmb@sel@two
{%% case 2 begin
\newdimen\@@paperheight
\newdimen\@@paperwidth
\newdimen\@@topmargin
}%% case 2 end
\pxgtmb@sel@twoone
{%% case 2 and 1 begin
\def\@tombowreset@@paper{%
     \@@topmargin\topmargin
     \iftombow
       \@@paperwidth\paperwidth
       \advance\@@paperwidth 2\dimexpr\@tombowbleed\relax
       \@@paperheight\paperheight \advance\@@paperheight 10mm\relax
       \advance\@@paperheight 2\dimexpr\@tombowbleed\relax
       \advance\@@topmargin 1in\relax \advance\@themargin 1in\relax
     \fi
}
}%% case 2 and 1 end
\pxgtmb@sel@two
{%% case 2 begin
\newcount\hour
\newcount\minute
}%% case 2 end

%%%%% EMULATION END

%% import from jsclasses
\hour\time \divide\hour by 60\relax
\@tempcnta\hour \multiply\@tempcnta 60\relax
\minute\time \advance\minute-\@tempcnta

\ifnum\mag=\@m\else
  % if BXjscls is detected and \mag != 1000,
  % the layout will be definitely broken
  \ifx\bxjs@param@mag\@undefined\else
    \PackageError{\pxgtmb@pkgname}{%
      It seems you are using Japanese `BXjscls'\MessageBreak
      (bxjsarticle, bxjsbook, bxjsreport, etc.) or\MessageBreak
      some derived class. Try adding `nomag' or\MessageBreak
      `nomag*' to the class option list}\@ehc
  \fi
  % if \mag != 1000 and \inv@mag is defined, assume jsclasses-style \mag employment
  \ifx\inv@mag\@undefined\else
    % \pxgtmb@magscale is almost equivalent to \jsc@magscale (introduced around 2016)
    % but defined only when \mag is actually employed
    \begingroup
      % calculation code borrowed from BXjscls
      \@tempcnta=\mag
      \advance\@tempcnta100000\relax
      \def\pxgtmb@tempa#1#2#3#4\@nil{\@tempdima=#2#3.#4\p@}
      \expandafter\pxgtmb@tempa\the\@tempcnta\@nil
      \xdef\pxgtmb@magscale{\strip@pt\@tempdima}
    \endgroup
  \fi
\fi

%% this package will use tombo feature in pLaTeX kernel
%  if tombow-related option is not included in class option list,
%  show info and enable it now
\iftombow\else
  % if jsclasses is detected and \mag != 1000, it's too late
  % -- When a size option other than `10pt' is specified,
  %    jsclasses uses \mag and calculates \oddsidemargin and \topmargin
  %    differently, depending on tombow status.
  %    In order to force `jsclasses' to calculate correctly,
  %    `tombow' or `tombo' is required as a class option.
  %    ... or, you may add `nomag' or `nomag*' instead.
  \ifx\pxgtmb@magscale\@undefined\else
    \PackageError{\pxgtmb@pkgname}{%
      It seems you are using Japanese `jsclasses'\MessageBreak
      (jsarticle, jsbook, jsreport, etc.) or some\MessageBreak
      derived class. Please add `tombow' or `tombo'\MessageBreak
      to the class option list}\@ehc
  \fi
  % BXjscls is already checked above, no check here
  \PackageInfo\pxgtmb@pkgname{tombow feature enabled by \pxgtmb@pkgname}
\fi
\tombowtrue %\tombowdatetrue %% enabled by tombowbanner option
\setlength{\@tombowwidth}{.1\p@}%

%% import from jsclasses
\@bannertoken{%
  \jobname\space(\number\year-\two@digits\month-\two@digits\day
  \space\two@digits\hour:\two@digits\minute)}

%% prepare dimension
\ifx\stockwidth\@undefined  \newdimen\stockwidth  \fi
\ifx\stockheight\@undefined \newdimen\stockheight \fi

%% prepare flag
\newif\ifpxgtmb@switch    \pxgtmb@switchfalse
\newif\ifpxgtmb@landscape \pxgtmb@landscapefalse
\newif\ifpxgtmb@pdfx@x    \pxgtmb@pdfx@xfalse

%% passed from class options
%% should be declared first inside this package (least priority)
\DeclareOption{tombow}{\tombowdatetrue}
\DeclareOption{tombo}{\tombowdatefalse}
\DeclareOption{mentuke}{\tombowdatefalse \setlength{\@tombowwidth}{\z@}}

%% package options part 1
\DeclareOption{tombowbanner}{\tombowdatetrue}
\DeclareOption{notombowbanner}{\tombowdatefalse}
\DeclareOption{tombowdate}{% obsolete since v0.9c (2018/01/11)
  \PackageWarning{\pxgtmb@pkgname}{%
    Option `tombowdate' is renamed;\MessageBreak
    use `tombowbanner' instead}%
  \tombowdatetrue}
\DeclareOption{notombowdate}{% obsolete since v0.9c (2018/01/11)
  \PackageWarning{\pxgtmb@pkgname}{%
    Option `notombowdate' is renamed;\MessageBreak
    use `notombowbanner' instead}%
  \tombowdatefalse}

%% register a list of candidate papersize
%  * \pxgtmb@addpapersize[<tombowname>]{<papername>}{<shorter edge>}{<longer edge>}
%      used for declaration of papersize.
%      when no option is specified (that is, \ifpxgtmb@switch = \iffalse),
%      also used for automatic stocksize determination.
%      * if <tombowname> = \@empty, the next <papername> is assumed.
%      * if <tombowname> = n, stocksize is set to papersize + 2in.
\def\pxgtmb@addpapersize{\@ifnextchar[{\pxgtmb@addp@persize}{\pxgtmb@addp@persize[\@empty]}}
\def\pxgtmb@addp@persize[#1]#2#3#4{%
  % get current papersize and search through known standard in ascending order
  \ifx\pxgtmb@guessedtombow\@empty
  \ifx\pxgtmb@guessedpaper\@empty
    % shorter edge -> \@tempdima, longer edge -> \@tempdimb
    \ifdim\paperwidth>\paperheight\relax
      \pxgtmb@landscapetrue
      \@tempdima\paperheight \@tempdimb\paperwidth
    \else
      \pxgtmb@landscapefalse
      \@tempdima\paperwidth  \@tempdimb\paperheight
    \fi
    % \@ovri and \@ovro are used temporarily (safe enough)
    \@ovri=#3\relax
    \@ovro=#4\relax
    % when jsclasses-style \mag employment is assumed ...
    \ifx\pxgtmb@magscale\@undefined\else
      \@ovri=\inv@mag\@ovri\relax
      \@ovro=\inv@mag\@ovro\relax
    \fi
    % compare
    \ifdim\@tempdima=\@ovri\relax \ifdim\@tempdimb=\@ovro\relax
      \def\pxgtmb@guessedpaper{#2}%
      \ifx#1\@empty\else
        \def\pxgtmb@guessedtombow{#1}%
        \if n\pxgtmb@guessedtombow\else
          \ExecuteOptions{tombow-#1}% package defaults to tombowdatetrue
          \pxgtmb@switchfalse
        \fi
      \fi
    \fi \fi
  \else
    \def\pxgtmb@guessedtombow{#2}% save for console message
    \pxgtmb@setstock{#3}{#4}%      set stockwidth/height
  \fi\fi
  \DeclareOption{tombow-#2}{%
    \pxgtmb@switchtrue
    \tombowdatetrue
    \pxgtmb@setstock{#3}{#4}%
  }%
  \DeclareOption{tombo-#2}{%
    \pxgtmb@switchtrue
    \tombowdatefalse
    \pxgtmb@setstock{#3}{#4}%
  }%
  \DeclareOption{mentuke-#2}{%
    \pxgtmb@switchtrue
    \tombowdatefalse
    \setlength{\@tombowwidth}{\z@}%
    \pxgtmb@setstock{#3}{#4}%
  }%
}
\def\pxgtmb@setstock#1#2{%
  \ifpxgtmb@landscape
    \setlength\stockwidth{#2}%
    \setlength\stockheight{#1}%
  \else
    \setlength\stockwidth{#1}%
    \setlength\stockheight{#2}%
  \fi
  % when jsclasses-style \mag employment is assumed ...
  \ifx\pxgtmb@magscale\@undefined\else
    \stockwidth=\inv@mag\stockwidth\relax
    \stockheight=\inv@mag\stockheight\relax
  \fi
}%
\@onlypreamble\pxgtmb@addpapersize
\@onlypreamble\pxgtmb@addp@persize
\@onlypreamble\pxgtmb@setstock

%% initialize before search
\def\pxgtmb@guessedpaper{}
\def\pxgtmb@guessedtombow{}
\@onlypreamble\pxgtmb@guessedpaper
\@onlypreamble\pxgtmb@guessedtombow

%% package options part 2
%  ISO A series <=> JIS B series in the ascending order
\pxgtmb@addpapersize{a10}{26mm}{37mm}
\pxgtmb@addpapersize{b10}{32mm}{45mm}
\pxgtmb@addpapersize{a9}{37mm}{52mm}
\pxgtmb@addpapersize{b9}{45mm}{64mm}
\pxgtmb@addpapersize{a8}{52mm}{74mm}
\pxgtmb@addpapersize{b8}{64mm}{91mm}
\pxgtmb@addpapersize{a7}{74mm}{105mm}
\pxgtmb@addpapersize{b7}{91mm}{128mm}
\pxgtmb@addpapersize{a6}{105mm}{148mm}
\pxgtmb@addpapersize{b6}{128mm}{182mm}
\pxgtmb@addpapersize{a5}{148mm}{210mm}
\pxgtmb@addpapersize{b5}{182mm}{257mm}
\pxgtmb@addpapersize{a4}{210mm}{297mm}
\pxgtmb@addpapersize{b4}{257mm}{364mm}
\pxgtmb@addpapersize{a3}{297mm}{420mm}
\pxgtmb@addpapersize{b3}{364mm}{515mm}
\pxgtmb@addpapersize{a2}{420mm}{594mm}
\pxgtmb@addpapersize{b2}{515mm}{728mm}
\pxgtmb@addpapersize{a1}{594mm}{841mm}
\pxgtmb@addpapersize{b1}{728mm}{1030mm}
\pxgtmb@addpapersize[n]{a0}{841mm}{1189mm}
\pxgtmb@addpapersize[n]{b0}{1030mm}{1456mm}

%% package options part 3
%  ISO C series
\pxgtmb@addpapersize[a9]{c10}{28mm}{40mm}
\pxgtmb@addpapersize[a8]{c9}{40mm}{57mm}
\pxgtmb@addpapersize[a7]{c8}{57mm}{81mm}
\pxgtmb@addpapersize[a6]{c7}{81mm}{114mm}
\pxgtmb@addpapersize[a5]{c6}{114mm}{162mm}
\pxgtmb@addpapersize[a4]{c5}{162mm}{229mm}
\pxgtmb@addpapersize[a3]{c4}{229mm}{324mm}
\pxgtmb@addpapersize[a2]{c3}{324mm}{458mm}
\pxgtmb@addpapersize[a1]{c2}{458mm}{648mm}
\pxgtmb@addpapersize[a0]{c1}{648mm}{917mm}
\pxgtmb@addpapersize[n]{c0}{917mm}{1297mm}
%  misc
\pxgtmb@addpapersize[b4]{a4j}{210mm}{297mm}
\pxgtmb@addpapersize[b5]{a5j}{148mm}{210mm}
\pxgtmb@addpapersize[a3]{b4j}{257mm}{364mm}
\pxgtmb@addpapersize[a4]{b5j}{182mm}{257mm}
\pxgtmb@addpapersize[b4]{a4var}{210mm}{283mm}
\pxgtmb@addpapersize[a4]{b5var}{182mm}{230mm}
\pxgtmb@addpapersize[a3]{letter}{8.5in}{11in}
\pxgtmb@addpapersize[a3]{legal}{8.5in}{14in}
\pxgtmb@addpapersize[a4]{executive}{7.25in}{10.5in}
\pxgtmb@addpapersize[a5]{hagaki}{100mm}{148mm}

%% package options part 4
\def\pxgtmb@pdfbox@status{0}
\DeclareOption{pdfbox}{\def\pxgtmb@pdfbox@status{1}}
\DeclareOption{dvips}{\def\pxgtmb@driver{s}}
\DeclareOption{dvipdfmx}{\def\pxgtmb@driver{m}}
\DeclareOption{xetex}{\def\pxgtmb@driver{x}}
\DeclareOption{pdftex}{\def\pxgtmb@driver{p}}
\DeclareOption{luatex}{\def\pxgtmb@driver{l}}

%% default options
\ExecuteOptions{tombowbanner}% package defaults to tombowdatetrue
\ProcessOptions

%% display search result
%  if any of explicit size option is specified, \ifpxgtmb@switch = \iftrue.
%  otherwise, automatic size detection should be successful.
\ifpxgtmb@switch\else
  % check status
  \@tempcnta=\z@\relax
  \ifx\pxgtmb@guessedpaper\@empty
    \advance\@tempcnta\@ne\relax
  \fi
  \ifx\pxgtmb@guessedtombow\@empty
    \advance\@tempcnta\tw@\relax
  \else\if n\pxgtmb@guessedtombow
    \advance\@tempcnta\tw@\relax
  \fi\fi
  % message
  \ifodd\@tempcnta
    %\PackageWarningNoLine\pxgtmb@pkgname{%
    %  No size option specified, and automatic papersize\MessageBreak
    %  detection also failed}
  \else
    \typeout{***** Package \pxgtmb@pkgname\space detected \pxgtmb@guessedpaper paper. *****}
  \fi
  \ifnum\@tempcnta>\@ne\relax
    \PackageWarningNoLine\pxgtmb@pkgname{%
      Output size cannot be determined. Please add size\MessageBreak
      option (e.g. `tombow-a4') to specify output size.\MessageBreak
      Falling back to +1in ..}
    \stockwidth\paperwidth   \advance\stockwidth 2in
    \stockheight\paperheight \advance\stockheight 2in
  \else
    \typeout{***** Now the output size is automatically set to \pxgtmb@guessedtombow. *****}
  \fi
\fi

%% warnings
\ifdim\stockwidth<\paperwidth
  \PackageWarningNoLine\pxgtmb@pkgname{%
    \string\stockwidth\space is smaller than \string\paperwidth!\MessageBreak
    Is this really what you want?}
\fi
\ifdim\stockheight<\paperheight
  \PackageWarningNoLine\pxgtmb@pkgname{%
    \string\stockheight\space is smaller than \string\paperheight!\MessageBreak
    Is this really what you want?}
\fi

%% pdf "digital tombo" (driver-dependent)
%  the box size calculation is delayed until \AtBeginDocument
%  to allow users to change \@tombowbleed in the preamble

% convert pt -> bp
\def\pxgtmb@PDF@setbp#1#2{%
  \@tempdima=.996264#2\relax % 0.996264 = 72/72.27 (cf. 1in = 72.27pt = 72bp)
  \@tempdima=\pxgtmb@magscale\@tempdima % adjustment for jsclasses-style \mag employment
  \edef#1{\strip@pt\@tempdima}}
% calculate and create pdf boxes
\def\pxgtmb@PDF@calcbox{%
  \begingroup
  % provide fallback definition inside this group
  \ifx\pxgtmb@magscale\@undefined
    \def\pxgtmb@magscale{1}%
  \fi
  % set pdf boxes in bp unit
  \pxgtmb@PDF@setbp\pxgtmb@PDF@crop@ur@x\stockwidth
  \pxgtmb@PDF@setbp\pxgtmb@PDF@crop@ur@y\stockheight
  \pxgtmb@PDF@setbp\pxgtmb@PDF@trim@ll@x{\dimexpr(\stockwidth-\paperwidth)/2}%
  \pxgtmb@PDF@setbp\pxgtmb@PDF@trim@ll@y{\dimexpr(\stockheight-\paperheight)/2}%
  \pxgtmb@PDF@setbp\pxgtmb@PDF@trim@ur@x{\dimexpr(\stockwidth+\paperwidth)/2}%
  \pxgtmb@PDF@setbp\pxgtmb@PDF@trim@ur@y{\dimexpr(\stockheight+\paperheight)/2}%
  \pxgtmb@PDF@setbp\pxgtmb@PDF@bleed@ll@x{\dimexpr(\stockwidth-\paperwidth)/2-\@tombowbleed}%
  \pxgtmb@PDF@setbp\pxgtmb@PDF@bleed@ll@y{\dimexpr(\stockheight-\paperheight)/2-\@tombowbleed}%
  \pxgtmb@PDF@setbp\pxgtmb@PDF@bleed@ur@x{\dimexpr(\stockwidth+\paperwidth)/2+\@tombowbleed}%
  \pxgtmb@PDF@setbp\pxgtmb@PDF@bleed@ur@y{\dimexpr(\stockheight+\paperheight)/2+\@tombowbleed}%
  \xdef\pxgtmb@PDF@CTM{%
    %% CropBox: normally implicit (same as MediaBox, large paper size)
    %% however, pdfx.sty in PDF/X mode sets /CropBox explicitly, so I need to override it!
   \ifpxgtmb@pdfx@x
    \noexpand\pxgtmb@PDF@begin
    /CropBox  [0 0
               \pxgtmb@PDF@crop@ur@x\space
               \pxgtmb@PDF@crop@ur@y] \noexpand\pxgtmb@PDF@end
   \fi
    %% BleedBox: explicit (final paper size + surrounding \@tombowbleed)
    \noexpand\pxgtmb@PDF@begin
    /BleedBox [\pxgtmb@PDF@bleed@ll@x\space
               \pxgtmb@PDF@bleed@ll@y\space
               \pxgtmb@PDF@bleed@ur@x\space
               \pxgtmb@PDF@bleed@ur@y] \noexpand\pxgtmb@PDF@end
    %% TrimBox: explicit (final paper size)
    \noexpand\pxgtmb@PDF@begin
    /TrimBox  [\pxgtmb@PDF@trim@ll@x\space
               \pxgtmb@PDF@trim@ll@y\space
               \pxgtmb@PDF@trim@ur@x\space
               \pxgtmb@PDF@trim@ur@y] \noexpand\pxgtmb@PDF@end
    %% ArtBox: implicit
    %% [Note] PDF/X requires /TrimBox or /ArtBox but not both!
  }%
  \endgroup
}

% do it
\AtBeginDocument{\pxgtmb@PDF@emit}
\def\pxgtmb@PDF@emit{%
  % handle compatibility with pdfx.sty here;
  % if pdfx.sty with PDF/X mode detected, force [pdfbox] option!
  \pxgtmb@handle@pdfx
  \ifpxgtmb@pdfx@x\def\pxgtmb@pdfbox@status{1}\fi
  % start actual procedure for [pdfbox] option
 \if 1\pxgtmb@pdfbox@status
%% supported drivers: dvips, dvipdfmx, XeTeX, pdfTeX, LuaTeX
\ifnum0\ifx\pdfvariable\@undefined\else\the\outputmode\fi=0\relax
\ifnum0\ifx\pdfpageattr\@undefined\else\the\pdfoutput\fi=0\relax
  %% for DVI output or XeTeX
  \ifx\XeTeXversion\@undefined
    \chardef\pxgtmb@errlevel=\z@
    % check graphics/graphicx/color status
    \ifx\Gin@driver\@undefined
      \ifx\pxgtmb@driver\@undefined % driver option unavailable
        \PackageError{\pxgtmb@pkgname}{%
          Option `pdfbox' is driver-dependent!\MessageBreak
          Please add a driver option}\@ehc
        \def\pxgtmb@driver{s}% fallback
      \fi
    \else
      % check consistency
      \def\pxgtmb@tempa{dvips.def}\ifx\Gin@driver\pxgtmb@tempa
        \ifx\pxgtmb@driver\@undefined
          \def\pxgtmb@driver{s}% pass
        \else
          \if s\pxgtmb@driver\else \chardef\pxgtmb@errlevel=\@ne \fi
        \fi
      \else\def\pxgtmb@tempa{dvipdfmx.def}\ifx\Gin@driver\pxgtmb@tempa
        \ifx\pxgtmb@driver\@undefined
          \def\pxgtmb@driver{m}% pass
        \else
          \if m\pxgtmb@driver\else \chardef\pxgtmb@errlevel=\@ne \fi
        \fi
      \else
        \ifx\pxgtmb@driver\@undefined
          \PackageError{\pxgtmb@pkgname}{%
            Option `pdfbox' is driver-dependent!\MessageBreak
            Please add a driver option}\@ehc
          \def\pxgtmb@driver{s}% fallback
        \fi
      \fi\fi
      \ifnum\pxgtmb@errlevel>\z@
        \PackageWarningNoLine{\pxgtmb@pkgname}{%
          Inconsistent driver option detected!\MessageBreak
          Package `graphics' or `color' already\MessageBreak
          loaded with different driver option}\@ehc
      \fi
    \fi
  \else
    \def\pxgtmb@driver{x}
  \fi
  % required for putting \special to every page
  \RequirePackage{atbegshi}
  \ifx\pfmtname\@undefined\else
    \ifx\AtBegShi@Output\@undefined
      % LaTeX2e 2020-10-01: an emulation by ``atbegshi-ltx.sty''
      % => pLaTeX2e 2020-10-01 natively supports it
    \else
      % older: the real ``atbegshi.sty'' is loaded
      \IfFileExists{pxatbegshi.sty}{\RequirePackage{pxatbegshi}}{}
    \fi
  \fi
  % do it
  \if x\pxgtmb@driver
    %% for XeTeX (similar to dvipdfmx, except for paper size)
    \AtBeginDocument{%
      \pxgtmb@PDF@calcbox
      \def\pxgtmb@PDF@begin{}\def\pxgtmb@PDF@end{}%
      \edef\pxgtmb@PDF@CTM{{pdf:put @thispage << \pxgtmb@PDF@CTM >>}}}
    % force paper size
    \pdfpagewidth\stockwidth \pdfpageheight\stockheight
    % emit pdf boxes
    \AtBeginShipout{\setbox\AtBeginShipoutBox=\vbox{%
      \baselineskip\z@skip\lineskip\z@skip\lineskiplimit\z@
      \expandafter\special\pxgtmb@PDF@CTM % here!
      \copy\AtBeginShipoutBox}}
  \else
    \if s\pxgtmb@driver
      %% for dvips
      \AtBeginDocument{%
        \pxgtmb@PDF@calcbox
        \def\pxgtmb@PDF@begin{[ }\def\pxgtmb@PDF@end{/PAGE pdfmark }%
        \edef\pxgtmb@PDF@CTM{{ps:SDict begin \pxgtmb@PDF@CTM end}}}
    \else\if m\pxgtmb@driver
      %% for dvipdfmx
      \AtBeginDocument{%
        \pxgtmb@PDF@calcbox
        \def\pxgtmb@PDF@begin{}\def\pxgtmb@PDF@end{}%
        \edef\pxgtmb@PDF@CTM{{pdf:put @thispage << \pxgtmb@PDF@CTM >>}}}
    \else
      %% for others (in case graphics option wrong)
      \PackageError{\pxgtmb@pkgname}{Sorry, driver unsupported}\@ehc
      \def\pxgtmb@PDF@CTM{{}}% dummy
    \fi\fi
    %% common
    \begingroup
      % when jsclasses-style \mag employment is assumed ...
      % [Note] \special{papersize=<width>,<height>} accepts only non-true units
      % and evaluates them as if they were true units!
      \ifx\pxgtmb@magscale\@undefined\else
        \stockwidth \pxgtmb@magscale\stockwidth
        \stockheight\pxgtmb@magscale\stockheight
      \fi
      \xdef\pxgtmb@PDF@size{{papersize=\the\stockwidth,\the\stockheight}}
    \endgroup
    \AtBeginShipout{\setbox\AtBeginShipoutBox=\vbox{%
      \baselineskip\z@skip\lineskip\z@skip\lineskiplimit\z@
      % force paper size
      \expandafter\special\pxgtmb@PDF@size
      % emit pdf boxes
      \expandafter\special\pxgtmb@PDF@CTM % here!
      \copy\AtBeginShipoutBox}}
  \fi
\else
  %% for pdfTeX
  \def\pxgtmb@driver{p}
  % force paper size
  \pdfpagewidth\stockwidth \pdfpageheight\stockheight
  % emit pdf boxes
  \AtBeginDocument{%
    \pxgtmb@PDF@calcbox
    \def\pxgtmb@PDF@begin{}\def\pxgtmb@PDF@end{}%
    \edef\pxgtmb@PDF@CTM{{\pxgtmb@PDF@CTM}}%
    \expandafter\pdfpageattr\pxgtmb@PDF@CTM}
\fi\else
  %% for LuaTeX
  \def\pxgtmb@driver{l}
  % force paper size
  \pagewidth\stockwidth \pageheight\stockheight
  % emit pdf boxes
  \AtBeginDocument{%
    \pxgtmb@PDF@calcbox
    \def\pxgtmb@PDF@begin{}\def\pxgtmb@PDF@end{}%
    \edef\pxgtmb@PDF@CTM{pageattr{\pxgtmb@PDF@CTM}}%
    \expandafter\pdfvariable\pxgtmb@PDF@CTM}
\fi
 \fi
}

%% make visible tombow box according to the current status of
%% \@bannerfont, \@bannertoken, \@tombowwidth & \@tombowbleed
\maketombowbox

%% shift amount
\hoffset .5\stockwidth
\advance\hoffset -.5\paperwidth
\advance\hoffset-1truein\relax
\voffset .5\stockheight
\advance\voffset -.5\paperheight
\advance\voffset-1truein\relax

%% user interface
\newcommand{\settombowbanner}[1]{%
  \iftombowdate\else
    \PackageWarning{\pxgtmb@pkgname}{%
      Package option `tombowbanner' is not effective.\MessageBreak
      The banner may be discarded}%
  \fi
  \@bannertoken{#1}\maketombowbox}
\newcommand{\settombowbannerfont}[1]{%
  \font\@bannerfont=#1\relax \maketombowbox}
\newcommand{\settombowwidth}[1]{%
  \setlength{\@tombowwidth}{#1}\maketombowbox}
\newcommand{\settombowbleed}[1]{%
  \def\@tombowbleed{#1}\maketombowbox}
\newcommand{\settombowcolor}[1]{%
  \def\@tombowcolor{#1}}
% forbid changing \@tombowbleed after \begin{document}
% because pdf boxes are calculated only inside \AtBeginDocument
\@onlypreamble\settombowbleed

%% patch internal of pdfpages.sty to work with tombow
\def\pxgtmb@patch@pdfpages{%
  \IfFileExists{pxpdfpages.sty}{\RequirePackage{pxpdfpages}}{}}
\AtBeginDocument{\@ifpackageloaded{pdfpages}{\pxgtmb@patch@pdfpages}{}}

%% patch pdfx.sty
%% (tested on pdfx 2019/02/27 v1.6.3)
\def\pxgtmb@handle@pdfx{\@ifpackageloaded{pdfx}{\let\ifpxgtmb@pdfx@x\ifpdfx@x}{}}

\endinput
