% cjkutf8-josa.sty % % Copyright (c) 2016-2024 Dohyun Kim % % 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 \ProvidesPackage{cjkutf8-josa}[2024/03/01 v2.5 Automatic Josa selection for cjk-ko] \ifx\use@josa\undefined\else % redefine \@setref \AddToHookWithArguments{cmd/@setref/after}{% \ifx#1\relax\else \cjkko@prepare@josa@str{\expandafter#2#1}% \fi } % redefine \@cite@ofmt \AtBeginDocument{ \let\CJKKO@orig@cite@ofmt\@cite@ofmt \def\@cite@ofmt#1{\CJKKO@orig@cite@ofmt{#1}% \bgroup \let\@safe@activesfalse\@empty % babel ? \def\hyper@@link[##1]##2##3##4{##4}% \def\beamer@sort##1##2{}% \def\hyperlink##1##2{##2}% for beamer: not from kotexutf \cjkko@prepare@josa@str{#1}% \egroup}} % partially support biblatex's \cite \AddToHook{package/biblatex/after}{% \renewrobustcmd*{\blx@imc@printfield}[2][]{% \blx@imc@iffieldundef{#2} {\blx@nounit} {\blx@getformat\blx@theformat{ffd}{#1}{#2}% \ifdefvoid\blx@theformat {\blx@nounit} {\blx@begunit \edef\currentfield{#2}% \expandafter\expandafter \expandafter\blx@theformat \expandafter\expandafter \expandafter{\csname abx@field@#2\endcsname}% \cjkko@prepare@josa@str{\csname abx@field@#2\endcsname}% \blx@endunit}}}} \fi \AddToHook{package/hyperref/after}{\g@addto@macro\pdfstringdefPreHook{% \let\jong\relax \let\rieul\relax \let\jung\relax \def\^^ea{^^ea}% \def\^^eb{^^eb}% \def\^^ec{^^ec}% }} % support hangul syllables (0xAC00..0xD7A3) \def\cjkko@josa@ea{\cjkko@josa@hangul@syllableS{"EA}} \def\cjkko@josa@eb{\cjkko@josa@hangul@syllableS{"EB}} \def\cjkko@josa@ec{\cjkko@josa@hangul@syllableS{"EC}} \def\cjkko@josa@ed{\cjkko@josa@hangul@syllableS{"ED}} \def\cjkko@josa@hangul@syllableS#1#2#3{% \expandafter\cjkko@josa@hangul@syllable\expandafter{% \number\numexpr (#1 - 224) * 4096 + (`#2 - 128) * 64 + (`#3 - 128) - "AC00\relax }} \def\cjkko@josa@hangul@syllable#1{% \ifnum#1<\z@ \else \ifnum#1>11171 \else \expandafter\cjkko@josa@hangul@syllable@\expandafter{% \number\numexpr #1 - (((#1 + 14) / 28 - 1) * 28)\relax }% we need floor, not round \fi\fi } \def\cjkko@josa@hangul@syllable@#1{% \ifnum#1=\z@ 2\else \ifnum#1=8 % 1\else 0\fi\fi } \def\cjkko@prepare@josa@str#1{% \ifx\protect\relax \begingroup \let^^ea\cjkko@josa@ea \let^^eb\cjkko@josa@eb \let^^ec\cjkko@josa@ec \let^^ed\cjkko@josa@ed \let\protect\noexpand \xdef\josa@str{#1}% \endgroup \fi } %%% user commands: \jong \jung \rieul \protected\def\jong {\global\let\josa@str\empty\global\chardef\@josa\z@ } \protected\def\rieul{\global\let\josa@str\empty\global\chardef\@josa\@ne} \protected\def\jung {\global\let\josa@str\empty\global\chardef\@josa\tw@} \jung \def\cjkko@josa@str@end{cjkko@josa@str@end} \def\makejosa{% \bgroup \expandafter\make@josa\josa@str\cjkko@josa@str@end \expandafter\egroup \expandafter\count@\number\@josa\relax \jung \make@@@josa } \begingroup \catcode`a=11 \global\let\cjkko@cat@letter=a\relax \catcode`0=12 \global\let\cjkko@cat@other=0\relax \endgroup \def\make@josa{\afterassignment\make@@josa\let\@let@token= } \def\make@@josa{% \ifx\@let@token\cjkko@josa@str@end \else \ifx\@let@token 1\rieul\else \ifx\@let@token 3\jong \else \ifx\@let@token 6\jong \else \ifx\@let@token 7\rieul\else \ifx\@let@token 8\rieul\else \ifx\@let@token 0\jong \else \ifx\@let@token l\rieul\else \ifx\@let@token m\jong \else \ifx\@let@token n\jong \else \ifx\@let@token L\rieul\else \ifx\@let@token M\jong \else \ifx\@let@token N\jong \else \ifcat\noexpand\@let@token\cjkko@cat@other \jung\else \ifcat\noexpand\@let@token\cjkko@cat@letter\jung\else \ifx\@let@token ^^c2\jung \else \ifx\@let@token ^^c3\jung \else \ifx\@let@token\jong \jong\else \ifx\@let@token\jung \jung\else \ifx\@let@token\rieul\rieul \fi\fi\fi\fi\fi \fi\fi\fi\fi\fi \fi\fi\fi\fi\fi \fi\fi\fi\fi \expandafter\make@josa \fi} \def\make@@@josa{% \ifcase\count@ \expandafter\@secondoftwo \or \expandafter\make@@@@josa \else \expandafter\@firstoftwo \fi } \def\make@@@@josa#1{% \ifx\empty#1\empty \expandafter\@gobble \else \expandafter\@firstofone \fi } \def\error@josa{\PackageError{cjkutf8-josa}{Undefined Control Sequence}{}} \def\makejosa@ga@i{\makejosa{가}{이}} \def\makejosa@wa@gwa{\makejosa{와}{과}} \def\makejosa@neun@eun{\makejosa{는}{은}} \def\makejosa@ra@ira{\makejosa{라}{이라}} \def\makejosa@empty@eu@ro{\makejosa{}{으}로} \def\makejosa@reul@eul{\makejosa{를}{을}} \def\makejosa@empty@eu{\makejosa{}{으}} \def\makejosa@relax@i{\makejosa\relax{이}} \DeclareRobustCommand*\^^ea[2]{% \ifx#1^^b0\ifx#2^^80\let\do@makejosa\makejosa@ga@i % \가 \else\let\do@makejosa\error@josa \fi \else\ifx#1^^b3\ifx#2^^bc\let\do@makejosa\makejosa@wa@gwa % \과 \else\let\do@makejosa\error@josa \fi \else\let\do@makejosa\error@josa \fi\fi \do@makejosa} \DeclareRobustCommand*\^^eb[2]{% \ifx#1^^8a\ifx#2^^94\let\do@makejosa\makejosa@neun@eun % \는 \else\let\do@makejosa\error@josa \fi \else\ifx#1^^9d\ifx#2^^bc\let\do@makejosa\makejosa@ra@ira % \라 \else\let\do@makejosa\error@josa \fi \else\ifx#1^^a1\ifx#2^^9c\let\do@makejosa\makejosa@empty@eu@ro % \로 \else\let\do@makejosa\error@josa \fi \else\ifx#1^^a5\ifx#2^^bc\let\do@makejosa\makejosa@reul@eul % \를 \else\let\do@makejosa\error@josa \fi \else\let\do@makejosa\error@josa \fi\fi\fi\fi \do@makejosa} \DeclareRobustCommand*\^^ec[2]{% \let\reserved@a#1\let\reserved@b#2% \futurelet\@let@token\@josa@begin@ec} \def\@josa@begin@ec{% \ifx\reserved@a^^99\ifx\reserved@b^^80\let\do@makejosa\makejosa@wa@gwa % \와 \else\let\do@makejosa\error@josa \fi \else\ifx\reserved@a^^9c\ifx\reserved@b^^bc\let\do@makejosa\makejosa@empty@eu % \으로 \else\let\do@makejosa\error@josa \fi \else\ifx\reserved@a^^9d% \ifx\reserved@b^^80\let\do@makejosa\makejosa@neun@eun % \은 \else\ifx\reserved@b^^84\let\do@makejosa\makejosa@reul@eul % \을 \else\ifx\reserved@b^^b4% \ifx\@let@token^^ea\let\do@makejosa\makejosa@relax@i % \이라 \else\ifx\@let@token^^eb\let\do@makejosa\makejosa@relax@i % \이라 \else\ifx\@let@token^^ec\let\do@makejosa\makejosa@relax@i % \이라 \else\ifx\@let@token^^ed\let\do@makejosa\makejosa@relax@i % \이라 \else\let\do@makejosa\makejosa@ga@i % \이 \fi\fi\fi\fi \else\let\do@makejosa\error@josa \fi\fi\fi \else\let\do@makejosa\error@josa \fi\fi\fi \do@makejosa} \endinput