summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/platex-tools/pxatbegshi.sty
blob: 77e00d6a544709aef00bad31eab1e2fcf4316540 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
%
% pxatbegshi.sty
% written by Hironobu Yamashita (@aminophen)
%
% This package is part of the platex-tools bundle.
% https://github.com/aminophen/platex-tools
%
% --------------------------------------------------------------------
% [Note]
% Previous version (2018/09/21 v0.4) was largely based on
%   "cope with tate-direction"
% of bxpapersize.sty 2017/05/02 v0.3a by T. Yato.
%   -- concept: execute all hooks in temporary yoko direction,
%   -- by prepending \yoko and switching back to the original
% However, it was problematic when used with multicol.sty.
%
% Thus, in newer version (2019/09/07 v0.5), I reverted back to
% the original code (2018/09/21 v0.3), which was largely based on
% H. Kitagawa's on GitHub:texjporg/tex-jp-build#21.
%   -- concept: execute all hooks inside yoko direction \vbox
%
% Update: version 2020/09/09 v0.6 supports LaTeX2e 2020-10-01
% based on a method proposed by H. Kitagawa in lltjp-atbegshi.sty.
%
% Update: version 2020/09/25 v0.7 does nothing, since
% pLaTeX2e 2020-10-01 will support the situation natively.
% --------------------------------------------------------------------
%

%% package declaration
\NeedsTeXFormat{pLaTeX2e}
\ProvidesPackage{pxatbegshi}
    [2021/05/31 v0.7c Patch to atbegshi for (u)pLaTeX]

%% Since LaTeX2e 2020-10-01, atbegshi.sty is merely
%% an emulation by atbegshi-ltx.sty from ltshipout.dtx.

\chardef\pxabgs@status=\z@
\@ifl@t@r\fmtversion{2020/10/01}{\chardef\pxabgs@status=\@ne}{}
\ifnum\pxabgs@status=\@ne
  % if LaTeX2e and pLaTeX2e are inconsistent, raise an error!
  \@ifl@t@r\pfmtversion{2020/10/01}{%
    \PackageInfo{pxatbegshi}{This package is no longer needed}%
  }{%
    \PackageError{pxatbegshi}{Inconsistent LaTeX2e/pLaTeX2e combination}\@ehc
  }%
  \RequirePackage{atbegshi}% input anyway
  \expandafter\endinput
\fi

%% The rest of this package is meant for
%% LaTeX2e 2020-02-02 PL5 or older.

\RequirePackage{atbegshi}

\ifx\AtBegShi@Output\@undefined
  \PackageError{pxatbegshi}{This should not happen}\@ehc
  \expandafter\endinput
\fi

%% preparations
\def\pxabgs@pkgname{pxatbegshi}
\def\pxabgs@warn{\PackageWarningNoLine\pxabgs@pkgname}

%% internal macros are locally effective
\begingroup

%--------------------------------------- helpers

%% unique tokens
\def\pxabgs@mark{\pxabgs@mark@}
\def\pxabgs@fin{\pxabgs@fin@}

%% \pxabgs@patch@cmd\CMD{<orig>}{<new>}
\@onlypreamble\pxabgs@patch@cmd
\def\pxabgs@patch@cmd#1#2#3{%
  \def\pxabgs@next##1#2##2\pxabgs@mark##3\pxabgs@fin{%
    \ifx\pxabgs@mark##3\pxabgs@mark
      \let\pxabgs@fragment\relax
    \else
      \def\pxabgs@fragment{##2}%
      \def#1{##1#3##2}%
    \fi}%
  \expandafter\pxabgs@next#1\pxabgs@mark#2\pxabgs@mark\pxabgs@fin}

%---------------------------------------

% prepare
\let\pxabgs@AtBegShi@Output\AtBegShi@Output
% try first patch
\pxabgs@patch@cmd\pxabgs@AtBegShi@Output
  {\let\AtBegShi@OrgProtect\protect}%
  {\setbox8\vbox\bgroup\yoko\let\AtBegShi@OrgProtect\protect}
\ifx\pxabgs@fragment\relax % failure
  \let\pxabgs@AtBegShi@Output\relax
\else % success, try second patch
  \pxabgs@patch@cmd\pxabgs@AtBegShi@Output
    {\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox}%
    {\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox\egroup}
  \ifx\pxabgs@fragment\relax % failure
    \let\pxabgs@AtBegShi@Output\relax
  \else % success, try third patch
    \pxabgs@patch@cmd\pxabgs@AtBegShi@Output{%
      \begingroup
        \setbox\AtBeginShipoutBox\box\AtBeginShipoutBox
      \endgroup
      \let\protect\AtBegShi@OrgProtect
    }{%
      \begingroup
        \setbox\AtBeginShipoutBox\box\AtBeginShipoutBox
      \endgroup
      \let\protect\AtBegShi@OrgProtect
      \egroup
    }
    \ifx\pxabgs@fragment\relax % failure
      \let\pxabgs@AtBegShi@Output\relax
    \fi
  \fi
\fi
% commit the change only when successful
\ifx\pxabgs@AtBegShi@Output\relax
  \pxabgs@warn{Failed in patching \string\AtBegShi@Output}
\else
  \global\let\AtBegShi@Output\pxabgs@AtBegShi@Output
\fi

\endgroup
%% internal macros are no longer effective

%--------------------------------------- done

\endinput
%% EOF