diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/bxpdfver/bxpdfver.sty |
Initial commit
Diffstat (limited to 'macros/latex/contrib/bxpdfver/bxpdfver.sty')
-rw-r--r-- | macros/latex/contrib/bxpdfver/bxpdfver.sty | 918 |
1 files changed, 918 insertions, 0 deletions
diff --git a/macros/latex/contrib/bxpdfver/bxpdfver.sty b/macros/latex/contrib/bxpdfver/bxpdfver.sty new file mode 100644 index 0000000000..213871f7bf --- /dev/null +++ b/macros/latex/contrib/bxpdfver/bxpdfver.sty @@ -0,0 +1,918 @@ +% bxpdfver.sty + +%% package declaration +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{bxpdfver}[2017/02/11 v0.4] +\def\bxpv@pkgname{bxpdfver} + +%% preparations +\RequirePackage{ifthen}[]% for \newboolean +\newif\ifbxpv@ok +\providecommand\bxDebug[1]{} + +%--------------------------------------- package options + +%% variables +\let\bxpv@drv@type\relax % driver type + % p=pdfmode,d=dvipdfmx,0=disabled,x=unsupported +\let\bxpv@drv@name\relax % driver name +\let\bxpv@version\relax % version value (eg. 1.4) +\let\bxpv@compress=t % use compression? +\let\bxpv@obj@compress=t % use object stream? +\chardef\bxpv@infolevel=2 % info-log level + +%% options +% (PDF version) +\DeclareOption{1.4}{% + \edef\bxpv@version{\CurrentOption}% +} +\DeclareOption{1.5}{% + \edef\bxpv@version{\CurrentOption}% +} +\DeclareOption{1.6}{% + \edef\bxpv@version{\CurrentOption}% +} +\DeclareOption{1.7}{% + \edef\bxpv@version{\CurrentOption}% +} +\DeclareOption{1.8}{% + \edef\bxpv@version{\CurrentOption}% +} +\DeclareOption{1.9}{% + \edef\bxpv@version{\CurrentOption}% +} +% (compression) +\DeclareOption{nocompress}{% + \let\bxpv@compress=f% +} +\DeclareOption{compress}{% + \let\bxpv@compress=t% +} +\DeclareOption{noobjcompress}{% + \let\bxpv@obj@compress=f% +} +\DeclareOption{objcompress}{% + \let\bxpv@obj@compress=t% +} +% (driver) +\DeclareOption{native}{% + \let\bxpv@drv@type=p% + \def\bxpv@drv@name{native}% +} +\DeclareOption{dvipdfmx}{% + \let\bxpv@drv@type=d% + \def\bxpv@drv@name{dvipdfmx}% +} +\DeclareOption{dvips}{% + \let\bxpv@drv@type=x% + \def\bxpv@drv@name{dvips}% +} +\DeclareOption{dviout}{% + \let\bxpv@drv@type=x% + \def\bxpv@drv@name{dviout}% +} +\DeclareOption{xdvi}{% + \let\bxpv@drv@type=x% + \def\bxpv@drv@name{xdvi}% +} +\DeclareOption{disabled}{% + \let\bxpv@drv@type=0% + \def\bxpv@drv@name{disabled}% +} +\DeclareOption{nodvidriver}{% + \let\bxpv@drv@type=0% + \def\bxpv@drv@name{nodvidriver}% +} +% (other) +\DeclareOption{lenient}{% + \chardef\bxpv@infolevel=1 +} + +%% process +\ProcessOptions* + +%--------------------------------------- helpers + +%% unique tokens +\def\bxpv@end{\bxpv@end@} +\def\bxpv@mt{\bxpv@mt@} +\let\bxpv@mk\noindent + +%% \bxpv@csletcs +\def\bxpv@csletcs#1#2{% + \expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname +} + +%% \bxpv@detokenize\CS +\def\bxpv@detokenize#1{% + \expandafter\bxpv@detokenize@a\meaning#1\bxpv@end#1% +} +\def\bxpv@detokenize@a#1>#2\bxpv@end#3{% + \def#3{#2}% +} + +%% \bxpv@fail{<message>} +% Issues an error or a warning. +\@onlypreamble\bxpv@fail +\def\bxpv@fail#1{% + \ifcase\bxpv@infolevel % silenced + \or % lenient + \PackageWarningNoLine\bxpv@pkgname{#1}% + \or % strict + \PackageError\bxpv@pkgname{#1}{\@ehc}% + \fi +} + +%% \bxpv@fail@nafea +\@onlypreamble\bxpv@fail@nafea +\def\bxpv@fail@nafea#1{% + \bxpv@fail{#1, because\MessageBreak + the engine/driver does not support the feature}% +} + +%--------------------------------------- internal dispatchers + +%% \bxpv@suppress@compress +\@onlypreamble\bxpv@suppress@compress +\def\bxpv@suppress@compress{% + \bxpv@fail@nafea{Cannot suppress compression}% +} +%% \bxpv@suppress@obj@compress +\@onlypreamble\bxpv@suppress@obj@compress +\def\bxpv@suppress@obj@compress{% + \bxpv@fail@nafea{Cannot suppress object compression}% +} +%% \bxpv@set@version +\@onlypreamble\bxpv@set@version +\def\bxpv@set@version{% + \bxpv@fail@nafea{Cannot set PDF version}% +} +%% \bxpv@set@decimaldigits +\@onlypreamble\bxpv@set@decimaldigits +\def\bxpv@set@decimaldigits{% + \bxpv@fail@nafea{Cannot set PDF decimal digits}% +} +%% \bxpv@set@pkresolution +\@onlypreamble\bxpv@set@pkresolution +\def\bxpv@set@pkresolution{% + \bxpv@fail@nafea{Cannot set PK resolution}% +} +%% \bxpv@preserve@destinations +\@onlypreamble\bxpv@preserve@destinations +\def\bxpv@preserve@destinations{% + \bxpv@fail@nafea{Cannot preserve PDF destinations}% +} +%% \bxpv@cancel@obj@compress +% The silent version of \bxpv@suppress@obj@compress. +\@onlypreamble\bxpv@cancel@obj@compress +\let\bxpv@cancel@obj@compress\relax + +%% \bxpv@begin@document@hook +% The begin-document hook. +\@onlypreamble\bxpv@begin@document@hook +\let\bxpv@begin@document@hook\@empty +\AtBeginDocument{\bxpv@begin@document@hook} + +%% 'disabled' driver +\if 0\bxpv@drv@type + \chardef\bxpv@infolevel=0 +\fi + +%% adjust internal dispatchers +\ifx 0\bxpv@drv@type\else %-------- +\begingroup + +%% \bxpv@check@prim\CS{<proc>} +% Do <proc> if \CS is defined as primitive. +\def\bxpv@check@prim#1{% + \edef\bxpv@tmpa{\string#1}% + \edef\bxpv@tmpb{\meaning#1}% + \ifx\bxpv@tmpa\bxpv@tmpb \expandafter\@firstofone + \else \expandafter\@gobble + \fi +} + +%% \bxpv@pdfoutput +\chardef\bxpv@pdfoutput\z@ +\bxpv@check@prim\pdfoutput{\chardef\bxpv@pdfoutput\pdfoutput} +\bxpv@check@prim\outputmode{\chardef\bxpv@pdfoutput\outputmode} +\bxpv@check@prim\ngbanner{\chardef\bxpv@pdfoutput\@ne} + +%% when in PDF mode +\ifnum\bxpv@pdfoutput>\z@ + \global\let\bxpv@drv@type=p + \global\let\bxpv@@compresslevel\pdfcompresslevel + \global\let\bxpv@@objcompresslevel\pdfobjcompresslevel + \global\let\bxpv@@minorversion\pdfminorversion + \global\let\bxpv@@decimaldigits\pdfdecimaldigits + \global\let\bxpv@@pkresolution\pdfpkresolution + \bxpv@check@prim\pdfvariable{% + \protected\xdef\bxpv@@compresslevel{\pdfvariable compresslevel}% + \protected\xdef\bxpv@@objcompresslevel{\pdfvariable objcompresslevel}% + \protected\xdef\bxpv@@minorversion{\pdfvariable minorversion}% + \protected\xdef\bxpv@@decimaldigits{\pdfvariable decimaldigits}% + \protected\xdef\bxpv@@pkresolution{\pdfvariable pkresolution}% + }% + % If \pdfcompresslevel is available, use it. + \ifx\bxpv@@compresslevel\@undefined\else + \gdef\bxpv@suppress@compress{% + \global\bxpv@@compresslevel\z@ + }% + \fi + % If \pdfobjcompresslevel is available, use it. + \ifx\bxpv@@objcompresslevel\@undefined\else + \global\chardef\bxpv@org@objcompresslevel\bxpv@@objcompresslevel + \gdef\bxpv@suppress@obj@compress{% + \global\bxpv@@objcompresslevel\z@ + }% + \global\let\bxpv@cancel@obj@compress\bxpv@suppress@obj@compress + \fi + % If \pdfminorversion is available, use it. + \ifx\bxpv@@minorversion\@undefined\else + \global\chardef\bxpv@org@minorversion\bxpv@@minorversion + \gdef\bxpv@set@version{% + \ifx\bxpdfverMinorVersion\relax + \global\bxpv@@minorversion\bxpv@org@minorversion + \else + \global\bxpv@@minorversion\bxpdfverMinorVersion + \fi + }% + \g@addto@macro\bxpv@begin@document@hook{% + \ifnum\bxpv@@minorversion<5 + \bxpv@cancel@obj@compress + \fi + }% + \fi + % If \pdfdecimaldigits is available, use it. + \ifx\bxpv@@decimaldigits\@undefined\else + \global\chardef\bxpv@org@decimaldigits\bxpv@@decimaldigits + \gdef\bxpv@set@decimaldigits{% + \ifx\bxpdfverDecimalDigits\relax + \global\bxpv@@decimaldigits\bxpv@org@decimaldigits + \else + \global\bxpv@@decimaldigits\bxpdfverDecimalDigits + \fi + }% + \fi + % If \pdfpkresolution is available, use it. + \ifx\bxpv@@pkresolution\@undefined\else + \global\mathchardef\bxpv@org@pkresolution\bxpv@@pkresolution + \gdef\bxpv@set@pkresolution{% + \ifx\bxpdfverPkResolution\relax + \global\bxpv@@pkresolution\bxpv@org@pkresolution + \else + \global\bxpv@@pkresolution\bxpdfverPkResolution + \fi + }% + \fi + % On pdfTeX or LuaTeX, \pdfpreservedestionations can be no-op. + \bxpv@oktrue \bxpv@check@prim\ngbanner{\bxpv@okfalse}% + \ifbxpv@ok + \global\let\bxpv@preserve@destinations\relax + \fi +\else + % XeTeX should do just as dvipdfmx. + \bxpv@check@prim\XeTeXversion{% + \global\let\bxpv@drv@type=d% + } +\fi + +%% when in DVI mode +\if x\bxpv@drv@type % 'bad' driver + \bxpv@fail{Unsupported driver '\bxpv@drv@name'}% + % no further errors + \global\chardef\bxpv@infolevel=0 +\else\if d\bxpv@drv@type % 'dvipdfmx' + \global\let\bxpv@suppress@compress\relax + \global\let\bxpv@suppress@obj@compress\relax + \global\let\bxpv@set@version\relax + \global\let\bxpv@set@decimaldigits\relax + %\global\let\bxpv@set@pkresolution\relax + \global\let\bxpv@preserve@destinations\relax + \g@addto@macro\bxpv@begin@document@hook{% + \bxpv@begin@document@dvipdfmx + } + \AtEndOfPackage{\g@addto@macro\bxpv@begin@document@hook{% + \bxpv@cache@finalize + }} +\else\if \relax\bxpv@drv@type % no driver + \bxpv@fail + {No driver option is given}% + \global\chardef\bxpv@infolevel=0 +\fi\fi\fi + +\endgroup +\fi %-------- + +%--------------------------------------- public interface + +%%<*> \suppresspdfcompression +\@onlypreamble\suppresspdfcompression +\newcommand*\suppresspdfcompression{% + \bxpv@suppress@compress + \global\bxpdfverCompressionSuppressedtrue +} + +%%<*> \suppresspdfobjcompression +\@onlypreamble\suppresspdfobjcompression +\newcommand*\suppresspdfobjcompression{% + \bxpv@suppress@obj@compress + \global\bxpdfverObjCompressionSuppressedtrue +} + +%%<*> \setpdfversion{<version>} +\@onlypreamble\setpdfversion +\newcommand*\setpdfversion[1]{% + \edef\bxpv@version{#1}% + \bxpv@get@mversion + \bxpv@set@version +} + +%%<*> \setpdfdecimaldigits{<number>} +\@onlypreamble\setpdfdecimaldigits +\newcommand*\setpdfdecimaldigits[1]{% + \bxpv@assign@num\bxpdfverDecimalDigits{#1}{0}{4}% + \bxpv@set@decimaldigits +} + +%%<*> \setpdfpkresolution{<number>} +\@onlypreamble\setpdfpkresolution +\newcommand*\setpdfpkresolution[1]{% + \bxpv@assign@num\bxpdfverPkResolution{#1}{0}{10000}% + \bxpv@set@pkresolution +} + +%%<*> \preservepdfdestinations +\@onlypreamble\preservepdfdestinations +\newcommand*\preservepdfdestinations{% + \bxpv@preserve@destinations + \global\bxpdfverDestinationsPreservedtrue +} + +%%<+> \ifbxpdfverCompressionSuppressed +\newboolean{bxpdfverCompressionSuppressed} + +%%<+> \ifbxpdfverObjCompressionSuppressed +\newboolean{bxpdfverObjCompressionSuppressed} + +%%<+> \bxpdfverMinorVersion +% The PDF minor version (eg. '4' for 1.4) that this package +% will impose. It is a number constant, or \relax. +\@ifdefinable{\bxpdfverMinorVersion}{% + \let\bxpdfverMinorVersion\relax +} + +%%<+> \bxpdfverDecimalDigits +% The PDF decimal-digits value that this package +% will impose. It is a number constant, or \relax. +\@ifdefinable{\bxpdfverDecimalDigits}{% + \let\bxpdfverDecimalDigits\relax +} + +%%<+> \bxpdfverPkResolution +% The PK resolution value that this package +% will impose. It is a number constant, or \relax. +\@ifdefinable{\bxpdfverPkResolution}{% + \let\bxpdfverPkResolution\relax +} + +%%<+> \ifbxpdfverDestinationsPreserved +\newboolean{bxpdfverDestinationsPreserved} + +%% \bxpv@assign@num\CS{<value>}{<min>}{<max>} +\@onlypreamble\bxpv@assign@num +\def\bxpv@assign@num#1#2#3#4{% + \begingroup + \edef\bxpv@tmpa{#2}% + \ifx\bxpv@tmpa\@empty + \global\let#1\relax + \else + \@tempswatrue + \afterassignment\bxpv@assign@num@a + \@tempcnta=\bxpv@tmpa\bxpv@mk + \if@tempswa + \ifnum\@tempcnta<#3\relax \@tempswafalse \fi + \ifnum\@tempcnta>#4\relax \@tempswafalse \fi + \if@tempswa + \global\mathchardef#1=\@tempcnta + \else + \PackageError\bxpv@pkgname + {Number is out of range (#3..#4)\MessageBreak + (value=\the\@tempcnta)}% + {\@ehc} + \fi + \else + \PackageError\bxpv@pkgname + {Illegal number format\MessageBreak + (value=\bxpv@tmpa)}% + {\@ehc} + \fi + \fi + \endgroup} +\@onlypreamble\bxpv@assign@num@a +\def\bxpv@assign@num@a#1\bxpv@mk{% + \ifx\bxpv@mt#1\bxpv@mt\else \@tempswafalse \fi} + +%--------------------------------------- version values + +%% variables +\let\bxpv@mversion\relax % minor version (temporary) + +%% \bxpv@get@mversion +% Sets \bxpdfverMinorVersion. +\@onlypreamble\bxpv@get@mversion +\def\bxpv@get@mversion{% + \edef\bxpv@version{\bxpv@version}% + \ifx\bxpv@version\@empty + \global\let\bxpdfverMinorVersion\relax % unset + \else + \let\bxpv@mversion\relax + \@tfor\bxpv@x:=456789\do{% + \edef\bxpv@tmpa{1.\bxpv@x}% + \ifx\bxpv@version\bxpv@tmpa + \chardef\bxpv@mversion=\bxpv@x\relax + \fi + }% + \ifx\bxpv@mversion\relax + \bxpv@file@mversion + \fi + \ifx\bxpv@mversion\relax + \PackageError\bxpv@pkgname + {Invalid value given for PDF version\MessageBreak + (value=\bxpv@version)}{% + PDF version must be either 1.4, 1.5, ..., 1.9, or\MessageBreak + or the name of a PDF file from which the version is pulled.% + \MessageBreak\@ehc}% + \else + \PackageInfo\bxpv@pkgname + {Output PDF version is set to 1.\the\bxpv@mversion + \MessageBreak}% + \global\let\bxpdfverMinorVersion\bxpv@mversion + \fi + \fi +} + +%% \bxpv@file@mversion +\@onlypreamble\bxpv@file@mversion +\def\bxpv@file@mversion{% + \let\bxpv@mversion\relax + \expandafter\bxpv@file@mversion@a\bxpv@version\bxpv@end +} +\@onlypreamble\bxpv@file@mversion@a +\def\bxpv@file@mversion@a#1\bxpv@end{% + \filename@parse{#1}% + \edef\bxpv@next{% + \lowercase{\def\noexpand\filename@ext{\filename@ext}}% + }\bxpv@next + \def\bxpv@tmpb{pdf}% + \ifx\filename@ext\bxpv@tmpb + \global\let\bxpv@gtmpa\relax + \bxpv@read@file{#1}{% + \bxpv@file@mversion@xa{##1 }% + \bxpv@read@file@finish + }% + \ifbxpv@read@file@ok\else + \PackageWarning\bxpv@pkgname + {File '#1' not found}% + \fi + \@tfor\bxpv@x:=456789\do{% + \ifx\bxpv@x\bxpv@gtmpa + \chardef\bxpv@mversion=\bxpv@x\relax + \fi + }% + \fi +} +% some more subprocedures +\@onlypreamble\bxpv@file@mversion@xa +\@onlypreamble\bxpv@file@mversion@xb +\@onlypreamble\bxpv@file@mversion@xc +\begingroup + \escapechar\m@ne + \def\bxpv@tmpa#1\bxpv@end{% + \gdef\bxpv@file@mversion@xa##1{% + \bxpv@file@mversion@xb##1#1\bxpv@end + }% + \gdef\bxpv@file@mversion@xb##1#1##2\bxpv@end{% + \ifx\bxpv@mt##1\bxpv@mt + \bxpv@file@mversion@xc##2\bxpv@end + \fi + }% + \gdef\bxpv@file@mversion@xc##1 ##2\bxpv@end{% + \gdef\bxpv@gtmpa{##1}% + }% + } + \edef\bxpv@tmpb{{\expandafter\string\csname\string\%PDF-1.\endcsname}}% + \expandafter\bxpv@tmpa\bxpv@tmpb\bxpv@end +\endgroup + +%--------------------------------------- dvipdfmx something +\ifx d\bxpv@drv@type % 'dvipdfmx' + +%% required packages +\RequirePackage{atbegshi}[2007/04/19]% v1.2 + +%% variables +\let\bxpv@C@value\relax + +%% \bxpv@C@bits +\@onlypreamble\bxpv@C@bits +\let\bxpv@C@bits\@empty + +%% \bxpv@page@specials +\let\bxpv@page@specials\@empty + +%% \bxpv@put@special +\@onlypreamble\bxpv@put@special +\def\bxpv@put@special#1{% + \edef\bxpv@page@specials{\bxpv@page@specials\special{#1}}% +} + +%% \bxpv@begin@document@dvipdfmx +\@onlypreamble\bxpv@begin@document@dvipdfmx +\def\bxpv@begin@document@dvipdfmx{% + % PDF version + \ifx\bxpdfverMinorVersion\relax\else + \g@addto@macro\bxpv@page@specials{% + \special{pdf:minorversion \the\bxpdfverMinorVersion}% + }% + \fi + % compression + \ifbxpdfverCompressionSuppressed + \bxpv@check@dvipdfmx@version{20160307}% + {Cannot suppress compression}% + \ifbxpv@ok + % New dvipdfmx supports this special. + \g@addto@macro\bxpv@page@specials{% + \special{dvipdfmx:config z 0}% + }% + \fi + \fi + % object compression + \ifbxpdfverObjCompressionSuppressed + \bxpv@check@dvipdfmx@version{20160307}% + {Cannot suppress object compression}% + \ifbxpv@ok + \g@addto@macro\bxpv@C@bits{\do{64}}% + \fi + \fi + % PDF decimal digits + \ifx\bxpdfverDecimalDigits\relax\else + \bxpv@check@dvipdfmx@version{20160307}% + {Cannot set PDF decimal digits}% + \ifbxpv@ok + \bxpv@put@special{dvipdfmx:config d \the\bxpdfverDecimalDigits}% + \fi + \fi + % PK resolution + \ifx\bxpdfverPkResolution\relax\else + \iffalse % This will never work.... + \bxpv@put@special{dvipdfmx:config r \the\bxpdfverPkResolution}% + \fi + \fi + % PDF destinations + \ifbxpdfverDestinationsPreserved + \bxpv@check@dvipdfmx@version{20160307}% + {Cannot preserve PDF destinations}% + \ifbxpv@ok + \g@addto@macro\bxpv@C@bits{\do{16}}% + \fi + \fi + % C option value + \ifx\bxpv@C@bits\@empty\else + \bxpv@cache@fetch{dvipdfmxcfg}% + \def\bxpv@next##1##2\bxpv@mk{\def\bxpv@C@value{##1}}% + \expandafter\bxpv@next\bxpv@cache@@dvipdfmxcfg{0}\bxpv@mk + \bxpv@rc@bitset{\bxpv@C@value}{64}% + \def\do##1{% + \bxpv@rc@bitset{\bxpv@C@value}{##1}% + \let\bxpv@C@value\bxpv@rc@num}% + \bxpv@C@bits + \bxpv@put@special{dvipdfmx:config C \bxpv@C@value}% + \fi + % special added to every page + \ifx\bxpv@page@specials\@empty\else + \edef\bxpv@page@specials{\bxpv@page@specials}% + \AtBeginShipout{% + \setbox\AtBeginShipoutBox=\vbox{% + \baselineskip\z@skip\lineskip\z@skip\lineskiplimit\z@ + \bxpv@page@specials + \copy\AtBeginShipoutBox + }% + }% + \fi +} + +%% \bxpv@check@dvipdfmx@version +\@onlypreamble\bxpv@check@dvipdfmx@version +\def\bxpv@check@dvipdfmx@version#1#2{% + \bxpv@cache@fetch{dvipdfmxver}% + \bxpv@okfalse + \ifnum\bxpv@cache@@dvipdfmxver=\z@ + \bxpv@fail + {#2, because the\MessageBreak + version of dvipdfmx in use is unknown + \MessageBreak (v.#1 or later is required)}% + \else\ifnum\bxpv@cache@@dvipdfmxver<#1 + \bxpv@fail + {#2, because the\MessageBreak + version of dvipdfmx in use (v.\bxpv@cache@@dvipdfmxver) is too old + \MessageBreak (v.#1 or later is required)}% + \else + \PackageInfo\bxpv@pkgname + {dvipdfmx version is \bxpv@cache@@dvipdfmxver\@gobble}% + \bxpv@oktrue + \fi\fi +} + +\fi +%--------------------------------------- software version + +%% \bxpv@cache@get@@newtex +% Returns 1 if the version of TeX is 3.14159265 (released on +% 2014/01/20) or later, 0 otherwise. +\@onlypreamble\bxpv@cache@get@@newtex +\def\bxpv@cache@get@@newtex{% + \edef\bxpv@tmpa{\expandafter\noexpand\csname\endcsname}% + \def\bxpv@tmpb##1 ##2##3\@nil{\gdef\bxpv@g@value{##2}}% + \expandafter\bxpv@tmpb\meaning\bxpv@tmpa1 0\@nil +} + +%% \bxpv@cache@get@@dvipdfmxver +% Returns the version of dvipdfmx (eg. 20110311). +% It returns 0 in failure. +\@onlypreamble\bxpv@cache@get@@dvipdfmxver +\def\bxpv@cache@get@@dvipdfmxver{% + % Here the version of TeX is checked, bacause on old TeX + % engines on Windows, pipe inputs will fail when the + % command line has arguments. + \bxpv@cache@fetch{newtex}% + \global\let\bxpv@gtmpa\relax + \ifnum\bxpv@cache@@newtex>\z@ + \def\bxpv@tmpc{This is extractbb Version }% + \bxpv@detokenize\bxpv@tmpc + \bxpv@read@file{"|extractbb --version"}{% + \bxpv@split@at{\bxpv@tmpc}{##1}% + \ifx\bxpv@pre\relax\else + \global\let\bxpv@gtmpa\bxpv@post + \fi + }% + \fi + \ifx\bxpv@gtmpa\relax % failed somewhere + \gdef\bxpv@g@value{0}% + \else + \global\let\bxpv@g@value\bxpv@gtmpa + \fi +} + +%--------------------------------------- dvipdfmx config + +%% variables +\let\bxpv@rc@num\relax + +%% \bxpv@cache@get@@dvipdfmxcfg +\@onlypreamble\bxpv@cache@get@@dvipdfmxcfg +\def\bxpv@cache@get@@dvipdfmxcfg{% + % check TeX version + \bxpv@cache@fetch{newtex}% + \ifnum\bxpv@cache@@newtex>\z@ + % search dvipdfmx.cfg + \global\let\bxpv@gtmpa\@empty + \bxpv@read@file{% + "|kpsewhich --progname=dvipdfmx --format=othertext dvipdfmx.cfg"% + }{% + \gdef\bxpv@gtmpa{##1}% + \bxpv@read@file@finish + }% + % read the file + \ifx\bxpv@gtmpa\@empty\else + \gdef\bxpv@g@rc@tmp@C{0}% + \def\bxpv@rc@tmp@C{C }% + \bxpv@detokenize\bxpv@rc@tmp@C + \gdef\bxpv@g@rc@tmp@V{5}% + \def\bxpv@rc@tmp@V{V }% + \bxpv@detokenize\bxpv@rc@tmp@V + \bxpv@read@file{\bxpv@gtmpa}{% + \bxpv@split@at{\bxpv@rc@tmp@C}{##1}% + \ifx\bxpv@pre\@empty + \bxpv@rc@parse@num{\bxpv@post}% + \global\let\bxpv@g@rc@tmp@C\bxpv@rc@num + \fi + \bxpv@split@at{\bxpv@rc@tmp@V}{##1}% + \ifx\bxpv@pre\@empty + \bxpv@rc@parse@num{\bxpv@post}% + \global\let\bxpv@g@rc@tmp@V\bxpv@rc@num + \fi + }% + % the return value + \xdef\bxpv@g@value{{\bxpv@g@rc@tmp@C}{\bxpv@g@rc@tmp@V}}% + \fi + \fi +} + +%% \bxpv@rc@parse@num{<string>} +% Returns to \bxpv@rc@num. +\def\bxpv@rc@parse@num#1{% + \edef\bxpv@tmpy{#1\relax\relax}% + \expandafter\bxpv@rc@parse@num@a\bxpv@tmpy\bxpv@end +} +\def\bxpv@rc@parse@num@a#1#2\bxpv@end{% + % skip leading spaces and change to uppercase + \uppercase{\bxpv@rc@parse@num@b#1#2\bxpv@end}% +} +\def\bxpv@rc@parse@num@b#1#2#3\bxpv@end{% + \def\bxpv@tmpy{#1#2#3}% + \if0#1\if X#2% convert '0x' to '"' + \def\bxpv@tmpy{"#3}% + \fi\fi + \afterassignment\bxpv@rc@parse@num@c\@tempcnta=\bxpv@tmpy +} +\def\bxpv@rc@parse@num@c#1\relax{% discard trailer + \edef\bxpv@rc@num{\the\@tempcnta}% +} + +%% \bxpv@rc@bitset{<number1>}{<number2>} +% Returns to \bxpv@rc@num. +\def\bxpv@rc@bitset#1#2{% + \@tempcnta=#1\relax \divide\@tempcnta#2\relax + \@tempcnta=\ifodd\@tempcnta\z@\else#2\relax\fi + \advance\@tempcnta#1\relax + \edef\bxpv@rc@num{\the\@tempcnta}% +} + +%--------------------------------------- string splitter + +%% variables +\let\bxpv@pre\relax +\let\bxpv@post\relax + +%% \bxpv@split@at{<sep>}{<text>} +% Splits the text by the given separator. +% In success, it will set \bxpv@pre and \bxpv@post. +\def\bxpv@split@at#1#2{% + \edef\bxpv@next{{#1}{#2}}% + \expandafter\bxpv@split@at@a\bxpv@next +} +\def\bxpv@split@at@a#1#2{% + \def\bxpv@next##1#1##2\bxpv@end{% + \bxpv@split@at@b{##1}{##2}}% + \bxpv@next#2\bxpv@mk#1\bxpv@end +} +\def\bxpv@split@at@b#1#2{% + \ifx\bxpv@mt#2\bxpv@mt + \let\bxpv@pre\relax \let\bxpv@post\relax + \else + \def\bxpv@pre{#1}% + \bxpv@split@at@c#2\bxpv@end + \fi +}% +\def\bxpv@split@at@c#1\bxpv@mk#2\bxpv@end{% + \def\bxpv@post{#1}% +}% + +%--------------------------------------- file reader + +%% variables +\let\bxpv@rf@parse\relax % line parser +\let\bxpv@rf@line\relax % line content +\let\bxpv@rf@cont\relax % continue to read? + +%% \ifbxpv@read@file@ok +% Whether or not the last \bxpv@read@file succeeded. +\newboolean{bxpv@read@file@ok} + +%% \bxpv@read@file{<file-name>}{<line-parser-code>} +% Reads from a text file. The line parser takes as #1 the +% content of each line. +\def\bxpv@read@file#1{% + \bxpv@read@file@oktrue + \begingroup + \openin\@inputcheck=#1\relax + \afterassignment\bxpv@read@file@a + \def\bxpv@rf@parse##1% +} +\@onlypreamble\bxpv@read@file@a +\def\bxpv@read@file@a{% + \ifeof\@inputcheck + \aftergroup\bxpv@read@file@okfalse + \else + % freeze special characters + \@tempcnta\z@ + \loop\ifnum\@tempcnta<\@cclvi + \catcode\@tempcnta12 + \advance\@tempcnta\@ne + \repeat + \endlinechar\m@ne + % go to loop + \chardef\bxpv@rf@cont\@ne + \bxpv@read@file@b + \fi + \endgroup +} +\@onlypreamble\bxpv@read@file@b +\def\bxpv@read@file@b{% + \read\@inputcheck to\bxpv@rf@line + \bxpv@detokenize\bxpv@rf@line + \expandafter\bxpv@rf@parse\expandafter{\bxpv@rf@line}% + \ifeof\@inputcheck + \chardef\bxpv@rf@cont\z@ + \fi + \ifnum\bxpv@rf@cont>\z@ + \expandafter\bxpv@read@file@b + \fi +} + +%% \bxpv@read@file@finish +\@onlypreamble\bxpv@read@file@finish +\def\bxpv@read@file@finish{% + \chardef\bxpv@rf@cont\z@ +} + +%--------------------------------------- simple cache system +% - \bxpv@cache@xxx can be invoked only in \AtBeginDocument. +% - \bxpv@cache@finalize must be called last. + +%% \bxpv@g@value +% The return variable for fetchers. +\@onlypreamble\bxpv@g@value +\let\bxpv@g@value\@undefined + +%% \bxpv@cache@fetch{<key>} +\@onlypreamble\bxpv@cache@fetch +\def\bxpv@cache@fetch#1{% + \begingroup + \expandafter\ifx\csname bxpv@cache@@#1\endcsname\relax + \global\let\bxpv@g@value\@empty + \@nameuse{bxpv@cache@get@@#1}% + \bxpv@cache@store{#1}{\bxpv@g@value}% + \bxDebug{cache-fetch:#1=\@nameuse{bxpv@cache@@#1}}% + \fi + \endgroup +} + +%% \bxpv@cache@store{<key>}{<value>} +\def\bxpv@cache@store#1#2{% + \expandafter\ifx\csname bxpv@cache@@#1\endcsname\relax + \expandafter\xdef\csname bxpv@cache@@#1\endcsname{#2}% + \g@addto@macro\bxpv@cache@keylist{{#1}}% + \fi +} +\@onlypreamble\bxpv@cache@keylist +\let\bxpv@cache@keylist\@empty + +%% \bxpv@cache@finalize +\@onlypreamble\bxpv@cache@finalize +\def\bxpv@cache@finalize{% + \if@filesw + \ifx\bxpv@cache@keylist\@empty\else + \immediate\write\@auxout{% + \string\providecommand\string\bxpv@cache@store[2]{}}% + \fi + \def\bxpv@x{\@tfor\bxpv@x:=}% + \expandafter\bxpv@x\bxpv@cache@keylist\do{% + \immediate\write\@auxout{% + \string\bxpv@cache@store{\bxpv@x}{\@nameuse{bxpv@cache@@\bxpv@x}}}}% + \fi + \global\let\bxpv@cache@store\@gobbletwo % for end-document clear-up +} + +%--------------------------------------- start-up + +\ifx t\bxUseDebug + \typeout{**bxpdfver-----------% + ^^Jdrvtype=\meaning\bxpv@drv@type + ^^Jdrvname=\meaning\bxpv@drv@name} + \AtBeginDocument{% + \def\do#1=#2{\ifx#2\@undefined\else + ^^J#1=\the#2 [\meaning#2]% + \fi}% + \def\next#1{\expandafter\meaning\csname if#1\endcsname}% + \typeout{**bxpdfver-----------% + ^^JMinorVersion=\meaning\bxpdfverMinorVersion + ^^JCompressionSuppressed=\next{bxpdfverCompressionSuppressed}% + ^^JObjCompressionSuppressed=\next{bxpdfverObjCompressionSuppressed}% + ^^JDecimalDigits=\meaning\bxpdfverDecimalDigits + ^^JPkResolution=\meaning\bxpdfverPkResolution + \do minorversion=\bxpv@@minorversion + \do compresslevel=\bxpv@@compresslevel + \do objcompresslevel=\bxpv@@objcompresslevel + \do decimaldigits=\bxpv@@decimaldigits + \do pkresolution=\bxpv@@pkresolution + ^^JCvalue=\meaning\bxpv@C@value + }% + } +\fi + +%% Applies the setting specified by package options +\ifx\bxpv@version\relax\else + \setpdfversion{\bxpv@version} +\fi +\if t\bxpv@compress\else + \suppresspdfcompression +\fi +\if t\bxpv@obj@compress\else + \suppresspdfobjcompression +\fi + +%--------------------------------------- all done +\endinput +%% EOF |