KTUG마당은 KTUG를 방문하는 모든 이용자가 대화를 나누고 소식을 전하는 곳입니다.
- 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
- Team Blog의 글을 이곳 게시판의 "정보글"로 모았습니다. Team blog는 기고자가 올린 글에 질문을 받는 부담을 줄이기 위하여 댓글을 허용하지 않았습니다. 그러나 이곳 게시판으로 모으면서 댓글을 달 수 있습니다. 게시물을 작성하실 때 댓글을 원하지 않으시면 댓글을 허용하시지 않으시기를 바랍니다. 또한 불필요한 소모성 댓글을 달지 않도록 주의하여 주시기를 바랍니다.
- TeX과 관련된 질문이나 답변은 QnA 마당을 이용하십시오. TeX과 관련된 질문은 지웁니다
- MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
- 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
- 금지어에서 stackexchange, stackoverflow, ctan, overleaf, , github, google.com, gmail.com, .org, .io, sil.org, wiki.com, tistory.com등은 해제하였습니다.
- 사용하는 편집기는 CKeditor입니다. 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한줄을 비웁니다. 글줄만 바꾸려면 shift-enter 를 누르시면 <BR>가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.
자유글 국어의 로마자 표기법, 전자법
2015.06.16 00:37
별로 관심들은 없으신 것 같지만, 이왕 시작한 얘기니 끝을 보도록 하겠습니다.
http://www.ktug.org/xe/index.php?document_srl=207243&mid=KTUG_open_board 에 "문제"가 나와 있습니다.
지난 번 글에서 우리는 한글 음절 문자의 초/중/종성 분리를 할 수 있게 되었습니다. ( http://www.ktug.org/xe/index.php?document_srl=208182&mid=KTUG_open_board )
======
국 어의 로마자 표기법 제3장 제8항에 나와 있는 규정은, 표기법의 복원을 염두에 둔, 학술적 목적의 로마자 표기법입니다. 이를 "전자법"이라고 한다고 가르쳐주셨습니다. 이것은 한글 자소를 기계적으로 로마자에 대응시키는 것이므로 복잡한 음운현상을 고려하지 않아도 되어서 구현이 쉬운 편에 속합니다.
초/중/종성 각각의 대응 로마자 표기를 clist에 넣는데, 이것은 상수로 취급할 예정입니다. 즉 이 내용이 바뀔 일은 없습니다.
\clist_const:Nn \c_cho_clist
{g,kk,n,d,tt,l,m,b,pp,s,ss,-,j,jj,ch,k,t,p,h}
\clist_const:Nn \c_jung_clist
{a,ae,ya,yae,eo,e,yeo,ye,o,wa,wae,oe,yo,u,wo,we,wi,yu,eu,ui,i}
\clist_const:Nn \c_jong_clist
{0,g,kk,gs,n,nj,nh,d,l,lg,lm,lb,ls,lt,lp,lh,m,b,bs,s,ss,ng,j,ch,k,t,p,h}
종성의 첫 글자는 "없는" 것이므로 '0'으로 넣어두긴 했지만 실제로 사용하지는 않을 것입니다.
지난번 작성한 \SylToLvt를 \split_hangul:n이라는 이름의 함수로 이름만 바꾸고,
한 글자를 전자하는 함수는 다음과 같습니다.
\cs_new:Npn \to_RR_a_char:n #1
{
%%% 초/중/종 코드를 얻습니다.
\split_hangul:n #1
%%% 초성의 로마자 표현을 \c_cho_clist에서 얻어내어 \g_output_tl에 넣음
\tl_gput_right:Nx \g_output_tl {
\clist_item:Nn \c_cho_clist { \g_cho_int + 1 }
}
%%% 중성의 로마자 표현을 \c_jung_clist에서 얻어냄.
\tl_gput_right:Nx \g_output_tl {
\clist_item:Nn \c_jung_clist { \g_jung_int + 1 }
}
%%% 종성의 로마자 표현을 \c_jong_clist에서 얻어냄. 종성이 없으면 생략.
\int_compare:nTF { \g_jong_int = 0 }
{ }
{
\tl_gput_right:Nx \g_output_tl {
\clist_item:Nn \c_jong_clist { \g_jong_int + 1 }
}
}
}
=======
이제 단어를 처리할 차례입니다. 아이디어만 소개하면,
- 인자로 한글 문자열이 들어옵니다.
- 이 문자열을 토큰리스트(tl)에 넣습니다.
- tl의 각 아이템에 대하여 반복 작업을 실행하는 mapping함수 \tl_map_inline:Nn을 불러서 출력 문자열을 만듭니다.
- 완성된 출력 문자열의 첫 문자가 -이면 표기하지 않는다는 규정을 위해 이것을 검사하여 제거하고 출력합니다.
다른 방식의 해법도 얼마든지 있을 것입니다.
아무튼, 이리하여 입력된 문자열의 로마자 전자법 표기가 가능하게 되었습니다.
첨부파일을 참고하십시오. RR38.tex
=====
이제 한 번 더 남았습니다. 다음 번에 할 것은 실제로 "국어의 로마자 표기법" 자체를 구현해보는 것입니다.
댓글 12
-
두텁
2015.06.16 15:54
Expl3에 너무 많은 걸 바랄 수 없겠지만 해쉬 혹은 맵은 없는 거군요. -
nanim
2015.06.16 16:45
너무 많은 걸 바랄 수 없겠지요. hashmap까지라고는 못해도 key=value 스트럭쳐는 가지고 있습니다.
첨부 파일은 초성의 map을 dict 비슷하게 구현해본 예입니다.
\cho_dict:n {
0=g, 1=kk, 2=n, 3=d, 4=tt, 5=l, 6=m, 7=b, 8=pp, 9=s,
10=ss, 11=-, 12=j, 13=jj, 14=ch, 15=k, 16=t, 17=p, 18=h
}
이걸
\prop_get:NnN \cho_prop { #1 } \l_tmpa_tl
이런 식으로 key(#1)를 주어서 get하여 \l_tmpa_tl에 넣을 수 있습니다.
-
DohyunKim
2015.06.16 18:25
이거 컴파일해보는 사람은 저밖에 없는 듯 하네요.
“이리”의 결과물 “i-li” 분철은 불필요해 보입니다. “일이”는 “il-i”로 변환되어야 하니 명백히 서로 구분가능 하죠.
종성 리스트의 0을 \empty로 바꾸면 int_compare:nTF 검사를 제거할 수 있을 듯하고요.
-
그로몹
2015.06.16 22:42
다른 일로 바빠서 감사히도 만들어주시고 고쳐주시는 파일을 테스트해보지 못하였습니다.
죄송합니다.
우선 존재한다는 것만으로도 마음이 놓여서 이것을 어떻게 사용할지에 생각이 더 가는 중입니다만,
이것도 다른 일이 마감된 이후에... 아마도 7월에 들어가서가 아닐까 하는데요...
아마 조만간에 테스트하게 될 것이라고 생각됩니다.
감사합니다.
-
nanim
2015.06.17 05:37
"이-리"는 소리나지 않는 'ㅇ'이 아닌 자리에 강제로 쓰인 붙임표를 테스트하려고 넣은 것이었는데 예가 좋지 않았습니다. :)
초성 리스트 0에 대해서 가르쳐주신 것이 맞습니다. 감사합니다.
두 분의 말씀을 반영하여 수정한 버전입니다. RR38-a.tex
-
yihoze
2015.06.17 08:53
괜스레 딴지걸어 봅니다.
"한글 자소를 로마자에 기계적으로 대응시켜 ... 복잡한 음운 현상을 고려하지 않고 ..."
이 방법이 대부분의 경우 별 문제 없으리라 보는데요. "ㄹ"에 대해서는 가능하다면 개선했으면 합니다.
i-li든 il-i든, 이것들은 "이리"가 아니라 "일리"라고 발음할 터인데요. 초성 "ㄹ"은 R, 종성 "ㄹ"은 L이라고 봅니다. 우리가 흔히 R과 L을 구분하지 못한다 하는데, 이 차이를 인식하지 못하기 때문인 듯합니다. 그래서 L을 제대로 소리내게 하는 손쉬운 방법은, 단어의 처음에 오는 L을 초성이 아니라 종성으로 만들어주는 것입니다."레이디"가 아니라 "을레이디"로 소리내는 거죠. 비슷하게, R을 살려주려면 "레디오"라 하지 않고 "우레이디오"라 하면 된다고 합니다.
-
nanim
2015.06.17 12:17
국어의 로마자 표기법은 말씀하신 대로 초성의 ㄹ은 r, 종성의 ㄹ은 l로 적습니다.
단지, 지금 얘기되는 것은 "전자법"이라서 하나의 자모는 하나의 로마자 표현으로 대응되어야 하기 때문에 모든 'ㄹ'을 l로 적는 것입니다.
이 표기법은 발음하고는 아무 관계 없습니다.
-
두텁
2015.06.17 13:53
여기서 "전자법"이란 "transliteration"입니다. 그냥 로마자 표기법은 "transcription"입니다. https://en.wikipediaDOTorg/wiki/Transliteration 참조
-
DohyunKim
2015.06.17 10:08
한 가지 제안입니다. 위 전자법은 매우 단순하기 때문에 분철이 필요한 경우는 몇 가지로 한정됩니다. 즉 종성+초성 문자열이
bss, gss, jj, kk, kkk, lpp, lss, ltt, njj, pp, ss, sss, tt
가 오는 경우뿐입니다. 따라서 사용자에게 분철표시하라고 요구하기보단 프로그램이 알아서 하면 좋겠습니다.
이를테면 get_value:nn 매크로 1행과 2행 사이에 아래와 유사한 코드를 추가하는 것입니다. (수정: toRR 시작시 운운 삭제)
if 종성:
edef jongcho {종성라틴문자열} % 수정: def를 edef로
elseif 초성:
if defined jongcho:
edef jongcho {jongcho 초성라틴문자열}
if jongcho == bss or gss or ... or tt:
tl_put_right g_output_tl { - }
let jongcho = undefined
가능하겠죠? 저로선 expl3를 잘 몰라 코드 짜려면 매뉴얼 보면서 하루종일 해야 할 거 같지만요.
-
nanim
2015.06.17 11:20
regex로 하고 싶다는 충동이 일었습니다만... 그건 다음번 글을 위해 미뤄두고...
말씀하신 대로 하자면 대략 다음과 같이 될 듯싶습니다.
\cs_new:Npn \get_value:nn #1 #2
{
\str_case:nn { #1 }
{
{ jong } {
\prop_get:cnN { dict _ #1 } { #2 } \l_tmpa_tl
\tl_gset_eq:NN \g_jongcho_tl \l_tmpa_tl
}
{ cho } {
\prop_get:cnN { dict _ #1 } { #2 } \l_tmpa_tl
\tl_gconcat:NNN \g_jong_and_cho \g_jongcho_tl \l_tmpa_tl
\str_case_x:nnTF { \g_jong_and_cho }
{
{ bss } { } { gss } { } { jj } { }
{ kk } { } { kkk } { } { lpp } { }
{ lss } { } { ltt } { } { njj } { }
{ pp } { } { ss } { } { sss } { }
{ tt } { } { bsss } { }
}
{
\tl_gput_right:Nx \g_output_tl { \g_jongcho_tl - \l_tmpa_tl }
}
{
\tl_gput_right:Nx \g_output_tl { \g_jong_and_cho }
}
}
{ jung } {
\prop_get:cnN { dict _ #1 } { #2 } \l_tmpa_tl
\tl_gput_right:Nx \g_output_tl { \l_tmpa_tl }
}
}
}\toRR 명령도 조금 바꾸어야 합니다. 이것은 첨부파일 참조...
분철 규칙에 bsss 하나를 더 추가했습니다. 이것은 분철 안 해도 되는 거로 보이지만 테스트용으로 넣었습니다.
-
DohyunKim
2015.06.17 11:55
감사합니다. 의도한대로 잘 작동하네요.
-
그로몹
2015.06.17 18:02
대단해요, 1개.
고마워요, 1개.