% This is the file CJK.sty of the CJK package % for using Asian logographs (Chinese/Japanese/Korean) with LaTeX2e % % created by Werner Lemberg % % Version 4.8.5 (16-Oct-2021) % Copyright (C) 1994-2021 Werner Lemberg % % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program in doc/COPYING; if not, write to the Free % Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, % MA 02110-1301 USA \NeedsTeXFormat{LaTeX2e}[2001/06/01] \def\fileversion{4.8.5} \def\filedate{2021/10/16} \ProvidesPackage{CJK}[\filedate\space\fileversion] \RequirePackage{MULEenc} \newif\ifCJK@lowercase@ \CJK@lowercase@false \DeclareOption{lowercase}{\CJK@lowercase@true} \DeclareOption{global}{\let\CJK@global \global \let\CJK@active \global \let\CJK@local \global} \DeclareOption{local}{\let\CJK@global \relax \let\CJK@active \global \let\CJK@local \global} \DeclareOption{active}{\let\CJK@global \relax \let\CJK@active \relax \let\CJK@local \global} \DeclareOption{encapsulated}{\let\CJK@global \relax \let\CJK@active \relax \let\CJK@local \relax} \ExecuteOptions{local} \ProcessOptions % we suppress any unwanted spaces produced by linefeeds. \endlinechar \m@ne % the use of the internal LaTeX macro `\@ifundefined' can be slightly % irritating. After it has been called, the tested macro is no % longer undefined but expands to \relax. Where possible, we use % the following macro which doesn't have this side effect. \def\CJK@ifundefined#1{ \ifx #1\@undefined \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi } % our input macro. For compatibility with ArabTeX, the catcode of `<' % is preserved. \def\CJK@input#1{ \makeatletter \edef\CJK@lesscatcode{\noexpand\catcode`< \the\catcode`<} \catcode`\< 12\relax \endlinechar \m@ne \input #1\relax \endlinechar `\^^M \CJK@lesscatcode \makeatother} % our symbol macro. It honours the \ifCJK@bold@ flag (to be set in the .fd % files) for producing poor-man's bold fonts; if it is raised we print % the character three times with a small horizontal shift. % % The user commands to set and unset \ifCJK@bold@ are \CJKbold and % \CJKnormal respectively. % % \CJKboldshift defines the shift used to imitate bold fonts. \newif\ifCJK@bold@ \newcommand{\CJKbold}{\global\CJK@bold@true} \newcommand{\CJKnormal}{\global\CJK@bold@false} \newcommand{\CJKboldshift}{0.015em} \DeclareRobustCommand{\CJKsymbol}[1]{ \symbol{#1} \ifCJK@bold@ \hbox to \CJKboldshift{\hss\symbol{#1}} \hbox to \CJKboldshift{\hss\symbol{#1}} \fi} \let\CJKpunctsymbol\CJKsymbol % the same for HLaTeX which uses the ligature mechanism \DeclareRobustCommand{\CJKsymbols}[2]{ \char #1\char #2\relax \ifCJK@bold@ \hbox to \CJKboldshift{\hss\char #1\char #2} \hbox to \CJKboldshift{\hss\char #1\char #2} \fi} % the auxiliary macro \CJK@numbToHex converts number #2 into a two-digit % hex string and assigns it globally to #1. \def\CJK@numbToHex#1#2{ {\count\z@ #2\relax \count\tw@ \count\z@ \divide\count\z@ \sixt@@n \count@ \count\z@ \multiply\count@ \sixt@@n \advance\count\tw@ -\count@ \xdef#1{ \hexnumber@{\count\z@}\hexnumber@{\count\tw@}}}} % the auxiliary macro \CJK@numbxToHex converts number #2 into a four-digit % hex string and assigns it globally to #1. \def\CJK@numbxToHex#1#2{ {\count\thr@@ #2\relax \count\tw@ \count\thr@@ \divide\count\tw@ \sixt@@n \count\@ne \count\tw@ \divide\count\@ne \sixt@@n \count\z@ \count\@ne \divide\count\z@ \sixt@@n \count@ \count\tw@ \multiply\count@ \sixt@@n \advance\count\thr@@ -\count@ \count@ \count\@ne \multiply\count@ \sixt@@n \advance\count\tw@ -\count@ \count@ \count\z@ \multiply\count@ \sixt@@n \advance\count\@ne -\count@ \xdef#1{ \hexnumber@{\count\z@} \hexnumber@{\count\@ne} \hexnumber@{\count\tw@} \hexnumber@{\count\thr@@}}}} % the encoding of the `UTF8' environment. \edef\CJK@UnicodeEnc{UTF8} % with \CJKchar you can access a character directly at a low level: % the parameters are the first and the second byte of the CJK character % code. The second parameter will be ignored if you address one-byte % encoded characters in SJIS. % % the optional parameter selects the encoding (using \CJKenc). % % for Unicode characters you must select UTF-8 encoding (but enter real % Unicode values). % % you can enter character codes with or without the 8th bit set (GL or % GR form) except for SJIS, Bg5 and UTF-8 encodings. \DeclareRobustCommand{\CJKchar}[3][]{ {\CJK@nobind@true \edef\CJK@tempenc{#1} \ifx\CJK@tempenc \@empty \else \let\CJK@oldenc \CJK@@@enc \CJKenc{#1} \fi \edef\CJK@temp{UTF8} \ifx\CJK@temp \CJK@@@enc \Unicode{#2}{#3} \else \@tempcnta #2 \edef\CJK@tempa{#3} \ifx\CJK@tempa \@empty% % test for one-byte SJIS characters \else \@tempcntb #3 \ifnum \CJK@min > 160\relax \ifnum\@tempcnta < 128\relax \advance\@tempcnta 128\relax \advance\@tempcntb 128\relax \fi \fi \edef\CJK@tempa{\the\@tempcntb} \fi \edef\CJK@temp{\the\@tempcnta} \expandafter\csname CJK@\CJK@temp\expandafter\endcsname \expandafter{\CJK@tempa} \fi \ifx\CJK@tempenc \@empty \else \ifx\CJK@global \global \CJKenc{\CJK@oldenc} \fi \fi} \CJK@ignorespaces} % with \Unicode you can access a Unicode character directly at a low level: % the parameters are the first and the second byte of the Unicode (real % Unicode values, not UTF-8). % % If the Unicode value is greater than U+FFFF, put the first two bytes % into #1, and the third byte into #2. \DeclareRobustCommand{\Unicode}[2]{ {\edef\CJK@temp{UTF8} \ifx\CJK@temp \CJK@@@enc \else \PackageError{CJK}{ You can't use \protect\Unicode\space here}{ You must activate UTF-8 encoding to use \protect\Unicode.} \fi \ifnum #1 > 255\relax \CJK@numbxToHex{\CJK@gtemp}{#1} \else \CJK@numbToHex{\CJK@gtemp}{#1} \fi \def\CJK@tempa##1{ \lowercase{\edef\CJK@plane{##1}}} \expandafter\CJK@tempa\expandafter{\CJK@gtemp} \usefont{\CJK@enc}{\CJK@family}{\CJK@series}{\CJK@shape} \edef\CJK@tempa{ \curr@fontshape/\CJK@plane/\number #2/\CJK@direction} \expandafter\ifx\csname\CJK@tempa\endcsname \relax \def\CJKtemp{\CJKsymbol{#2}} \else \def\CJKtemp{\csname\CJK@tempa\endcsname} \fi \ifCJK@latin@ \CJKtemp \else \expandafter\CJK@testInList\expandafter\CJK@uniPunct \expandafter{\CJK@plane} \ifCJK@% % punctuation character \CJK@numbToHex{\CJK@gtemp}{#2} \CJK@testLastCJK \ifCJK@ \CJK@testPostPunct{\CJK@@@enc}{\CJK@plane}{\CJK@gtemp} \ifCJK@ \ifCJK@CJK@ \CJK@nobreakglue \fi \else \ifCJK@hangul@ \discretionary{}{}{} \else \CJKglue \fi \fi \fi \ifCJK@CJK@ \CJK@testLastKern \ifCJK@ \CJK@nobreakglue \fi \fi \CJKtemp \CJK@testPrePunct{\CJK@@@enc}{\CJK@plane}{\CJK@gtemp} \ifCJK@ \CJK@kern \else \CJK@CJK \fi \else% % not a punctuation character \CJK@testLastCJK \ifCJK@ \ifCJK@hangul@ \discretionary{}{}{} \else \CJKglue \fi \fi \ifCJK@CJK@ \CJK@testLastKern \ifCJK@ \CJK@nobreakglue \fi \fi \CJKtemp \CJK@CJK \fi \fi} \CJK@ignorespaces} % the following commands are needed for UTF-8 encoding to select the proper % intercharacter glue. \newif\ifCJK@CJK@ \newif\ifCJK@hangul@ \newif\ifCJK@latin@ \newcommand{\CJKCJKchar}{ \CJK@global\CJK@CJK@true \CJK@global\CJK@hangul@false \CJK@global\CJK@latin@false} \newcommand{\CJKhangulchar}{ \CJK@global\CJK@CJK@false \CJK@global\CJK@hangul@true \CJK@global\CJK@latin@false} \newcommand{\CJKlatinchar}{ \CJK@global\CJK@CJK@false \CJK@global\CJK@hangul@false \CJK@global\CJK@latin@true} \CJKCJKchar % the next commands control mapping of half-width katakana to full-width % glyphs within SJIS encoding. \newif\ifCJK@hwkatakana@ \newcommand{\CJKhwkatakana}{\CJK@global\CJK@hwkatakana@true} \newcommand{\CJKnohwkatakana}{\CJK@global\CJK@hwkatakana@false} \CJKhwkatakana % you will find the innermost routines of the macros defined above in the % xxx.chr files. These routines are % % \CJK@char, \CJK@charx, % \CJK@altchar, \CJK@altcharx, % \CJK@punctchar, \CJK@punctcharx, % \CJK@sjischar, \CJK@sjispunctchar . % we need to scan comma separated lists of character codes (represented as % hexadecimal strings), testing whether a particular character is in the % list. The macro \CJK@testInList sets the flag \ifCJK@ globally if true. % Parameter #1 is the list, #2 the actual character code to test. % % see the documentation of the \ifnot@excluded macro in the doc package of % the standard LaTeX2e distribution for a detailed explanation of the % following tricky definitions. \newif\ifCJK@ \def\CJK@stop{\CJK@stop} \def\CJK@testInList#1#2{ \def\CJK@tempa##1,#2,##2\CJK@stop{ \def\CJK@tempb{##2} \global\CJK@true \ifx\CJK@tempb \@empty \global\CJK@false \fi} \expandafter\CJK@tempa\expandafter,#1,#2,\CJK@stop} % lists defined in CJK.enc for plane yy with encoding xx are assigned to % global macros \CJK@xx@yy@prePunct and \CJK@xx@yy@postPunct. \def\CJK@prePunct#1#2#3{ \expandafter\gdef\csname CJK@#1@#2@prePunct\endcsname{#3}} \def\CJK@postPunct#1#2#3{ \expandafter\gdef\csname CJK@#1@#2@postPunct\endcsname{#3}} % the next two functions scan the lists of punctuation characters of a % particular plane which should not occur at the beginning or at the end % of a line. They will be used in the xxx.chr files. Parameters are the % encoding, the plane and the character to be tested. Again these macros % raise or lower \ifCJK@. \def\CJK@testPrePunct#1#2#3{ \expandafter\expandafter\expandafter \CJK@testInList \expandafter\csname CJK@#1@#2@prePunct\expandafter\endcsname \expandafter{#3}} \def\CJK@testPostPunct#1#2#3{ \expandafter\expandafter\expandafter \CJK@testInList \expandafter\csname CJK@#1@#2@postPunct\expandafter\endcsname \expandafter{#3}} % the macro \CJKenc changes the encoding inside of a CJK environment. It % always uses the fontencoding defined with \CJKfontenc (this % behaviour is intentionally different from the similar command pair % \CJKfamily and \CJKencfamily). \DeclareRobustCommand{\CJKenc}[1]{ \expandafter\ifx\csname CJK@#1@fontenc\endcsname \relax \PackageError{CJK}{ Encoding `#1' is not defined}{} \fi \edef\CJK@temp{\csname CJK@#1@fontenc\endcsname} \expandafter\ifx\csname CJK@#1\CJK@temp @enc\endcsname \relax \PackageError{CJK}{ Encoding `#1\CJK@temp' is not defined}{} \else \CJK@global\edef\CJK@@@enc{#1} \CJK@selectEnc \fi} \edef\CJK@@@enc{} % to change a fontencoding yyy for a specific encoding xxx say % \CJKfontenc{xxx}{yyy}. If you then change the encoding forth and back, % this fontencoding is still valid. You will need this command only in % cases where the fonts are not CJK-fontencoded, such as pmC or dnp % fontencodings. % % if you define a new encoding `foo', you *must* supply the command % `\CJKfontenc{foo}{}' (note the empty second parameter) since the % encoding existence test relies on this. \DeclareRobustCommand{\CJKfontenc}[2]{ \expandafter\CJK@global\expandafter\edef \csname CJK@#1@fontenc\endcsname{#2} \CJK@selectEnc} % \CJKfamily{xxx} selects the shape xxx for all encodings. It will override % \CJKencfamily, i.e., if you change the encoding, the family will be % the same. To reactivate \CJKencfamily, say `\CJKfamily{}'. % % For backward compatibility the macros \CJKshape and \CJKencshape are set % to \CJKfamily and \CJKencfamily, respectively. \DeclareRobustCommand{\CJKfamily}[1]{ \CJK@global\edef\CJK@globalfamily{#1} \CJK@selectFamily} \edef\CJK@globalfamily{} % to change a family for a specific encoding xxx (and a font encoding yyy), % use \CJKencfamily. If you then change the encoding forth and back, % this family is still valid. This macro is especially useful with % cjk-enc.el since it allows to change the encoding without the need to % select a (possibly different) family each time. See the various % encoding definitions in CJK.enc for the default values. % % note that it is equivalent to say \CJKencfamily[yyy]{xxx}{...} and % \CJKencfamily{xxxyyy}{...}. \DeclareRobustCommand{\CJKencfamily}[3][]{ \expandafter\CJK@global\expandafter\edef \csname CJK@#2#1@family\endcsname{#3} \CJK@selectFamily} \let\CJKshape \CJKfamily \let\CJKencshape \CJKencfamily % the next commands select the actual family and encoding. \def\CJK@selFam{ \edef\CJK@temp{\csname CJK@\CJK@@@enc @fontenc\endcsname} \ifx\CJK@globalfamily \@empty \CJK@global\edef\CJK@family{ \csname CJK@\CJK@@@enc\CJK@temp @family\endcsname} \else \CJK@global\edef\CJK@family{\CJK@globalfamily} \fi} % \CJK@@@enc is the encoding selected by the user, \CJK@enc will be really % used. With the internal hook \CJK@@@xxx@hook we can modify \CJK@enc % for the encoding xxx if necessary. With the hook \CJK@xxx@hook other % packages can add stuff which should be executed immediately after the % encoding has changed. \def\CJK@selEnc{ \edef\CJK@temp{\csname CJK@\CJK@@@enc @fontenc\endcsname} \CJK@global\edef\CJK@enc{ \csname CJK@\CJK@@@enc\CJK@temp @nfssenc\endcsname} \csname CJK@@@\CJK@@@enc\CJK@temp @hook\endcsname \csname CJK@\CJK@@@enc\CJK@temp @enc\endcsname \CJK@selectFamily \csname CJK@\CJK@@@enc @hook\endcsname} % and here the user-visible macro to add something to the encoding hook. % First parameter is the encoding, second parameter the data to be % appended. \def\CJKaddEncHook#1#2{ \expandafter\let\expandafter\CJK@temp \csname CJK@#1@hook\endcsname \expandafter\def\expandafter\CJK@temp\expandafter{ \CJK@temp #2} \expandafter\let\csname CJK@#1@hook\endcsname \CJK@temp} % we disable \CJK@selectFamily and \CJK@selectEnc until a CJK environment % starts to avoid side effects while defining default values for % encodings (outside of a CJK environment). \let\CJK@selectFamily \relax \let\CJK@selectEnc \relax % CJK.enc contains the \CJK@...@enc macros and the punctuation lists. \input CJK.enc % the macros \CJK@testLastKern and \CJK@testLastCJK check the last kern and % raise or lower \ifCJK@. \edef\CJK@kern{\kern -2sp\kern 2sp} \edef\CJK@CJK{\kern -1sp\kern 1sp} \let\CJKkern \CJK@kern % does previous CJK character request nonbreakable glue? \def\CJK@testLastKern{ \global\CJK@false \ifnum\lastkern = \tw@ \global\CJK@true \fi \ifnum\lastkern = 5% % request from ruby.sty \global\CJK@true \fi} % is previous character a CJK character? \def\CJK@testLastCJK{ \global\CJK@false \ifnum\lastkern = \@ne \global\CJK@true \fi} % we only check for lower and upper bounds, not for possible gaps in the % range of the second byte, as it happens for Big5 and SJIS encoding. \def\CJK@err{ \PackageError{CJK}{ Invalid character code}{ The second byte of the CJK code is out of range.\MessageBreak Do you use the right encoding scheme?}} \def\CJK@errx{ \PackageError{CJK}{ Invalid character code}{ The third byte of the CJK code is out of range.\MessageBreak Do you use the right encoding scheme?}} \def\CJK@errxx{ \PackageError{CJK}{ Invalid character code}{ The CJK code is out of range for this font encoding.\MessageBreak Do you use the right encoding scheme?}} % we now define a set of new size functions: % `CJK', `sCJK', `CJKfixed', and `sCJKfixed' are similar to `' (empty), % `s', `fixed', and `sfixed' except that the value of \CJK@plane is % appended to \font@name. % % `CJKsub', `CJKssub' are similar to `sub' and `ssub' except that the font % substitution warning appears only once per CJK fontset. % % `CJKb', `sCJKb', `CJKfixedb', and `sCJKfixedb' are absolutely identical % to the functions without the final `b'; they just exist to overcome % a special feature of LaTeX: % % consider this example: % % \DeclareFontShape{C00}{kai}{m}{n}{<-> CJK * ntukai}{} % \DeclareFontShape{C00}{kai}{bx}{n}{<-> CJK * ntukai}{\CJKbold} % % the internal name of the macro which executes the last parameter % (\CJKbold) is identical to the fifth parameter (without spaces), in % this case `<->CJK*ntukai' -- the same name for both font shapes! This % means that the latter font shape definition overwrites the former. % Thus we have to write % % \DeclareFontShape{C00}{kai}{bx}{n}{<-> CJKb * ntukai}{\CJKbold} % % to get a different internal macro name. \def\CJK@curr@fontshape{CJK@\f@encoding/\f@family/\f@series/\f@shape} \DeclareSizeFunction{CJK}{\CJK@empty\@font@warning} \DeclareSizeFunction{CJKb}{\CJK@empty\@font@warning} \DeclareSizeFunction{sCJK}{\CJK@empty\@font@info} \DeclareSizeFunction{sCJKb}{\CJK@empty\@font@info} \def\CJK@empty#1{ \@tempdimb \f@size\p@ \ifx\optional@arg \@empty \else \expandafter\ifx \csname CJK@\mandatory@arg/\f@size/\the\@tempdimb\endcsname \relax \@tempdimb \optional@arg\@tempdimb #1{Font\space shape\space `\curr@fontshape'\space will\space be\MessageBreak scaled\space to\space size\space \the\@tempdimb} \expandafter \gdef\csname CJK@\mandatory@arg/\f@size/\the\@tempdimb\endcsname{} \fi \fi \edef\external@font{ \mandatory@arg\CJK@plane\space at \the\@tempdimb} \xdef\font@name{ \csname \curr@fontshape/\f@size/\CJK@plane\endcsname} \expandafter\global\expandafter\let \csname \CJK@curr@fontshape\expandafter\endcsname \csname \curr@fontshape\endcsname} \DeclareSizeFunction{CJKfixed}{\CJK@fixed\@font@warning} \DeclareSizeFunction{CJKfixedb}{\CJK@fixed\@font@warning} \DeclareSizeFunction{sCJKfixed}{\CJK@fixed\@font@info} \DeclareSizeFunction{sCJKfixedb}{\CJK@fixed\@font@info} \def\CJK@fixed#1{ \ifx\optional@arg \@empty \edef\external@font{ \mandatory@arg\CJK@plane} \else \edef\external@font{ \mandatory@arg\CJK@plane\space at \optional@arg pt} \fi \xdef\font@name{ \csname \curr@fontshape/\f@size/\CJK@plane\endcsname} #1{External\space font\space `\external@font'\space loaded\space for\space size\MessageBreak <\f@size>} \expandafter\global\expandafter\let \csname \CJK@curr@fontshape\expandafter\endcsname \csname \curr@fontshape\endcsname} \DeclareSizeFunction{CJKsub}{\CJK@sub\@font@warning} \DeclareSizeFunction{CJKssub}{\CJK@sub\@font@info} \def\CJK@sub#1{ \edef\mandatory@arg{\f@encoding/\mandatory@arg} \begingroup \expandafter\split@name\mandatory@arg/\@nil \try@load@fontshape \endgroup \let\f@user@size\f@size \expandafter\ifx\csname\mandatory@arg\endcsname \relax \errmessage{No\space declaration\space for\space shape\space \mandatory@arg} \error@fontshape \else \expandafter\ifx\csname CJK@\mandatory@arg/\f@size\endcsname \relax #1{Font\space shape\space `\curr@fontshape'\MessageBreak in\space size\space <\f@size>\space not\space available.\MessageBreak Font\space shape\space `\mandatory@arg'\MessageBreak tried\space instead} \expandafter\gdef\csname CJK@\mandatory@arg/\f@size\endcsname{} \fi \expandafter\split@name\mandatory@arg/\@nil \fi \edef\f@size{\f@user@size} \get@external@font \do@subst@correction \expandafter\global\expandafter\let \csname \CJK@curr@fontshape\expandafter\endcsname \csname \curr@fontshape\endcsname} % the following size functions are needed for the DNP fonts in JIS encoding. % `DNPgen' is similar to `gen' but ignores the optional argument. % `DNP' is similar to `gen' but the optional argument is used to % indicate the designsize. % % see the comment above for an explanation of DNPb and DNPgenb. \DeclareSizeFunction{DNPgen}{\CJK@DNPgen} \DeclareSizeFunction{DNPgenb}{\CJK@DNPgen} \def\CJK@DNPgen{ \edef\external@font{ \mandatory@arg\CJK@plane\f@size} \xdef\font@name{ \csname \curr@fontshape/\f@size/\CJK@plane\endcsname} \expandafter\global\expandafter\let \csname \CJK@curr@fontshape\expandafter\endcsname \csname \curr@fontshape\endcsname} \DeclareSizeFunction{DNP}{\CJK@DNP} \DeclareSizeFunction{DNPb}{\CJK@DNP} \def\CJK@DNP{ \@tempdimb \f@size\p@ \edef\external@font{ \mandatory@arg\CJK@plane\optional@arg\space at \the\@tempdimb} \xdef\font@name{ \csname \curr@fontshape/\f@size/\CJK@plane\endcsname} \expandafter\global\expandafter\let \csname \CJK@curr@fontshape\expandafter\endcsname \csname \curr@fontshape\endcsname} % we also must redefine \pickup@font to append \CJK@plane to the font name % if the particular subfont is already known. \def\pickup@font{ \CJK@ifundefined\CJK@plane {\expandafter\ifx\font@name \relax% % old definition \define@newfont \fi} {\expandafter% % CJK extension \ifx\csname \curr@fontshape/\f@size/\CJK@plane\endcsname \relax \define@newfont \else \xdef\font@name{ \csname \curr@fontshape/\f@size/\CJK@plane\endcsname} \fi}} % for older versions of LaTeX2e command we must redefine \selectfont. % It will now reset \ifCJK@bold@ and calls \CJK@curr@fontshape % additionally (if it exists) to execute the loading-setting % parameter of \DeclareFontShape each time we switch to this font. % \CJK@curr@fontshape has been defined by the above size functions. % For newer versions of LaTeX2e it is sufficient to set a hook for % \selectfont. % % for compatibility with older versions of LaTeX2e we provide a % definition of \IfFormatAtLeastTF. \def\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} \IfFormatAtLeastTF{2020-10-01} {\AddToHook{selectfont}{ \expandafter \ifx\csname CJK@\curr@fontshape\endcsname \relax \else \CJK@bold@false \csname CJK@\curr@fontshape\endcsname \fi}} {\DeclareRobustCommand{\selectfont}{ \ifx\f@linespread \baselinestretch \else \set@fontsize\baselinestretch\f@size\f@baselineskip \fi \xdef\font@name{\csname\curr@fontshape/\f@size\endcsname} \pickup@font \font@name \expandafter% % CJK extension \ifx\csname CJK@\curr@fontshape\endcsname \relax \else \CJK@bold@false \csname CJK@\curr@fontshape\endcsname \fi \size@update \enc@update}} % additional vertical and horizontal information for a font is stored in % files with the extension `.fdx'. We extend LaTeX's % \try@load@fontshape@ macro to load them. % % the macros \CJKhdef, \CJKvdef, \CJKhlet and \CJKvlet should be used to % handle commands in `.fdx' files. \def\CJK@load@fdx{ \expandafter\ifx\csname \f@encoding+\f@family+x\endcsname \relax \global\expandafter\let\csname \f@encoding+\f@family+x\endcsname \@empty \def\CJKhdef##1##2{ \expandafter\gdef\csname \CJK@enc/\CJK@family/##1/h\endcsname{##2}} \def\CJKhlet##1##2{ \edef\reserved@a{\CJK@enc/\CJK@family/##1/h} \edef\reserved@b{\CJK@enc/\CJK@family/##2/h} \global\expandafter\let \csname\reserved@a\expandafter\endcsname \csname\reserved@b\endcsname} \def\CJKvdef##1##2{ \expandafter\gdef\csname \CJK@enc/\CJK@family/##1/v\endcsname{##2}} \def\CJKvlet##1##2{ \edef\reserved@a{\CJK@enc/\CJK@family/##1/v} \edef\reserved@b{\CJK@enc/\CJK@family/##2/v} \global\expandafter\let \csname\reserved@a\expandafter\endcsname \csname\reserved@b\endcsname} \edef\reserved@a{ \lowercase{\noexpand\InputIfFileExists{\f@encoding\f@family.fdx}}} \reserved@a{}{} \fi} \expandafter\def\expandafter\try@load@fontshape\expandafter{ \try@load@fontshape \CJK@load@fdx} % \CJKglue defines the stretchability of CJK characters. \newcommand{\CJKglue}{\hskip \z@ \@plus .08\baselineskip} \def\CJK@nobreakglue{ \nobreak \CJKglue \nobreak} % if the `verbatim' package is loaded it is possible to improve the output % automatically, namely, to avoid breaking of overfull lines in a % verbatim environment. The following command will install a hook to % suppress insertion of glue between CJK glyphs. MULEenc.sty will extend % it for Thai glyphs. \def\CJK@verbatim{ \addto@hook{\every@verbatim}{ \renewcommand{\CJKglue}{}}} \CJK@ifundefined\mule@verbatim {\mule@verbatim{}} {} \def\CJKverbatim{ \mule@verbatim \CJK@verbatim} % increasing \CJKtolerance will allow more space between Hangul words. \newcommand{\CJKtolerance}{400} % \CJKtilde changes the definition of the active `~' character to embed % non-CJK words into CJK text. The horizontal space defined here has % a smaller width than an ordinary space character and is breakable. % It will suppress spaces afterwards. % The original definition will be preserved within \nbs, which is % a shorthand for the LaTeX command \nobreakspace. % % \standardtilde is the opposite command. \let\nbs \nobreakspace \DeclareRobustCommand{\CJKtilde}{ \CJK@global\def~{\hspace{0.25em plus 0.125em minus 0.08em}\ignorespaces}} \DeclareRobustCommand{\standardtilde}{ \CJK@global\def~{\nobreakspace{}}} % \CJKspace and \CJKnospace enables the user to switch between a CJK and a % CJK* environment without leaving the actual environment: % % \CJKnospace switches from CJK to CJK* % \CJKspace switches from CJK* to CJK % % the definitions are in MULEenc.sty also. \DeclareRobustCommand{\CJKspace}{ \CJK@global\let\CJK@ignorespaces \@empty} \DeclareRobustCommand{\CJKnospace}{ \CJK@global\let\CJK@ignorespaces \ignorespaces} % \CJKindent sets \parindent to two ideographic spaces. \CJK@spaceChar % is defined in CJK.enc for all encodings. \newbox\CJK@indent \providecommand{\CJKindent}{ \setbox\CJK@indent\hbox{\CJK@spaceChar\CJK@spaceChar} \parindent\wd\CJK@indent } % make all characters possibly used active so they can become macros. \def\CJK@makeActive{ \@tempcnta "080\relax \loop \CJK@active\catcode\@tempcnta \active \ifnum\@tempcnta < "0FE\relax \advance\@tempcnta \@ne \repeat} \def\CJK@makeInactive{ \@tempcnta "080\relax \loop \CJK@active\catcode\@tempcnta 12\relax \ifnum\@tempcnta < "0FE\relax \advance\@tempcnta \@ne \repeat} % the following macro is a signature for `CJKspace.sty'. \def\CJK@@@{} % we assign to each active character ^^xx the macro \CJK@XX (if expansion % occurs); this will be done in the .bdg files. Then the various .enc % files define \CJK@.. (using \CJK@namegdef) with encoding-specific % macros. \def\CJK@namedef#1{ \CJK@active\def#1{ \CJK@@@ \ifx\protect \@typeset@protect \string #1 \else \noexpand #1 \fi}} \def\CJK@namepdef#1{ \CJK@active\def#1{ \CJK@@@ \ifx\protect \@typeset@protect \expandafter\expandafter\expandafter\CJK@X \expandafter\string\expandafter#1 \else \noexpand #1 \fi}} \def\CJK@nameppdef#1{ \CJK@active\def#1{ \CJK@@@ \ifx\protect \@typeset@protect \expandafter\expandafter\expandafter\CJK@XX \expandafter\string\expandafter#1 \else \noexpand #1 \fi}} \def\CJK@namepppdef#1{ \CJK@active\def#1{ \CJK@@@ \ifx\protect \@typeset@protect \expandafter\expandafter\expandafter\CJK@XXX \expandafter\string\expandafter#1 \else \noexpand #1 \fi}} \def\CJK@nameppppdef#1{ \CJK@active\def#1{ \CJK@@@ \ifx\protect \@typeset@protect \expandafter\expandafter\expandafter\CJK@XXXX \expandafter\string\expandafter#1 \else \noexpand #1 \fi}} \def\CJK@X#1{ \csname CJK@\number `#1\endcsname\CJK@ignorespaces} % two possibilities: % either \CJK@XX % or \CJK@XX \protect \def\CJK@XX#1#2{ \ifx #2\protect \expandafter\CJK@XXp\expandafter#1 \else \csname CJK@\number `#1\endcsname{`#2}\CJK@ignorespaces \fi} \def\CJK@XXp#1#2{ \csname CJK@\number `#1\endcsname{`#2}\CJK@ignorespaces} % two possibilities: % either \CJK@XXX % or \CJK@XXX \protect \protect \def\CJK@XXX#1#2#3{ \ifx #2\protect \expandafter\CJK@XXXp\expandafter#1#3 \else \csname CJK@\number `#1\endcsname{`#2}{`#3}\CJK@ignorespaces \fi} \def\CJK@XXXp#1#2#3#4{ \csname CJK@\number `#1\endcsname{`#2}{`#4}\CJK@ignorespaces} % two possibilities: % either \CJK@XXXX % or \CJK@XXXX \protect \protect \protect \def\CJK@XXXX#1#2#3#4{ \ifx #2\protect \expandafter\CJK@XXXXp\expandafter#1#3 \else \csname CJK@\number `#1\endcsname{`#2}{`#3}{`#4}\CJK@ignorespaces \fi} \def\CJK@XXXXp#1#2#3#4#5{ \csname CJK@\number `#1\endcsname{`#2}{`#3}{`#5}\CJK@ignorespaces} % these auxiliary macros reset \lccode's and \uccode's of characters % 0x80-0xFF. This overrides the values set by LaTeX2e. \def\CJK@upperReset{ \@tempcnta "080\relax \loop \CJK@local\uccode\@tempcnta \z@ \ifnum\@tempcnta < "0FF\relax \advance\@tempcnta \@ne \repeat} \def\CJK@lowerReset{ \@tempcnta "080\relax \loop \CJK@local\lccode\@tempcnta \z@ \ifnum\@tempcnta < "0FF\relax \advance\@tempcnta \@ne \repeat} % finally come the CJK environments: % % CJK* will swallow spaces after a CJK character, whereas CJK will not. % % the first parameter selects the CJK encoding, the second the CJK font % family; the optional argument selects the fontencoding. % % each time a CJK or CJK* environment will be opened the hook \CJKhook will % be called (this feature is used by cjk-enc.el). % % always end the line after saying \begin{CJK} or \begin{CJK*}; % any characters on the same line will have already been read with % their non-CJK meanings. \def\CJK@envStart#1#2#3{ \CJK@upperReset \ifCJK@lowercase@ \CJK@lowerReset \fi \CJK@makeActive % we enable \CJK@selectFamily and \CJK@selectEnc. \CJK@global\let\CJK@selectFamily \CJK@selFam \CJK@global\let\CJK@selectEnc \CJK@selEnc \def\CJK@@@enc{#2} \ifx\CJK@@@enc \@empty \PackageInfo{CJK}{ no encoding parameter given,\MessageBreak waiting for \protect\CJKenc\space commands} \else \CJKenc{#2} \fi \CJKfontenc{#2}{#1} \CJKfamily{#3} \def\CJK@series{\f@series} \def\CJK@shape{\f@shape} \csname CJKhook\endcsname} \def\CJK@envEnd{ \ifx\CJK@global \global \CJK@makeInactive \CJK@global\let\CJK@selectFamily \relax \CJK@global\let\CJK@selectEnc \relax \fi} \newenvironment{CJK}[3][]{ \CJKspace \CJK@envStart{#1}{#2}{#3} }{ \CJK@envEnd} \newenvironment{CJK*}[3][]{ \CJKnospace \CJK@envStart{#1}{#2}{#3} }{ \CJK@envEnd} % \CJKcaption{caption} will test whether we are in a CJK environment; if yes, % it tries to load `.cpx' (this is .cap in preprocessed % mode). \newcommand{\CJKcaption}[1]{ \ifx\CJK@actualBinding \@empty \PackageError{CJK}{ You must be inside of a CJK environment to use \protect\CJKcaption}{} \else \makeatletter \InputIfFileExists{#1.cpx}{}{ \PackageError{CJK}{ Can't find #1.cpx}{ The default captions are used if you continue.}} \makeatother \fi} % the writing direction. \def\CJK@direction{h} % reset endline character. \endlinechar `\^^M % in case some customization is necessary it should be done in the % configuration file `CJK.cfg' and *not* here. \InputIfFileExists{CJK.cfg} {\typeout{^^J *****************************************^^J * Local configuration file CJK.cfg used *^^J *****************************************^^J}} {} \endinput