texlive[53001] Master/texmf-dist: luatexko (2dec19)

commits+karl at tug.org commits+karl at tug.org
Mon Dec 2 22:59:03 CET 2019


Revision: 53001
          http://tug.org/svn/texlive?view=revision&revision=53001
Author:   karl
Date:     2019-12-02 22:59:03 +0100 (Mon, 02 Dec 2019)
Log Message:
-----------
luatexko (2dec19)

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-12-02 21:58:50 UTC (rev 53000)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog	2019-12-02 21:59:03 UTC (rev 53001)
@@ -1,3 +1,10 @@
+2019-12-01	Dohyun Kim <nomos at ktug org>
+
+	Version 2.5
+
+	* luatexko.lua: start to support luahbtex
+	* luatexko.sty: 2020 expl3 deprecation removals
+
 2019-08-01      Dohyun Kim <nomos at ktug org>
 
 	Version 2.4

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/README
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luatexko/README	2019-12-02 21:58:50 UTC (rev 53000)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/README	2019-12-02 21:59:03 UTC (rev 53001)
@@ -1,4 +1,4 @@
-LuaTeX-ko Package version 2.4 (2019/08/01)
+LuaTeX-ko Package version 2.5 (2019/12/01)
 ===========================================
 
 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-12-02 21:58:50 UTC (rev 53000)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex	2019-12-02 21:59:03 UTC (rev 53001)
@@ -43,6 +43,7 @@
   Expansion, Protrusion=notoserifcjk,
 ]
 \setsanshangulfont{Noto Sans CJK KR}[
+  \ifluahbtex Renderer=OpenType\fi,
   Scale=0.98,
   Script=Hangul,
   Language=Korean,
@@ -83,7 +84,14 @@
 \edef\verbatim{\unexpanded\expandafter{\verbatim\linespread{1.1}\selectfont}}
 \edef\itemize{\unexpanded\expandafter{\itemize\small}}
 \catcode`|=13 \protected\def|{\verb|\let\\=\textbackslash}
-\protected\def\cs#1{\texttt{\language=1 \textbackslash\detokenize{#1}}}
+\def\nohyphen{\language\csname l at nohyphenation\endcsname}
+\protected\def\cs#1{\texttt{\nohyphen \textbackslash\detokenize{#1}}}
+\protected\def\pkgkwd#1#{\leavevmode
+  \ifx\relax#1\relax \expandafter\luatexkopkgkwd
+  \else              \expandafter\luatexkopkgkwdX \fi}
+\def\luatexkopkgkwd#1{\texttt{\nohyphen \string#1}\luatexkopkgkwdX{#1}}
+\def\luatexkopkgkwdX#1{\marginpar{%
+  \hfuzz\maxdimen \texttt{\nohyphen \footnotesize \string#1}}}
 \def\logoko{\textsf{k}\kern-.0625em\textit{o}}
 \def\luatexko{\luatex-\logoko}
 \def\texlive{\TeX\ Live}
@@ -96,7 +104,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.4\quad 2019/08/01}
+\date{Version 2.5\quad 2019/12/01}
 \maketitle
 
 \begin{quote}\small
@@ -103,6 +111,8 @@
   For a summary introduction in English, please see |README| file.
 
   \begin{itemize}\linespread{1.1}\selectfont
+    \item[v2.5] ------
+    \item LuaHB\TeX\ 지원
     \item[v2.2] ------
     \item \hyperref[sec:fontoption]{글꼴옵션 |InterCharStretch| 제공}
     \item[v2.0] ------
@@ -135,7 +145,7 @@
 
 \section{패키지 옵션}\label{sec:packageopt}
 
-패키지 옵션으로 |[hangul]|과 |[hanja]|가 제공된다.%
+패키지 옵션으로 \pkgkwd{hangul}과 \pkgkwd{hanja}가 제공된다.%
 \footnote{%
   |[nofontspec]| 옵션은 v2.0부터 더는 제공되지 않는다. }
 행간격 조정이 행해지며
@@ -145,8 +155,8 @@
 
 \section{글꼴명령}\label{sec:fontcmds}
 
-\luatexko를 로드하면 fontspec 패키지를 자동으로 불러온다. 글꼴 설정에
-대해서는 fontspec 문서를 참조.
+\luatexko를 로드하면 fontspec 패키지를 자동으로 불러온다. 글꼴 설정은
+fontspec 문서를 참조.
 
 한국어 글꼴을 위해 새로 마련한 명령은 다음과 같다.
 첫 두 줄, 즉 main/sans 글꼴들에는 |Ligatures=TeX| 옵션이 자동으로 주어진다.%
@@ -159,6 +169,13 @@
   \cs{hangulfont=UnDotum\relax}\\
   \cs{hanjafont=UnDotum at 14pt}\\
   \cs{fallbackfont=HanaMinB at 12pt} }
+\pkgkwd*{\setmainhangulfont}%
+\pkgkwd*{\setsanshangulfont}%
+\pkgkwd*{\setmonohangulfont}%
+\pkgkwd*{\newhangulfontfamily}%
+\pkgkwd*{\newhangulfontface}%
+\pkgkwd*{\addhangulfontfeature}%
+\pkgkwd*{\hangulfontspec}%
 \begin{verbatim}
   \setmainhangulfont     \setmainhanjafont    \setmainfallbackfont
   \setsanshangulfont     \setsanshanjafont    \setsansfallbackfont
@@ -179,22 +196,23 @@
 \footnote{%
   은글꼴 트루타입은 \texlive에 포함되어 있다. }
 
-하지만 \cs{hangulbyhangulfont=1}을 선언하면 한글은 우선 한글폰트로
-식자한다. 또한 \cs{hanjabyhanjafont=1}을 선언하면 한자는 우선 한자폰트로
+하지만 \pkgkwd{\hangulbyhangulfont}|=1|을 선언하면 한글은 우선 한글폰트로
+식자한다. 또한 \pkgkwd{\hanjabyhanjafont}|=1|을 선언하면 한자는 우선 한자폰트로
 식자한다. 두 경우 모두 |0|을 선언하면 원래 방식으로 되돌아간다.
 문단 중간에서 사용해도 동작한다. 그러나 루아코드가 실행되므로
 텍의 그룹에 의해 영향받지 않는 전역적 효과를 가진다.
 
 일정한 영문 문장부호들은 한글 폰트로 식자된다.
-즉, \cs{hangulpunctuations=1}이 기본으로 작동하고,
+즉, \pkgkwd{\hangulpunctuations}|=1|이 기본으로 작동하고,
 |0|을 지시해야 이 기능이 비로소 꺼진다.
 verbatim 코드를 식자할 때는 이 기능이 작동하지 않는다.%
 \footnote{%
-  좀 더 정확히 말하면 \cs{language=1} 상황에서는 작동하지 않는다.
-  부연하건대, \cs{language=1}인 상황에서 작동하지 않는 그밖의 기능들은
-  다음과 같다: 줄바꿈 허용, InterCharacter, InterHangul, InterLatinCJK,
-  CompressPunctuations, RemoveClassicSpaces,
-  한글^^b7한자 폰트 문자 다음에 오는 공백의 크기 조정 등. }\,%
+  정확히 말하자면 |\\language=\\l at nohyphenation|, 즉 하이프네이션이
+  허용 안 되는  상황에서는 작동하지 않는다.
+  부연하건대, |\\language=\\l at nohyphenation| 상황에서 작동하지 않는
+  그밖의 기능은 다음과 같다: 줄바꿈 허용, InterCharacter, InterHangul,
+  InterLatinCJK, CompressPunctuations, RemoveClassicSpaces,
+  한글^^b7한자 폰트 문자 다음의 공백 크기 조정 등. }\,%
 \footnote{%
   또한 플레인텍에서는 영문글꼴을 트루타입/오픈타입으로 지정해야만 작동한다. }
 영향 받는 문장부호들의 기본값은 다음과 같다:
@@ -208,7 +226,9 @@
 
 다음과 같은 명령으로 이 목록에 문자를 추가하거나 제거할 수 있다.
 인자는 콤마로 분리된 숫자 형식으로서 유니코드 코드포인트를 뜻한다.
-이들 명령은 문단 중간에서도 쓸 수 있지만, 전역적 효과를 가진다.
+이들 명령은 문단 중간에서도 쓸 수 있지만, 전역적 효과를 가진다.%
+\pkgkwd*{\registerpunctuations}%
+\pkgkwd*{\unregisterpunctuations}
 \begin{verbatim}
   \registerpunctuations{45, "2D, `-}
   \unregisterpunctuations{"2D, "2015}
