%% xob-font.sty %% %% Copyright (c) 2014-2023 Kangsoo Kim %% Copyright (c) 2017-2020 Kihwang Lee %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c %% of this license or (at your option) any later version. %% The latest version otef this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3c or later is part of all distributions of LaTeX %% version 2006/05/20 or later. %% %% %% oblivoir hangul/hanja font setting. %% part of oblivoir %% \ProvidesPackage{xob-font}[2023/02/19 v0.9.7 select hangul/hanja fonts for oblivoir] %%% obsolete options: retain \if@.. conditions for backward compatibility \newif\if@nowin\@nowinfalse \newif\if@latinquote\@latinquotefalse \newif\if@unfont\@unfontfalse \DeclareOption{nowinname}{} \DeclareOption{latinquote}{} \DeclareOption{unfonts}{\@unfonttrue} \DeclareOption{nounfonts}{\@unfontfalse} %%% active optoins \newif\if@oldhangul\@oldhangulfalse \DeclareOption{oldhangul}{\@oldhangultrue} \newif\if@gremph\@gremphtrue \DeclareOption{gremph}{\@gremphtrue} \DeclareOption{itemph}{\@gremphfalse} \newif\if@nanumfonts\@nanumfontsfalse \newif\if@nanumxfonts\@nanumxfontsfalse \DeclareOption{nanum}{\@nanumfontstrue} \DeclareOption{nanumx}{\@nanumfontstrue\@nanumxfontstrue} \newif\if@hcrfonts\@hcrfontsfalse \DeclareOption{hcr}{\@hcrfontstrue\@oldhangultrue} \ProcessOptions \relax \RequirePackage{xparse} \RequirePackage{etoolbox} \@ifclassloaded{oblivoir}{}{% \RequirePackage{fontspec} \RequirePackage{kotex} } \ExplSyntaxOn \sys_if_engine_xetex:T { \RequirePackage{xetexko-space} \RequirePackage{xetexko-font} } \if@gremph \bool_set_false:N \ital_fake_bool \else \bool_set_true:N \ital_fake_bool \fi \if@oldhangul \bool_set_true:N \hangulscript_bool \else \bool_set_false:N \hangulscript_bool \fi \bool_new:N \opt_mainfontdeclared_bool \bool_new:N \opt_mathfontdeclared_bool \bool_set_false:N \bold_prov_bool \bool_set_false:N \in_hanja_mode \bool_set_false:N \mono_mode \DeclareDocumentCommand \setmonoscale { m } { \tl_set:Nn \_mono_scale { #1 } } \setmonoscale{0.95} \DeclareDocumentCommand \treat_feature_name_options { d() d() m o } { \tl_set:Nn \_regu_font_name { #3 } \IfValueTF { #1 } { \tl_set:Nn \_bold_font_name { #1 } \bool_set_true:N \bold_prov_bool } { \tl_clear:N \_bold_font_name \bool_set_false:N \bold_prov_bool } \IfValueTF { #2 } { \tl_if_eq:nnTF { #2 } { * } { \tl_set_eq:NN \_ital_font_name \_regu_font_name } { \tl_set:Nn \_ital_font_name { #2 } } } { \tl_set_eq:NN \_ital_font_name \_regu_font_name } \IfValueTF { #4 } { \tl_set:Nn \_additional_feature_str { #4 } } { \tl_clear:N \_additional_feature_str } \bool_if:nTF { \mono_mode || \in_hanja_mode } { \tl_clear:N \_font_feature_str } { \tl_set:Nn \_font_feature_str { Ligatures = TeX, } } \bool_if:NT \ital_fake_bool { \tl_if_eq:NNTF \_ital_font_name \_regu_font_name { \tl_put_right:Nn \_font_feature_str { ItalicFeatures = { FakeSlant = .15 }, } } { \tl_put_right:Nn \_font_feature_str { ItalicFeatures = { FakeSlant = { 0.15 } }, } } \tl_put_right:Nn \_font_feature_str { BoldItalicFeatures = { FakeSlant = { 0.15 } }, } } \bool_if:NT \bold_prov_bool { \tl_put_right:Nn \_font_feature_str { BoldFont = \_bold_font_name, BoldItalicFont = \_bold_font_name, ItalicFont = \_ital_font_name, % FontFace = {bx}{n} {Font = {\_bold_font_name}}, % FontFace = {bx}{it} {Font = {\_bold_font_name}}, % FontFace = {m}{up} {Font = {\_regu_font_name}} } } \bool_if:nF \in_hanja_mode { \bool_if:NT \hangulscript_bool { \tl_put_right:Nn \_font_feature_str { Script = Hangul, } } } \bool_if:NT \mono_mode { \tl_put_right:Nn \_font_feature_str { Scale = \_mono_scale, } } } \DeclareDocumentCommand \set_kor_sub_hanja_font { m d() d() m o } { \bool_set_true:N \in_hanja_mode % \treat_feature_name_options ( #2 ) ( #3 ) { #4 } [ #5 ] \IfValueTF { #2 } { \IfValueTF { #3 } { \treat_feature_name_options ( #2 ) ( #3 ) { #4 } [ #5 ] } { \treat_feature_name_options ( #2 ) { #4 } [ #5 ] } } { \treat_feature_name_options { #4 } [ #5 ] } \setmainhanjafont [ \_font_feature_str, \_additional_feature_str ] { \_regu_font_name } \sys_if_engine_luatex:T { \tl_if_exist:NT \hanjabyhanjafont { \AtBeginDocument { \hanjabyhanjafont 1 } } } } \DeclareDocumentCommand \setkorfont { m d() d() m o d() } { \bool_set_false:N \in_hanja_mode \str_if_eq:nnTF { #1 } { mono } { \bool_set_true:N \mono_mode } { \bool_set_false:N \mono_mode } %%% when regular fontname contains "HCR", input [ Script=Hangul ] to font features. \tl_if_in:nnT { #4 } { HCR } { \bool_set_true:N \hangulscript_bool } \tl_if_in:nnT { #4 } { hcr } { \bool_set_true:N \hangulscript_bool } % \tl_if_in:nnT { #4 } { HAN } % { \bool_set_true:N \hangulscript_bool } %%% the following three \tl_if_in's for \setkomainfont \tl_if_in:NnT { #4 } { HCR } { \bool_set_true:N \hangulscript_bool } \tl_if_in:NnT { #4 } { hcr } { \bool_set_true:N \hangulscript_bool } % \tl_if_in:NnT { #4 } { HAN } % { \bool_set_true:N \hangulscript_bool } \IfValueTF { #2 } { \IfValueTF { #3 } { \treat_feature_name_options ( #2 ) ( #3 ) { #4 } [ #5 ] } { \treat_feature_name_options ( #2 ) { #4 } [ #5 ] } } { \treat_feature_name_options { #4 } [ #5 ] } % \tl_set:Nx \l_tmpa_tl { \_font_feature_str, \_additional_feature_str } \cs:w set #1 hangulfont \cs_end: [ \_font_feature_str, \_additional_feature_str, % FontFace = {bx}{n}{ Font={\_bold_font_name} , \_font_feature_str }, % FontFace = {m}{up}{ Font={\_regu_font_name} , \_font_feature_str } ] { \_regu_font_name } %%% \set_kor_sub_hanja_font will take more optional arguments, %%% hence, this codes have to be located at the end of code block. \IfValueT { #6 } { \set_kor_sub_hanja_font { #1 } ( #6 ) } } %%% new \setko(main|sans|mono)font %\bool_new:N \setko_bold_process \bool_set_false:N \setko_bold_process \NewDocumentCommand \process_set_korob_hanja { m o d() d() d() o } { \IfValueTF { #2 } { \tl_set:Nn \ko_hanja_base_font_name { #2 } \tl_set_eq:NN \ko_hanja_regu_font_name \ko_hanja_base_font_name \tl_put_right:Nn \ko_hanja_regu_font_name { #3 } \IfValueTF { #4 } { \tl_if_empty:nTF { #4 } { \tl_set_eq:NN \ko_hanja_bold_font_name \ko_hanja_regu_font_name } { \tl_set_eq:NN \ko_hanja_bold_font_name \ko_hanja_base_font_name \tl_put_right:Nn \ko_hanja_bold_font_name { #4 } } \bool_set_false:N \setko_hanja_bold_process } { % \tl_clear:N \ko_hanja_bold_font_name \bool_set_true:N \setko_hanja_bold_process } \IfValueTF { #5 } { \tl_if_empty:nTF { #5 } { \tl_set_eq:NN \ko_hanja_ital_font_name \ko_hanja_regu_font_name } { \tl_set_eq:NN \ko_hanja_ital_font_name \ko_hanja_base_font_name \tl_put_right:Nn \ko_hanja_ital_font_name { #5 } } } { \tl_set_eq:NN \ko_hanja_ital_font_name \ko_hanja_regu_font_name } } { \tl_clear:N \ko_hanja_base_font_name \tl_set:Nn \ko_hanja_regu_font_name { #3 } \IfValueTF { #4 } { \tl_set:Nn \ko_hanja_bold_font_name { #4 } \bool_set_false:N \setko_hanja_bold_process } { % \tl_clear:N \ko_hanja_bold_font_name \bool_set_true:N \setko_hanja_bold_process } \IfValueTF { #5 } { \tl_set:Nn \ko_hanja_ital_font_name { #5 } } { \tl_set_eq:NN \ko_hanja_ital_font_name \ko_hanja_regu_font_name } } \IfValueTF { #6 } { \tl_set:Nn \ko_hanja_features { #6 } } { \tl_clear:N \ko_hanja_features } \bool_if:NTF \setko_bold_process { \bool_if:NTF \setko_hanja_bold_process { \cs:w setkor #1 font \cs_end: { \ko_regu_font_name } [ \ko_features ] \bool_if:NTF \ital_fake_bool { \cs:w set #1 hanjafont \cs_end: [ \ko_hanja_features, ItalicFeatures = {FakeSlant=.15}, BoldItalicFeatures={FakeSlant={0.15}} ] { \ko_hanja_regu_font_name } } { \cs:w set #1 hanjafont \cs_end: [ \ko_hanja_features ] { \ko_hanja_regu_font_name } } } { \cs:w setkor #1 font \cs_end: { \ko_regu_font_name } [ \ko_features ] ( \ko_hanja_bold_font_name ) ( \ko_hanja_ital_font_name ) { \ko_hanja_regu_font_name } [ \ko_hanja_features ] } } { \bool_if:NTF \setko_hanja_bold_process { \cs:w setkor #1 font \cs_end: ( \ko_bold_font_name ) ( \ko_ital_font_name ) { \ko_regu_font_name } \bool_if:NTF \ital_fake_bool { \cs:w set #1 hanjafont \cs_end: [ \ko_hanja_features, ItalicFeatures={FakeSlant=.15}, BoldItalicFeatures={FakeSlant={0.15}} ] { \ko_hanja_regu_font_name } } { \cs:w set #1 hanjafont \cs_end: [ \ko_hanja_features ] { \ko_hanja_regu_font_name } } } { \cs:w setkor #1 font \cs_end: ( \ko_bold_font_name ) ( \ko_ital_font_name ) { \ko_regu_font_name } [ \ko_features ] ( \ko_hanja_bold_font_name ) ( \ko_hanja_ital_font_name ) { \ko_hanja_regu_font_name } [ \ko_hanja_features ] } } \sys_if_engine_luatex:T { \tl_if_exist:NT \hanjabyhanjafont { \AtBeginDocument { \hanjabyhanjafont 1 } } } } \NewDocumentCommand \process_korob_only_hangul { m } { \bool_if:NTF \setko_bold_process { \cs:w setkor #1 font \cs_end: { \ko_regu_font_name } [ \ko_features ] } { \cs:w setkor #1 font \cs_end: ( \ko_bold_font_name ) ( \ko_ital_font_name ) { \ko_regu_font_name } [ \ko_features ] } } \DeclareDocumentCommand \setkorfontxob { m o d() d() d() o o d() } { \IfValueTF { #2 } { \tl_set:Nn \ko_base_font_name { #2 } \tl_set_eq:NN \ko_regu_font_name \ko_base_font_name \tl_put_right:Nn \ko_regu_font_name { #3 } \IfValueTF { #4 } { \tl_if_empty:nTF { #4 } { \tl_set_eq:NN \ko_bold_font_name \ko_regu_font_name } { \tl_set_eq:NN \ko_bold_font_name \ko_base_font_name \tl_put_right:Nn \ko_bold_font_name { #4 } } \bool_set_false:N \setko_bold_process } { % \tl_set_eq:NN \ko_bold_font_name \ko_regu_font_name \bool_set_true:N \setko_bold_process } \IfValueTF { #5 } { \tl_if_empty:nTF { #5 } { \tl_set_eq:NN \ko_ital_font_name \ko_regu_font_name } { \tl_set_eq:NN \ko_ital_font_name \ko_base_font_name \tl_put_right:Nn \ko_ital_font_name { #5 } } } { \tl_set_eq:NN \ko_ital_font_name \ko_regu_font_name } } { \tl_clear:N \ko_base_font_name \tl_set:Nn \ko_regu_font_name { #3 } \IfValueTF { #4 } { \tl_set:Nn \ko_bold_font_name { #4 } \bool_set_false:N \setko_bold_process } { % \tl_set_eq:NN \ko_bold_font_name \ko_regu_font_name \bool_set_true:N \setko_bold_process } \IfValueTF { #5 } { \tl_set:Nn \ko_ital_font_name { #5 } } { \tl_set_eq:NN \ko_ital_font_name \ko_regu_font_name } } \IfValueTF { #6 } { \tl_set:Nn \ko_features { #6 } } { \tl_clear:N \ko_features } \IfValueTF { #7 } { \IfValueTF { #8 } { \process_set_korob_hanja { #1 } [ #7 ] ( #8 ) } { \process_set_korob_hanja { #1 } [ #7 ] } } { \IfValueTF { #8 } { \process_set_korob_hanja { #1 } ( #8 ) } { \process_korob_only_hangul { #1 } } } } %%% bracket version. \bool_set_false:N \ext_loc_bool \DeclareDocumentCommand \set_kor_font_orig_method_sub_hanja { m o m } { \IfValueTF { #2 } { \cs:w set #1 hanjafont \cs_end: [ #2, \ext_loc_feature ] { #3 } } { \cs:w set #1 hanjafont \cs_end: [ \ext_loc_feature ]{ #3 } } \bool_set_false:N \ext_loc_bool } \DeclareDocumentCommand \setkorfontorigmethod { m o m o } { \bool_if:NTF \ext_loc_bool { \tl_set:Nn \ext_loc_feature { ExternalLocation, } } { \tl_clear:N \ext_loc_feature } \IfValueTF { #2 } { \cs:w set #1 hangulfont \cs_end: [ #2, \ext_loc_feature ] { #3 } } { \cs:w set #1 hangulfont \cs_end: [ \ext_loc_feature ] { #3 } } \IfValueTF { #4 } { \set_kor_font_orig_method_sub_hanja { #1 } [ #4 ] } { \bool_set_false:N \ext_loc_bool } } %%% starred version. \DeclareDocumentCommand \setkorfontorigstar { s m } { \bool_set_true:N \ext_loc_bool \setkorfontorigmethod { #2 } } %%% \setobmainfont \DeclareDocumentCommand \setxoblatinfont { m o d() d() d() o } { \IfValueTF { #2 } { \tl_set:Nn \latin_base_font_name { #2 } \tl_set_eq:NN \latin_regu_font_name \latin_base_font_name \tl_put_right:Nn \latin_regu_font_name { #3 } \IfValueTF { #4 } { \tl_if_empty:nTF { #4 } { \tl_set_eq:NN \latin_bold_font_name \latin_regu_font_name } { \tl_set_eq:NN \latin_bold_font_name \latin_base_font_name \tl_put_right:Nn \latin_bold_font_name { #4 } } \bool_set_false:N \setlatin_bold_process } { \bool_set_true:N \setlatin_bold_process } \IfValueTF { #5 } { \tl_if_empty:nTF { #5} { \tl_set_eq:NN \latin_ital_font_name \latin_regu_font_name } { \tl_set_eq:NN \latin_ital_font_name \latin_base_font_name \tl_put_right:Nn \latin_ital_font_name { #5 } } \bool_set_false:N \setlatin_ital_process } { \bool_set_true:N \setlatin_ital_process } } { \tl_clear:N \latin_base_font_name \tl_set:Nn \latin_regu_font_name { #3 } \IfValueTF { #4 } { \tl_set:Nn \latin_bold_font_name { #4 } \bool_set_false:N \setlatin_bold_process } { \bool_set_true:N \setlatin_bold_process } \IfValueTF { #5 } { \tl_set:Nn \latin_ital_font_name { #5 } \bool_set_false:N \setlatin_ital_process } { \bool_set_true:N \setlatin_ital_process } } \tl_if_eq:nnTF { #1 } { mono } { \bool_set_true:N \latin_mono_mode } { \bool_set_false:N \latin_mono_mode } \bool_if:NTF \latin_mono_mode { \tl_clear:N \latin_feature } { \tl_set:Nn \latin_feature { Ligatures=TeX, } } \bool_if:nF \setlatin_bold_process { \tl_put_right:Nn \latin_feature { BoldFont = { \latin_bold_font_name }, } } \bool_if:nF \setlatin_ital_process { \tl_put_right:Nn \latin_feature { ItalicFont = { \latin_ital_font_name }, } } \IfValueT { #6 } { \tl_put_right:Nn \latin_feature { #6 } } \cs:w set #1 font \cs_end: [ \latin_feature ] { \latin_regu_font_name } } %%% starred version commands are provided for backward compatibility. \protected\def\setkormainfont{% \@ifstar{\setkorfontorigstar*{main}}{% \@ifnextchar[{\setkorfontorigmethod{main}}{\setkorfont{main}}}} \protected\def\setkorsansfont{% \@ifstar{\setkorfontorigstar*{sans}}{% \@ifnextchar[{\setkorfontorigmethod{sans}}{\setkorfont{sans}}}} \protected\def\setkormonofont{% \@ifstar{\setkorfontorigstar*{mono}}{% \@ifnextchar[{\setkorfontorigmethod{mono}}{\setkorfont{mono}}}} %%% newly defined commands: %%% \setkomainfont[BASENAME](Regu)(Bold)(Ital)[Feature]% %%% [HJBASENAME](HJREGU)(HJBOLD)(HJITAL)[HJFeatures] %%% no spaces allowed between optional arguments, e.g., [...]*nospace*[...] \protected\def\setkomainfont{\bool_set_true:N \opt_mainfontdeclared_bool\setkorfontxob{main}} \protected\def\setkosansfont{\setkorfontxob{sans}} \protected\def\setkomonofont{\setkorfontxob{mono}} %%% \setobmainfont(regu)[features] = \setmainfont[features]{regu} \protected\def\setobmainfont{\setxoblatinfont{main}} \protected\def\setobsansfont{\setxoblatinfont{sans}} \protected\def\setobmonofont{\setxoblatinfont{mono}} %%% [unfonts] will be deprecated shortly. %\if@unfont % \if@gremph % \setkomainfont(UnBatang.ttf)(UnBatangBold.ttf)(UnGraphic.ttf)[Script=Hangul]% % (UnBatang.ttf)(UnBatangBold.ttf)(UnBatang.ttf)[Script=Hangul] % \else % \setkomainfont(UnBatang.ttf)(UnBatangBold.ttf)(UnBatang.ttf)[Script=Hangul] % \fi % \setkosansfont[UnDotum](.ttf)(Bold.ttf)(.ttf) % \setmonoscale{1.05} % \setkomonofont(UnTaza.ttf) %\fi %%% \setmainhangulfont \pretocmd{\setmainhangulfont}{\bool_set_true:N \opt_mainfontdeclared_bool}{}{} \pretocmd{\setmathhangulfont}{\bool_set_true:N \opt_mathfontdeclared_bool}{}{} \AddToHook{env/document/before}{% \bool_if:NF \opt_mainfontdeclared_bool { \if@nanumfonts \if@nanumxfonts \setkomainfont(NanumMyeongjo)(*ExtraBold)(*)[](NanumGothic)(*Bold) \else \setkomainfont(NanumMyeongjo)(*Bold)(*)[](NanumGothic)(*Bold) \fi \setkosansfont(NanumGothic)(*Bold)(*) \setkomonofont(NanumGothic) \tl_set:Nn \ko_regu_font_name { NanumMyeongjo } \else %%% [hcr] adds [Script=Hangul] feature automatically. \if@hcrfonts \setkomainfont(HCRBatangLVT)(HCRBatangLVT-Bold)(HCRBatangLVT) \setkosansfont(HCRDotumLVT)(HCRDotumLVT-Bold)(HCRDotumLVT) \setkomonofont(HCRDotumLVT) \tl_set:Nn \ko_regu_font_name { HCRBatangLVT } \else %%% 2020/03/03: Now UnFonts is set to default \RequirePackage{ob-unfontsdefault} \tl_set:Nn \ko_regu_font_name { UnBatang } \fi \fi } \bool_if:NF \opt_mathfontdeclared_bool { \tl_if_exist:NT \ko_regu_font_name { \setmathhangulfont{\ko_regu_font_name} } } } %\setkomainfont(UnBatang.ttf)(UnBatangBold.ttf)(UnGraphic.ttf) %\fi\fi %%% compresspunctuations \NewDocumentCommand \compressbnms { } { \@ifpackageloaded{luatexko} { \AtBeginDocument{\addhangulfontfeature{CompressPunctuations}} }{} } \ExplSyntaxOff \endinput %%% end of file `xob-font.sty` %% CHANGES %% v0.9.6 : \setmathhangulfont problem fixed (reported by Progress) %% v0.9.5 : \setmathhangulfont, default (requested by ischo) %% v0.9 : unfontsxe introduced %% v0.8.1 : minor bug fix %% v0.8 : suport fontspec’s FontFace feature. %% v0.7 : Use \sys_if_engine_xetex and \sys_if_engine_luatex instead of xetex_if_engine and luatex_if_engine to be compatible with latest l3kernel. %% v0.6 : HCR auto insert Script=Hangul, HAN disabled %% v0.5 : [nanum] sets Bold, [nanumx] sets ExtraBold for NanumMyeongjo %% v0.4 : hangul_bold_exist && hanja_bold_no_exist bug fixed. %% v0.3 : \setobmainfont ( = \setmainfont ) introduced. %% v0.2 : do not insert [ Ligatures=TeX ] in mono_mode