%% code part of frkim %% v1.2 (fix a bug reported by AppleMintChoco) %% v1.1 (\AddRule extended, \RenewVowels added) %% v1.0.2 (\frkhangulfont, \bf) %% v1.0.1 (\AddRule) %% v1.0 (\jamoul) %% \char_set_catcode_other:N \@ \clist_const:Nn \c_hgvow_clist { a, e, o, u, y, i, @, * } \tl_set:Nn \zero_const { x } \tl_new:N \g_cho_tl \tl_new:N \g_jun_tl \tl_new:N \g_jon_tl \tl_new:N \l_currtk_tl \int_new:N \l_cflag_int %\bool_new:N \opt_zeroisx_bool \NewDocumentCommand \zeroisx {} { \bool_set_true:N \opt_zeroisx_bool } \NewDocumentCommand \zeroisrq {} { \bool_set_false:N \opt_zeroisx_bool } \cs_if_exist:NT \rq { \let\originalrq\rq \cs_undefine:N \rq } \NewDocumentCommand \rq {} { \symbol{"0027} } %%% jamoul cmd \tl_new:N \l_frkjamoulcmd_tl \tl_set:Nn \frk_space_here { \exp_args:No \use:c { \l_frkjamoulcmd_tl } { \c_space_token } } \tl_set:Nn \l_frkjamoulcmd_tl {} \NewDocumentCommand \jamoul { m m } { \group_begin: \bool_if:NTF \opt_luatexko_loaded { \use:c { #1 } { \hg { #2 } } } { \tl_set:Nn \l_frkjamoulcmd_tl { #1 } \hg { #2 } } \group_end: } \DeclareDocumentCommand \setpmhangulfont { o m o } { \IfValueTF { #1 } { \tl_set:Nn \frkhangulfontfeature { #1 } \IfValueT { #3 } { \tl_put_right:Nn \frkhangulfontfeature { , #3 } } } { \IfValueT { #3 } { \tl_set:Nn \frkhangulfontfeature { #3 } } } \tl_set:Nn \frkhangulfont { #2 } } \NewDocumentCommand \hg { m } { \regex_split:nnN { \s } { #1 } \l_tmpa_seq \seq_map_indexed_inline:Nn \l_tmpa_seq { \_process_word:n { ##2 } \int_compare:nT { ##1 < \seq_count:N \l_tmpa_seq } { \frk_space_here } } } \cs_new:Npn \_process_word:n #1 { \tl_set:Nn \l_aword_tl { #1 } \bool_if:NT \opt_zeroisx_bool { \regex_replace_all:nnN { ' } { \c{rq} } \l_aword_tl } \clear_all_var: \tl_map_function:NN \l_aword_tl \_main_fn:n %%% 마지막에 끝난 조건에 따라 \int_case:nn { \l_cflag_int } { { 1 } {%% 모음으로 끝남 \tl_gput_right:NV \g_jun_tl \l_currtk_tl \build_syl: } { 3 } {%% 자음으로 끝남 \tl_gput_right:NV \g_jon_tl \l_currtk_tl \build_syl: } } } \cs_new:Nn \clear_all_var: { \tl_gclear:N \g_cho_tl \tl_gclear:N \g_jun_tl \tl_gclear:N \g_jon_tl \tl_clear:N \l_currtk_tl \int_zero:N \l_cflag_int } \tl_new:N \l_delayedtoken_tl \cs_new:Npn \_main_fn:n #1 { \regex_match:nnTF { ['@a-zA-Z\*] } { #1 } { \clist_if_in:NnTF \c_hgvow_clist { #1 } { \_proc_vowel:n { #1 } } { \_proc_const:n { #1 } } } { \str_if_eq:nnTF { #1 } { - } { \_proc_dash: } { \int_compare:nTF { \l_cflag_int == 0 } { #1 } { \tl_put_right:Nn \l_delayedtoken_tl { #1 } } } } } \cs_new:Npn \_proc_dash: { \int_case:nn { \l_cflag_int } { { 0 } { } { 1 } { \tl_gput_right:NV \g_jun_tl \l_currtk_tl \build_syl: } { 3 } { \tl_gput_right:NV \g_jon_tl \l_currtk_tl \build_syl: } } \int_zero:N \l_cflag_int \tl_clear:N \l_currtk_tl } \cs_new:Npn \_proc_vowel:n #1 { \int_case:nn { \l_cflag_int } { { 0 } {%%% 직전이 0이면 초성 확정 \tl_if_empty:NT \l_currtk_tl %%% 어두에 모음 => 초성을 'ㅇ'으로 { \tl_set:No \l_currtk_tl { \zero_const } } \tl_gset:NV \g_cho_tl \l_currtk_tl \tl_set:Nn \l_currtk_tl { #1 } \int_set:Nn \l_cflag_int { 1 } } { 1 } {%%% 직전이 모음이면 모음 모음 \tl_gput_right:NV \g_jun_tl \l_currtk_tl \tl_set:Nn \l_currtk_tl { #1 } \int_set:Nn \l_cflag_int { 1 } } { 3 } {%%% 직전이 자음이면 직전 토큰은 다음 음절의 초성임 %%% 이전 문자를 출력 \build_syl: %%% 초성 확정 \tl_gset:NV \g_cho_tl \l_currtk_tl \tl_set:Nn \l_currtk_tl { #1 } \int_set:Nn \l_cflag_int { 1 } } } } \cs_new:Npn \_proc_const:n #1 { \int_case:nn { \l_cflag_int } { { 0 } {%%% 어절의 시작. 초성 생략 규칙이 없으므로 무조건 초성임. %%% 어절의 시작이 아니면? \tl_put_right:Nn \l_currtk_tl { #1 } \int_set:Nn \l_cflag_int { 0 } } { 1 } {%%% 직전이 모음이면 중성 확정 \tl_gput_right:NV \g_jun_tl \l_currtk_tl \tl_set:Nn \l_currtk_tl { #1 } \int_set:Nn \l_cflag_int { 3 } } { 3 } {%%% 직전이 자음이면 종성 모음 \tl_gput_right:NV \g_jon_tl \l_currtk_tl \tl_set:Nn \l_currtk_tl { #1 } \int_set:Nn \l_cflag_int { 3 } } } } %%% %%%%%%%%% DICTIONARIES \prop_const_from_keyval:Nn \c_frkcho_prop { g = \__prt_symbol_u:n { 1100 }, G = \__prt_symbol_u:n { 1101 }, n = \__prt_symbol_u:n { 1102 }, d = \__prt_symbol_u:n { 1103 }, D = \__prt_symbol_u:n { 1104 }, r = \__prt_symbol_u:n { 1105 }, m = \__prt_symbol_u:n { 1106 }, b = \__prt_symbol_u:n { 1107 }, B = \__prt_symbol_u:n { 1108 }, s = \__prt_symbol_u:n { 1109 }, S = \__prt_symbol_u:n { 110A }, x = \__prt_symbol_u:n { 110B }, q = \__prt_symbol_u:n { 110B }, j = \__prt_symbol_u:n { 110C }, J = \__prt_symbol_u:n { 110D }, c = \__prt_symbol_u:n { 110E }, k = \__prt_symbol_u:n { 110F }, t = \__prt_symbol_u:n { 1110 }, p = \__prt_symbol_u:n { 1111 }, h = \__prt_symbol_u:n { 1112 }, Q = \__prt_symbol_u:n { 114C }, z = \__prt_symbol_u:n { 1140 }, X = \__prt_symbol_u:n { 1159 }, v = \__prt_symbol_u:n { 112B }, %%%% bs = \__prt_symbol_u:n { 1121 }, bd = \__prt_symbol_u:n { 1120 }, bs = \__prt_symbol_u:n { 1121 }, bsg = \__prt_symbol_u:n { 1122 }, bsd = \__prt_symbol_u:n { 1123 }, bsj = \__prt_symbol_u:n { 1126 }, sg = \__prt_symbol_u:n { 112D }, sd = \__prt_symbol_u:n { 112F }, sr = \__prt_symbol_u:n { 1130 }, sb = \__prt_symbol_u:n { 1132 }, sj = \__prt_symbol_u:n { 1136 }, sc = \__prt_symbol_u:n { 1137 }, sk = \__prt_symbol_u:n { 1138 }, st = \__prt_symbol_u:n { 1139 }, sp = \__prt_symbol_u:n { 113A }, %%% fillet w = \__prt_symbol_u:n { 115F }, } \prop_const_from_keyval:Nn \c_frkjung_prop { a = \__prt_symbol_u:n { 1161 }, ai = \__prt_symbol_u:n { 1162 }, ia = \__prt_symbol_u:n { 1163 }, iai = \__prt_symbol_u:n { 1164 }, e = \__prt_symbol_u:n { 1165 }, ei = \__prt_symbol_u:n { 1166 }, ie = \__prt_symbol_u:n { 1167 }, iei = \__prt_symbol_u:n { 1168 }, o = \__prt_symbol_u:n { 1169 }, oa = \__prt_symbol_u:n { 116A }, oai = \__prt_symbol_u:n { 116B }, oi = \__prt_symbol_u:n { 116C }, io = \__prt_symbol_u:n { 116D }, u = \__prt_symbol_u:n { 116E }, ue = \__prt_symbol_u:n { 116F }, uei = \__prt_symbol_u:n { 1170 }, ui = \__prt_symbol_u:n { 1171 }, iu = \__prt_symbol_u:n { 1172 }, y = \__prt_symbol_u:n { 1173 }, yi = \__prt_symbol_u:n { 1174 }, i = \__prt_symbol_u:n { 1175 }, @ = \__prt_symbol_u:n { 119E }, @i = \__prt_symbol_u:n { 11A1 }, @@ = \__prt_symbol_u:n { 11A2 }, %%% fillet * = \__prt_symbol_u:n { 1160 }, } \prop_const_from_keyval:Nn \c_frkjong_prop { g = \__prt_symbol_u:n { 11A8 }, G = \__prt_symbol_u:n { 11A9 }, gs = \__prt_symbol_u:n { 11AA }, n = \__prt_symbol_u:n { 11AB }, nj = \__prt_symbol_u:n { 11AC }, nh = \__prt_symbol_u:n { 11AD }, d = \__prt_symbol_u:n { 11AE }, r = \__prt_symbol_u:n { 11AF }, rg = \__prt_symbol_u:n { 11B0 }, rm = \__prt_symbol_u:n { 11B1 }, rb = \__prt_symbol_u:n { 11B2 }, rs = \__prt_symbol_u:n { 11B3 }, rt = \__prt_symbol_u:n { 11B4 }, rp = \__prt_symbol_u:n { 11B5 }, rh = \__prt_symbol_u:n { 11B6 }, m = \__prt_symbol_u:n { 11B7 }, b = \__prt_symbol_u:n { 11B8 }, bs = \__prt_symbol_u:n { 11B9 }, s = \__prt_symbol_u:n { 11BA }, S = \__prt_symbol_u:n { 11BB }, q = \__prt_symbol_u:n { 11BC }, Q = \__prt_symbol_u:n { 11F0 }, j = \__prt_symbol_u:n { 11BD }, c = \__prt_symbol_u:n { 11BE }, k = \__prt_symbol_u:n { 11BF }, t = \__prt_symbol_u:n { 11C0 }, p = \__prt_symbol_u:n { 11C1 }, h = \__prt_symbol_u:n { 11C2 }, v = \__prt_symbol_u:n { 11E6 }, %%%%% rX = \__prt_symbol_u:n { 11D9 }, X = \__prt_symbol_u:n { 11F9 }, mg = \__prt_symbol_u:n { 11DA }, sg = \__prt_symbol_u:n { 11E7 }, sd = \__prt_symbol_u:n { 11E8 }, sr = \__prt_symbol_u:n { 11E9 }, sb = \__prt_symbol_u:n { 11EA }, } \prop_new:N \l_usercho_prop \prop_new:N \l_userjung_prop \prop_new:N \l_userjong_prop \NewDocumentCommand \AddRule { m m } { \clist_set:Nn \l_tmpa_clist { #2 } \clist_map_inline:Nn \l_tmpa_clist { \_split_userrule_keyval:w ##1 \q_stop \prop_put:cVx { l_user #1 _prop } \l_tmpkey_tl { \__prt_symbol_u:n {\l_tmpval_tl} } } } \cs_new:Npn \_split_userrule_keyval:w #1 = #2 \q_stop { \tl_set:Nn \l_tmpkey_tl { #1 } \tl_set:Nn \l_tmpval_tl { #2 } } \cs_new:Nn \build_syl: { \group_begin: \cs_if_exist:NTF \hangulfontspec { \exp_last_unbraced:NNf \hangulfontspec [ \frkhangulfontfeature ] { \frkhangulfont } } { \exp_last_unbraced:NNf \fontspec [ \frkhangulfontfeature ] { \frkhangulfont } } \tl_if_empty:NTF \l_frkjamoulcmd_tl { \build_syl_main: } { \sys_if_engine_xetex:T { \allowbreak } \exp_args:No \use:c { \l_frkjamoulcmd_tl } { \build_syl_main: } } \group_end: \tl_clear:N \l_delayedtoken_tl } \cs_new:Nn \build_syl_main: { \bool_if:NF \opt_zeroisx_bool { \exp_args:Nno \regex_replace_all:nnN { ' } { \zero_const } \g_cho_tl } \tl_if_empty:NF \g_cho_tl { \prop_get:NVNTF \l_usercho_prop \g_cho_tl \l_tmpone_tl { \tl_use:N \l_tmpone_tl } { \prop_get:NVNT \c_frkcho_prop \g_cho_tl \l_tmpone_tl { \tl_use:N \l_tmpone_tl } } } \tl_if_empty:NF \g_jun_tl { \prop_get:NVNTF \l_userjung_prop \g_jun_tl \l_tmptwo_tl { \tl_use:N \l_tmptwo_tl } { \prop_get:NVNT \c_frkjung_prop \g_jun_tl \l_tmptwo_tl { \tl_use:N \l_tmptwo_tl } } } \tl_if_empty:NF \g_jon_tl { \prop_get:NVNTF \l_userjong_prop \g_jon_tl \l_tmpthr_tl { \tl_use:N \l_tmpthr_tl } { \prop_get:NVNT \c_frkjong_prop \g_jon_tl \l_tmpthr_tl { \tl_use:N \l_tmpthr_tl } } } \tl_gclear:N \g_jun_tl \tl_gclear:N \g_jon_tl \tl_if_empty:NF \l_delayedtoken_tl { \l_delayedtoken_tl } } %%%% \frdash \NewDocumentCommand \frdash { } { \symbol{"002D} } \NewDocumentCommand \frendash {} { -- } \NewDocumentCommand \fremdash {} { --- } \prop_const_from_keyval:Nn \my_compjamo_prop { !g = \__prt_symbol_u:n { 3131 }, !G = \__prt_symbol_u:n { 3132 }, !gs = \__prt_symbol_u:n { 3133 }, !n = \__prt_symbol_u:n { 3134 }, !nj = \__prt_symbol_u:n { 3135 }, !nh = \__prt_symbol_u:n { 3136 }, !d = \__prt_symbol_u:n { 3137 }, !dd = \__prt_symbol_u:n { 3138 }, !r = \__prt_symbol_u:n { 3139 }, !rg = \__prt_symbol_u:n { 313A }, !rm = \__prt_symbol_u:n { 313B }, !rb = \__prt_symbol_u:n { 313C }, !rs = \__prt_symbol_u:n { 313D }, !rt = \__prt_symbol_u:n { 313E }, !rp = \__prt_symbol_u:n { 313F }, !rh = \__prt_symbol_u:n { 3140 }, !m = \__prt_symbol_u:n { 3141 }, !b = \__prt_symbol_u:n { 3142 }, !B = \__prt_symbol_u:n { 3143 }, !bs = \__prt_symbol_u:n { 3144 }, !s = \__prt_symbol_u:n { 3145 }, !S = \__prt_symbol_u:n { 3146 }, !q = \__prt_symbol_u:n { 3147 }, !j = \__prt_symbol_u:n { 3148 }, !J = \__prt_symbol_u:n { 3149 }, !c = \__prt_symbol_u:n { 314A }, !k = \__prt_symbol_u:n { 314B }, !t = \__prt_symbol_u:n { 314C }, !p = \__prt_symbol_u:n { 314D }, !h = \__prt_symbol_u:n { 314E }, !a = \__prt_symbol_u:n { 314F }, !ai = \__prt_symbol_u:n { 3150 }, !ia = \__prt_symbol_u:n { 3151 }, !iai = \__prt_symbol_u:n { 3152 }, !e = \__prt_symbol_u:n { 3153 }, !ei = \__prt_symbol_u:n { 3154 }, !ie = \__prt_symbol_u:n { 3155 }, !iei = \__prt_symbol_u:n { 3156 }, !o = \__prt_symbol_u:n { 3157 }, !oa = \__prt_symbol_u:n { 3158 }, !oai = \__prt_symbol_u:n { 3159 }, !oi = \__prt_symbol_u:n { 315A }, !io = \__prt_symbol_u:n { 315B }, !u = \__prt_symbol_u:n { 315C }, !ue = \__prt_symbol_u:n { 315E }, !eui = \__prt_symbol_u:n { 315E }, !ui = \__prt_symbol_u:n { 315F }, !yi = \__prt_symbol_u:n { 315F }, !iu = \__prt_symbol_u:n { 3160 }, !y = \__prt_symbol_u:n { 3161 }, !yi = \__prt_symbol_u:n { 3162 }, !i = \__prt_symbol_u:n { 3163 }, !rX = \__prt_symbol_u:n { 316D }, !bg = \__prt_symbol_u:n { 3172 }, !bsg = \__prt_symbol_u:n { 3174 }, !bsd = \__prt_symbol_u:n { 3175 }, !v = \__prt_symbol_u:n { 3178 }, !sg = \__prt_symbol_u:n { 317A }, !sd = \__prt_symbol_u:n { 317C }, !sb = \__prt_symbol_u:n { 317D }, !sj = \__prt_symbol_u:n { 317E }, !z = \__prt_symbol_u:n { 317F }, !Q = \__prt_symbol_u:n { 3181 }, !hh = \__prt_symbol_u:n { 3185 }, !X = \__prt_symbol_u:n { 3186 }, !@ = \__prt_symbol_u:n { 318D }, !@i = \__prt_symbol_u:n { 318E }, } \NewDocumentCommand \frcc { m } { \space\unskip \prop_get:NnNT \my_compjamo_prop {!#1} \l_tmpa_tl { \tl_use:N \l_tmpa_tl } } \NewDocumentCommand \activatefrcccmds { } { \clist_set:Nn \l_tmpa_clist { g, G, n, d, D, r, m, b, B, s, S, q, Q, j, J, c, k, t, p, h, z, X, v, a, ai, ia, iai, e, ei, ie, iei, o, oi, io, oa, oai, u, ui, iu, ue, uei, i, y, yi, @} \clist_map_inline:Nn \l_tmpa_clist { \cs_set:cn { frcc ##1: } { \frcc{##1} } \cs_set_eq:cc { frcc ##1 } { frcc ##1: } } } %%% hangul \cs_set_eq:NN \endhangul \scan_stop: \cs_new:Npn \hangul_start:w #1 \endhangul { \seq_set_split:Nnn \l_tmpa_seq { \par } { #1 } \seq_map_inline:Nn \l_tmpa_seq { \hg{##1} \par } } \NewDocumentCommand \hangul {} { \hangul_start:w } %%% activatefrcccmds \bool_if:NT \opt_frcccmds_bool { \AtBeginDocument { \activatefrcccmds } } %%% compatibility \cs_set_eq:NN \jamoword \hg \seq_new:N \l_inputword_seq \seq_new:N \l_inputpar_seq \NewDocumentEnvironment { jamotext } { +b } { \seq_set_split:Nnn \l_inputpar_seq { \par } { #1 } \seq_map_indexed_function:NN \l_inputpar_seq \jamo_word:nn }{} \cs_new:Npn \jamo_word:nn #1 #2 { % \jamoword { #2 } \seq_set_split:Nnn \l_inparpar_seq { ~ } { #2 } \seq_map_indexed_inline:Nn \l_inparpar_seq { \regex_match:nnTF { ^\!\{ } { ##2 } { \tl_set:Nn \l_tmpa_tl { ##2 } \regex_match:nnTF { ^\!\{(.+?)\}$ } { ##2 } { \regex_replace_once:nnN { ^\!\{(.+?)\}$ } { \1 } \l_tmpa_tl \l_tmpa_tl } { \tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl \regex_replace_once:nnN { ^\!\{(.+?)\}(.*)$ } { \1 } \l_tmpa_tl \l_tmpa_tl \regex_replace_once:nnN { ^\!\{(.+?)\}(.*)$ } { \2 } \l_tmpb_tl \exp_args:No \jamoword { \l_tmpb_tl } } } { \jamoword{ ##2 } } \int_compare:nT { ##1 < \seq_count:N \l_inparpar_seq } { \frk_space_here } } \int_compare:nT { #1 < \seq_count:N \l_inputpar_seq } { \par } } \NewDocumentCommand \RenewVowels { m } { \clist_set:Nn \c_hgvow_clist { @, *, #1 } } \NewDocumentCommand \RenewLeadingZero { m } { \tl_set:Nn \zero_const { #1 } } \endinput