% % plautopatch.sty % written by Hironobu Yamashita (@aminophen) % % This package is part of the plautopatch bundle. % https://github.com/aminophen/plautopatch % \NeedsTeXFormat{pLaTeX2e} \ProvidesPackage{plautopatch} [2018/08/21 v0.2 Automated patches for pLaTeX/upLaTeX] \def\platpc@pkgname{plautopatch} \def\platpc@warn{\PackageWarningNoLine\platpc@pkgname} \def\platpc@info{\PackageInfo\platpc@pkgname} \RequirePackage{filehook} % low-level helpers %% \platpc@req@add{} % = if not loaded yet, \RequirePackage{} % and add to list. \def\platpc@req@add#1{% \@ifpackageloaded{#1}{}{\RequirePackage{#1}\platpc@addtolist{#1}}% } %% \platpc@addtolist{} % = add to list named \platpc@list. \def\platpc@addtolist#1{\xdef\platpc@list{\platpc@list, #1}} \def\platpc@list{}% initialize % high-level helpers %% \platpc@patch@after{}{} % = Load after . \def\platpc@patch@after#1#2{% \expandafter\def\csname platpc@end@#1\endcsname{% \expandafter\ifx\csname platpc@disable@#1\endcsname\relax \platpc@req@add{#2}% \fi }% \AtEndOfPackageFile{#1}{\csname platpc@end@#1\endcsname}% } \@onlypreamble\platpc@patch@after %% \platpc@patch@after@both{}{}{} % = Load after both & . \def\platpc@patch@after@both#1#2#3{% % for order #2 => #1 \expandafter\def\csname platpc@end@#1+#2\endcsname{% \expandafter\ifx\csname platpc@disable@#1\endcsname\relax \expandafter\ifx\csname platpc@disable@#2\endcsname\relax \@ifpackageloaded{#2}{\platpc@req@add{#3}}{}% \fi \fi }% \AtEndOfPackageFile{#1}{\csname platpc@end@#1+#2\endcsname}% % for order #1 => #2 \expandafter\def\csname platpc@end@#2+#1\endcsname{% \expandafter\ifx\csname platpc@disable@#2\endcsname\relax \expandafter\ifx\csname platpc@disable@#1\endcsname\relax \@ifpackageloaded{#1}{\platpc@req@add{#3}}{}% \fi \fi }% \AtEndOfPackageFile{#2}{\csname platpc@end@#2+#1\endcsname}% } \@onlypreamble\platpc@patch@after@both %% \platpc@patch@before{}{} % = Load before . % used when both conditions are met: % - must be loaded *before* % - contains \RequirePackage{} \def\platpc@patch@before#1#2{% \expandafter\def\csname platpc@begin@#1\endcsname{% % if is already loaded, nothing to do \@ifpackageloaded{#2}{}{% else \expandafter\ifx\csname platpc@disable@#1\endcsname\relax % the code (*!) should be used only once, % remove it immediately when this macro is executed \expandafter\let\csname platpc@begin@#1\endcsname\relax % pretend as if not loaded \expandafter\let\csname ver@#1.sty\endcsname\relax % load the package \RequirePackage{#2}\platpc@addtolist{#2}% % avoid loading twice by discarding "\@@input " (*!) \let\platpc@filehook@@atbegin\filehook@@atbegin \def\filehook@@atbegin\@@input####1\filehook@atend{% \let\filehook@@atbegin\platpc@filehook@@atbegin % avoid infinite loop even when \AtEndOfPackageFile used \expandafter\let\csname filehook@atend@#1.sty\endcsname\relax \filehook@@atbegin \filehook@atend}% % all done \fi }% }% \AtBeginOfPackageFile{#1}{\csname platpc@begin@#1\endcsname}% } \@onlypreamble\platpc@patch@before % interface for users who want don't patches %% \plautopatchdisable{,,...} % = Disable patches triggered by , , ... \newcommand{\plautopatchdisable}[1]{% \edef\@tempa{\zap@space#1 \@empty}% \@for\@tempa:=\@tempa\do{% \expandafter\let\csname platpc@disable@\@tempa\endcsname\@empty }% } \@onlypreamble\plautopatchdisable % show list of loaded patches \AtEndDocument{\platpc@showlist} \def\platpc@showlist{% \ifx\platpc@list\@empty \platpc@info{No additional packages loaded} \else % the first token of \platpc@list should be ',' \typeout{% ***** List of packages loaded by `\platpc@pkgname': *****^^J% \expandafter\@gobble\platpc@list.^^J% *****************************************************}% \fi } % register patches \ifx\enablecjktoken\@undefined \platpc@patch@after{tracefnt}{ptrace}% platex \else \platpc@patch@after{tracefnt}{uptrace}% uplatex \fi \platpc@patch@after{fltrace}{pfltrace}% platex \platpc@patch@after{array}{plarray}% platex-tools \platpc@patch@after@both{array}{plext}{plextarray}% platex-tools \platpc@patch@after@both{delarray}{plext}{plextdelarray}% platex-tools \platpc@patch@after{everysel}{pxeverysel}% platex-tools \platpc@patch@after{everyshi}{pxeveryshi}% platex-tools \platpc@patch@after{atbegshi}{pxatbegshi}% platex-tools \platpc@patch@before{ftnright}{pxftnright}% platex-tools \platpc@patch@after{pdfpages}{pxpdfpages}% (maintained here!) \endinput