%% %% This is file 'pxchfon.sty'. %% %% Copyright (c) 2009-2023 Takayuki YATO (aka. "ZR") %% GitHub: https://github.com/zr-tex8r %% Twitter: @zr_tex8r %% %% This package is distributed under the MIT License. %% %% package declaration \NeedsTeXFormat{pLaTeX2e} \ProvidesPackage{pxchfon}[2023/08/28 v2.0] \def\pxcz@pkgname{pxchfon} %--------------------------------------- general %% packages \RequirePackage{keyval} %% variables \newif\ifpxcz@ok \newif\ifpxcz@utf \let\pxcz@value\relax \let\pxcz@pre\relax \let\pxcz@post\relax %% unique tokens \def\pxcz@end{\pxcz@end@} \def\pxcz@mt{\pxcz@mt@} %% \pxcz@csletcs{}{} \def\pxcz@csletcs#1#2{% \expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname} %% \pxcz@cond\ifXXX...\fi{}{} \@gobbletwo\if\if \def\pxcz@cond#1\fi{% #1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} %% \pxcz@onlypreamble@csdef{} \def\pxcz@onlypreamble@csdef#1{% \expandafter\pxcz@onlypreamble@def\csname#1\endcsname} %% \pxcz@onlypreamble@def\CS \def\pxcz@onlypreamble@def#1{% \@onlypreamble#1\def#1} %% \pxcz@onlypreamble@let\CS \def\pxcz@onlypreamble@let#1{% \@onlypreamble#1\let#1} %% \pxcz@csuse@or{}{} \def\pxcz@csuse@or#1#2{% \expandafter\ifx\csname#1\endcsname\relax \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi{#2}{\csname#1\endcsname}} %% \pxcz@lower\CS \def\pxcz@lower#1{% \expandafter\pxcz@lower@a#1\pxcz@end#1} \def\pxcz@lower@a#1\pxcz@end#2{% \lowercase{\def#2{#1}}} %% \pxcz@setkeys{}{} \pxcz@onlypreamble@def\pxcz@setkeys#1#2{% \def\KV@errx##1{#2}% \edef\pxcz@do{\noexpand\setkeys{pxchfon}{#1}}\pxcz@do \let\KV@errx\pxcz@org@KV@errx} \let\pxcz@org@KV@errx\KV@errx %% \pxcz@handle@kvopt{}{}{}{} %% \pxcz@handle@bool@kvopt{}{}{} \pxcz@onlypreamble@def\pxcz@handle@kvopt{% \pxcz@handle@kvopt@a{@@}} \pxcz@onlypreamble@def\pxcz@handle@bool@kvopt#1#2#3{% \pxcz@handle@kvopt@a{}{#1}{#2}{#3}{\pxcz@value}} \pxcz@onlypreamble@def\pxcz@handle@kvopt@a#1#2#3#4{% \@nameuse{pxcz@#3@giventrue}% \pxcz@csletcs{pxcz@value}{pxcz@#3#1#4}% \ifx\pxcz@value\relax \PackageError\pxcz@pkgname {Invalid value for option key '#2'\MessageBreak (#4)}% \expandafter\@gobble \else \expandafter\@firstofone \fi} %% \pxcz@split{}{} \def\pxcz@split#1#2{% \edef\pxcz@tmpx{{#1}{#2}}% \expandafter\pxcz@split@a\pxcz@tmpx} \def\pxcz@split@a#1#2{% \def\pxcz@tmpx##1#1##2\pxcz@end{\pxcz@split@b{##1}{##2}}% \pxcz@tmpx#2\pxcz@mt#1\pxcz@end} \def\pxcz@split@b#1#2{% \let\pxcz@pre\relax \let\pxcz@post\relax \ifx\pxcz@end#2\pxcz@end\else \pxcz@split@c#2\pxcz@end{#1}% \fi} \def\pxcz@split@c#1\pxcz@mt#2\pxcz@end#3{% \def\pxcz@pre{#3}\def\pxcz@post{#1}} %--------------------------------------- environment check %% check for 'pxjafont' package \@ifpackageloaded{pxjafont}{% \PackageError\pxcz@pkgname {Old 'pxjafont' is loaded}{\@ehc} \endinput}{} %% \ifpxcz@uptex \newif\ifpxcz@uptex \pxcz@uptexfalse \def\pxcz@do#1#2{% \edef\pxcz@tmpa{\string#1}\edef\pxcz@tmpb{\meaning#1}% \ifx\pxcz@tmpa\pxcz@tmpb #2\fi} \pxcz@do\ucs{% \pxcz@do\ptexversion{\pxcz@uptextrue} \pxcz@do\kchardef{\pxcz@uptextrue} % only upTeX in Unicode is seen as upTeX \ifnum\ucs"3000="3000 \else \pxcz@uptexfalse \fi} %% \pxcz@JYn \edef\pxcz@JYn{% \ifpxcz@uptex JY2\else JY1\fi} %% \ifpxcz@lite@mode \newif\ifpxcz@lite@mode \IfFileExists{pxchfon0.def}{}{%else \PackageInfo\pxcz@pkgname {Working in Lite mode\@gobble}% \pxcz@lite@modetrue} %% \ifpxcz@otf@loaded %% \ifpxcz@otf@deluxe %% \pxcz@otf@weight: otf weight mode \newif\ifpxcz@otf@loaded \pxcz@otf@loadedtrue \newif\ifpxcz@otf@deluxe \pxcz@otf@deluxefalse % watch out for priority... \@ifpackagewith{otf}{deluxe}{% \pxcz@otf@deluxetrue \let\pxcz@otf@weight=d }{\@ifpackagewith{otf}{bold}{% \let\pxcz@otf@weight=b }{\@ifpackagewith{otf}{expert}{% \let\pxcz@otf@weight=r % 'expert' cancels 'noreplace' }{\@ifpackagewith{otf}{noreplace}{% \let\pxcz@otf@weight=n }{\@ifpackageloaded{otf}{% \let\pxcz@otf@weight=r }{%else \pxcz@otf@loadedfalse \let\pxcz@otf@weight=n }}}}} %% \ifpxcz@otf@multi \newif\ifpxcz@otf@multi \pxcz@otf@multifalse \@ifpackagewith{otf}{multi}{\pxcz@otf@multitrue}{} %% \ifpxcz@otf@expert \newif\ifpxcz@otf@expert \pxcz@otf@expertfalse \@ifpackagewith{otf}{expert}{\pxcz@otf@experttrue}{} %% \ifpxcz@otf@mmivjis: 'jis2004' of otf is used? \newif\ifpxcz@otf@mmivjis \pxcz@otf@mmivjisfalse \@ifpackagewith{otf}{jis2004}{\pxcz@otf@mmivjistrue}{} %% \pxcz@jascale \ifpxcz@uptex % do not consider JFM scale \let\pxcz@jascale\utf@sc@le \ifx\pxcz@jascale\@undefined \let\pxcz@jascale\Cjascale \fi \ifx\pxcz@jascale\@undefined \edef\pxcz@jascale{\ifx\jsc@JYn\@undefined 0.962216\else 0.924715\fi}% \fi \fi %% \pxcz@pxufont@avail \IfFileExists{pxufont-ruby.sty}{\chardef\pxcz@pxufont@avail=2 }{% \IfFileExists{pxufont.sty}{\chardef\pxcz@pxufont@avail=1 }{% \chardef\pxcz@pxufont@avail=0 }} %% \pxcz@pxufont@loaded \@ifpackageloaded{pxufont}{% \ifx t\pxufontUseRubyFont \chardef\pxcz@pxufont@loaded=2 \else \chardef\pxcz@pxufont@loaded=1 \fi }{%else \chardef\pxcz@pxufont@loaded=0 } %% \ifpxcz@old@hook@system \newif\ifpxcz@old@hook@system \@ifl@t@r\fmtversion{2020/10/01}{}{\pxcz@old@hook@systemtrue} %% \pxcz@hy@disable@commands{} \pxcz@onlypreamble@def\pxcz@hy@disable@commands{% \providecommand*\pdfstringdefPreHook{}% \g@addto@macro\pdfstringdefPreHook} %--------------------------------------- custom presets %% \pxcz@custom@presets \pxcz@onlypreamble@let\pxcz@custom@presets\@empty %% \pxcz@custom@apply@opt@unicode \pxcz@onlypreamble@let\pxcz@custom@apply@opt@unicode\@empty %% freeze \pxcz@onlypreamble@let\pxcz@custom\relax \let\pxcz@uniweight\relax \let\pxcz@multiweight\relax %% \pxcz@check@avail@custom@presets \pxcz@onlypreamble@let\pxcz@check@avail@custom@presets\relax \AtEndOfPackage{% \def\pxcz@check@avail@custom@presets#1#2#3{% \PackageError\pxcz@pkgname {Custom presets cannot be registered after\MessageBreak loading pxchfon package}% {\@eha}}} %% \pxcz@declare@oneweight@preset{}{}{} \pxcz@onlypreamble@def\pxcz@declare@oneweight@preset#1#2#3{% \pxcz@check@avail@custom@presets \xdef\pxcz@custom@presets{\pxcz@custom@presets \pxcz@custom{#1}{\pxcz@uniweight{#2}{#3}}}} %% \pxcz@declare@multiweight@preset{}{}...{} \pxcz@onlypreamble@def\pxcz@declare@multiweight@preset#1#2#3#4#5#6#7#8#9{% \pxcz@check@avail@custom@presets \xdef\pxcz@custom@presets{\pxcz@custom@presets \pxcz@custom{#1}{\pxcz@multiweight{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}}} %%<+> \pxchfonDeclareOneWeightPreset{}{}{} \@onlypreamble\pxchfonDeclareOneWeightPreset \newcommand*\pxchfonDeclareOneWeightPreset[1]{% \pxcz@declare@oneweight@preset{user:#1}} %%<+> \pxchfonDeclareMultiWeightPreset{}{}...{} \@onlypreamble\pxchfonDeclareMultiWeightPreset \newcommand*\pxchfonDeclareMultiWeightPreset[1]{% \pxcz@declare@multiweight@preset{user:#1}} %% Load custom preset definitions \IfFileExists{pxchfon-extras.def}{% PXchfon-extras \PackageInfo\pxcz@pkgname {Extra preset settings are loaded\@gobble}% \input{pxchfon-extras.def}% }{} \IfFileExists{pxchfon.cfg}{% of user \PackageInfo\pxcz@pkgname {Custom preset settings are loaded\@gobble}% \begingroup \makeatother\input{pxchfon.cfg}% \endgroup }{} %--------------------------------------- handle options %% variables \newif\ifpxcz@enabled \pxcz@enabledtrue \let\pxcz@alphabet\relax \newif\ifpxcz@otf \pxcz@otftrue \newif\ifpxcz@cmap@alpha \newif\ifpxcz@mmivjis \newif\ifpxcz@everypage \newif\ifpxcz@oneweight \newif\ifpxcz@fullwidth \let\pxcz@unicode\relax \let\pxcz@main@preset\relax \let\pxcz@file@preset\relax \newif\ifpxcz@file@preset@tl \newif\ifpxcz@dumpmap \newif\ifpxcz@dumpmap@tl \newif\ifpxcz@switch@font \pxcz@switch@fonttrue \newif\ifpxcz@switch@font@xjis \let\pxcz@strict@csi\relax \newif\ifpxcz@unicode@given \let\pxcz@legacycode\relax \newif\ifpxcz@legacycode@replace \newif\ifpxcz@legacycode@replace@given \let\pxcz@expert\relax \chardef\pxcz@glyphid\z@ \newif\ifpxcz@autojfmsync %% process options % drivers \DeclareOption{nodvidriver}{\pxcz@enabledfalse} \DeclareOption{dvips}{\pxcz@enabledfalse} \DeclareOption{dviout}{\pxcz@enabledfalse} \DeclareOption{xdvi}{\pxcz@enabledfalse} \DeclareOption{dvipdfmx}{\pxcz@enabledtrue} % (no)alphabet / relfont \DeclareOption{alphabet}{\let\pxcz@alphabet=t} \DeclareOption{noalphabet}{\let\pxcz@alphabet=f} \DeclareOption{relfont}{\let\pxcz@alphabet=r} % (no)otf \DeclareOption{otf}{\pxcz@otftrue} \DeclareOption{nootf}{\pxcz@otffalse} \DeclareOption{utf}{\pxcz@otftrue} \DeclareOption{noutf}{\pxcz@otffalse} % (no)usecmapforalphabet \DeclareOption{usecmapforalphabet}{\pxcz@cmap@alphatrue} \DeclareOption{nousecmapforalphabet}{\pxcz@cmap@alphafalse} % (no)prefer2004jis / (no)jis2004 \DeclareOption{prefer2004jis}{\pxcz@mmivjistrue} \DeclareOption{noprefer2004jis}{\pxcz@mmivjisfalse} \DeclareOption{jis2004}{\pxcz@mmivjistrue} \DeclareOption{nojis2004}{\pxcz@mmivjisfalse} % (no)everypage \DeclareOption{everypage}{\pxcz@everypagetrue} \DeclareOption{noeverypage}{\pxcz@everypagefalse} % (no)oneweight \DeclareOption{oneweight}{\pxcz@oneweighttrue} \DeclareOption{nooneweight}{\pxcz@oneweightfalse} % unicode= \chardef\pxcz@unicode@@false=0 \chardef\pxcz@unicode@@UTF=1 \chardef\pxcz@unicode@@simple=2 \chardef\pxcz@unicode@@full=3 \chardef\pxcz@unicode@@true=\pxcz@unicode@@full \define@key{pxchfon}{unicode}[true]{% \pxcz@handle@kvopt{unicode}{unicode}{#1}{% \let\pxcz@unicode\pxcz@value}} \DeclareOption{nounicode}{\setkeys{pxchfon}{unicode=false}} % (old options) \DeclareOption{directunicode*}{\setkeys{pxchfon}{unicode=simple}} \DeclareOption{directunicode}{\setkeys{pxchfon}{unicode=UTF}} \DeclareOption{nodirectunicode}{\setkeys{pxchfon}{unicode=false}} % (no)fullwidth \DeclareOption{fullwidth}{\pxcz@fullwidthtrue} \DeclareOption{nofullwidth}{\pxcz@fullwidthfalse} % (no)dumpmap \DeclareOption{dumpmap}{\pxcz@dumpmaptrue} \DeclareOption{nodumpmap}{\pxcz@dumpmapfalse} % (no)dumpmaptl \DeclareOption{dumpmaptl}{\pxcz@dumpmap@tltrue} \DeclareOption{nodumpmaptl}{\pxcz@dumpmap@tlfalse} % (no)switchfont \DeclareOption{switchfont}{\pxcz@switch@fonttrue} \DeclareOption{noswitchfont}{\pxcz@switch@fontfalse} % (no)strictcsi \DeclareOption{strictcsi}{\let\pxcz@strict@csi=t} \DeclareOption{nostrictcsi}{\let\pxcz@strict@csi=f} % legacycode= \chardef\pxcz@legacycode@@apply=0 \chardef\pxcz@legacycode@@ignore=1 \chardef\pxcz@legacycode@@suppress=2 \define@key{pxchfon}{legacycode}{% \pxcz@handle@kvopt{legacycode}{legacycode}{#1}{% \let\pxcz@legacycode\pxcz@value}} % legacycode-replace= \define@key{pxchfon}{legacycode-replace}[true]{% \pxcz@handle@bool@kvopt{legacycode-replace}{legacycode@replace}{#1}} % (no)expert \DeclareOption{expert}{\let\pxcz@expert=t} \DeclareOption{noexpert}{\let\pxcz@expert=f} % (no)glyphid \DeclareOption{glyphid}{\chardef\pxcz@glyphid=2 } \DeclareOption{noglyphid}{\chardef\pxcz@glyphid=0 } % (no)autojfmsync \DeclareOption{autojfmsync}{\pxcz@autojfmsynctrue} \DeclareOption{noautojfmsync}{\pxcz@autojfmsyncfalse} % maybe-multiweight \DeclareOption{maybe-multiweight}{\let\pxchfonMaybeMultiweight=t} % use= \define@key{pxchfon}{use}{% \pxcz@okfalse \pxcz@split{:}{#1}\ifx\pxcz@pre\relax \pxcz@handle@use@b{file}{#1}% \else \pxcz@handle@use@a{file}{file}% \pxcz@handle@use@a{tl-ja}{ja}% \pxcz@handle@use@a{tl-ko}{ko}% \pxcz@handle@use@a{tl-sc}{sc}% \pxcz@handle@use@a{tl-tc}{tc}% \pxcz@handle@use@a{tl}{ja}% \fi \ifpxcz@ok\else \PackageError\pxcz@pkgname {The value for option 'use' has an invalid prefix:\MessageBreak ('\pxcz@pre:')}% {\@ehc}% \fi} \pxcz@onlypreamble@def\pxcz@handle@use@a#1#2{% \ifpxcz@ok\else \def\pxcz@tmpb{#1}\ifx\pxcz@pre\pxcz@tmpb \pxcz@handle@use@b{#2}{\pxcz@post}% \fi\fi} \pxcz@onlypreamble@def\pxcz@handle@use@b#1#2{% \edef\pxcz@use@list{\pxcz@use@list\pxcz@use@do{#1}{#2}}% \pxcz@oktrue} % preset spec options \pxcz@onlypreamble@def\pxcz@all@main@preset{% noembed,% %(uniweight) ms,ipa,ipaex,% %(multiweight) ms-hg,ipa-hg,ipaex-hg,moga-mobo,moga-mobo-ex,moga-maruberi,ume,% kozuka-pro,kozuka-pr6,kozuka-pr6n,hiragino-pro,hiragino-pron,% hiragino-elcapitan-pro,hiragino-elcapitan-pron,% morisawa-pro,morisawa-pr6n,yu-win,yu-win10,yu-osx,% sourcehan-otc,sourcehan,sourcehan-jp,noto-otc,noto,noto-jp,% haranoaji,% sourcehan-otc!,sourcehan!,sourcehan-jp!,noto-otc!,noto!,noto-jp!,% noto-otf!,% %(alias) hiragino,noto-otf,% noEmbed,kozuka,hiragino-elcapitan,morisawa} \pxcz@onlypreamble@def\pxcz@all@abolished@preset{% sourcehan+,sourcehan-otc+,noto+,noto-otc+,yu-win10+, ipa-otf,ipa-otf-dx,kozuka4,kozuka6,kozuka6n, ms-dx,ipa-ttf,ipa-ttf-dx,ipav2,ipav2-dx,ipa-dx,hiragino-dx} \def\pxcz@do#1{\DeclareOption{#1}{\def\pxcz@main@preset{#1}}} \@for\pxcz@x:=\pxcz@all@main@preset\do{% \expandafter\pxcz@do\expandafter{\pxcz@x}} \@for\pxcz@x:=\pxcz@all@abolished@preset\do{% \expandafter\pxcz@do\expandafter{\pxcz@x}} \def\pxcz@custom#1#2{\pxcz@do{#1}} \pxcz@custom@presets %% 'local-only' constant options % The 'unicode' option means a Unicode-oriented mapping, and requires % dvipdfmx of version 20170918 or later. The 'unicode-fwid' is a variant. % The 'unicode*(-fwid)' option is ABOLISHED. \define@key{pxchfon}{unicode*}[]{% \PackageError\pxcz@pkgname {Option 'unicode*' is ABOLISHED!\MessageBreak You should update to TL2018 or later and use\MessageBreak option 'unicode' instead}% {This option was to invoke a transitional setting\MessageBreak that was specially tailored for TL2017.\MessageBreak \@ehc}} % general option handler \DeclareOption*{% \pxcz@parse@opt\CurrentOption \ifpxcz@ok\else \pxcz@setkeys{\CurrentOption}{\@unknownoptionerror}% \fi} %% \pxcz@use@list \pxcz@onlypreamble@let\pxcz@use@list\@empty \let\pxcz@use@do\relax %freeze %% \pxcz@parse@opt{