texlive[51424] Master/texmf-dist: luatexko (22jun19)

commits+karl at tug.org commits+karl at tug.org
Sat Jun 22 23:23:02 CEST 2019


Revision: 51424
          http://tug.org/svn/texlive?view=revision&revision=51424
Author:   karl
Date:     2019-06-22 23:23:02 +0200 (Sat, 22 Jun 2019)
Log Message:
-----------
luatexko (22jun19)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog
    trunk/Master/texmf-dist/doc/luatex/luatexko/README
    trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf
    trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex
    trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua
    trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua
    trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua
    trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog	2019-06-22 21:22:49 UTC (rev 51423)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog	2019-06-22 21:23:02 UTC (rev 51424)
@@ -1,3 +1,10 @@
+2019-06-21      Dohyun Kim <nomos at ktug org>
+
+	Version 2.3
+
+	* luatexko.lua: prevent discretionary node after Kana;
+	provide lua functions deactivateall() and reactivateall().
+
 2019-06-07      Dohyun Kim <nomos at ktug org>
 
 	Version 2.2

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/README
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luatexko/README	2019-06-22 21:22:49 UTC (rev 51423)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/README	2019-06-22 21:23:02 UTC (rev 51424)
@@ -1,4 +1,4 @@
-LuaTeX-ko Package version 2.2 (2019/06/07)
+LuaTeX-ko Package version 2.3 (2019/06/21)
 ===========================================
 
 This is a Lua(La)TeX macro package that supports typesetting Korean

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex	2019-06-22 21:22:49 UTC (rev 51423)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex	2019-06-22 21:23:02 UTC (rev 51424)
@@ -13,6 +13,7 @@
 \usepackage[svgnames]{xcolor}
 \usepackage[hangul]{luatexko}
 \setmainhangulfont{Noto Serif CJK KR}[
+  Scale=0.98,
   AutoFakeSlant,
   Script=Hangul,
   Language=Korean,
@@ -23,6 +24,7 @@
   Expansion, Protrusion,
 ]
 \setsanshangulfont{Noto Sans CJK KR}[
+  Scale=0.98,
   Script=Hangul,
   Language=Korean,
   UprightFont=* DemiLight,
@@ -30,12 +32,15 @@
   InterLatinCJK=.125em,
 ]
 \setmonofont{Inconsolatazi4}[
+  Scale=0.98,
+  CharRaise=0.125ex,
   Color=MidnightBlue,
 ]
 \setmonohangulfont{Noto Sans CJK KR}[
+  Scale=0.98,
   UprightFont=* DemiLight,
   BoldFont=* Bold,
-  CharRaise=-.2ex,
+  CharRaise=-.125ex,
   Color=MidnightBlue,
 ]
 \setmathhangulfont{Noto Sans CJK KR}[
@@ -72,7 +77,7 @@
 \author{Dohyun Kim \normalsize |<nomos at ktug org>| \and
         Soojin Nam \normalsize |<jsunam at gmail com>| \and
   \normalsize <\url{http://github.com/dohyunkim/luatexko}>}
-\date{Version 2.2\quad 2019/06/07}
+\date{Version 2.3\quad 2019/06/21}
 \maketitle
 
 \begin{quote}\small
@@ -82,7 +87,6 @@
     \item[v2.2] ------
     \item \hyperref[sec:fontoption]{글꼴옵션 |InterCharStretch| 제공}
     \item[v2.0] ------
-    \item \hyperref[sec:packageopt]{패키지 옵션 |nofontspec| 제거}
     \item \hyperref[sec:fontoption]{글꼴옵션 |PunctRaise|, |NoEmbeding| 제거}
     \item \hyperref[sec:mathhangul]{수식 한글 글꼴을 자동으로 잡아주지 않음}
     \item \cs{actualtext} 명령 작동 않음. 대신, 옛한글 텍스트 추출 자동 지원%
@@ -99,6 +103,7 @@
 \smallskip
 
 \section{부르기}\label{sec:loading}
+
 \hemph{\texlive\ 2019 이상}{ \small (\luatex\ v1.10 이상)}을 사용해야 한다.
 
 \luatexko\ 부르기: \cs{usepackage{luatexko}} 혹은 \cs{usepackage{kotex}}.%
@@ -110,6 +115,7 @@
 CP949 인코딩에 관해서는 제\ref{sec:uhcencoding}절 참조.
 
 \section{패키지 옵션}\label{sec:packageopt}
+
 패키지 옵션으로 |[hangul]|과 |[hanja]|가 제공된다.%
 \footnote{%
   |[nofontspec]| 옵션은 v2.0부터 더는 제공되지 않는다. }
@@ -119,10 +125,12 @@
 ``제~3 장''과 같은 방식으로 표시되며 절 제목 이하에는 붙지 않는다.
 
 \section{글꼴명령}\label{sec:fontcmds}
+
 \luatexko를 로드하면 fontspec 패키지를 자동으로 불러온다. 글꼴 설정에
 대해서는 fontspec 문서를 참조.
 
-한국어 글꼴을 위해 새로 마련한 명령은 다음과 같다.%
+한국어 글꼴을 위해 새로 마련한 명령은 다음과 같다.
+첫 두 줄, 즉 main/sans 글꼴들에는 |Ligatures=TeX| 옵션이 자동으로 주어진다.%
 \footnote{%
   \cs{adhochangulfont} \cs{adhochanjafont} \cs{addhocfallbackfont}는
   마지막 줄 명령들의 다른 이름들이다. }\,%
@@ -141,10 +149,9 @@
   \addhangulfontfeature  \addhanjafontfeature \addfallbackfontfeature
   \hangulfontspec        \hanjafontspec       \fallbackfontspec
 \end{verbatim}
-첫 두 줄, 즉 main/sans hangul/hanja/fallback 글꼴에는
-|Ligatures=TeX| 옵션이 자동으로 주어진다.
 
 \section{글꼴 대체}\label{sec:fontswitch}
+
 원칙적으로 \luatexko는 지시된 글자가 영문폰트에 없으면 한글폰트에서,
 한글폰트에도 없으면 한자폰트에서, 한자폰트에도 없으면 fallback
 폰트에서 글자를 찾아 찍는다.
@@ -159,7 +166,7 @@
 문단 중간에서 사용해도 동작한다. 그러나 루아코드가 실행되므로
 텍의 그룹에 의해 영향받지 않는 전역적 효과를 가진다.
 
-나아가 일정한 영문 문장부호들은 한글 폰트로 식자된다.
+일정한 영문 문장부호들은 한글 폰트로 식자된다.
 즉, \cs{hangulpunctuations=1}이 기본으로 작동하고,
 |0|을 지시해야 이 기능이 비로소 꺼진다.
 verbatim 코드를 식자할 때는 이 기능이 작동하지 않는다.%
@@ -179,15 +186,17 @@
   [0x2015]  ―   [0x2018]  ‘   [0x2019]  ’   [0x201C]  “
   [0x201D]  ”    [0x2026]  …   [0x203B]  ※
 \end{verbatim}
+
 다음과 같은 명령으로 이 목록에 문자를 추가하거나 제거할 수 있다.
 인자는 콤마로 분리된 숫자 형식으로서 유니코드 코드포인트를 뜻한다.
+이들 명령은 문단 중간에서도 쓸 수 있지만, 전역적 효과를 가진다.
 \begin{verbatim}
   \registerpunctuations{45, "2D, `-}
   \unregisterpunctuations{"2D, "2015}
 \end{verbatim}
-이들 명령은 문단 중간에서도 쓸 수 있지만, 전역적 효과를 가진다.
 
 \section{줄바꿈 허용}\label{sec:break}
+
 어떤 글자 앞이나 뒤에서 줄바꿈을 허용하고 싶을 때 아래와 같이 명령을 준다.
 \begin{verbatim}
 \registerbreakableafter{"2460, "2461}
@@ -198,6 +207,7 @@
 이들 문자 앞뒤 모두에서 줄바꿈이 되지 않는다.
 
 \section{글꼴 옵션}\label{sec:fontoption}
+
 fontspec의 글꼴 옵션 외에 \luatexko가 따로 제공하는 것들이 있다.%
 \footnote{%
   옛한글 식자를 위해서는 적어도 |Script=Hangul|
@@ -323,6 +333,24 @@
 \end{description}
 
 \section{고문헌}\label{sec:classic}
+
+\begin{figure}
+  \centering
+  \fbox{\parbox{37em}{\typesetclassic\sffamily
+  \addhangulfontfeature{CompressPunctuations}
+子曰:「學而時習之,不亦說乎?有朋自遠方來,不亦樂乎?人不知而不慍,
+不亦君子乎?」\par
+有子曰:「其爲人也孝弟,而好犯上者,鮮矣!不好犯上,而好作亂者,未之有也!
+君子務本,本立而道生;孝弟也者,其爲仁之本與?」\par
+子曰:「巧言令色,鮮矣仁!」\par
+曾子曰:「吾日三省吾身:爲人謀,而不忠乎?與朋友交,而不信乎?傳,
+不習乎?」\par
+子曰:「道千乘之國,敬事而信,節用而愛人,使民以時。」\par
+子曰:「弟子入則孝,出則弟;謹而信,汎愛衆;而親仁,行有餘力,則以學文。」
+  }}
+\caption{고문헌 조판 보기. typesetclassic 환경을 이용했다.}\label{fig:gomun}
+\end{figure}
+
 고문헌 조판을 위해 |typesetclassic| 환경을 제공한다.%
 \footnote{%
   플레인텍에서는 (문서 전체에 적용하지 않는다면 그룹 안에서)
@@ -342,27 +370,11 @@
   플레인텍에서는 (문서 전체에 적용하지 않는다면 그룹 안에서)
   \cs{typesetmodern}을 사용한다. }
 
-\begin{figure}
-  \centering
-  \fbox{\parbox{37em}{\typesetclassic\sffamily
-  \addhangulfontfeature{CompressPunctuations}
-子曰:「學而時習之,不亦說乎?有朋自遠方來,不亦樂乎?人不知而不慍,
-不亦君子乎?」\par
-有子曰:「其爲人也孝弟,而好犯上者,鮮矣!不好犯上,而好作亂者,未之有也!
-君子務本,本立而道生;孝弟也者,其爲仁之本與?」\par
-子曰:「巧言令色,鮮矣仁!」\par
-曾子曰:「吾日三省吾身:爲人謀,而不忠乎?與朋友交,而不信乎?傳,
-不習乎?」\par
-子曰:「道千乘之國,敬事而信,節用而愛人,使民以時。」\par
-子曰:「弟子入則孝,出則弟;謹而信,汎愛衆;而親仁,行有餘力,則以學文。」
-  }}
-\caption{고문헌 조판 보기. typesetclassic 환경을 이용했다.}\label{fig:gomun}
-\end{figure}
-
 고문헌 조판 중 \luatexko가 글자 사이에 삽입하는 미세간격을
 사용자가 영{\small(zero)}으로 강제하기 위해선 \cs{inhibitglue} 명령을 이용한다.
 
 \section{세로쓰기}\label{sec:verttype}
+
 세로쓰기는 폰트의 고급 오픈타입 속성을 이용하므로 폰트가 이를 지원해야
 가능한 일이다. 폰트에 |Vertical=Alternates|와 |RawFeature=vertical| 옵션을
 준다.%
@@ -378,12 +390,6 @@
 세로쓰기에서는 \cs{typesetclassic}의 아종인 \cs{typesetvertical}이
 기본으로 셋팅되어 있다. 일종의 고문헌 조판으로 보는 것이다.
 
-문서의 일부를 세로쓰기하려면 \cs{begin{vertical}{<dimen>}} \ldots\ \cs{end{vertical}}
-환경을 이용한다. |<dimen>|으로 세로쓰기 박스의 높이를 지시한다.%
-\footnote{%
-  플레인텍에서는 \cs{vertical{<dimen>}} \ldots\ \cs{endvertical}. }
-그림~\ref{fig:vertical} 및 그림~\ref{fig:vertical2} 참조.
-
 \begin{figure}
 \framebox[\linewidth]{\begin{vertical}{20em}\sffamily
   \addhangulfontfeature{Vertical=Alternates, RawFeature=vertical}
@@ -393,6 +399,12 @@
 \caption{세로쓰기의 예. 박스 높이 |20em|을 지시했다.}\label{fig:vertical}
 \end{figure}
 
+문서의 일부를 세로쓰기하려면 \cs{begin{vertical}{<dimen>}} \ldots\ \cs{end{vertical}}
+환경을 이용한다. |<dimen>|으로 세로쓰기 박스의 높이를 지시한다.%
+\footnote{%
+  플레인텍에서는 \cs{vertical{<dimen>}} \ldots\ \cs{endvertical}. }
+그림~\ref{fig:vertical} 및 그림~\ref{fig:vertical2} 참조.
+
 \begin{figure}
 \framebox[\linewidth]{\begin{vertical}{17em}\sffamily
   \addhangulfontfeature{Vertical=Alternates, CharRaise=3.2pt,
@@ -430,37 +442,8 @@
   플레인텍에서는 \cs{horizontal{<dimen>}} \ldots\ \cs{endhorizontal}. }
 가로쓰기 영역의 폰트 설정은 사용자의 몫이다.
 
-\section{수식 한글}\label{sec:mathhangul}
-\begin{quote}
-  |$가^{나^다}$|\quad$\Rightarrow\quad가^{나^다}$
-\end{quote}
-수식 한글 폰트를 설정하면 수식 모드에서도 한글을 {\small(hbox로 감싸지 않고)}
-직접 입력할 수 있다.%
-\footnote{%
-  플레인텍에서는 \cs{mathhangulfont=UnBatang}과 같이 설정한다.
-  또는 좀 더 그럴듯하게 하려면:\par
-  \leftskip=3em\noindent
-  |\\font\\texthangul="Noto Sans CJK KR DemiLight" at 10pt|\\
-  |\\font\\scripthangul="Noto Sans CJK KR Regular" at 7pt|\\
-  |\\font\\scriptscripthangul="Noto Sans CJK KR Medium" at 5pt|\\
-  |\\setmathhangulfonts\\texthangul\\scripthangul\\scriptscripthangul| }
-v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.
-\begin{verbatim}
-  \setmathhangulfont{Noto Sans CJK KR}[
-    SizeFeatures={
-      {Size=-6,  Font=* Medium},
-      {Size=6-9, Font=* Regular},
-      {Size=9-,  Font=* DemiLight},
-    } ]
-\end{verbatim}
-현재 한글만 쓸 수 있게 설정되어 있다.
-한자도 수식에 직접 입력하려면 사용자는
-\begin{verbatim}
-  \setmathhangulblock{4E00}{9FC3}
-\end{verbatim}
-명령으로 유니코드 블럭을 추가 지정해야 한다.
+\section{드러냄표}\label{sec:dotemph}
 
-\section{드러냄표}\label{sec:dotemph}
 \cs{dotemph} 명령으로 \dotemph{드러냄표}%
 를 이용한 강조를 할 수 있다.  기본은 글자 위에 점을 찍는 형태이나
 다음과 같이 명령을 주어 개인적으로 선호하는 기호를 드러냄표로 쓸 수
@@ -472,6 +455,7 @@
 ②~|\def\dotemphchar{\bfseries ^^^^02d9}|: 드러냄표 기호 자체를 정의.
 
 \section{루비}\label{sec:ruby}
+
 루비를 달 수 있다. ruby 패키지가 이미 존재하지만 \luatexko와 궁합이 잘
 맞지 않아 새로 매크로를 제공한다.
 \begin{quote}
@@ -507,6 +491,7 @@
 두 인자의 글자 수가 동일해야 한다.
 
 \section{밑줄긋기}\label{sec:uline}
+
 ulem 패키지가 \luatexko와 궁합이 잘 맞지 않아{\small (줄바꿈에 문제가 있음)}
 명령을 따로 제공한다.
 
@@ -553,6 +538,7 @@
 \ymarker{노란색을 칠해서 강조한다}.
 
 \section{자동조사}\label{sec:autojosa}
+
 자동조사는 \kotex 과 동일하게 \cs{은} \cs{는} \cs{이} \cs{가} \cs{을} \cs{를}
 \cs{와} \cs{과} \cs{로} \cs{으로} \cs{라} \cs{이라} 따위를 사용한다.
 버전 1.3부터는 \cs{josaignoreparens=1}이 선언되어 있으면 자동조사는
@@ -567,7 +553,49 @@
   |홍길동(2001)\로|\quad$\Rightarrow$\quad 홍길동(2001)\로
 \end{quote}
 
+\section{루아 모듈의 제거 및 복원}\label{sec:luamodule}
+
+루아 코드 |luatexko.deactivateall()|은 이상 언급한 \luatexko 의 거의 모든
+기능을 무력화한다. |luatexko.reactivateall()|은 이를 복원한다.%
+\footnote{수직 모드 (문단과 문단 사이)에서 사용할 것.
+  수평 모드에서는 정상작동을 보장하지 못한다.}
+다른 패키지와 충돌할 때 시도해 볼 수 있다.
+전자의 함수에는 문자열을 인자로 줄 수도 있는데, 해당하는 다른 패키지의
+모듈들을 잠시 제거할 수 있다.
+
+\section{수식 한글}\label{sec:mathhangul}
+
+\begin{quote}
+  |$가^{나^다}$|\quad$\Rightarrow\quad가^{나^다}$
+\end{quote}
+수식 한글 폰트를 설정하면 수식 모드에서도 한글을 {\small(hbox로 감싸지 않고)}
+직접 입력할 수 있다.%
+\footnote{%
+  플레인텍에서는 \cs{mathhangulfont=UnBatang}과 같이 설정한다.
+  또는 좀 더 그럴듯하게 하려면:\par
+  \leftskip=3em\noindent
+  |\\font\\texthangul="Noto Sans CJK KR DemiLight" at 10pt|\\
+  |\\font\\scripthangul="Noto Sans CJK KR Regular" at 7pt|\\
+  |\\font\\scriptscripthangul="Noto Sans CJK KR Medium" at 5pt|\\
+  |\\setmathhangulfonts\\texthangul\\scripthangul\\scriptscripthangul| }
+v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.
+\begin{verbatim}
+  \setmathhangulfont{Noto Sans CJK KR}[
+    SizeFeatures={
+      {Size=-6,  Font=* Medium},
+      {Size=6-9, Font=* Regular},
+      {Size=9-,  Font=* DemiLight},
+    } ]
+\end{verbatim}
+현재 한글만 쓸 수 있게 설정되어 있다.
+한자도 수식에 직접 입력하려면 사용자는
+다음 명령으로 유니코드 블럭을 추가 지정해야 한다.
+\begin{verbatim}
+  \setmathhangulblock{4E00}{9FC3}
+\end{verbatim}
+
 \section{한국어 항목 번호}\label{sec:hangulnums}
+
 \kotex과 동일하게 항목 번호를 한국어 기호로 붙일 수 있다.%
 \footnote{%
   \cs{jaso} \cs{gana} \cs{ojaso} \cs{ogana} \cs{pjaso} \cs{pgana}
@@ -575,6 +603,7 @@
   \cs{hroman} \cs{hRoman} \cs{hNum} \cs{hanjanum} 따위를 사용한다. }
 
 \section{입력 변환}\label{sec:noramlize}
+
 \cs{luatexhangulnormalize=1}이라 지시하면 첫가끝 자모를 완성형 음절로,
 |2|라면 완성형 음절을 첫가끝 자모로 인코딩 변환한다. |0|이 할당되면
 인코딩 변환 기능이 꺼진다. \XeTeX의 \cs{XeTeXinputnormalization} 명령과
@@ -581,6 +610,7 @@
 유사하나, 오직 한글과 일부 한자에 대해서만 정규화가 작동할 뿐이다.
 
 \section{UHC 입력 인코딩}\label{sec:uhcencoding}
+
 권장하지 않지만 불가피하게 입력 인코딩이 UHC (Unified Hangul Code)%
 \footnote{%
   CP949라고도 하며 EUC-KR을 포함한다. }%

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua	2019-06-22 21:22:49 UTC (rev 51423)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua	2019-06-22 21:23:02 UTC (rev 51424)
@@ -13,16 +13,23 @@
 
 luatexbase.provides_module({
   name        = "luatexko-normalize",
-  version     = "2.2",
-  date        = "2019/06/07",
+  version     = "2.3",
+  date        = "2019/06/21",
   author      = "Dohyun Kim, Soojin Nam",
   description = "Hangul normalization",
   license     = "LPPL v1.3+",
 })
 
-luatexkonormalize = luatexkonormalize or {}
-local luatexkonormalize = luatexkonormalize
+luatexko = luatexko or {}
+luatexko.normalize = luatexko.normalize or {}
+local luatexkonormalize = luatexko.normalize
 
+local utf8codes   = utf8.codes
+local utf8char    = utf8.char
+local tableinsert = table.insert
+local tableappend = table.append
+local tableunpack = table.unpack
+
 local chanjatohanja = {
   [0xF900] = {0x8C48, 0xFE00},
   [0xF901] = {0x66F4, 0xFE00},
@@ -422,7 +429,7 @@
 end
 
 local function jamo2syllable (t) -- table -> integer
-  local cho, jung, jong = table.unpack(t)
+  local cho, jung, jong = tableunpack(t)
   local s = (cho - 0x1100) * 21
   s = (s + jung - 0x1161) * 28
   if jong then
@@ -445,23 +452,23 @@
 
 local function hanguldecompose (buffer)
   local t = {}
-  for _, c in utf8.codes(buffer) do
+  for _, c in utf8codes(buffer) do
     if is_hangul(c) then
-      table.append(t, syllable2jamo(c))
+      tableappend(t, syllable2jamo(c))
     else
-      table.insert(t, c)
+      tableinsert(t, c)
     end
   end
-  return utf8.char(table.unpack(t))
+  return utf8char(tableunpack(t))
 end
 
 -- LV | LVT, T  -> L, V, T+
 local function flush_syllable_jong (t, s)
   if #s == 2 then
-    table.append(t, syllable2jamo( s[1] ))
-    table.insert(t, s[2])
+    tableappend(t, syllable2jamo( s[1] ))
+    tableinsert(t, s[2])
   else
-    table.append(t, s)
+    tableappend(t, s)
   end
   return t, {}
 end
@@ -468,12 +475,12 @@
 
 local function compose_hanguldecompose (buffer) -- string -> table
   local t, s = {}, {}
-  for _, c in utf8.codes(buffer) do
+  for _, c in utf8codes(buffer) do
     if #s == 1 and is_jongsong(c) then
-      table.insert(s, c)
+      tableinsert(s, c)
     else
       t, s = flush_syllable_jong(t, s)
-      table.insert(is_hangul(c) and s or t, c)
+      tableinsert(is_hangul(c) and s or t, c)
     end
   end
   t = flush_syllable_jong(t, s)
@@ -483,9 +490,9 @@
 -- L, V, [T & ^OT]? -> LV | LVT
 local function flush_syllable (t, s)
   if #s == 2 or #s == 3 and is_modern_jong( s[3] ) then
-    table.insert(t, jamo2syllable(s))
+    tableinsert(t, jamo2syllable(s))
   else
-    table.append(t, s)
+    tableappend(t, s)
   end
   return t, {}
 end
@@ -494,10 +501,10 @@
   local t, s = {}, {}
   for _, c in ipairs(ot) do
     if #s == 1 and is_modern_jung(c) or #s >= 2 and is_jongsong(c) then
-      table.insert(s, c)
+      tableinsert(s, c)
     else
       t, s = flush_syllable(t, s)
-      table.insert(is_modern_cho(c) and s or t, c)
+      tableinsert(is_modern_cho(c) and s or t, c)
     end
   end
   t = flush_syllable(t, s)
@@ -507,9 +514,9 @@
 -- L, VF -> CL
 local function flush_cjamocho (t, s)
   if #s == 2 then
-    table.insert(t, jamotocjamo.ccho[ s[1] ])
+    tableinsert(t, jamotocjamo.ccho[ s[1] ])
   else
-    table.append(t, s)
+    tableappend(t, s)
   end
   return t, {}
 end
@@ -518,10 +525,10 @@
   local t, s = {}, {}
   for _, c in ipairs(ot) do
     if #s == 1 and c == 0x1160 then
-      table.insert(s, c)
+      tableinsert(s, c)
     else
       t, s = flush_cjamocho(t, s)
-      table.insert(jamotocjamo.ccho[c] and s or t, c)
+      tableinsert(jamotocjamo.ccho[c] and s or t, c)
     end
   end
   t = flush_cjamocho(t, s)
@@ -531,9 +538,9 @@
 -- LF, V, ^T -> CV, ^T
 local function flush_cjamojung (t, s)
   if #s == 2 then
-    table.insert(t, jamotocjamo.cjung[ s[2] ])
+    tableinsert(t, jamotocjamo.cjung[ s[2] ])
   else
-    table.append(t, s)
+    tableappend(t, s)
   end
   return t, {}
 end
@@ -542,10 +549,10 @@
   local t, s = {}, {}
   for _, c in ipairs(ot) do
     if #s == 1 and jamotocjamo.cjung[c] or #s == 2 and is_jongsong(c) then
-      table.insert(s, c)
+      tableinsert(s, c)
     else
       t, s = flush_cjamojung(t, s)
-      table.insert(c == 0x115F and s or t, c)
+      tableinsert(c == 0x115F and s or t, c)
     end
   end
   t = flush_cjamojung(t, s)
@@ -555,9 +562,9 @@
 -- CHJ -> HJ, VS
 local function flush_compat_hanja (t, s)
   if #s == 1 then
-    table.append(t, chanjatohanja[ s[1] ])
+    tableappend(t, chanjatohanja[ s[1] ])
   else
-    table.append(t, s)
+    tableappend(t, s)
   end
   return t, {}
 end
@@ -566,10 +573,10 @@
   local t, s = {}, {}
   for _, c in ipairs(ot) do
     if #s ==  1 and c >= 0xFE00 and c <= 0xFE02 then
-      table.insert(s, c)
+      tableinsert(s, c)
     else
       t, s = flush_compat_hanja(t, s)
-      table.insert(chanjatohanja[c] and s or t, c)
+      tableinsert(chanjatohanja[c] and s or t, c)
     end
   end
   t = flush_compat_hanja(t, s)
@@ -583,7 +590,7 @@
   t = compose_jamo_jungsong(t)
   t = compose_compat_hanja (t)
 
-  return utf8.char(table.unpack(t))
+  return utf8char(tableunpack(t))
 end
 
 local loaded = false
@@ -592,7 +599,7 @@
 
 local function unload()
   if loaded then
-    remove_from_callback('process_input_buffer', 'luatexko-hangul-normalize')
+    remove_from_callback('process_input_buffer', 'luatexko.hangul_normalize')
     loaded = false
   end
 end
@@ -600,7 +607,7 @@
 
 local function compose()
   unload()
-  add_to_callback('process_input_buffer', hangulcompose, 'luatexko-hangul-normalize')
+  add_to_callback('process_input_buffer', hangulcompose, 'luatexko.hangul_normalize')
   loaded = true
 end
 luatexkonormalize.compose = compose
@@ -607,7 +614,7 @@
 
 local function decompose()
   unload()
-  add_to_callback('process_input_buffer', hanguldecompose, 'luatexko-hangul-normalize')
+  add_to_callback('process_input_buffer', hanguldecompose, 'luatexko.hangul_normalize')
   loaded = true
 end
 luatexkonormalize.decompose = decompose

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua	2019-06-22 21:22:49 UTC (rev 51423)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua	2019-06-22 21:23:02 UTC (rev 51424)
@@ -13,15 +13,16 @@
 
 luatexbase.provides_module({
   name        = "luatexko-uhc2utf8",
-  version     = "2.2",
-  date        = "2019/06/07",
+  version     = "2.3",
+  date        = "2019/06/21",
   author      = "Dohyun Kim, Soojin Nam",
   description = "UHC (CP949) input encoding",
   license     = "LPPL v1.3+",
 })
 
-luatexkouhc2utf8 = luatexkouhc2utf8 or {}
-local luatexkouhc2utf8 = luatexkouhc2utf8
+luatexko = luatexko or {}
+luatexko.uhc2utf8 = luatexko.uhc2utf8 or {}
+local luatexkouhc2utf8 = luatexko.uhc2utf8
 
 local kpse_find_file = kpse.find_file
 local add_to_callback = luatexbase.add_to_callback
@@ -64,12 +65,12 @@
 end
 
 local function startconvert ()
-  add_to_callback('process_input_buffer', uhc_to_utf8, 'luatexko-uhctoutf8', 1)
+  add_to_callback('process_input_buffer', uhc_to_utf8, 'luatexko.uhctoutf8', 1)
 end
 luatexkouhc2utf8.startconvert = startconvert
 
 local function stopconvert ()
-  remove_from_callback('process_input_buffer', 'luatexko-uhctoutf8')
+  remove_from_callback('process_input_buffer', 'luatexko.uhctoutf8')
 end
 luatexkouhc2utf8.stopconvert = stopconvert
 
@@ -93,13 +94,13 @@
     if u >= 0xA1 and u <= 0xFFE6 then
       local c = t_ucs2uhc[u]
       if c then
-        table.insert(t, c // 256)
-        table.insert(t, c %  256)
+        t[#t + 1] = c // 256
+        t[#t + 1] = c %  256
       else
-        table.insert(t, u)
+        t[#t + 1] = u
       end
     else
-      table.insert(t, u)
+      t[#t + 1] = u
     end
   end
   return string.char(table.unpack(t))
@@ -113,15 +114,15 @@
 end
 
 local function start_uhc_filename ()
-  add_to_callback('find_read_file', function(id, name) return uhc_find_file(name) end, 'luatexko-touhc-findreadfile')
-  add_to_callback('find_image_file', uhc_find_file, 'luatexko-touhc-findimagefile')
+  add_to_callback('find_read_file', function(id, name) return uhc_find_file(name) end, 'luatexko.touhc_findreadfile')
+  add_to_callback('find_image_file', uhc_find_file, 'luatexko.touhc_findimagefile')
   kpse.find_file = uhc_find_file
 end
 luatexkouhc2utf8.start_uhc_filename = start_uhc_filename
 
 local function stop_uhc_filename ()
-  remove_from_callback('find_read_file', 'luatexko-touhc-findreadfile')
-  remove_from_callback('find_image_file', 'luatexko-touhc-findimagefile')
+  remove_from_callback('find_read_file', 'luatexko.touhc_findreadfile')
+  remove_from_callback('find_image_file', 'luatexko.touhc_findimagefile')
   kpse.find_file = kpse_find_file
 end
 luatexkouhc2utf8.stop_uhc_filename = stop_uhc_filename

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua	2019-06-22 21:22:49 UTC (rev 51423)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua	2019-06-22 21:23:02 UTC (rev 51424)
@@ -13,8 +13,8 @@
 
 luatexbase.provides_module {
   name        = 'luatexko',
-  date        = '2019/06/07',
-  version     = '2.2',
+  date        = '2019/06/21',
+  version     = '2.3',
   description = 'typesetting Korean with LuaTeX',
   author      = 'Dohyun Kim, Soojin Nam',
   license     = 'LPPL v1.3+',
@@ -61,17 +61,18 @@
 local stringformat = string.format
 
 local tableconcat = table.concat
-local tableinsert = table.insert
 local tableunpack = table.unpack
 
-local add_to_callback     = luatexbase.add_to_callback
-local attributes          = luatexbase.attributes
-local call_callback       = luatexbase.call_callback
-local create_callback     = luatexbase.create_callback
-local module_warning      = luatexbase.module_warning
-local new_user_whatsit    = luatexbase.new_user_whatsit
-local new_user_whatsit_id = luatexbase.new_user_whatsit_id
-local registernumber      = luatexbase.registernumber
+local add_to_callback       = luatexbase.add_to_callback
+local attributes            = luatexbase.attributes
+local call_callback         = luatexbase.call_callback
+local callback_descriptions = luatexbase.callback_descriptions
+local create_callback       = luatexbase.create_callback
+local module_warning        = luatexbase.module_warning
+local new_user_whatsit      = luatexbase.new_user_whatsit
+local new_user_whatsit_id   = luatexbase.new_user_whatsit_id
+local registernumber        = luatexbase.registernumber
+local remove_from_callback  = luatexbase.remove_from_callback
 
 local function warning (...)
   return module_warning("luatexko", stringformat(...))
@@ -98,6 +99,7 @@
 local lua_value  = 108
 local spaceskip  = 13
 local nohyphen = registernumber"l at nohyphenation" or -1 -- verbatim
+local langkor  = registernumber"koreanlanguage"  or 16383
 
 local hangulfontattr   = attributes.luatexkohangulfontattr
 local hanjafontattr    = attributes.luatexkohanjafontattr
@@ -152,7 +154,7 @@
   or     is_unicode_var_sel(c)
 end
 
-local function is_noncjkletter (c)
+local function is_noncjk_char (c)
   return c >= 0x30 and c <= 0x39
   or     c >= 0x41 and c <= 0x5A
   or     c >= 0x61 and c <= 0x7A
@@ -329,7 +331,7 @@
 
         local c = curr.char
 
-        if is_unicode_var_sel(c) then
+        if is_cjk_combining(c) then
           local p = getprev(curr)
           if p.id == glyphid and curr.font ~= p.font then
             hangul_space_skip(curr, p.font)
@@ -435,12 +437,12 @@
 
 local SC_charclass = setmetatable({
   [0xFF01] = 4, [0xFF1A] = 4, [0xFF1B] = 4, [0xFF1F] = 4,
-}, { __index = function(_,c) return charclass[c] end })
+}, { __index = charclass })
 
 local vert_charclass = setmetatable({
   [0xFF1A] = 5, -- 0xFE13
   [0xFF1B] = 5, -- 0xFE14
-}, { __index = function(_,c) return charclass[c] end })
+}, { __index = charclass })
 
 local function get_char_class (c, classic)
   if classic == vert_classic then
@@ -467,7 +469,7 @@
   [0xFF1E] = true, [0xFF5E] = true, [0xFF70] = true,
 },{ __index = function (_,c)
   return is_hangul_jamo(c) and not is_chosong(c)
-  or is_noncjkletter(c)
+  or is_noncjk_char(c)
   or is_hanja(c)
   or is_cjk_combining(c)
   or is_kana(c)
@@ -553,7 +555,7 @@
 local function fontdata_opt_dim (fd, optname)
   local dim = option_in_font(fd, optname)
   if dim then
-    local m, u = dim:match"(.+)(e[mx])%s*$"
+    local m, u = dim:match"^(.+)(e[mx])%s*$"
     if m and u then
       if u == "em" then
         dim = m * fd.parameters.quad
@@ -700,7 +702,7 @@
 
 -- interhangul & interlatincjk
 
-local function is_cjk (c)
+local function is_cjk_char (c)
   return is_hangul_jamo(c)
   or     is_hanja(c)
   or     is_cjk_combining(c)
@@ -710,6 +712,32 @@
   or     rawget(breakable_after,  c) and c >= 0x2000
 end
 
+local function is_cjk (n, c) -- node, char
+  if n and c then
+    if is_unicode_var_sel(c) then
+      local p = getprev(n)
+      if p and p.id == glyphid then
+        local pc = my_node_props(p).unicode or p.char or 0
+        return is_cjk_char(pc)
+      end
+    end
+    return is_cjk_char(c)
+  end
+end
+
+local function is_noncjk (n, c) -- node, char
+  if n and c then
+    if is_unicode_var_sel(c) then
+      local p = getprev(n)
+      if p and p.id == glyphid then
+        local pc = my_node_props(p).unicode or p.char or 0
+        return is_noncjk_char(pc)
+      end
+    end
+    return is_noncjk_char(c)
+  end
+end
+
 local function do_interhangul_option (head, curr, pc, c, fontid, par)
   local cc = (is_hangul(c) or is_chosong(c)) and 1 or 0
 
@@ -758,55 +786,63 @@
   return head
 end
 
-local function do_interlatincjk_option (head, curr, pc, pf, c, cf, par)
-  local cc = is_cjk(c) and 1 or is_noncjkletter(c) and 2 or 0
-  local brb = cc == 2 or breakable_before[c] -- numletter != br_before
+local function do_interlatincjk_option (head, curr, pc, pf, pcl, c, cf, par)
+  local cc = is_cjk(curr, c) and 1 or is_noncjk(curr, c) and 2 or 0
+  local old = has_attribute(curr, classicattr)
+  local ccl = get_char_class(c, old)
 
-  if brb and cc*pc == 2 and curr.lang ~= nohyphen then
-    local fontid = cc == 1 and cf or pf
-    local dim = get_font_opt_dimen(fontid, "interlatincjk")
-    if dim then
-      head = insert_glue_before(head, curr, par, true, brb, false, false, dim, fontid)
+  if cc*pc == 2 and curr.lang ~= nohyphen then
+    local brb = cc == 2 or breakable_before[c] -- numletter != br_before
+    if brb then
+      local fid = cc == 1 and cf or pf
+      local dim = get_font_opt_dimen(fid, "interlatincjk")
+      if dim then
+        local ict = old and intercharclass[pcl][ccl] -- under classic env. only
+        if ict then
+          dim = get_font_opt_dimen(fid, "intercharacter") or 0
+        end
+        head = insert_glue_before(head, curr, par, true, brb, old, ict, dim, fid)
+      end
     end
   end
 
-  return head, cc, cf
+  return head, cc, cf, ccl
 end
 
 local function process_interlatincjk (head, par)
-  local curr, pc, pf = head, 0, 0
+  local curr, pc, pf, pcl = head, 0, 0, 0
   while curr do
     local id = curr.id
     if id == glyphid then
       local c = my_node_props(curr).unicode or curr.char
-      head, pc, pf = do_interlatincjk_option(head, curr, pc, pf, c, curr.font, par)
+      head, pc, pf, pcl = do_interlatincjk_option(head, curr, pc, pf, pcl, c, curr.font, par)
       pc = breakable_after[c] and pc or 0
 
     elseif id == hlistid and has_attribute(curr, rubyattr) then
       local c, cf = ruby_char_font(curr)
-      head, pc, pf = do_interlatincjk_option(head, curr, pc, pf, c, cf, par)
+      head, pc, pf, pcl = do_interlatincjk_option(head, curr, pc, pf, pcl, c, cf, par)
 
     elseif id == whatsitid and curr.mode == directmode then
       local glyf, c = get_actualtext(curr)
       if c and glyf then
-        head, pc, pf = do_interlatincjk_option(head, curr, pc, pf, c, glyf.font, par)
+        head, pc, pf, pcl = do_interlatincjk_option(head, curr, pc, pf, pcl, c, glyf.font, par)
         curr = goto_end_actualtext(curr)
       end
 
     elseif id == mathid then
       if pc == 1 then
-        head = do_interlatincjk_option(head, curr, pc, pf, 0x30, pf, par)
+        head = do_interlatincjk_option(head, curr, pc, pf, pcl, 0x30, pf, par)
       end
-      pc, curr = 2, end_of_math(curr)
+      pc, pcl, curr = 2, 0, end_of_math(curr)
 
     elseif id == dirid then
       if pc == 1 and curr.dir:sub(1,1) == "+" then
-        head = do_interlatincjk_option(head, curr, pc, pf, 0x30, pf, par)
-        pc = 0
+        head = do_interlatincjk_option(head, curr, pc, pf, pcl, 0x30, pf, par)
+        pc, pcl = 0, 0
       end
 
     elseif is_blocking_node(curr) then
-      pc = 0
+      pc, pcl = 0
     end
     curr = getnext(curr)
   end
@@ -836,7 +872,7 @@
                 vchar, vfont = ruby_char_font(v)
               end
               if vchar and vfont and option_in_font(vfont, opt_name) then
-                ok = is_cjk(vchar)
+                ok = is_cjk(v, vchar)
               end
 
               break
@@ -845,7 +881,7 @@
           end
           if ok then
             head = noderemove(head, curr)
-            tableinsert(to_free, curr)
+            to_free[#to_free + 1] = curr
             break
           end
         end
@@ -906,7 +942,7 @@
     return c ~= 0x1160 and 2
   elseif is_jongsong(c) then
     return c == 0x11AF and 1 or 3
-  elseif is_noncjkletter(c) and c <= 0x7A
+  elseif is_noncjk_char(c) and c <= 0x7A
     or c >= 0x2160 and c <= 0x217F -- roman
     or c >= 0x2460 and c <= 0x24E9 -- ①
     or c >= 0x314F and c <= 0x3163 or c >= 0x3187 and c <= 0x318E -- ㅏ
@@ -974,7 +1010,7 @@
             curr.char = cc
           else
             head = noderemove(head, curr)
-            tableinsert(tofree, curr)
+            tofree[#tofree + 1] = curr
           end
         end
         unset_attribute(curr, autojosaattr)
@@ -1232,7 +1268,7 @@
   if syllable then
     local t = {}
     for _,v in ipairs(syllable) do
-      tableinsert(t, conv_tounicode(v))
+      t[#t + 1] = conv_tounicode(v)
     end
     data = stringformat("/Span<</ActualText<FEFF%s>>>BDC", tableconcat(t))
   else
@@ -1284,7 +1320,7 @@
             if   is_jungsong(u)
               or is_jongsong(u)
               or hangul_tonemark[u] then
-              tableinsert(syllable, u)
+              syllable[#syllable + 1] = u
               curr, uni = n, u
             else
               break
@@ -1471,7 +1507,7 @@
   local tsb_tab = get_tsb_table(fontdata.filename, subfont)
   if not tsb_tab then
     warning("Vertical metrics table (vmtx) not found in the font\n"..
-    "`%s'", fontdata.fontname)
+    "`%s'", fontdata.fullname)
     return
   end
 
@@ -1697,13 +1733,13 @@
       texset("global", "protrudechars", 2)
       active_processes.protrusion = true
     end
-    if not active_processes[fontdata.fontname] and
+    if not active_processes[fontdata.fullname] and
       option_in_font(fontdata, "compresspunctuations") then
       warning("Both `compresspunctuations' and `protrusion' are\n"..
       "enabled for the font `%s'.\n"..
       "Beware that this could result in bad justifications.\n",
-      fontdata.fontname)
-      active_processes[fontdata.fontname] = true
+      fontdata.fullname)
+      active_processes[fontdata.fullname] = true
     end
   end
 
@@ -1766,8 +1802,57 @@
 end
 luatexko.activate = activate
 
+add_to_callback ("hyphenate",
+function(head)
+  local curr = head
+  while curr do
+    local id = curr.id
+    if id == glyphid then
+      if curr.subtype == 1      and
+        curr.lang ~= nohyphen   and
+        is_cjk(curr, curr.char) then
+        curr.lang = langkor
+      end
+    elseif id == mathid then
+      curr = end_of_math(curr)
+    end
+    curr = getnext(curr)
+  end
+  lang.hyphenate(head)
+end,
+"luatexko.hyphenate.prevent_disc_nodes")
+
 -- aux functions
 
+local function deactivate_all (str)
+  luatexko.deactivated = {}
+  for _, name in ipairs{ "hpack_filter",
+                         "pre_linebreak_filter",
+                         "vpack_filter",
+                         "hyphenate",
+                         "luaotfload.patch_font" } do
+    local t = {}
+    for i, v in ipairs( callback_descriptions(name) ) do
+      if v:find(str or "^luatexko%.") then
+        local ff, dd = remove_from_callback(name, v)
+        t[#t + 1] = { ff, dd, i }
+      end
+    end
+    luatexko.deactivated[name] = t
+  end
+end
+luatexko.deactivateall = deactivate_all
+
+local function reactivate_all ()
+  for name, v in pairs(luatexko.deactivated or {}) do
+    for _, vv in ipairs(v) do
+      add_to_callback(name, tableunpack(vv))
+    end
+  end
+  luatexko.deactivated = nil
+end
+luatexko.reactivateall = reactivate_all
+
 local function current_has_hangul_chars (cnt)
   texcount[cnt] = char_in_font(fontcurrent(), 0xAC00) and 1 or 0
 end
@@ -1789,7 +1874,7 @@
   local t = {}
   for i, v in pairs(fd.characters) do
     if v.index == gid then
-      table.insert(t, i)
+      t[#t + 1] = i
     end
   end
   return t

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty	2019-06-22 21:22:49 UTC (rev 51423)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty	2019-06-22 21:23:02 UTC (rev 51424)
@@ -13,7 +13,7 @@
 
 \ifdefined\luatexkohangulfontattr \endinput\fi
 \ifdefined\selectfont
-  \ProvidesPackage{luatexko}[2019/06/07 v2.2 typesetting Korean with LuaTeX]
+  \ProvidesPackage{luatexko}[2019/06/21 v2.3 typesetting Korean with LuaTeX]
   \RequirePackage{luatexbase}
   \RequirePackage{fontspec}
 \else
@@ -22,6 +22,7 @@
   \chardef\luatexkoatcatcode=\catcode`\@
   \catcode`\@=11
 \fi
+\newlanguage\koreanlanguage
 \protected\def\pdfliteral{\pdfextension literal}
 \newattribute\luatexkohangulfontattr
 \newattribute\luatexkohanjafontattr
@@ -30,7 +31,7 @@
 \newattribute\luatexkoclassicattr
 \newattribute\luatexkodotemphattr
 \newattribute\luatexkorubyattr \chardef\luatexkorubyalloc\allocationnumber
-\directlua{ require"luatexko.lua" }
+\directlua{ require"luatexko" }
 % classic
 \protected\def\typesetclassic{\luatexkoclassicattr\z@\parindent1em }
 \protected\def\typesetvertical{\luatexkoclassicattr\@ne\parindent1em }
@@ -293,9 +294,9 @@
   \directlua{require"luatexko-normalize"}%
   \afterassignment\luatexkohangulnormalize\count@}
 \def\luatexkohangulnormalize{%
-  \ifcase\count@ \directlua{ luatexkonormalize.unload() }% 0: none
-  \or \directlua{ luatexkonormalize.compose() }% 1: nfc
-  \else \directlua{ luatexkonormalize.decompose() }% 2: nfd
+  \ifcase\count@ \directlua{ luatexko.normalize.unload() }% 0: none
+  \or \directlua{ luatexko.normalize.compose() }% 1: nfc
+  \else \directlua{ luatexko.normalize.decompose() }% 2: nfd
   \fi }
 % convert uhc to utf8
 \def\luatexuhcinputencoding{%
@@ -302,8 +303,8 @@
   \directlua{require"luatexko-uhc2utf8"}%
   \afterassignment\luatexkouhcinputencoding\count@}
 \def\luatexkouhcinputencoding{%
-  \ifcase\count@ \directlua{ luatexkouhc2utf8.stopconvert() }%
-  \else \directlua{ luatexkouhc2utf8.startconvert() }%
+  \ifcase\count@ \directlua{ luatexko.uhc2utf8.stopconvert() }%
+  \else \directlua{ luatexko.uhc2utf8.startconvert() }%
   \fi}
 % actualtext not provided
 \protected\def\actualtext#1#{\luatexkoactualtext}



More information about the tex-live-commits mailing list