% % pxbase.def % % Note: bxbase.def and pxbase.def provide same set of functionality. % To avoid version clash, when a version of one of them is loaded, % load of an older version of the other is aborted. %%%% stuffs read when \input'ed \ifx\bxbaseOk\undefined \bgroup \catcode`\@=11 \gdef\bx@defextension{def} \gdef\bx@ver@#1{\expandafter\expandafter\expandafter\@parse@version \csname ver@#1.\@currext\endcsname//00\@nil} %% \bxInputDefFile{} \gdef\bxInputDefFile#1{\@onefilewithoptions{#1}[][]\bx@defextension} %% \bxCheckCPart{} \gdef\bxCheckCPart#1{% \@ifl@aded\@currext{#1}{% \ifnum\bx@ver@{#1}>\bx@ver@\@currname \expandafter\endinput\fi}{}} \egroup \let\bxbaseOk=t \bxInputDefFile{pxbase} %% read this file again \expandafter\endinput\fi %%--------------- folloing stuffs are read by \bxTnext %%%% file declaration \NeedsTeXFormat{LaTeX2e} \ProvidesFile{pxbase.def}[2010/06/15 v0.5 BX/PX base library] \bxCheckCPart{bxbase} %* v0.5.r13 %%%% error messages \def\bx@b@pkgname{BX/PXbase} % bundle name \def\bx@b@error{\PackageError\bx@b@pkgname} \def\bx@err@nobbl{\bx@b@error{babel not yet loaded}\@eha} \def\bx@err@oorng{\bx@b@error{Number out of range}\@eha} \def\bx@err@nanbc{\bx@b@error{Non-BMP characters not supported}\@eha} \def\bx@err@ilnfm{\bx@b@error{Illegal number format}\@eha} \def\bx@err@uddrv#1{\bx@b@error{\string#1 is undefined}\@eha} %%%% common stuffs \ifx\bxUcv\@undefined \newcount\bxUcv % argument of \bx@Ux \fi \newif\ifbxOk % all-purpsoe switch \let\bxHex\relax % result of \bxToHex... \let\bxRes\relax % result of \bxToLower \edef\bx@b@resetcatcodes{% < ! " ' + ^ > \catcode33=\the\catcode33\catcode34=\the\catcode34% \catcode39=\the\catcode39\catcode43=\the\catcode43% \catcode94=\the\catcode94\relax} \catcode33=12 \catcode34=12 \catcode39=12 \catcode43=12 \catcode94=6 %%------ Programming tools %%%% \bxNullify\CS % Make \CS void and unoverridable by \providecommand. \def\bxNullify#1{\global\let#1\bx@nullified} \def\bx@nullified{\@gobble\bx@@nullified} %%%% \bxDebug{} % If \bxUseDebug is defined when bxbase is loaded, this command % prints debug messages; otherwise it is ignored. %\let\bx@typeout\typeout %\ifx\bxUseDebug\@undefined \let\bxDebug\@gobble %\else \def\bxDebug#1{\bx@typeout{BX debug: #1}}\fi \providecommand*\bxDebug{\@gobble} %%%% \bxCheckMA\CS \bxEndCheckMA % If this construct appears in moving arguments, it expands to % an error message command. \def\bxCheckMA{\let\bx@chkma@a\bx@chkma@a\noexpand} \let\bxEndCheckMA\@empty \let\bx@chkma@z\relax \def\bx@chkma@a#1{\bx@chkma@z\relax\bx@chkma@b} \def\bx@chkma@b#1#2#3\bxEncCheckMA{\noexpand\bx@err@ivfrg#1#2} \def\bx@err@ivfrg#1{\bx@b@error{Cannot use \string#1 here}\@eha} %%------ TeX engine distinction %%%% \bxIfPrimitive\CS{}{} % Checks if \CS is a primitive. \def\bxIfPrimitive#1{% \edef\bx@tmpa{\string#1}\edef\bx@tmpb{\meaning#1}% \ifx\bx@tmpa\bx@tmpb \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi} %%%% \bxEngineTypeX / \bxEngineTypeY % Numbers that signify what I am. % \bxEngineTypeX values \chardef\bxETTeX=0 % none of those \chardef\bxETpTeX=1 % pTeX-extended \chardef\bxETXeTeX=2 % XeTeX-extended \chardef\bxETOmega=3 % Omega-extended % \bxEngineTypeY values (plus \bxETTeX) \chardef\bxETeTeX=1 % e-TeX-extended \chardef\bxETpdfTeX=3 % pdfTeX-extended % (here old pdfTeX without e-TeX is ignored) % \bxIfPrimitive\kansuji{\let\bxEngineTypeX\bxETpTeX}{% \bxIfPrimitive\XeTeXversion{\let\bxEngineTypeX\bxETXeTeX}{% \bxIfPrimitive\Omegaversion{\let\bxEngineTypeX\bxETOmega}{% \let\bxEngineTypeX\bxETTeX}}} \bxIfPrimitive\eTeXversion{\let\bxEngineTypeY\bxETeTeX}{% \bxIfPrimitive\pdftexversion{\let\bxEngineTypeY\bxETpdfTeX}{% \let\bxEngineTypeY\bxETTeX}} %%%% \bx@b@uptex \bxIfPrimitive\kchar{\chardef\bx@b@uptex\@ne}{\chardef\bx@b@uptex\z@} %%------ Babel something %%<+> \bxBDHookBabel % A begindocument-hook about Babel. \newif\ifbx@bbl@inuse \def\bx@bbl@bdhook{} \providecommand\bxBDHookBabel{\bx@bdhook@babel@do} \def\bx@bdhook@babel@do{% \AtBeginDocument{% \@ifpackageloaded{babel}{% \bx@bbl@inusetrue \ifx\bx@bbl@captlang\@undefined\else \bx@bbl@do@captlang \fi \bx@bbl@bdhook }{}}% \bxNullify\bxBDHookBabel} \@onlypreamble\bxBDHookBabel \@onlypreamble\bx@bdhook@babel@do %%<+> \bxAtBeginDocumentBabel{} % Register a begin-document hook that willl be invoked only when babel % is loaded. \def\bxAtBeginDocumentBabel{% \g@addto@macro\bx@bbl@bdhook} \@onlypreamble\bxAtBeginDocumentBabel \@onlypreamble\bx@bbl@bdhook %%%% \bx@bbl@patch@sel@lang % A patch to \select@language that disables automatic switching of % caption language. \def\bx@bbl@patch@sel@lang{% this wlll be never invoked twice \global\let\bx@bbl@org@select@language\select@language \gdef\select@language##1{% \bx@bbl@copy{**C}{##1}\bx@bbl@copy{##1}{**Z}% \bx@bbl@org@select@language{##1}\bx@bbl@copy{##1}{**C}}} \@onlypreamble\bx@bbl@patch@sel@lang %%%% \bx@bbl@do@captlang \def\bx@bbl@@main{main} \def\bx@bbl@@default{default} \def\bx@bbl@do@captlang{% % set captions \ifx\bx@bbl@captlang\bx@bbl@@main \let\bx@bbl@captlang\bbl@main@language \fi \ifx\bx@bbl@captlang\bx@bbl@@default \else\expandafter\ifx\csname l@\bx@bbl@captlang\endcsname\relax \@nolanerr\bx@bbl@captlang \else \csname date\bx@bbl@captlang\endcsname \csname captions\bx@bbl@captlang\endcsname \fi\fi} \@onlypreamble\bx@bbl@do@captlang %%%% \bx@bbl@copy{}{} % Copies \captions... and \date... for save. \def\bx@bbl@copy#1#2{% \bx@bbl@copy@a{#1}{#2}{captions}% \bx@bbl@copy@a{#1}{#2}{date}} \def\bx@bbl@copy@a#1#2#3{% \edef\bx@tmpa{\let\expandafter\noexpand\csname#3#1\endcsname \expandafter\noexpand\csname#3#2\endcsname}\bx@tmpa} \@namedef{captions**Z}{\@empty} \@namedef{date**Z}{\@empty} %%<*> \bxcaptionlanguage{} % Change the caption language manually, with disabling automatic % switching on it. \def\bxcaptionlanguage#1{% \@ifpackageloaded{babel}% {\ifx\bx@bbl@captlang\@undefined \bx@bbl@patch@sel@lang \fi \xdef\bx@bbl@captlang{#1}}% {\bx@err@nobbl}} \@onlypreamble\bxcaptionlanguage %%<*> \bxmainlanguage{} % Changes the 'main' language (one that is effective at beginning). \def\bxmainlanguage#1{% \expandafter\ifx\csname date#1\endcsname\relax \@nolanerr{#1}\fi \xdef\bbl@main@language{#1}} \@onlypreamble\bxmainlanguage %%<+> \bxTrivLangDef{} % Makes a fake language option. \def\bxTrivLangDef#1{% \@ifundefined{date#1}{% \@ifundefined{l@#1}% {\expandafter\chardef\csname l@#1\endcsname\z@}{}% \@namedef{date#1}{\relax}% \@namedef{captions#1}{\relax}% \@namedef{extras#1}{\relax}% \@namedef{noextras#1}{\relax}% \@namedef{date#1}{\relax}% }{}} \@onlypreamble\bxTrivLangDef %%------ 'Number-to-hex-string' functions % All public commands put their result in \bxHex. %%%% preparation \newif\ifbx@hx@bigchar \ifnum\bxEngineTypeX>\@ne \bx@hx@bigchartrue \fi \ifnum\bx@b@uptex>\z@ \bx@hx@bigchartrue \fi %%<+> \bxToHexTiny % For one-to-two-digit hex strings. \def\bxToHexTiny#1{% \chardef\bxHex=#1\relax \expandafter\bx@hx@tohextiny@a\meaning\bxHex\@nil} \def\bx@hx@tohextiny@a#1"#2\@nil{\def\bxHex{#2}} %%<+> \bxToHexSmall % For one-to-three-digit hex strings. \def\bxToHexSmall#1{% \mathchardef\bxHex=#1\relax \expandafter\bx@hx@tohexsmall@a\meaning\bxHex\@nil} \def\bx@hx@tohexsmall@a#1"#2\@nil{\def\bxHex{#2}} %%<+> \bxToHexTwo % For zero-padded two-digit hex strings. \def\bxToHexTwo#1{% \chardef\bxHex=#1\relax \expandafter\bx@hx@tohextwo@a\meaning\bxHex"0\@nil} \def\bx@hx@tohextwo@a#1"#2#3#4#5\@nil{\bx@hx@tohextwo@b#2#3#4\@nil} \def\bx@hx@tohextwo@b#1"#2\@nil{\def\bxHex{#2#1}} %%<+> \bxToHexThree % For zero-padded three-digit hex strings. \def\bxToHexThree#1{% \mathchardef\bxHex=#1\relax \expandafter\bx@hx@tohexthree@a\meaning\bxHex"00\@nil} \def\bx@hx@tohexthree@a#1"#2#3#4#5#6\@nil{\bx@hx@tohexthree@b#2#3#4#5\@nil} \def\bx@hx@tohexthree@b#1"#2\@nil{\def\bxHex{#2#1}} %%<+> \bxToHexFour % For zero-padded four-digit hex strings. \ifbx@hx@bigchar %----<*bigchar> \def\bxToHexFour#1{% \chardef\bxHex=#1\relax \expandafter\bx@hx@tohexfour@a\meaning\bxHex"000\@nil} \def\bx@hx@tohexfour@a#1"#2#3#4#5#6#7\@nil{\bx@hx@tohexfour@b#2#3#4#5#6\@nil} \def\bx@hx@tohexfour@b#1"#2\@nil{\def\bxHex{#2#1}} \else %----<*!bigchar> \mathchardef\bx@hx@fzzz="4000 \def\bxToHexFour#1{\bgroup \@tempcnta=#1\relax\@tempcntb\@tempcnta\divide\@tempcntb\bx@hx@fzzz \ifcase\@tempcntb \advance\@tempcnta\bx@hx@fzzz \or \or \advance\@tempcnta-\bx@hx@fzzz \or \advance\@tempcnta-"8000 \or \@tempcnta\z@ \fi \mathchardef\bx@hx@tmp\@tempcnta \expandafter\bx@hx@tohexfour@a\meaning\bx@hx@tmp\@nil \egroup \let\bxHex\bx@hx@gtmp} \def\bx@hx@tohexfour@a#1"#2#3\@nil{% \expandafter\let\expandafter\bx@hx@tmp \csname bxhx@X/\the\@tempcntb#2\endcsname \ifx\bx@hx@tmp\relax \bx@err@oorng \global\let\bx@hx@gtmp\@empty \else \xdef\bx@hx@gtmp{\bx@hx@tmp#3}\fi} \def\bx@hx@nxt#1#2#3{\bgroup\catcode`#3=12 \global\expandafter\def\csname bxhx@X/#1#2\endcsname{#3}\egroup} \@for\bx@hx@tmp:={040,051,062,073,144,155,166,177,248,259,26A,27B,% 34C,35D,36E,37F}\do{\expandafter\bx@hx@nxt\bx@hx@tmp} \fi %---- %%<+> \bxToHexFive %%<+> \bxToHexFiveX % For zero-padded five-digit hex strings. \def\bxToHexFive{\bx@tohexfive@aa\relax} \def\bxToHexFiveX{\bx@tohexfive@aa {\ifnum\@tempcnta>\bx@hx@vdmax \@tempcnta=\bx@hx@vdmax\fi}} \ifbx@hx@bigchar %----<*bigchar> \chardef\bx@hx@vdmax="FFFFF \def\bx@tohexfive@aa#1#2{% {\@tempcnta=#2\relax#1\global\chardef\bx@hx@gtmp=\@tempcnta}% \expandafter\bx@hx@tohexfivex@a\meaning\bx@hx@gtmp"0000\@nil} \def\bx@hx@tohexfivex@a#1"#2#3#4#5#6#7#8\@nil{% \bx@hx@tohexfivex@b#2#3#4#5#6#7\@nil} \def\bx@hx@tohexfivex@b#1"#2\@nil{\edef\bxHex{#2#1}} \else %----<*!bigchar> \edef\bx@hx@vdmax{"FFFFF\space} \def\bx@tohexfive@aa#1#2{% \bgroup \@tempcnta=#2\relax#1% \@tempcntb=\@tempcnta \divide\@tempcnta\bx@hx@m\relax \bxToHexTwo\@tempcnta \let\bx@hx@tmp\bxHex \multiply\@tempcnta-\bx@hx@m\advance\@tempcnta\@tempcntb\relax \bxToHexThree\@tempcnta \xdef\bx@hx@gtmp{\bx@hx@tmp\bxHex}% \egroup \let\bxHex\bx@hx@gtmp} \fi %---- %%<+> \bxToHexEight % For zero-padded eight-digit hex strings. \def\bxToHexEight#1{% \bgroup \@tempcnta=#1\relax \@tempcntb=\@tempcnta\divide\@tempcnta\p@\relax \bxToHexFour\@tempcnta \let\bx@hx@tmp\bxHex \multiply\@tempcnta-\p@\advance\@tempcnta\@tempcntb\relax \bxToHexFour\@tempcnta \xdef\bx@hx@gtmp{\bx@hx@tmp\bxHex}% \egroup \let\bxHex\bx@hx@gtmp} %%<+> \bxToHexUC % For zero-padded four-to-six-digit hex strings. \ifbx@hx@bigchar %----<*bigchar> \def\bxToHexUC#1{% \chardef\bxHex=#1\relax \expandafter\bx@hx@tohexuc@a\meaning\bxHex"\@empty\@empty000\@nil} \def\bx@hx@tohexuc@a#1"#2#3#4#5#6#7#8#9\@nil{% \bx@hx@tohexuc@b#2#3#4#5#6#7#8\@nil} \def\bx@hx@tohexuc@b#1"#2\@nil{\edef\bxHex{#2#1}} \else %----<*!bigchar> \mathchardef\bx@hx@m="1000 \def\bxToHexUC#1{% \bgroup \@tempcnta=#1\relax \@tempcntb=\@tempcnta \divide\@tempcnta\bx@hx@m\relax \bxToHexSmall\@tempcnta \let\bx@hx@tmp\bxHex \multiply\@tempcnta-\bx@hx@m\advance\@tempcnta\@tempcntb\relax \bxToHexThree\@tempcnta \xdef\bx@hx@gtmp{\bx@hx@tmp\bxHex}% \egroup \let\bxHex\bx@hx@gtmp} \fi %---- %%<+> \bxToDecFour \def\bxToDecFour#1{% \expandafter\bx@hx@todecfour@a\number#1"000\@nil} \def\bx@hx@todecfour@a#1#2#3#4#5#6\@nil{\bx@hx@todecfour@b#1#2#3#4#5\@nil} \def\bx@hx@todecfour@b#1"#2\@nil{\def\bxHex{#2#1}} %%<+> \bxToDecFive \def\bxToDecFive#1{% \expandafter\bx@hx@todecfive@a\number#1"0000\@nil} \def\bx@hx@todecfive@a#1#2#3#4#5#6#7\@nil{\bx@hx@todecfive@b#1#2#3#4#5#6\@nil} \def\bx@hx@todecfive@b#1"#2\@nil{\def\bxHex{#2#1}} %%------ Input through code values %%<+> \bxBDHookUnicode % A begindocument-hook about Unicode (& CID) input. \providecommand\bxBDHookUnicode{\bx@bdhook@unicode@do} \def\bx@bdhook@unicode@do{% \AtBeginDocument{\bx@assign@Ux}% \bxNullify\bxBDHookUnicode} \@onlypreamble\bxBDHookUnicode \@onlypreamble\bx@bdhook@unicode@do %%<+> \bxBDHookJisInput % A begindocument-hook about JIS-code input. \providecommand\bxBDHookJisInput{\bx@bdhook@jisinput@do} \def\bx@bdhook@jisinput@do{% \AtBeginDocument{\bx@assign@JI}% \bxNullify\bxBDHookJisInput} \@onlypreamble\bxBDHookJisInput \@onlypreamble\bx@bdhook@jisinput@do %%<+> \bxFallbackSym \def\bxFallbackSym#1{\leavevmode\bx@fbs@fnt{\dimen@=\bx@junit\relax \hb@xt@\dimen@{\hss\vrule\@width\z@\@height.88\dimen@\@depth.12\dimen@ \frame{\lower.04\dimen@\hb@xt@.84\dimen@{\hss\vbox to.84\dimen@{\vss \hsize=.84\dimen@\baselineskip\z@\lineskip.01\dimen@\parskip\z@skip \leftskip\@flushglue\rightskip\@flushglue\parfillskip\z@skip \parindent\z@\let\\\bx@fbs@c\leavevmode\let\sml=\bx@fbs@fs\bx@fbs@f #1\unskip\par\vss}\hss}}\hss}}} \edef\bx@junit{\ifnum\bxEngineTypeX=\@ne 1zw\else 1em\fi} \def\bx@fbs@c{\unskip\par\ignorespaces} \def\bx@fbs@fnt{\global\let\bx@fbs@fnt\relax \global\font\bx@fbs@fs=phvr at 2.4pt \global\font\bx@fbs@f=phvr at 3.6pt} %%<+> \bxCodeValueSeq\CS{} % Dispatcher for code value sequences. \def\bxCodeValueSeq{% \let\bx@cvseq@branch\bx@cvseq@branch@hex \bx@cvseq@a} \def\bx@cvseq@a#1#2{% {\catcode33=12% \xdef\bx@gtmpa{\uppercase{\def\noexpand\bx@tmpa{#2}}}}% \let\bx@cvseq@do=#1\bx@gtmpa\relax \expandafter\bx@cvseq@b\bx@tmpa,!\@nil} \def\bx@cvseq@b{\futurelet\bx@toka\bx@cvseq@branch} \def\bx@cvseq@branch@hex{% \if !\bx@toka \let\bx@nxt\bx@cvseq@fin \else\if "\bx@toka \let\bx@nxt\bx@cvseq@pfx \else\if '\bx@toka \let\bx@nxt\bx@cvseq@pfx \else\if +\bx@toka \let\bx@nxt\bx@cvseq@pfx \else \let\bx@nxt\bx@cvseq@hex \fi\fi\fi\fi \bx@nxt} \def\bx@cvseq@pfx{% \afterassignment\bx@cvseq@post \bxUcv=} \def\bx@cvseq@hex{% \afterassignment\bx@cvseq@post \bxUcv="0} \def\bx@cvseq@post#1{% \if ,#1\expandafter\bx@cvseq@post@a \else \bx@err@ilnfm \expandafter\bx@cvseq@fin \fi} \def\bx@cvseq@post@a{% \bx@cvseq@do \bx@cvseq@b} \def\bx@cvseq@fin#1\@nil{} %%<+> \bxCodeValueSeqD\CS{} % Same as \bxCodeValueSeq, except that it defaults to decimal. \def\bxCodeValueSeqD{% \let\bx@cvseq@branch\bx@cvseq@branch@dec \bx@cvseq@a} \def\bx@cvseq@branch@dec{% \if !\bx@toka \let\bx@nxt\bx@cvseq@fin \else \let\bx@nxt\bx@cvseq@pfx \fi \bx@nxt} %%<+> \bxUx, \bxUI, \bxAJ, \bxJI, \bxKI % The prefixed names for \Ux, etc. They are (more likely to be) % collision-safe. \let\bxUx\relax \DeclareRobustCommand*\bxUx{\bxCodeValueSeq\bx@Ux} \let\bxUI\relax \DeclareRobustCommand*\bxUI{\bxCodeValueSeq\bx@UI} \let\bxAJ\relax \DeclareRobustCommand*\bxAJ{\bxCodeValueSeqD\bx@AJ} \let\bxJI\relax \DeclareRobustCommand*\bxJI{\bxCodeValueSeq\bx@JI} \let\bxKI\relax \DeclareRobustCommand*\bxKI{\bxCodeValueSeqD\bx@KI} %%<+> \bxUHex{}, \bxUInt{} % Alternative entry points for \Ux. The code value is specified in % hexadecimal (\bxUHex) / decimal (\bxUInt) numerals. \def\bxUHex{\protect\bx@Uxh} \def\bxUqInt{\protect\bx@UInt} \def\bx@UInt#1{\bxUcv=#1\relax\bx@Ux} %% \bx@UIh@fb, \bx@AJ@fb \def\bx@UIh@fb#1{\bxUcv="#1\relax\bxToHexFive\bxUcv \expandafter\bx@b@fb@five\bxHex[Ux]} \def\bx@AJ@fb{\bxToDecFive\bxUcv \expandafter\bx@b@fb@five\bxHex[AJ]} \def\bx@JI@fb{\bxToHexFour\bxUcv \expandafter\bx@b@fb@four\bxHex[JI]} \def\bx@KI@fb{\bxToDecFive\bxUcv \expandafter\bx@b@fb@five\bxHex[KI]} \def\bx@b@fb@five#1#2#3#4#5#6[#7]{% \bxFallbackSym{{\sml#7}\\\bx@hx@supzero#1#2#3\\#4#5}} \def\bx@b@fb@four#1#2#3#4#5[#6]{% \bxFallbackSym{{\sml#6}\\#1#2\\#3#4}} \def\bx@hx@supzero#1{\ifx0#1\else\expandafter#1\fi} %%%% \bx@assign@Ux % Picks up appropriate drivers \bx@Ux etc. according to current % load-states of packages. % [driver] [purpose] [argument] [default] % \bx@Ux Unicode \bxUcv go to \bx@UI % \bx@Uxh Unicode #1(hex) go to \bx@UIh % \bx@UI Unicode-ideo. \bxUcv go to \bx@UIh % \bx@UIh Unicode-ideo. #1(hex) fallback % \bx@AJ Adobe-Japan1 \bxUcv fallback % From the default value it can be said: % - Implemetations for \bx@Ux(h) must fallback on \bx@UI(h) when % they cannot be handle the given character, unless such fallback % is known to be useless. % - When you implement one of \bx@Ux or \bx@Uxh, then you must also % implement the other. % - When you implement \bx@UI, then you must also implement \bx@UIh. % (But you can implement only \bx@UIh.) % Initial values \def\bx@Ux{\bx@UI} % pass to \bx@UI \def\bx@Uxh{\bx@UIh} % pass to \bx@UIh \def\bx@UI{\bxToHexUC\bxUcv\bx@UIh\bxHex} % pass to \bx@UIh \let\bx@UIh\bx@UIh@fb % 'fallback' driver \let\bx@AJ\bx@AJ@fb % 'fallback' driver % some helpers % one more step put so that \UTF could be redefined \def\bx@UIh@otf{\UTF} % \UMS with the argument expanded \def\bx@UIh@ums#1{\expandafter\UMS\expandafter{#1}} % \CID with \bxUcv \def\bx@AJ@otf{\CID\bxUcv} \def\bx@assign@Ux{% % If I have bxucs, then set \bx@Ux to \bx@Ux@ucs % (which fallbacks on \bx@UI in failure). \@ifpackageloaded{bxucs}{% \let\bx@Ux\bx@Ux@ucs\let\bx@Uxh\bx@Uxh@ucs}{}% % If I have ums or bxsuika then I use \UMS as \bx@UIh driver. \@ifpackageloaded{ums}{\bxOktrue}{\bxOkfalse} \@ifpackageloaded{bxsuika}{\bxOktrue}{} \ifbxOk \let\bx@UIh\bx@UIh@UMS \fi % If I have utf or otf then I use \UTF as \bx@UIh driver. \@ifpackageloaded{utf}{\bxOktrue}{\bxOkfalse} \@ifpackageloaded{otf}{\bxOktrue}{} \ifbxOk \let\bx@UIh\bx@UIh@otf \let\bx@AJ\bx@AJ@otf \fi % pxotf is same as otf, except that it also provides a direct % way to \bx@UI and \bx@AJ. \@ifpackageloaded{pxotf}{% \let\bx@UIh\bxUIh@otf \let\bx@UI\pxUcvUTF \let\bx@AJ\pxUcvCID}{}% % If I am upTeX I use \kchar. \ifnum\bx@b@uptex>\z@ \def\bx@UI{\kchar\bxUcv}\def\bx@UIh##1{\kchar"##1\relax}% % If I am a Unicode-aware engine, then... \else\ifnum\bxEngineTypeX>\@ne % \def\bx@UI{\char\bxUcv}\def\bx@UIh##1{\char"##1\relax}% \let\bx@Ux\bx@UI \let\bx@Uxh\bx@UIh % zxjatype provides better handling of \UI & \Ux. \@ifpackageloaded{zxjatype}{% \let\bx@UI\zxjt@UI \let\bx@UIh\zxjt@UIh \let\bx@Ux\zxjt@Ux \let\bx@Uxh\zxjt@Uxh}{}% % zxotf provides \CID comamnd. \@ifpackageloaded{zxotf}{% \def\bx@AJ{\CID\bxUcv}}{}% \fi\fi % If \bx@UIh@usr is known I use it. \ifx\bx@UIh@usr\@undefined\else \let\bx@UIh\bx@UIh@usr \fi \let\bx@setuidriver@a\bx@setuidriver@b \ifx\bx@AJ@usr\@undefined\else \let\bx@AJ\bx@AJ@usr \fi \let\bx@setajdriver@a\bx@setajdriver@b } \@onlypreamble\bx@assign@Ux %%%% \setUIdriver\CS \def\setUIdriver#1{% \ifx#1\@undefined \bx@err@uddrv#1% \else \bx@setuidriver@a#1\fi} \def\bx@setuidriver@a#1{\let\bx@UIh@usr#1} \def\bx@setuidriver@b#1{\let\bx@UIh#1} %%%% \setAJdriver\CS \def\setAJdriver#1{% \ifx#1\@undefined \bx@err@uddrv#1% \else \bx@setajdriver@a#1\fi} \def\bx@setajdriver@a#1{\let\bx@AJ@usr#1} \def\bx@setajdriver@b#1{\let\bx@AJ#1} %%%% \bx@assign@JI % Picks up appropriate drivers \bx@JI etc. % [driver] [purpose] [argument] [default] % \bx@JI JIS-code \bxUcv fallback % \bx@KI Kuten-code \bxUcv fallback \def\bx@JI{\bx@JI@fb} \def\bx@KI{\bx@KI@fb} \def\bx@assign@JI{% % \JI & \KI are available only in (u)pTeX \ifnum\bxEngineTypeX=\@ne \def\bx@JI{\char\jis\bxUcv\relax}\let\bx@KI\bx@KI@pTeX \fi } \ifnum\bxEngineTypeX=\@ne %----<*pTeX> %% \bx@KI@pTeX % \KI{2????} (0213 plane 2) works only when kanji-internal=sjis \mathchardef\bx@ki@max=\ifnum\jis"2121="8140 30000\else 20000\fi\relax \mathchardef\bx@ki@myr=10000 \mathchardef\bx@ki@bas="2020 \let\bx@ki@char=\char \ifx\kchar\@undefined\else \let\bx@ki@char=\kchar \fi \def\bx@KI@pTeX{% \ifnum\bxUcv<\bx@ki@max\else \bxUcv=\z@ \fi \ifnum\bxUcv<\bx@ki@myr \advance\bxUcv\bx@ki@myr \fi \expandafter\bx@ki@ptex@a\the\bxUcv\@nil \bx@ki@char\jis\bxUcv\relax} \bgroup \@tempcnta=94 \@for\bx@tmpa:=01,08,03,04,05,12,13,14,15\do{\advance\@tempcnta\@ne \expandafter\xdef\csname bx@JSH/\bx@tmpa\endcsname{\the\@tempcnta}} \@tempcntb=77 \loop \advance\@tempcnta\@ne \advance\@tempcntb\@ne \expandafter\xdef\csname bx@JSH/\the\@tempcntb\endcsname {\the\@tempcnta}% \ifnum\@tempcntb<94 \repeat \egroup \def\bx@ki@ptex@a#1#2#3#4#5#6\@nil{% \ifnum#1=\@ne \bxUcv=#2#3\relax \else \bxUcv=0\csname bx@JSH/#2#3\endcsname\relax \fi \multiply\bxUcv\@cclvi \advance\bxUcv#4#5\relax \advance\bxUcv\bx@ki@bas} \fi %---- \@onlypreamble\bx@assign@JI %%------ Assignment check %%%% \bxAssign \relax \def\bxAssign{% \bxOkfalse\afterassignment\bx@b@assign@a} \def\bx@b@assign@a#1\relax{% \def\bx@tmpa{#1}\ifx\bx@tmpa\@empty\bxOktrue\fi} %%------ Case conversion %%%% \bxToLower{} % Sets to \bxRes converted to lowercase. \def\bxToLower#1{% \edef\bxRes{\lowercase{\def\noexpand\bxRes{#1}}}\bxRes} %%%% \bxToUpper{} \def\bxToUpper#1{% \edef\bxRes{\uppercase{\def\noexpand\bxRes{#1}}}\bxRes} %%------ Document-level specials % Such specials must come before any typeset commands in DVI. %%%% \bxDocumentSpecial{} % Appends \special{} to the list of 'document-level specials'. % A simple use of \AtBeginDvi will do in this case. \def\bxDocumentSpecial#1{% \AtBeginDvi{\special{#1}}} \@onlypreamble\bxDocumentSpecial %%%% \bxDocumentSpecialUrgent{} % Similar to the above, but it demands that the given special be % placed as early as possible. \def\bxDocumentSpecialUrgent#1{% \bx@docspec@urgent@init \bx@prepend@box\bx@dsu@box{\special{#1}}} \def\bx@prepend@box#1#2{% \global\setbox#1\vbox{#2\unvbox#1}} \providecommand\bx@docspec@urgent@init{\bx@docspec@urgent@init@do} \def\bx@docspec@urgent@init@do{% \newbox\bx@dsu@box \AtBeginDocument{% \ifx\AtBeginShipoutFirst\@undefined \bx@prepend@box\@begindvibox{\unvbox\bx@dsu@box}% \else % 'atbegshi' package is in use {\toks@{\unvbox\bx@dsu@box}% \toks\tw@\expandafter{\AtBegShi@HookFirst}% \xdef\AtBegShi@HookFirst{\the\toks@\the\toks\tw@}} \fi}% \bxNullify\bx@docspec@urgent@init} \@onlypreamble\bxDocumentSpecialUrgent \@onlypreamble\bx@docspec@urgent@init \@onlypreamble\bx@docspec@urgent@init@do %%%% \recordpapersize \def\recordpapersize{% \bxDocumentSpecial{papersize=\the\paperwidth,\the\paperheight}% \bxNullify\recordpapersize} \@onlypreamble\recordpapersize %%<*> \dvipdfmxmapline{} %%<*> \dvipdfmxmapfile{} \def\dvipdfmxmapline#1{\bxDocumentSpecial{pdf:mapline #1}} \@onlypreamble\dvipdfmxmapline \def\dvipdfmxmapfile#1{\bxDocumentSpecial{pdf:mapfile #1}} \@onlypreamble\dvipdfmxmapfile %%----- "safe-caret" module \newif\ifbx@acr@ok \newif\ifbx@acr@needed \bx@acr@neededfalse \newif\ifbx@safecaret \bx@safecaretfalse \catcode`\^=13 %%%%<*> \safecaret \def\safecaret{% \bx@safecarettrue} \@onlypreamble\safecaret %%%% \bxEnableSafeCaret \def\bxEnableSafeCaret{% \bx@acr@neededtrue} \@onlypreamble\bxEnableSafeCaret %%%% \bx@acr@defbytes \def\bx@acr@defbytes{% \bgroup\@tempcnta128\lccode`\Z=`\B\catcode`\^\active \@whilenum\@tempcnta<256 \do{% \lccode`\^\@tempcnta \chardef\bx@acr@tok\@tempcnta \expandafter\bx@acr@defbytes@do@a\meaning\bx@acr@tok\@nil \advance\@tempcnta\@ne}\egroup} \def\bx@acr@defbytes@do@a#1"#2\@nil{% name is bx@acr@B/ab etc. \lowercase{\expandafter\gdef\csname bx@acr@Z/#2\endcsname{^}}} \@onlypreamble\bx@acr@defbytes \@onlypreamble\bx@acr@defbytes@do@a %%%% \bx@acr@caret %% This command should be \let'd to active <^>. \def\bx@acr@caret{% \let\bx@acr@out\@empty \bx@acr@caret@a} \def\bx@acr@caret@a{% \bx@acr@nextcaret{\bx@acr@caret@b}{\bx@acr@finish{\bx@acr@nxc}}} \def\bx@acr@caret@b#1{% \let\bx@acr@hex\@empty \bx@acr@nexthexdgt{\bx@acr@caret@c}{\bx@acr@finish{\bx@acr@nxdc}}} \def\bx@acr@caret@c#1{% \edef\bx@acr@hex{#1}% \bx@acr@nexthexdgt{\bx@acr@caret@d}{\bx@acr@finish{\bx@acr@nxdc\bx@acr@hex}}} \def\bx@acr@caret@d#1{% \edef\bx@acr@hex{\bx@acr@hex#1}% \expandafter\bx@acr@caret@e\csname bx@acr@B/\bx@acr@hex\endcsname \bx@acr@ifok{\bx@acr@nextcaret{\bx@acr@caret@g}{\bx@acr@finish{}}}% {\bx@acr@finish{\bx@acr@nxdc\bx@acr@hex}}} \def\bx@acr@caret@e#1{% \ifx#1\relax \bx@acr@okfalse \else \bx@acr@oktrue \expandafter\bx@acr@caret@f#1\fi} \def\bx@acr@caret@f#1{% \expandafter\def\expandafter\bx@acr@out\expandafter{\bx@acr@out#1}} \def\bx@acr@caret@g#1{\bx@acr@caret@a} \def\bx@acr@nxc{\noexpand^} \def\bx@acr@nxdc{\noexpand^\noexpand^} \def\bx@acr@nextcaret#1#2{% \def\bx@acr@tmpa{#1}\def\bx@acr@tmpb{#2}% \futurelet\bx@acr@tok\bx@acr@nextcaret@a} \def\bx@acr@nextcaret@a{% \let\bx@acr@nxt\bx@acr@tmpb \ifx^\bx@acr@tok \let\bx@acr@nxt\bx@acr@tmpa \fi \bx@acr@nxt} \def\bx@acr@nexthexdgt#1#2{% \def\bx@acr@tmpa{#1}\def\bx@acr@tmpb{#2}% \futurelet\bx@acr@tok\bx@acr@nexthexdgt@a} \def\bx@acr@nexthexdgt@a{% \let\bx@acr@nxt\bx@acr@tmpb \ifcat @\noexpand\bx@acr@tok \let\bx@acr@nxt\bx@acr@tmpa \fi \ifcat "\noexpand\bx@acr@tok \let\bx@acr@nxt\bx@acr@tmpa \fi \bx@acr@nxt} \def\bx@acr@ifok{% \ifbx@acr@ok \expandafter\@firstoftwo \else \expandafter \@secondoftwo \fi} \def\bx@acr@finish#1{% \edef\bx@acr@nxt{#1}% \ifx\bx@acr@out\@empty \bx@acr@oktrue \else \bx@acr@okfalse \fi \bx@acr@ifok{\expandafter\bx@acr@finish@a\bx@acr@nxt\@nil}% {\expandafter\bx@acr@out\bx@acr@nxt}} \def\bx@acr@finish@a#1#2\@nil{% % replace first ^ with normal one to avoid loop \bx@acr@normcaret #2} \let\bx@acr@normcaret\sp % this does not mean much %%%% \bx@acr@initialize \def\bx@acr@initialize{% \bx@acr@defbytes} \@onlypreamble\bx@acr@initialize %%%% \bx@acr@annihilate \def\bx@acr@annihilate{% \let\bx@acr@caret\relax\let\bx@acr@caret@a\relax \let\bx@acr@caret@b\relax\let\bx@acr@caret@c\relax \let\bx@acr@caret@d\relax\let\bx@acr@caret@e\relax \let\bx@acr@caret@f\relax\let\bx@acr@caret@g\relax \let\bx@acr@nextcaret\relax\let\bx@acr@nextcaret@a\relax \let\bx@acr@nexthexdgt\relax\let\bx@acr@nexthexdgt@a\relax \let\bx@acr@finish\relax\let\bx@acr@finish@a\relax} \@onlypreamble\bx@acr@annihilate %%%% \bx@acr@babel@hookcaret \def\bx@acr@babel@hookcaret{% \expandafter\ifx\csname active@char\string^\endcsname\relax\else \declare@shorthand\system@group{^}{\bx@acr@caret}% \let\bx@acr@normcaret\bx@acr@babel@normcaret \bxEnableSafeCaret \fi} \@onlypreamble\bx@acr@babel@hookcaret \edef\bx@acr@babel@normcaret{% \expandafter\noexpand\csname normal@char\string^\endcsname} %%%% \bx@acr@verbatim@hookcaret \def\bx@acr@verbatim@hookcaret{% \g@addto@macro\@noligs{\catcode`\^\active\let^\bx@acr@caret \let\bx@acr@normcaret\bx@acr@verb@normcaret}% \bxEnableSafeCaret} \begingroup \catcode`\^=12 \global\let\bx@acr@verb@normcaret=^\endgroup \@onlypreamble\bx@acr@verbatim@hookcaret %%%% begin-document hook \providecommand*\bxBDHookSafeCaret{\bx@bdhook@safecaret@do} \def\bx@bdhook@safecaret@do{% \AtBeginDocument{% %% function activated by '\safecaret' \ifbx@safecaret \@ifpackageloaded{babel}{\bx@acr@babel@hookcaret}{}% \bx@acr@verbatim@hookcaret \fi %% initialize or annihilate... \ifbx@acr@needed \bx@acr@initialize \else \bx@acr@annihilate \fi \let\bxEnableSafeCaret\@undefined}% \bxNullify\bxBDHookSafeCaret} \@onlypreamble\bx@bdhook@safecaret@do \catcode`\^=6 %%------ "shadow map" module %%%% \bxUseShadowMap\CS{} \def\bxUseShadowMap#1#2{% \global\font#1=#2\relax} %%%% \bxMap\CS \mathchardef\bx@m@cc=256 \def\bxMap#1{\begingroup\count@\bxUcv\divide\count@\bx@m@cc \chardef\bx@m@hb\count@ \multiply\count@\bx@m@cc \advance\bxUcv-\count@ \setbox\z@\hbox{#1\bx@m@hb\char\bxUcv}% \global\bxUcv\wd\z@ \endgroup} %%------ all done \bx@b@resetcatcodes \let\bx@nxt\relax \endinput %% EOF