@@ -216,7 +236,9 @@
 
 \section{줄바꿈 허용}\label{sec:break}
 
-어떤 글자 앞이나 뒤에서 줄바꿈을 허용하고 싶을 때 아래와 같이 명령을 준다.
+어떤 글자 앞이나 뒤에서 줄바꿈을 허용하고 싶을 때 아래와 같이 명령을 준다.%
+\pkgkwd*{\registerbreakableafter}%
+\pkgkwd*{\registerbreakablebefore}
 \begin{verbatim}
 \registerbreakableafter{"2460, "2461}
 \registerbreakablebefore{"2460, "2461}
@@ -271,7 +293,8 @@
 \end{figure}
 
 \begin{description}
-  \item[InterHangul] {\addhangulfontfeature{InterHangul=.5ex}한글 글자
+  \item[InterHangul] \pkgkwd*{InterHangul}%
+    {\addhangulfontfeature{InterHangul=.5ex}한글 글자
     사이의 자간}.  아래는 $-0.04$em 만큼 한글 자간을 지시한다.%
     \footnote{%
       플레인텍에서는 |interhangul=<dimen>|. }
@@ -279,7 +302,8 @@
   [InterHangul=-0.04em]
 \end{verbatim}
 
-\item[InterLatinCJK] 한글 또는 한자와 Latin문자 사이의 자간을 설정한다.%
+\item[InterLatinCJK] \pkgkwd*{InterLatinCJK}%
+  한글 또는 한자와 Latin문자 사이의 자간을 설정한다.%
     \footnote{%
       플레인텍에서는 |interlatincjk=<dimen>|. }
     한글^^b7한자 다음에 라틴 문자가 오는 경우 원래는 줄바꿈이 되지 않지만
@@ -288,7 +312,8 @@
   [InterLatinCJK=0.25em]
 \end{verbatim}
 
-\item[InterCharacter] CJK 글자들 사이의 자간을 지시한다.%
+\item[InterCharacter] \pkgkwd*{InterCharacter}%
+  CJK 글자들 사이의 자간을 지시한다.%
   \footnote{%
     플레인텍에서는 |intercharacter=<dimen>|. }
   fontspec의 |LetterSpace| 옵션과 기능이 유사하지만, 옛한글을 깨뜨리는 등의
@@ -297,8 +322,8 @@
   [InterCharacter=.125em]
 \end{verbatim}
 
-\item[InterCharStretch] CJK 글자간 가변공백{\small(글루)}의
-  stretch 값을 지시한다.%
+\item[InterCharStretch] \pkgkwd*{InterCharStretch}%
+  CJK 글자간 가변공백{\small(글루)}의 stretch 값을 지시한다.%
   \footnote{%
     플레인텍에서는 |intercharstretch=<dimen>|. }
 \begin{verbatim}
@@ -305,7 +330,8 @@
   [InterCharStretch=0.5pt]
 \end{verbatim}
 
-\item[CharRaise] 글자의 세로 위치를
+\item[CharRaise] \pkgkwd*{CharRaise}%
+  글자의 세로 위치를
   {\addhangulfontfeature{CharRaise=.3em} 조절}할 수 있는 기능이다.
   이로써 주변에 식자되는 다른 글꼴과 조화를 이루게 한다.%
   \footnote{%
@@ -318,11 +344,13 @@
   크기가 다른 폰트들간에 중앙정렬이 이루어진다.
   세로쓰기에서 이 옵션을 주지 않으면 |0.5ex|가 기본값으로 동작한다.
 
-\item[RemoveClassicSpaces] 고문헌 조판시에 CJK 글자들 사이의 공백을 없애준다.%
+\item[RemoveClassicSpaces] \pkgkwd*{RemoveClassicSpaces}%
+  고문헌 조판시에 CJK 글자들 사이의 공백을 없애준다.%
   \footnote{%
     플레인텍에서는 |+removeclassicspaces|. }
 
-\item[CompressPunctuations] CJK 구두점 {\small (낫표 따위)}의 글자폭을
+\item[CompressPunctuations] \pkgkwd*{CompressPunctuations}%
+  CJK 구두점 {\small (낫표 따위)}의 글자폭을
   반각으로 만든다. v2.0부터는 사용자가 지시하지 않는 한 자동으로 글자폭을
   줄여주지 않는다.%
   \footnote{%
@@ -333,7 +361,8 @@
     플레인텍에서는 각각 |+halt| 및 |+vhal|이다. 이들과 완전 동일하진
     않다. 가령 U+3002 (\char"3002) 처리의 경우.}
 
-\item[Protrusion] 특정 글자가 행 끌에 왔을 때 판면 바깥으로 끌어내는
+\item[Protrusion] \pkgkwd*{Protrusion}%
+  특정 글자가 행 끌에 왔을 때 판면 바깥으로 끌어내는
   기능이다. Lua\TeX은 기본값으로 온점 반점 등을 완전 글자내밀기 한다.
   |Protrusion|은 |Protrusion=default|와 같은 뜻이다.%
   \footnote{%
@@ -344,7 +373,8 @@
     \leftskip=3em\noindent
     \cs{directlua{ fonts.protrusions.setups.default[0x201C] = { 1, 0 } }} }
 
-\item[Expansion] 판면의 균일한 조판을 위해 글자들을 미세하게 늘이거나
+\item[Expansion] \pkgkwd*{Expansion}%
+  판면의 균일한 조판을 위해 글자들을 미세하게 늘이거나
   줄이는 기능이다. |Expansion|은 |Expansion=default|와 마찬가지 뜻이다.%
   \footnote{%
     플레인텍에서는 |expansion=default|. }
@@ -373,7 +403,7 @@
 \caption{고문헌 조판 보기. typesetclassic 환경을 이용했다.}\label{fig:gomun}
 \end{figure}
 
-고문헌 조판을 위해 |typesetclassic| 환경을 제공한다.%
+고문헌 조판을 위해 \pkgkwd{typesetclassic} 환경을 제공한다.%
 \footnote{%
   플레인텍에서는 (문서 전체에 적용하지 않는다면 그룹 안에서)
   \cs{typesetclassic}을 사용한다.
@@ -387,25 +417,31 @@
 또한 불필요한 공백이 오더라도 자동으로 제거해주지 않으므로 이런 경우
 사용자가 |RemoveClassicSpaces| 옵션을 주어야 한다.
 
-|typesetmodern|은 고문헌 조판 중에 잠깐 현대 한국어를 조판하는 데 사용한다.%
+\pkgkwd{typesetmodern} 환경은 고문헌 조판 중에 잠깐 현대 한국어를 조판하는 데
+사용한다.%
 \footnote{%
   플레인텍에서는 (문서 전체에 적용하지 않는다면 그룹 안에서)
   \cs{typesetmodern}을 사용한다. }
 
-고문헌 조판 중 \luatexko가 글자 사이에 삽입하는 미세간격을
-사용자가 영{\small(zero)}으로 강제하기 위해선 \cs{inhibitglue} 명령을 이용한다.
+고문헌 조판 중 \luatexko가 글자 사이에 삽입하는 미세간격을 사용자가
+영{\small(zero)}으로 강제하기 위해선 \pkgkwd{\inhibitglue} 명령을 이용한다.
 
 \section{세로쓰기}\label{sec:verttype}
 
 세로쓰기는 폰트의 고급 오픈타입 속성을 이용하므로 폰트가 이를 지원해야
-가능한 일이다. 폰트에 |Vertical=Alternates|와 |RawFeature=vertical| 옵션을
-준다.%
+가능한 일이다. 폰트에 |Vertical=Alternates|와 \pkgkwd{RawFeature=vertical}
+옵션을 준다.%
 \footnote{%
   이는 플레인텍에서 |vertical;+vert| 옵션을 주는 것과 같다.
   사실 |vertical|을 선언하면 |vert|는 자동으로 켜지도록 해 두었다. }\,%
 \footnote{%
   |vmtx| 정보를 가지고 있지 않은 글꼴은 세로쓰기에 적합치 않은 글꼴이다.
-  |otfinfo -t <파일>| 명령으로 글꼴에 들어있는 테이블 정보를 알 수 있다. }
+  |otfinfo -t <파일>| 명령으로 글꼴에 들어있는 테이블 정보를 알 수 있다. }\,%
+\footnote{%
+  폰트 옵션 |Renderer=OpenType| 등(플레인텍에서는 |mode=harf| 옵션)을 주고
+  |luahblatex|으로 컴파일하여 Harfbuzz 모듈을 이용하려는 경우 세로쓰기가
+  현재로서는 지원되지 않는다. 세로쓰기를 하려면 이 옵션을 빼고 디폴트 값인
+  |Renderer=Node| (플레인텍에서는 |mode=node|)를 사용하라.}
 세로쓰기에서 |CharRaise| 옵션의 효과에 대해서는 제\ref{sec:fontoption}절을
 참조할 것.
 
@@ -414,7 +450,7 @@
 
 \begin{figure}
 \framebox[\linewidth]{\begin{vertical}{19.6em}\sffamily
-  \addhangulfontfeature{Vertical=Alternates, RawFeature=vertical}
+  \addhangulfontfeature{Renderer=Node, Vertical=Alternates, RawFeature=vertical}
   \linespread{1.5}\selectfont
   \hunmintxt
 \end{vertical}}
@@ -423,9 +459,10 @@
 
 \begin{figure}
 \framebox[\linewidth]{\begin{vertical}{18.62em}\sffamily
-  \addhangulfontfeature{Vertical=Alternates, RemoveClassicSpaces,
+  \addhangulfontfeature{Renderer=Node, Vertical=Alternates, RemoveClassicSpaces,
   InterCharStretch=1pt, CompressPunctuations, RawFeature=vertical}
   \linespread{1.5}\selectfont
+  \parindent=-1em \leftskip=1em
   \analectstext
 \end{vertical}}
 \caption{세로쓰기의 다른 예. 박스 높이 |19em|을 지시했다.
@@ -434,7 +471,8 @@
   넉넉하게 주는 것이 좋다.}\label{fig:vertical3}
 \end{figure}
 
-문서의 일부를 세로쓰기하려면 \cs{begin{vertical}{<dimen>}} \ldots\ \cs{end{vertical}}
+문서의 일부를 세로쓰기하려면
+|\begin{|\pkgkwd{vertical}|}{<dimen>}| \ldots\ |\end{vertical}|
 환경을 이용한다. |<dimen>|으로 세로쓰기 박스의 높이를 지시한다.%
 \footnote{%
   플레인텍에서는 \cs{vertical{<dimen>}} \ldots\ \cs{endvertical}. }
@@ -441,11 +479,11 @@
 그림~\ref{fig:vertical},~\ref{fig:vertical3} 및 \ref{fig:vertical2} 참조.
 
 문서 전체를 세로쓰기한다면 이 환경을 쓰는 대신
-\cs{verticaltypesetting} 명령을 전처리부에 선언한다.
+\pkgkwd{\verticaltypesetting} 명령을 전처리부에 선언한다.
 이때 면주는 가로로 식자되며 면주 폰트의 설정은 사용자의 몫이다.
 
 세로쓰기 도중에 문서의 일부를 가로쓰기하려면
-\cs{begin{horizontal}{<dimen>}} \ldots\ \cs{end{horizontal}}
+|\begin{|\pkgkwd{horizontal}|}{<dimen>}| \ldots\ |\end{horizontal}|
 환경을 이용한다. |<dimen>|은 가로쓰기 박스의 너비를 지시한다.%
 \footnote{%
   플레인텍에서는 \cs{horizontal{<dimen>}} \ldots\ \cs{endhorizontal}. }
@@ -454,7 +492,7 @@
 
 \begin{figure}
 \framebox[\linewidth]{\begin{vertical}{16.66em}\sffamily
-  \addhangulfontfeature{Vertical=Alternates, CharRaise=3.2pt,
+  \addhangulfontfeature{Renderer=Node, Vertical=Alternates, CharRaise=3.2pt,
   CompressPunctuations, CharacterWidth=Full, RawFeature=vertical}
   \parindent-1em\leftskip1em \linespread{1.5}\selectfont
   \spaceskip=.5em plus.25em minus.125em
@@ -480,15 +518,16 @@
 
 \section{드러냄표}\label{sec:dotemph}
 
-\cs{dotemph} 명령으로 \dotemph{드러냄표}%
+\pkgkwd{\dotemph} 명령으로 \dotemph{드러냄표}%
 를 이용한 강조를 할 수 있다.  기본은 글자 위에 점을 찍는 형태이나
 다음과 같이 명령을 주어 개인적으로 선호하는 기호를 드러냄표로 쓸 수
 있다.
 
 \medskip
-①~|\def\dotemphraise{0.4em }|: 드러냄표를 피강조 글자 위로 끌어올리는 길이
+①~|\def|\pkgkwd{\dotemphraise}|{0.4em }|:
+드러냄표를 피강조 글자 위로 끌어올리는 길이
 
-②~|\def\dotemphchar{\bfseries ^^^^02d9}|: 드러냄표 기호 자체를 정의.
+②~|\def|\pkgkwd{\dotemphchar}|{\bfseries ^^^^02d9}|: 드러냄표 기호 자체를 정의.
 
 \section{루비}\label{sec:ruby}
 
@@ -495,19 +534,19 @@
 루비를 달 수 있다. ruby 패키지가 이미 존재하지만 \luatexko와 궁합이 잘
 맞지 않아 새로 매크로를 제공한다.
 \begin{quote}
-  \cs{ruby{漢字}{한자}}\quad$\Rightarrow$\quad\ruby{漢字}{한자}
+  \pkgkwd{\ruby}|{漢字}{한자}|\quad$\Rightarrow$\quad\ruby{漢字}{한자}
 \end{quote}
 이처럼 글자별로 따로 루비를 달 필요가 없다.  관련 설정은 다음처럼
 한다.
 
 \medskip
-①~\cs{rubyfont}: 루비를 식자할 폰트를 지시해 둔다. 기본값은 현재 폰트%
+①~\pkgkwd{\rubyfont}: 루비를 식자할 폰트를 지시해 둔다. 기본값은 현재 폰트%
 \footnote{%
   루비는 글자 크기가 작기 때문에 본문 폰트보다 약간 굵은 폰트로
   지정하는 것이 좋다. }
 
-②~|\def\rubysize{0.6}|: 루비 글자 크기를 본문 글자 크기에 대한 비율로
-지정%
+②~|\def|\pkgkwd{\rubysize}|{0.6}|:
+루비 글자 크기를 본문 글자 크기에 대한 비율로 지정%
 \footnote{%
   플레인텍에서는 루비의 글꼴크기를 따로 조정해주지 않는다.
   사용자가 \cs{rubyfont}를 설정할 때 크기도 함께 지시하도록 한다.
@@ -515,21 +554,28 @@
   \leftskip=3em\noindent
   |\\font\\rubyfont=UnBatang at \\rubysize em| }
 
-③~|\def\rubysep{0.1ex}|: 루비와 본문 글자 사이의 간격을 지정
+③~|\def|\pkgkwd{\rubysep}|{0.1ex}|: 루비와 본문 글자 사이의 간격을 지정
 
-④~\cs{rubynooverlap}: 루비의 폭이 본문 글자의 폭보다 클 때 루비가 이웃
+④~\pkgkwd{\rubynooverlap}: 루비의 폭이 본문 글자의 폭보다 클 때 루비가 이웃
 글자들 위로 삐져나가지 못하게 한다. 본문 글자의 흐름을 중시하여
-\cs{rubyoverlap}을 기본값으로 하였으므로 이는 따로 선언할 필요가 없다.
+\pkgkwd{\rubyoverlap}을 기본값으로 하였으므로 이는 따로 선언할 필요가 없다.
 
 \medskip
 한편, 연속된 본문 글자들에 각각 한 글자씩 루비를 달고자 한다면
-\cs{xxruby{...}{...}} 명령을 사용한다. 글자들 사이에 줄바꿈이 허용된다.
+\pkgkwd{\xxruby}|{...}{...}| 명령을 사용한다. 글자들 사이에 줄바꿈이 허용된다.
 두 인자의 글자 수가 동일해야 한다.
 
 \section{밑줄긋기}\label{sec:uline}
 
-ulem 패키지가 \luatexko와 궁합이 잘 맞지 않아{\small (줄바꿈에 문제가 있음)}
-명령을 따로 제공한다.
+ulem 패키지가 \luatexko와 궁합이 맞지 않아{\small (줄바꿈에 문제가 있음)}
+명령을 따로 제공한다.%
+\pkgkwd*{\uline}%
+\pkgkwd*{\sout}%
+\pkgkwd*{\uuline}%
+\pkgkwd*{\xout}%
+\pkgkwd*{\uwave}%
+\pkgkwd*{\dashuline}%
+\pkgkwd*{\dotuline}
 
 \def\RA{\>$\Rightarrow$\>}
 \begin{tabbing}
@@ -546,12 +592,13 @@
 관련하여 다음 설정을 할 수 있다.
 
 \medskip
-①~|\def\ulinedown{0.5ex}|: 밑줄을 베이스라인 아래로 끌어내리는 정도
+①~|\def|\pkgkwd{\ulinedown}|{0.5ex}|: 밑줄을 베이스라인 아래로 끌어내리는 정도
 
-②~|\def\ulinewidth{0.04em}|: 밑줄의 굵기
+②~|\def|\pkgkwd{\ulinewidth}|{0.04em}|: 밑줄의 굵기
 
 \medskip
-사실 위 밑줄 양식들을 만드는 데는 예외없이 \cs{markoverwith} 명령이 사용되었다.
+사실 위 밑줄 양식들을 만드는 데는 예외없이
+\pkgkwd{\markoverwith} 명령이 사용되었다.
 따라서 사용자는 이를 이용해 원하는 양식을 만들 수 있다.
 가령 노란색 마커펜을 흉내내려면,%
 \footnote{%
@@ -577,7 +624,7 @@
 
 자동조사는 \kotex 과 동일하게 \cs{은} \cs{는} \cs{이} \cs{가} \cs{을} \cs{를}
 \cs{와} \cs{과} \cs{로} \cs{으로} \cs{라} \cs{이라} 따위를 사용한다.
-버전 1.3부터는 \cs{josaignoreparens=1}이 선언되어 있으면 자동조사는
+버전 1.3부터는 \pkgkwd{\josaignoreparens}|=1|이 선언되어 있으면 자동조사는
 \hemph{괄호 부분을 건너뛰고} 그 앞 글자에 매칭한다.
 |0|이 선언되면 원래 방식으로 돌아간다.
 \begin{quote}
@@ -614,7 +661,8 @@
   |\\font\\scripthangul="Noto Sans CJK KR Regular" at 7pt|\\
   |\\font\\scriptscripthangul="Noto Sans CJK KR Medium" at 5pt|\\
   |\\setmathhangulfonts\\texthangul\\scripthangul\\scriptscripthangul| }
-v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.
+v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.%
+\pkgkwd*{\setmathhangulfont}
 \begin{verbatim}
   \setmathhangulfont{Noto Sans CJK KR}[
     SizeFeatures={
@@ -623,9 +671,9 @@
       {Size=9-,  Font=* DemiLight},
     } ]
 \end{verbatim}
-현재 한글만 쓸 수 있게 설정되어 있다.
-한자도 수식에 직접 입력하려면 사용자는
-다음 명령으로 유니코드 블럭을 추가 지정해야 한다.
+현재 한글만 쓸 수 있게 설정되어 있다. 한자도 수식에 직접 입력하려면 사용자는
+다음 명령으로 유니코드 블럭을 추가 지정해야 한다.%
+\pkgkwd*{\setmathhangulblock}
 \begin{verbatim}
   \setmathhangulblock{4E00}{9FC3}
 \end{verbatim}
@@ -638,9 +686,9 @@
   \cs{onum} \cs{pnum} \cs{oeng} \cs{peng} \cs{hnum} \cs{Hnum}
   \cs{hroman} \cs{hRoman} \cs{hNum} \cs{hanjanum} 따위를 사용한다. }
 
-\section{입력 변환}\label{sec:noramlize}
+\section{입력 변환}\label{sec:normalize}
 
-\cs{luatexhangulnormalize=1}이라 지시하면 첫가끝 자모를 완성형 음절로,
+\pkgkwd{\luatexhangulnormalize}|=1|이라 지시하면 첫가끝 자모를 완성형 음절로,
 |2|라면 완성형 음절을 첫가끝 자모로 인코딩 변환한다. |0|이 할당되면
 인코딩 변환 기능이 꺼진다. \XeTeX의 \cs{XeTeXinputnormalization} 명령과
 유사하나, 오직 한글과 일부 한자에 대해서만 정규화가 작동할 뿐이다.
@@ -650,15 +698,14 @@
 권장하지 않지만 불가피하게 입력 인코딩이 UHC (Unified Hangul Code)%
 \footnote{%
   CP949라고도 하며 EUC-KR을 포함한다. }%
-로 되어 있는 파일을 처리할 때는
-\cs{luatexuhcinputencoding=1}을 선언한다.
-|0|을 할당하면 다시 UTF-8 입력으로 간주한다.
-\XeTeX의 \cs{XeTeXinputencoding} 명령과 유사하나, 오직 한국어 문자만 처리할 수
-있다.%
+로 되어 있는 파일을 처리할 때는 \pkgkwd{\luatexuhcinputencoding}|=1|을 선언한다.
+|0|을 할당하면 다시 UTF-8 입력으로 간주한다. \XeTeX의 \cs{XeTeXinputencoding}
+명령과 유사하나, 오직 한국어 문자만 처리할 수 있다.%
 \footnote{%
   윈도 운영체제에서의 한글 파일이름 불러오기 기능은 v2.0부터는 제공하지 않는다.
   대신 |luatex -cmdx ...|, |lualatex -cmdx ...|와 같이 컴파일시 명령행에
   |-cmdx| 옵션을 주면 된다고 하니 테스트해 보시기 바란다. }
+
 \hfill \fboxsep=-\fboxrule \fbox{\vbox to 1em{\hbox to 1em{\hss}\vss}}
 
 \end{document}

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua	2019-12-02 21:58:50 UTC (rev 53000)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua	2019-12-02 21:59:03 UTC (rev 53001)
@@ -13,8 +13,8 @@
 
 luatexbase.provides_module({
   name        = "luatexko-normalize",
-  version     = "2.4",
-  date        = "2019/08/01",
+  version     = "2.5",
+  date        = "2019/12/01",
   author      = "Dohyun Kim, Soojin Nam",
   description = "Hangul normalization",
   license     = "LPPL v1.3+",

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua	2019-12-02 21:58:50 UTC (rev 53000)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua	2019-12-02 21:59:03 UTC (rev 53001)
@@ -13,8 +13,8 @@
 
 luatexbase.provides_module({
   name        = "luatexko-uhc2utf8",
-  version     = "2.4",
-  date        = "2019/08/01",
+  version     = "2.5",
+  date        = "2019/12/01",
   author      = "Dohyun Kim, Soojin Nam",
   description = "UHC (CP949) input encoding",
   license     = "LPPL v1.3+",

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua	2019-12-02 21:58:50 UTC (rev 53000)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua	2019-12-02 21:59:03 UTC (rev 53001)
@@ -13,8 +13,8 @@
 
 luatexbase.provides_module {
   name        = 'luatexko',
-  date        = '2019/08/01',
-  version     = '2.4',
+  date        = '2019/12/01',
+  version     = '2.5',
   description = 'typesetting Korean with LuaTeX',
   author      = 'Dohyun Kim, Soojin Nam',
   license     = 'LPPL v1.3+',
@@ -59,9 +59,13 @@
 
 local set_macro = token.set_macro
 
+local mathmax = math.max
+
 local stringformat = string.format
+local stringunpack = string.unpack
 
 local tableconcat = table.concat
+local tableinsert = table.insert
 local tableunpack = table.unpack
 
 local add_to_callback       = luatexbase.add_to_callback
@@ -230,8 +234,8 @@
   if type(fontdata) == "number" then
     fontdata = get_font_data(fontdata)
   end
-  if fontdata.shared then
-    return fontdata.shared.features[optionname]
+  if fontdata.specification then
+    return fontdata.specification.features.normal[optionname]
   end
 end
 
@@ -245,6 +249,28 @@
   return t.luatexko
 end
 
+local function is_harf (f)
+  if type(f) == "number" then
+    f = get_font_data(f)
+  end
+  return f.hb
+end
+
+local function is_not_harf (f)
+  if option_in_font(f, "mode") == "harf" then -- mode=harf with non-luahbtex
+    return false
+  end
+  return not is_harf(f)
+end
+
+local function harf_reordered_tonemark (curr)
+  if is_harf(curr.font) then
+    local props = getproperty(curr) or {}
+    local actualtext = props.luaotfload_startactualtext or ""
+    return actualtext:find"302[EF]$"
+  end
+end
+
 -- font fallback
 
 local force_hangul = {
@@ -283,6 +309,8 @@
 local active_processes = {}
 
 local char_font_options = {
+  ascender         = {},
+  charraise        = {},
   hangulspaceskip  = {},
   intercharacter   = {},
   intercharstretch = {},
@@ -292,7 +320,7 @@
 }
 
 local function hangul_space_skip (curr, newfont)
-  if curr.lang ~= nohyphen then
+  if curr.lang ~= nohyphen and curr.font ~= newfont then
     local n = getnext(curr)
     if n and n.id == glueid and n.subtype == spaceskip then
       local params = getparameters(curr.font)
@@ -306,17 +334,24 @@
 
         local newwd = char_font_options.hangulspaceskip[newfont]
         if newwd == nil then
-          local newsp = nodecopy(curr)
-          newsp.char, newsp.font = 32, newfont
-          newsp = nodes.simple_font_handler(newsp)
-          newwd = newsp and newsp.width or false
-          if newwd then
-            newwd = { texsp(newwd), texsp(newwd/2), texsp(newwd/3) }
+          if is_harf(newfont) then
+            newwd = getparameters(newfont) or false
+            if newwd then
+              newwd = { newwd.space, newwd.space_stretch, newwd.space_shrink }
+            end
+          else
+            local newsp = nodecopy(curr)
+            newsp.char, newsp.font = 32, newfont
+            newsp = nodes.simple_font_handler(newsp)
+            newwd = newsp and newsp.width or false
+            if newwd then
+              newwd = { texsp(newwd), texsp(newwd/2), texsp(newwd/3) }
+            end
+            if newsp then
+              nodefree(newsp)
+            end
           end
           char_font_options.hangulspaceskip[newfont] = newwd
-          if newsp then
-            nodefree(newsp)
-          end
         end
         if newwd then
           setglue(n, newwd[1], newwd[2], newwd[3])
@@ -345,6 +380,7 @@
 
           if not active_processes.reorderTM and
              hangul_tonemark[c] and
+             is_not_harf(curr.font) and
              option_in_font(curr.font, "script") == "hang" then
             luatexko.activate("reorderTM") -- activate reorderTM here
             active_processes.reorderTM = true
@@ -410,6 +446,7 @@
   { [0] = {1,0},  {1,0},  nil,    {1.5,.5},nil,    {1,0},  {1,0} },
   { [0] = nil,    {1,1},  nil,    {.5,.5} },
   { [0] = {1,1},  {1,1},  nil,    {.5,.5} },
+  { }, -- vertical colon
 }
 
 local charclass = setmetatable({
@@ -447,8 +484,8 @@
 }, { __index = charclass })
 
 local vert_charclass = setmetatable({
-  [0xFF1A] = 5, -- 0xFE13
-  [0xFF1B] = 5, -- 0xFE14
+  [0xFF1A] = 7, -- 0xFE13
+  [0xFF1B] = 7, -- 0xFE14
 }, { __index = charclass })
 
 local function get_char_class (c, classic)
@@ -579,7 +616,7 @@
 local function get_actualtext (curr)
   local actual = my_node_props(curr).startactualtext
   if type(actual) == "table" then
-     return actual[0], actual[1], actual[#actual]
+     return actual.init, actual[1], actual[#actual]
   end
 end
 
@@ -586,11 +623,10 @@
 local function goto_end_actualtext (curr)
   local n = getnext(curr)
   while n do
-    if n.id == whatsitid
-      and n.mode == directmode
-      and my_node_props(n).endactualtext then
-      curr = n
-      break
+    if n.id == whatsitid and
+       n.mode == directmode and
+       my_node_props(n).endactualtext then
+      curr = n; break
     end
     n = getnext(n)
   end
@@ -731,7 +767,8 @@
         if class >= 1 and class <= 4 and
           (old or cc < 0x2000 or cc > 0x202F) then -- exclude general puncts
 
-          local gpos = class == 1 and getprev(curr) or getnext(curr)
+          -- harf-node always puts kern after the glyph
+          local gpos = class == 1 and is_not_harf(curr.font) and getprev(curr) or getnext(curr)
           gpos = gpos and gpos.id == kernid and gpos.subtype == fontkern
 
           if not gpos then
@@ -898,7 +935,6 @@
         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, pcl, 0x30, pf, par)
@@ -962,7 +998,7 @@
           end
           if ok then
             head = noderemove(head, curr)
-            to_free[#to_free + 1] = curr
+            tableinsert(to_free, curr)
             break
           end
         end
@@ -1048,9 +1084,9 @@
     local id = n.id
     if id == glyphid then
       local c = my_node_props(n).unicode or n.char -- beware hlist/vlist
-      if ignore_parens and c == 0x29 then
+      if ignore_parens and c == 0x29 then -- )
         parenlevel = parenlevel + 1
-      elseif ignore_parens and c == 0x28 then
+      elseif ignore_parens and c == 0x28 then -- (
         parenlevel = parenlevel - 1
       elseif parenlevel <= 0 then
         josacode = josa_code[c]
@@ -1091,7 +1127,7 @@
             curr.char = cc
           else
             head = noderemove(head, curr)
-            tofree[#tofree + 1] = curr
+            tableinsert(tofree, curr)
           end
         end
         unset_attribute(curr, autojosaattr)
@@ -1107,6 +1143,26 @@
 
 -- dotemph
 
+local function shift_put_top (bot, top)
+  local shift = top.shift or 0
+
+  if bot.id == hlistid then
+    bot = has_glyph(bot.list) or {}
+  end
+  local bot_off = bot.yoffset or 0
+
+  if bot_off ~= 0 then
+    if top.id == hlistid then
+      top = has_glyph(top.list) or {}
+    end
+    local top_off = top.yoffset or 0
+
+    return shift + top_off - bot_off
+  end
+
+  return shift
+end
+
 local dotemphbox = {}
 luatexko.dotemphbox = dotemphbox
 
@@ -1123,6 +1179,12 @@
            is_chosong(c)     or
            is_hanja(c)       or
            is_kana(c)        then
+
+          -- harf font: skip reordered tone mark
+          if harf_reordered_tonemark(curr) then
+            curr = getnext(curr)
+          end
+
           local currwd = curr.width
           if currwd >= get_en_size(curr.font) then
             local box = nodecopy(dotemphbox[dotattr])
@@ -1133,6 +1195,10 @@
               k.kern = shift
               box.list = insert_before(list, list, k)
             end
+
+            -- consider charraise
+            box.shift = shift_put_top(curr, box)
+
             box.width = 0
             head = insert_before(head, curr, box)
             tofree[dotattr] = true
@@ -1299,6 +1365,42 @@
   return head
 end
 
+local os2tag = luaotfload.harfbuzz and luaotfload.harfbuzz.Tag.new"OS/2"
+
+-- luaharfbuzz's Font:get_h_extents() gets ascender value from hhea table;
+-- Node mode's parameters.ascender is gotten from OS/2 table.
+-- TypoAscender in OS/2 table seems to be more suitable for our purpose.
+local function get_font_ascender (f)
+  local ascender = char_font_options.ascender
+  local ascend = ascender[f]
+  if ascend == nil then
+    local hb = is_harf(f)
+    if hb and os2tag then
+      local hbface = hb.shared.face
+      local tags = hbface:get_table_tags()
+      local hasos2 = false
+      for _,v in ipairs(tags) do
+        if v == os2tag then
+          hasos2 = true
+          break
+        end
+      end
+      if hasos2 then
+        local os2 = hbface:get_table(os2tag)
+        local length = os2:get_length()
+        if length > 69 then -- sTypoAscender (int16)
+          local data = os2:get_data()
+          local typoascender = stringunpack(">h", data, 69)
+          ascend = typoascender * hb.scale
+        end
+      end
+    end
+    ascend = ascend or get_font_param(f, "ascender") or false
+    ascender[f] = ascend
+  end
+  return ascend
+end
+
 local function process_ruby_post_linebreak (head)
   local curr = head
   while curr do
@@ -1316,9 +1418,13 @@
             ruby.list = insert_before(list, list, k)
           end
           ruby.width = 0
+
+          -- consider charraise
+          local shift = shift_put_top(curr, ruby)
+
           local _, f = ruby_char_font(curr)
-          local ascender = get_font_param(f, "ascender") or curr.height
-          ruby.shift = -ascender - ruby.depth - ruby_t[2] -- rubysep
+          local ascender = get_font_ascender(f) or curr.height
+          ruby.shift = shift - ascender - ruby.depth - ruby_t[2] -- rubysep
           head = insert_before(head, curr, ruby)
         end
         ruby_t = nil
@@ -1387,72 +1493,68 @@
 end
 
 local function process_reorder_tonemarks (head)
-  local curr = head
+  local curr, init = head
   while curr do
     local id = curr.id
-    if id == glyphid and option_in_font(curr.font, "script") == "hang" then
+    if id == glyphid and
+       is_not_harf(curr.font) and
+       option_in_font(curr.font, "script") == "hang" then
+
       local fontdata = get_font_data(curr.font)
       local uni = my_node_props(curr).unicode or curr.char
       if is_hangul(uni) or is_chosong(uni) or uni == 0x25CC then
-
-        local syllable = { [0]=curr, uni }
-
-        local n = getnext(curr)
-        while n do
-          local nid = n.id
-          if nid == glyphid then
-            local u = my_node_props(n).unicode or n.char
-            if   is_jungsong(u)
-              or is_jongsong(u)
-              or hangul_tonemark[u] then
-              syllable[#syllable + 1] = u
-              curr, uni = n, u
-            else
-              break
+        init = curr
+      elseif is_jungsong(uni) or is_jongsong(uni) then
+      elseif hangul_tonemark[uni] then
+        if init then
+          local n, syllable = init, { init = init }
+          while n do
+            if n.id == glyphid then
+              local u = my_node_props(n).unicode or n.char
+              if u then tableinsert(syllable, u) end
             end
-          elseif nid ~= kernid or n.subtype == userkern then
-            break
+            if n == curr then break end
+            n = getnext(n)
           end
-          n = getnext(n)
-        end
 
-        if #syllable > 1
-          and hangul_tonemark[uni]
-          and get_tonemark_width(curr, uni) ~= 0 then
+          if #syllable > 1 and get_tonemark_width(curr, uni) ~= 0 then
+            local TM = curr
 
-          local ini, fin = syllable[0], curr
-          local actual = pdfliteral_direct_actual(syllable)
-          local endactual = pdfliteral_direct_actual()
-          head = insert_before(head, ini, actual)
-          head, curr = insert_after(head, curr, endactual)
+            local actual    = pdfliteral_direct_actual(syllable)
+            local endactual = pdfliteral_direct_actual()
+            head = insert_before(head, init, actual)
+            head, curr = insert_after(head, curr, endactual)
 
-          head = noderemove(head, fin)
-          head = insert_before(head, ini, fin)
+            head = noderemove(head, TM)
+            head = insert_before(head, init, TM)
+          end
+
+          init = nil
+        elseif char_in_font(fontdata, 0x25CC) then -- isolated tone mark
+          local dotcircle = nodecopy(curr)
+          dotcircle.char = 0x25CC
+          if get_tonemark_width(curr, uni) ~= 0 then
+            local actual    = pdfliteral_direct_actual{ init = curr, uni }
+            local endactual = pdfliteral_direct_actual()
+            head = insert_before(head, curr, actual)
+            head, curr = insert_after(head, curr, dotcircle)
+            head, curr = insert_after(head, curr, endactual)
+          else
+            head = insert_before(head, curr, dotcircle)
+          end
         end
 
-      elseif hangul_tonemark[uni] -- isolated tone mark
-        and char_in_font(fontdata, 0x25CC) then
-
-        local dotcircle = nodecopy(curr)
-        dotcircle.char = 0x25CC
-        if get_tonemark_width(curr, uni) ~= 0 then
-          local actual = pdfliteral_direct_actual{ [0]=curr, uni }
-          local endactual = pdfliteral_direct_actual()
-          head = insert_before(head, curr, actual)
-          head, curr = insert_after(head, curr, dotcircle)
-          head, curr = insert_after(head, curr, endactual)
-        else
-          head = insert_before(head, curr, dotcircle)
-        end
+      else
+        init = nil
       end
-    elseif id == whatsitid
-      and curr.mode == directmode
-      and my_node_props(curr).startactualtext then
-
-      curr = goto_end_actualtext(curr)
-
-    elseif id == mathid then
-      curr = end_of_math(curr)
+    elseif id == kernid and curr.subtype ~= userkern then -- skip
+    elseif id == whatsitid then
+      if curr.mode == directmode and my_node_props(curr).startactualtext then
+        curr, init = goto_end_actualtext(curr), nil
+      end
+    else
+      init = nil
+      if id == mathid then curr = end_of_math(curr) end
     end
     curr = getnext(curr)
   end
@@ -1587,12 +1689,21 @@
   end
 end
 
+local function fontdata_warning(activename, ...)
+  if not active_processes[activename] then
+    warning(...)
+    active_processes[activename] = true
+  end
+end
+
 local function process_vertical_font (fontdata)
   local subfont = fontdata.specification and fontdata.specification.sub
   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.fullname)
+    local fullname = fontdata.fullname
+    fontdata_warning("vertical."..fullname,
+    "Vertical metrics table (vmtx) not found in the font\n`%s'", fullname)
     return
   end
 
@@ -1690,24 +1801,23 @@
 
 -- charraise
 
-local function process_charriase_font (fontdata)
-  local raise = fontdata_opt_dim(fontdata, "charraise")
-  if raise then
-    local shared = fontdata.shared or {}
-    local descriptions = shared.rawdata and shared.rawdata.descriptions or {}
-    local scale = fontdata.parameters.factor or 655.36
-    for i, v in pairs( fontdata.characters ) do
-      v.commands = {
-        {"down", -raise },
-        {"char", i},
-      }
-      local bbox = descriptions[i] and descriptions[i].boundingbox or {0,0,0,0}
-      local ht = bbox[4] * scale + raise
-      local dp = bbox[2] * scale + raise
-      v.height = ht > 0 and  ht or nil
-      v.depth  = dp < 0 and -dp or nil
+local function process_charraise (head)
+  local curr = head
+  while curr do
+    if curr.id == glyphid then
+      local f = curr.font
+      local raise = get_font_opt_dimen(f, "charraise")
+      if raise and not option_in_font(f, "vertical") then
+        local props = my_node_props(curr)
+        if not props.charraised then
+          curr.yoffset = (curr.yoffset or 0) + raise
+          props.charraised = true
+        end
+      end
     end
+    curr = getnext(curr)
   end
+  return head
 end
 
 -- fake italic correctioin
@@ -1718,28 +1828,34 @@
     local id = curr.id
     if id == kernid then
       if curr.subtype == italcorr and curr.kern == 0 then
-        local p = getprev(curr)
-        while p do -- skip jungsong/jongsong
-          if p.id == glyphid and p.width < get_en_size(p.font) then
+        local p, t = getprev(curr), {}
+        while p do
+          if p.id == glyphid then
+            -- harf font: break before reordered tone mark
+            if harf_reordered_tonemark(p) then
+              break
+            end
+
+            local slant = option_in_font(p.font, "slant")
+            if slant and slant > 0 then
+              tableinsert(t, char_in_font(p.font, p.char).italic or 0)
+            end
+
             local c = my_node_props(p).unicode or p.char
-            if not is_jungsong(c) and not is_jongsong(c) then
+            if is_jungsong(c) or is_jongsong(c) or hangul_tonemark[c] then
+            else
               break
             end
-          elseif p.id == whatsitid
-            and p.mode == directmode
-            and my_node_props(p).endactualtext then -- skip
           else
             break
           end
           p = getprev(p)
         end
-        if p.id == glyphid then
-          local fontdata = get_font_data(p.font)
-          if fontdata.slant and fontdata.slant > 0 then
-            local italic = char_in_font(fontdata, p.char).italic
-            if italic then
-              curr.kern = italic
-            end
+
+        if p.id == glyphid and #t > 0 then
+          local italic = mathmax(tableunpack(t))
+          if italic > 0 then
+            curr.kern = italic
           end
         end
       end
@@ -1757,12 +1873,33 @@
     fsl = fsl/1000
     local params = fontdata.parameters or {}
     params.slant = (params.slant or 0) + fsl*65536 -- slant per point
-    local scale  = params.factor or 655.36
+
+    local hb = is_harf(fontdata)
+    local scale  = hb and hb.scale or params.factor or 655.36
+
     local shared = fontdata.shared or {}
-    local descriptions = shared.rawdata and shared.rawdata.descriptions or {}
+    local descrs = shared.rawdata and shared.rawdata.descriptions or {}
+
     for i, v in pairs(fontdata.characters) do
-      local bbox = descriptions[i] and descriptions[i].boundingbox or {0,0,0,0}
-      local italic = (v.height or 0) * fsl - (v.width or 0) + bbox[3]*scale
+      local ht   = v.height and v.height > 0 and v.height or 0
+      local wd   = v.width  and v.width  > 0 and v.width  or 0
+      local rbearing = 0
+
+      if wd > 0 then -- or, jong/jung italic could by very large value
+        if hb then
+          local extents = hb.shared.font:get_glyph_extents(v.index)
+          if extents then
+            rbearing = wd - (extents.x_bearing + extents.width)*scale
+          end
+        else
+          local bbox = descrs[i] and descrs[i].boundingbox
+          if bbox then
+            rbearing = wd - bbox[3]*scale
+          end
+        end
+      end
+
+      local italic = ht * fsl - rbearing
       if italic > 0 then
         v.italic = italic
       end
@@ -1773,38 +1910,42 @@
 -- wrap up
 
 local pass_fun = function(...) return ... end
-create_callback("luatexko_pre_hpack", "data", pass_fun)
-create_callback("luatexko_pre_prelinebreak", "data", pass_fun)
-create_callback("luatexko_post_hpack", "data", pass_fun)
-create_callback("luatexko_post_prelinebreak", "data", pass_fun)
+create_callback("luatexko_hpack_first",         "data", pass_fun)
+create_callback("luatexko_prelinebreak_first",  "data", pass_fun)
+create_callback("luatexko_hpack_second",        "data", pass_fun)
+create_callback("luatexko_prelinebreak_second", "data", pass_fun)
 
 add_to_callback("hpack_filter", function(h)
   h = process_fonts(h)
-  h = call_callback("luatexko_pre_hpack", h)
-  h = call_callback("luatexko_post_hpack", h)
+  h = call_callback("luatexko_hpack_first", h)
+  h = call_callback("luatexko_hpack_second", h)
   return process_linebreak(h)
 end, "luatexko.hpack_filter.pre_rendering", 1)
 
 add_to_callback("pre_linebreak_filter", function(h)
   h = process_fonts(h)
-  h = call_callback("luatexko_pre_prelinebreak", h, true)
-  h = call_callback("luatexko_post_prelinebreak", h, true)
+  h = call_callback("luatexko_prelinebreak_first", h, true)
+  h = call_callback("luatexko_prelinebreak_second", h, true)
   return process_linebreak(h, true)
 end, "luatexko.pre_linebreak_filter.pre_rendering", 1)
 
 local font_opt_procs = {
   removeclassicspaces = {
-    luatexko_pre_hpack        = process_remove_spaces,
-    luatexko_pre_prelinebreak = process_remove_spaces,
+    luatexko_hpack_first        = process_remove_spaces,
+    luatexko_prelinebreak_first = process_remove_spaces,
   },
   interhangul = {
-    luatexko_post_hpack        = process_interhangul,
-    luatexko_post_prelinebreak = process_interhangul,
+    luatexko_hpack_second        = process_interhangul,
+    luatexko_prelinebreak_second = process_interhangul,
   },
   interlatincjk = {
-    luatexko_post_hpack        = process_interlatincjk,
-    luatexko_post_prelinebreak = process_interlatincjk,
+    luatexko_hpack_second        = process_interlatincjk,
+    luatexko_prelinebreak_second = process_interlatincjk,
   },
+  charraise = {
+    hpack_filter         = process_charraise,
+    pre_linebreak_filter = process_charraise,
+  },
   compresspunctuations = {
     hpack_filter         = process_glyph_width,
     pre_linebreak_filter = process_glyph_width,
@@ -1815,50 +1956,73 @@
   },
 }
 
-local function process_patch_font (fontdata)
-  for name, procs in pairs( font_opt_procs ) do
-    if not active_processes[name] and option_in_font(fontdata, name) then
-      for cbnam, cbfun in pairs( procs ) do
-        add_to_callback(cbnam, cbfun, "luatexko."..cbnam.."."..name)
-      end
-      active_processes[name] = true
+local font_opt_procs_single = {
+  expansion = function()
+    if not active_processes.expansion then
+      texset("global", "adjustspacing", 2)
+      active_processes.expansion = true
     end
-  end
+  end,
 
-  if not active_processes.expansion
-    and option_in_font(fontdata, "expansion") then
-    texset("global", "adjustspacing", 2)
-    active_processes.expansion = true
-  end
-
-  if option_in_font(fontdata, "protrusion") then
+  protrusion = function(fontdata)
     if not active_processes.protrusion then
       texset("global", "protrudechars", 2)
       active_processes.protrusion = true
     end
-    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.fullname)
-      active_processes[fontdata.fullname] = true
+    if option_in_font(fontdata, "compresspunctuations") then
+      local fullname = fontdata.fullname
+      fontdata_warning("protrude."..fullname,
+      "Both `compresspunctuations' and `protrusion' are\nenabled for `%s'.\n"..
+      "Beware bad justifications.", fullname)
     end
-  end
+  end,
 
-  if option_in_font(fontdata, "vertical") then
-    process_vertical_font(fontdata)
-  elseif option_in_font(fontdata, "charraise") then
-    process_charriase_font(fontdata)
+  slant = process_fake_slant_font,
+
+  vertical = function(fontdata)
+    local fullname = fontdata.fullname
+    if is_harf(fontdata) then
+      fontdata_warning("vertical."..fullname,
+      "Currently, vertical writing is not supported\nby harf mode."..
+      "`Renderer=Node' option is needed for\n`%s'", fullname)
+    elseif fontdata.type == "virtual" then
+      fontdata_warning("vitrual."..fullname,
+      "Virtual font `%s' cannot be\nused for vertical writing.", fullname)
+    else
+      process_vertical_font(fontdata)
+    end
+  end,
+}
+
+local function process_patch_font (fontdata)
+  if type(fontdata) ~= "table" or
+     fontdata.format ~= "opentype" and fontdata.format ~= "truetype" then
+    return
+  end -- as we have called patch_font_unsafe for hb fonts
+
+  for name, procs in pairs( font_opt_procs ) do
+    if not active_processes[name] and option_in_font(fontdata, name) then
+      if name == "charraise" and option_in_font(fontdata, "vertical") then
+      else
+        for cbnam, cbfun in pairs( procs ) do
+          add_to_callback(cbnam, cbfun, "luatexko."..cbnam.."."..name)
+        end
+        active_processes[name] = true
+      end
+    end
   end
 
-  if option_in_font(fontdata, "slant") then
-    process_fake_slant_font(fontdata)
+  for name, func in pairs( font_opt_procs_single ) do
+    if option_in_font(fontdata, name) then
+      func(fontdata)
+    end
   end
 end
 
 add_to_callback("luaotfload.patch_font", process_patch_font,
 "luatexko.patch_font")
+add_to_callback("luaotfload.patch_font_unsafe", process_patch_font,
+"luatexko.patch_font")
 
 local auxiliary_procs = {
   dotemph = {
@@ -1875,12 +2039,12 @@
     vpack_filter         = process_ruby_post_linebreak,
   },
   autojosa = {
-    luatexko_pre_hpack        = process_josa,
-    luatexko_pre_prelinebreak = process_josa,
+    luatexko_hpack_first        = process_josa,
+    luatexko_prelinebreak_first = process_josa,
   },
   reorderTM = {
-    luatexko_pre_hpack        = process_reorder_tonemarks,
-    luatexko_pre_prelinebreak = process_reorder_tonemarks,
+    luatexko_hpack_first        = process_reorder_tonemarks,
+    luatexko_prelinebreak_first = process_reorder_tonemarks,
   },
 }
 
@@ -1939,12 +2103,13 @@
                          "pre_linebreak_filter",
                          "vpack_filter",
                          "hyphenate",
+                         "luaotfload.patch_font_unsafe", -- added for harf
                          "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 }
+        tableinsert(t, { ff, dd, i })
       end
     end
     luatexko.deactivated[name] = t

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty	2019-12-02 21:58:50 UTC (rev 53000)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty	2019-12-02 21:59:03 UTC (rev 53001)
@@ -13,7 +13,7 @@
 
 \ifdefined\luatexkohangulfontattr \endinput\fi
 \ifdefined\selectfont
-  \ProvidesPackage{luatexko}[2019/08/01 v2.4 typesetting Korean with LuaTeX]
+  \ProvidesPackage{luatexko}[2019/12/01 v2.5 typesetting Korean with LuaTeX]
   \RequirePackage{luatexbase}
   \RequirePackage{fontspec}
 \else
@@ -149,7 +149,8 @@
   \directlua{
     if \the\luatexkoulinecount == 1 then luatexko.activate("uline") end
     luatexko.ulboundary(\the\count@, tex.box[0].list, \luatexkoleaderstype)
-  }#2\directlua{
+  }#2\relax
+  \directlua{
     luatexko.ulboundary(\the\count@)
   }\endgroup }
 \protected\def\uline{\markoverwith{%
@@ -309,8 +310,10 @@
   \else \directlua{ luatexko.uhc2utf8.startconvert() }%
   \fi}
 % actualtext not provided
-\protected\def\actualtext#1#{\luatexkoactualtext}
-\def\luatexkoactualtext#1{#1}
+\ifdefined\actualtext\else
+  \protected\def\actualtext#1#{\luatexkoactualtext}
+  \def\luatexkoactualtext#1{#1}
+\fi
 % math hangul
 \def\setmathhangulblock#1#2{%
   \count@="#1
@@ -369,8 +372,8 @@
     \afterassignment\luatexkosetmathhangulfonts\font\textmathhangul}
   \def\luatexkosetmathhangulfonts{%
     \toks@\expandafter{\directlua{
-      local n = string.gsub("\fontname\textmathhangul", " at .+", "")
-      tex.sprint(n) }}%
+      local n = tex.fontname(font.id"textmathhangul"):gsub(" at .+", "")
+      tex.sprint(string.unquoted(n)) }}%
     \dimen@\fontdimen 6 \textmathhangul
     \font\scriptmathhangul= {\the\toks@} at .7\dimen@
     \font\scriptscriptmathhangul = {\the\toks@} at .5\dimen@
@@ -407,11 +410,11 @@
 \DeclareDocumentCommand \setmainhangulfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomainhangulfamily { Ligatures=TeX, #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkomainhangulfont
+  \cs_set_protected_nopar:Npn \luatexkomainhangulfont
   {
     \fontfamily \luatexkomainhangulfamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \rmdefault
+  \str_if_eq:eeT \familydefault \rmdefault
   {
     \cs_set_eq:NN \luatexkohangulfont \luatexkomainhangulfont
     \luatexkohangulselectfont
@@ -421,11 +424,11 @@
 \DeclareDocumentCommand \setsanshangulfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkosanshangulfamily { Ligatures=TeX, #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkosanshangulfont
+  \cs_set_protected_nopar:Npn \luatexkosanshangulfont
   {
     \fontfamily \luatexkosanshangulfamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \sfdefault
+  \str_if_eq:eeT \familydefault \sfdefault
   {
     \cs_set_eq:NN \luatexkohangulfont \luatexkosanshangulfont
     \luatexkohangulselectfont
@@ -435,11 +438,11 @@
 \DeclareDocumentCommand \setmonohangulfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomonohangulfamily { #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkomonohangulfont
+  \cs_set_protected_nopar:Npn \luatexkomonohangulfont
   {
     \fontfamily \luatexkomonohangulfamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \ttdefault
+  \str_if_eq:eeT \familydefault \ttdefault
   {
     \cs_set_eq:NN \luatexkohangulfont \luatexkomonohangulfont
     \luatexkohangulselectfont
@@ -449,9 +452,9 @@
 \DeclareDocumentCommand \newhangulfontfamily { m O{} m O{} }
 {
   \fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
-  \DeclareRobustCommand #1
+  \cs_set_protected_nopar:Npn #1
   {
-    \tl_set:Nn \luatexkohangulfont
+    \cs_set_nopar:Npn \luatexkohangulfont
     {
       \exp_args:Nc \fontfamily { luatexko_user_family_ \cs_to_str:N #1 } \selectfont
     }
@@ -466,7 +469,7 @@
 \DeclareDocumentCommand \hangulfontspec { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkohangulfontfamily { #1, #3 } { #2 }
-  \tl_set:Nn \luatexkohangulfont
+  \cs_set_nopar:Npn \luatexkohangulfont
   {
     \fontfamily \luatexkohangulfontfamily \selectfont
   }
@@ -476,11 +479,11 @@
 \DeclareDocumentCommand \setmainhanjafont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomainhanjafamily { Ligatures=TeX, #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkomainhanjafont
+  \cs_set_protected_nopar:Npn \luatexkomainhanjafont
   {
     \fontfamily \luatexkomainhanjafamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \rmdefault
+  \str_if_eq:eeT \familydefault \rmdefault
   {
     \cs_set_eq:NN \luatexkohanjafont \luatexkomainhanjafont
     \luatexkohanjaselectfont
@@ -490,11 +493,11 @@
 \DeclareDocumentCommand \setsanshanjafont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkosanshanjafamily { Ligatures=TeX, #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkosanshanjafont
+  \cs_set_protected_nopar:Npn \luatexkosanshanjafont
   {
     \fontfamily \luatexkosanshanjafamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \sfdefault
+  \str_if_eq:eeT \familydefault \sfdefault
   {
     \cs_set_eq:NN \luatexkohanjafont \luatexkosanshanjafont
     \luatexkohanjaselectfont
@@ -504,11 +507,11 @@
 \DeclareDocumentCommand \setmonohanjafont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomonohanjafamily { #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkomonohanjafont
+  \cs_set_protected_nopar:Npn \luatexkomonohanjafont
   {
     \fontfamily \luatexkomonohanjafamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \ttdefault
+  \str_if_eq:eeT \familydefault \ttdefault
   {
     \cs_set_eq:NN \luatexkohanjafont \luatexkomonohanjafont
     \luatexkohanjaselectfont
@@ -518,9 +521,9 @@
 \DeclareDocumentCommand \newhanjafontfamily { m O{} m O{} }
 {
   \fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
-  \DeclareRobustCommand #1
+  \cs_set_protected_nopar:Npn #1
   {
-    \tl_set:Nn \luatexkohanjafont
+    \cs_set_nopar:Npn \luatexkohanjafont
     {
       \exp_args:Nc \fontfamily { luatexko_user_family_ \cs_to_str:N #1 } \selectfont
     }
@@ -535,7 +538,7 @@
 \DeclareDocumentCommand \hanjafontspec { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkohanjafontfamily { #1, #3 } { #2 }
-  \tl_set:Nn \luatexkohanjafont
+  \cs_set_nopar:Npn \luatexkohanjafont
   {
     \fontfamily \luatexkohanjafontfamily \selectfont
   }
@@ -546,11 +549,11 @@
 \DeclareDocumentCommand \setmainfallbackfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomainfallbackfamily { Ligatures=TeX, #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkomainfallbackfont
+  \cs_set_protected_nopar:Npn \luatexkomainfallbackfont
   {
     \fontfamily \luatexkomainfallbackfamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \rmdefault
+  \str_if_eq:eeT \familydefault \rmdefault
   {
     \cs_set_eq:NN \luatexkofallbackfont \luatexkomainfallbackfont
     \luatexkofallbackselectfont
@@ -560,11 +563,11 @@
 \DeclareDocumentCommand \setsansfallbackfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkosansfallbackfamily { Ligatures=TeX, #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkosansfallbackfont
+  \cs_set_protected_nopar:Npn \luatexkosansfallbackfont
   {
     \fontfamily \luatexkosansfallbackfamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \sfdefault
+  \str_if_eq:eeT \familydefault \sfdefault
   {
     \cs_set_eq:NN \luatexkofallbackfont \luatexkosansfallbackfont
     \luatexkofallbackselectfont
@@ -574,11 +577,11 @@
 \DeclareDocumentCommand \setmonofallbackfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomonofallbackfamily { #1, #3 } { #2 }
-  \DeclareRobustCommand \luatexkomonofallbackfont
+  \cs_set_protected_nopar:Npn \luatexkomonofallbackfont
   {
     \fontfamily \luatexkomonofallbackfamily \selectfont
   }
-  \str_if_eq_x:nnT \familydefault \ttdefault
+  \str_if_eq:eeT \familydefault \ttdefault
   {
     \cs_set_eq:NN \luatexkofallbackfont \luatexkomonofallbackfont
     \luatexkofallbackselectfont
@@ -588,9 +591,9 @@
 \DeclareDocumentCommand \newfallbackfontfamily { m O{} m O{} }
 {
   \fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
-  \DeclareRobustCommand #1
+  \cs_set_protected_nopar:Npn #1
   {
-    \tl_set:Nn \luatexkofallbackfont
+    \cs_set_nopar:Npn \luatexkofallbackfont
     {
       \exp_args:Nc \fontfamily { luatexko_user_family_ \cs_to_str:N #1 } \selectfont
     }
@@ -605,7 +608,7 @@
 \DeclareDocumentCommand \fallbackfontspec { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkofallbackfontfamily { #1, #3 } { #2 }
-  \tl_set:Nn \luatexkofallbackfont
+  \cs_set_nopar:Npn \luatexkofallbackfont
   {
     \fontfamily \luatexkofallbackfontfamily \selectfont
   }



More information about the tex-live-commits mailing list