KTUGFaq

KTUG FAQ

로그인:
비밀번호:
가입
A gift of flower will soon be made to you.
FrontPage › DHUcs/대화

목차

1 On Progress
1.1 allow break
1.2 혹시 잊어버릴까봐....
1.3 engtxt 환경
2 Done
2.1 fake tfm 없애기
2.2 드러냄표
2.3 makeindex-dhucs의 문제 (다시)
2.4 MakeUppercase 재정의
2.5 설치 패키지 관련
2.6 makeindex-dhucs의 이상한 동작
2.7 unichar 정의
2.8 Prerender Unicode Revisited
2.9 자동조사 관련. 한자 등.
2.10 Windows 전각 특수문자의 처리
2.11 Prerender Unicode
2.12 document
2.13 확장한자
2.14 nameref bug
2.15 utf8x
2.16 nonfrench option
3 기타

새로 발견한 버그나 문제점에 대한 보고는 On Progress 항목 아래에 써주십시오. 종료되면 Done 항목 아래로 이동하겠습니다.

1 On Progress


1.1 allow break

1.2 혹시 잊어버릴까봐....

  1. makeindex 의 한글/영문 정렬순서 옵션

1.3 engtxt 환경

ucs-hangul, dhucs-interword를 사용하는 경우 한글 텍스트에 적용되는 어간이 너무 넓어서 영문자에 대해서는 부적절한 경우가 있다고 생각됩니다. 영문과 한글 텍스트를 식별하여 어간을 별도로 처리하는 것이 최선이겠으나, 우선 dhucs-interword에 다음과 같은 환경을 하나 정의하여 영문에 대해서 기본값 단어간격을 사용자가 지정할 수 있게 하면 어떨까 싶습니다.
\newenvironment{engtxt}{%
 \begingroup\spaceskip=\fontdimen2\font plus\fontdimen3\font minus \fontdimen4\font}{\endgroup}
dhucs-interword뿐만 아니라 dhucs-trivcj에서도 일어나 중어 중간에 영문 한 구절이 올 때 유용하게 써먹을 수 있을 것 같습니다. 쓰기 간편한 선언형도 하나 있었으면 좋겠습니다.

2 Done

2.1 fake tfm 없애기

은바탕 외에 다른 폰트를 거의 써보지 않아서 왜 fake tfm이 필요한지 그동안 파악하지 못했었습니다. 아무래도 lucenc.def가 폰트전환에는 적합하지 않게 만들어져 있는 것 같습니다. 어쨌든 faketfm을 지워버리기 위한 꽁수를 생각해봤습니다. 정도가 있을터인데 시간과 능력이 문제군요. --DohyunKim
\let\LUC@@empty@@ORIG\LUC@@empty
\let\dhucs@old@f@family\relax
\renewcommand\LUC@@empty[1]{\edef\dhucs@new@f@family{\f@family}%
  \ifx\dhucs@old@f@family\dhucs@new@f@family\else\gdef\LUC@plane@LUC{00}\fi
  \LUC@@empty@@ORIG{#1}%
  \xdef\dhucs@old@f@family{\f@family}}

꽁수라고 하셨지만, 이것이 한 방법인 것 같습니다. --Karnes

2.2 드러냄표

2005-04-24 HLaTeX 1.0의 hangul.sty에 드러냄표의 구현이 있습니다. "방점"이라 불리는 것인데요, 의외로 간단한 방식으로 잘 구현되어 있다고 생각됩니다. dhucs에 이것을 도입하였으면 좋겠습니다.

dhucs.sty
\let\normalfamily\rmfamily
%% redefine \normalfont
\let\ORIG@normalfont\normalfont
\def\normalfont{\ORIG@normalfont\normalfamily}

\def\no@ccent#1{#1}
\let\hemph@size\no@ccent

\newcommand*{\StartHangulChar}{%
	\ifhmode
	\ifdim\lastskip=\z@
	\ifnum\spacefactor=\Hangul@spacefactor
     \discretionary{}{}{\kern\inter@hangul@skip}\fi\fi\fi\hemph@size}

이 정의를 dhucs에 둔다면, ucs-hangul.tex에는
\def\circemphchar{˚}
\def\dotemphchar{˙}
\def\tmpheightchar{!}
%%% 드러냄표 (derived from hangul.sty 1.01)
\def\circemph@size#1{\leavevmode%
  \setbox0\hbox{\normalfont\tmpheightchar}%
  \dimen@\ht0\advance\dimen@-.3ex%
  \rlap{\raise.7\dimen@\hbox{\normalfont\rule{.3\dimen@}{0pt}\circemphchar}}#1}
\def\dotemph@size#1{\leavevmode%
  \setbox0\hbox{\normalfont\tmpheightchar}%
  \dimen@\ht0\advance\dimen@-.3ex%
  \rlap{\raise.7\dimen@\hbox{\normalfont\rule{.7\dimen@}{0pt}\dotemphchar}}#1}

%\def\circem{\let\hemph@size\circemph@size}
%\def\dotem#1{\let\hemph@size\dotemph@size}
\def\circemph#1{{\let\hemph@size\circemph@size #1}}
\def\dotemph#1{{\let\hemph@size\dotemph@size #1}}

이 정도로 할 수 있을 것 같습니다. 또는 이 루틴에 별 문제가 없다면, dhucs에다 넣어두는 것도 생각해봄직합니다. 그리고, hangul.sty에는 \circem, \dotem도 정의하고 있는데, 이것은 제외하였으면 좋겠습니다.

다시 생각해보니, ucs-hangul에서만 구현하는 것이 좋을 것 같습니다.
오, 멋진 기능입니다. 잠깐 테스트 해보니 본문에서 사용할 때 별다른 문제 없이 잘 구현됩니다. 그런데 말씀하신대로 ucs-hangul 레벨에서 적용하는 것이 정합성의 관점에서 더 타당하지 않나 싶습니다. -- DohyunKim
말씀대로 ucs-hangul에서 구현하였습니다. \StartHangulChar를 ucs-hangul에서 재정의하도록 하였습니다. 큰 문제는 없는 것 같아서 2.1로 올렸습니다. 장절명령 안에서는 \protect해주면 별탈없이 되지 않을까 생각하고 있습니다. --Karnes 추가. 2.1로 올렸던 코드에, 글자 크기가 달라지면 점의 찍히는 위치가 조정되지 않는 문제점이 있어서, 사용자가 이 길이를 설정하지 않으면 길이를 다시 구하도록 하는 약간 해키쉬한 코드를 추가했습니다. 대강 다음과 같은 모양입니다만... 아무튼지간에 이 길이를 "원한다면" 사용자가 바꿀 수 있도록 해야 여러 가지 폰트를 사용할 경우에 대비할 수 있다고 생각한 것인데... 그냥 CM/은글꼴에만 맞춰서 갈까요? --Karnes
\def\circemph@size#1{\leavevmode%
  \ifnum\usrdhucsraisedim=\z@\relax\Get@emphdim@raisedim\else\let\dhucsraisedim\usrdhucsraisedim\fi
  \ifnum\usrcircemphhposdim=\z@\relax\Get@emphdim@hposdim\else\let\circemphhposdim\usrcircemphhposdim\fi
  \dhucs@emph@size{\dhucsraisedim}{\circemphhposdim}{\circemphchar}{#1}}


느낌표의 높이나 보이지않는 rule 따위의 트릭을 모두 접어두고 원점에서 다시 생각해 보겠습니다. \dotemph{피강조구문}의 각 글자 위에 강조점을 찍는다고 할 때, 우선 강조점의 세로 위치는 “피강조구문”이라는 통 박스의 height만큼 올려주면 대충 될 것이고, 강조점의 가로 위치는 각 글자 박스(“피”, “강” ...)의 폭을 알아내어 같은 폭의 박스의 한가운데에 점이 오게 만들면 되지 않을까 합니다. 말로만 설명하는 게 쉽지가 않군요. 시간나면 코딩을 해 보겠습니다. 어쨌든 이렇게 하면 세로 dimen은 혹 사용자가 조절할 필요성이 있을지 모르겠으나 가로 dimen은 사용자의 설정 필요성이 없으리라 봅니다. --DohyunKim
저도 그런 생각을 하기는 했습니다만, 좋은 생각이 떠오르지 않았습니다. 구현이 된다면 좋겠습니다. 저도 처음부터 생각해보도록 하겠습니다. --Karnes

dhcus.sty에 다음처럼 수정을 가해보았습니다. 잘될런지 모르겠네요. --DohyunKim
%%% hangul BANGJEOM emphasis
\let\dhucs@emph\@gobble
\newdimen\dhucs@emph@raise
\newdimen\dhucs@emph@width
\def\dotemph#1{\begingroup
  \settoheight{\dhucs@emph@raise}{#1}%
  \addtolength{\dhucs@emph@raise}{-.4em}%
  \let\dhucs@emph\dot@emph
  #1\endgroup}
\def\dot@emph#1{\leavevmode
  \settowidth{\dhucs@emph@width}{\textunicodechar{#1}}%
  \llap{\raise\dhucs@emph@raise
    \hb@xt@\dhucs@emph@width{\normalfont\hss˙\hss}}%
}
% ......
\DeclareRobustCommand\unihangulchar[1]{%
  \ifnum #1<13312 %% "3400
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup\else
  \ifnum #1<44032 %%% "AC00
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\dhucs@emph{#1}\global\@josa#1\endgroup
    \CloseHangulChar\else
  \ifnum #1<63744 %%% "F900
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\dhucs@emph{#1}\global\@josa#1\endgroup
    \CloseHangulChar\else
  \ifnum #1<64256 %%% "FB00
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\dhucs@emph{#1}\global\@josa#1\endgroup
    \CloseHangulChar
  \else %%% ..
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup
  \fi\fi\fi\fi}

테스트를 조금 해보았는데, 잘 됩니다. ucs-hangul에서 다음과 같이 확장하려고 합니다. 기본 높이는 윗줄과의 행간격을 고려하여 .-3em을 더하는 것이 좋을 듯합니다.
%% BANGJEON emphasis : extension.

\def\circemphchar{˚}
\def\dotemphchar{˙}
\let\useremphchar\circemphchar
\newdimen\raisedotdim\raisedotdim0pt

\def\put@dhucs@mphch@r#1{%
  \llap{\raise\dhucs@emph@raise
    \hb@xt@\dhucs@emph@width{\normalfont\hss#1\hss}}%
}
\def\get@dhucs@mphheight#1{%
  \ifdim\raisedotdim=\z@\relax
     \settoheight{\dhucs@emph@raise}{#1}%
     \addtolength{\dhucs@emph@raise}{-.3em}%
  \else\let\dhucs@emph@raise\raisedotdim\fi
}

\def\dotemph#1{\begingroup
  \get@dhucs@mphheight{#1}%
  \let\dhucs@emph\dhucs@dot@emph
  #1\endgroup}

\def\dhucs@dot@emph#1{\leavevmode
  \settowidth{\dhucs@emph@width}{\textunicodechar{#1}}%
  \put@dhucs@mphch@r{\dotemphchar}%
}

\def\circemph#1{\begingroup
  \get@dhucs@mphheight{#1}%
  \let\dhucs@emph\dhucs@circ@emph
  #1\endgroup}

\def\dhucs@circ@emph#1{\leavevmode
  \settowidth{\dhucs@emph@width}{\textunicodechar{#1}}%
  \put@dhucs@mphch@r{\circemphchar}%
}

\newdimen\useremphraisedim\useremphraisedim0pt

\def\useremph#1{\begingroup
  \ifdim\useremphraisedim=\z@\relax
     \settoheight{\dhucs@emph@raise}{#1}%
     \addtolength{\dhucs@emph@raise}{-.3em}%
  \else\let\dhucs@emph@raise\useremphraisedim\fi
  \let\dhucs@emph\dhucs@user@emph
  #1\endgroup}
  
\def\dhucs@user@emph#1{\leavevmode
  \settowidth{\dhucs@emph@width}{\textunicodechar{#1}}%
  \put@dhucs@mphch@r{\useremphchar}%
}
잘 되네요. 애초 저는 강조점이 U+00B7 MIDDLE DOT이라고 착각해서 -2em을 잡았던 것인데, 이제보니 U+02D9 DOT ABOVE이군요. 그렇다면 -3em도 모자라고 -4em정도는 더해줘야 하는 것 아닌지요? 위 dhucs의 코드는 일단 이렇게 고쳤습니다만... --DohyunKim
다양한 밤샘 테스트 결과, 훌륭하게 동작하는 것을 확인하였습니다. :) dhucs만 쓸 때는 \dotemph, hangul 옵션으로는 \dotemph, \circemph, \useremph를 쓸 수 있는 것으로. 그리고 높이는 -.4em이 좋다고 생각합니다. dhucs 페이지에 올리겠습니다. --Karnes

2.3 makeindex-dhucs의 문제 (다시)

\indexentry의 두번째 인자(pagenum)에 아라비아 숫자가 아닌, 예컨대 로만 숫자가 오면 이 엔트리가 없어지는 버그가 있는 것 같습니다.

test.idx
\indexentry{\unihangulchar  {51109}\unihangulchar  {48708}|hyperpage}{iii}

이 파일을 makeindex-dhucs로 처리하면 내용이 없는 .ind 파일이 만들어집니다.
144째줄을 수정해야합니다.
-            (\Q$ist_arg_close$ist_arg_open\E\d+\Q$ist_arg_close\E)
+            (\Q$ist_arg_close$ist_arg_open\E.+\Q$ist_arg_close\E)

2.4 MakeUppercase 재정의

\documentclass{book}
\usepackage[hangul]{dhucs}
\begin{document}
\chapter{\oe dipus 왕}
\chapter{}
\end{document}
HLaTeX과 latex-ucs은 하부구조가 근본적으로 서로 다릅니다. HLaTeX이 아닌 latex-ucs에서 \MakeUppercase의 재정의가 과연 필요한 것인지 토론이 있어야 할 것 같습니다.

저도 그 생각을 하고 있었습니다. 다음과 같이 하면 어떨까 싶습니다.
\DeclareRobustCommand{\MakeUppercase}[1]{{% latex.ltx
      \PrerenderUnicode{#1}%
      \def\i{I}\def\j{J}%
      \def\reserved@a##1##2{\let##1##2\reserved@a}%
      \expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
      \protected@edef\reserved@a{\uppercase{#1}}%
      \reserved@a
   }}
저도 이것을 생각하고 있었습니다. 다만, latex.ltx를 그대로 옮겨오자면 위 정의 직후에 다음을 추가함이 안전할 것입니다.
\protected@edef\MakeUppercase#1{\MakeUppercase{#1}}
또 기왕이면 MakeLowercase에 대해서도 마찬가지로 적용했으면 하구요... 그런데 본디 저의 제안은 ucs-hangul.tex에서
\DeclareRobustCommand{\MakeUppercase}[1]{\uppercase{#1}}
등의 재정의가 필요한 것인지에 관한 것이었습니다.

dhucs.styMakeUppercase/MakeLowercase를 재정의하고, ucs-hangul의 재정의는 빼는 것에 동의합니다. 그리스 문자 같은 경우, 한글 문서에서 uppercase를 해주어야 하는지 확신이 서지 않는 점이 있기는 합니다만, 단순한 uppercase보다는 MakeUppercase가 호환성이 높겠지요. 몇 가지 테스트를 거쳤습니다. 좋으시다면, 이것을 합쳐서 모든 한자 자동조사까지 합쳐서 2.0으로 릴리스하겠습니다. --Karnes
그리스문자를 한글 특수문자로 간주하고 싶다면...
\DeclareUnicodeCharacter{"03B1}{\unihangulchar{"03B1}}% alpha
\DeclareUnicodeCharacter{"03B2}{\unihangulchar{"03B2}}% beta
이렇게 한글문자임을 선언하는 약간의 수고를 감수함이 옳다고 봅니다. 또는 $\alpha \beta$ 방식을 써도 되겠네요. 이 두가지 모두 uppercase가 먹지 않습니다. 각설하고, 2.0을 릴리스 하신다니 약간 다듬고 싶은 곳이 있는데, 우선 hyperref가 로드되지 않았을 때 경고 메시지를 조금 뽀대나게 하면 좋겠구요:
    \PackageWarningNoLine{dhucs}{For autojosa to function properly, 
      \MessageBreak hyperref package should be loaded}
또 만일을 위해서 dhucsPrerenderUnicode에다 lowercase에 대한 대비도 넣어두었으면 하구요:
\def\dhucsPrerenderUnicode@#1#2#3\dh@prerender@nil{% <"FFFF only. FIXME!
  \ifnum`#1<"E0 \ifx #3\empty\empty
                  \dhucsPrerenderUnicode@@{#1#2#3}%
                \else
                  \typeout{***** Rerun or insert \string\PrerenderUnicode{??} into preamble. *****}%
                \fi
  \else \ifx #3\empty\empty
          \typeout{***** Rerun or insert \string\PrerenderUnicode{??} into preamble. *****}%
        \else
          \dhucsPrerenderUnicode@@{#1#2#3}%
        \fi
  \fi}
맘에 차지 않는 코드지만 없는 것보단 있는 쪽이 낫지 않나 합니다.

말씀대로 수정하여 릴리스했습니다. :) --Karnes

2.5 설치 패키지 관련

  1. 은글꼴 TEXMF Tree를 DHUcs와 동합하는 것은 어떨까요? HLaTeX처럼 스타일과 폰트들을 하나의 패키지로 묶는 방안에 대해서 생각해보았으면 합니다.
  2. DHHangul처럼 KTUG cvs로 관리하는 방안도 괜찮을 것 같습니다.

    cvs로 관리하는 것은 찬성입니다. 은글꼴 TEXMF Tree와 통합하는 것은 현재 이 tree가 HLaTeX을 염두에 두고 만들어진 것이고 또 은타자 관련하여 개선할 점도 있고 해서 좀더 지켜본 후에 하는 것이 어떨까 합니다. 그리고 은타자의 경우, 개인적인 생각입니다만, c-series를 지워버렸으면 하는데 어떨까요? --DohyunKim
    은타자의 c-series 없애는 것은 좋다고 생각합니다. --Karnes

2.6 makeindex-dhucs의 이상한 동작

index 패키지를 이용하거나 memhangul-ucs에서 예컨대 인덱스 명령을 다음과 같이 주었을 때,
\index{abc|bfseries}
이 indexentry가 makeindex-dhucs를 거치면 없어집니다.

예제 test.idx는 다음과 같습니다.
\indexentry {ABC|textbf}{1}
\indexentry {ABC|hyperpage}{2}
\indexentry {가나다|textsf}{2}

그냥 makeindex만 실행해서 만들어지는 test.ind는 다음과 같습니다.
\begin{theindex}

  \item ABC, \textbf{1}, \hyperpage{2}

  \indexspace

  \item 가나다, \textsf{2}

\end{theindex}

makeindex-dhucs를 거치는 경우는 다음과 같은 로그를 보여줍니다. test.ind는 아무 내용이 기록되지 않습니다.
This is makeindex, version 2.14 [02-Oct-2002] (with Thai support).
Scanning input file stdin...done (0 entries accepted, 0 rejected).
Nothing written in test.ind.
Transcript written in test.ilg.
makeindex-dhucs.pl의 141번째 줄을 다음처럼 고쳐야 합니다.
        if (/\Q$ist_keyword\E\s*\Q$ist_arg_open\E

2.7 unichar 정의

현재 \unichar 자체가 \DeclareRobustCommand로 정의되어 있어서 T1 인코딩 영역의 글자를 uppercase해도 작동하지 않습니다. uppercase의 인자가 \unichar{254} 이런 식으로 들어오기 때문입니다. \DeclareRobustCommand는 LUC인코딩에 대해서만 지정함이 옳다고 생각합니다. 다음과 같이 수정하면 될 것 같습니다.
\renewcommand*{\unichar}[1]{%
  \ifnum #1<8448 %%% "2100
    \uni@char{#1}\else
  \ifnum #1<64256 %%% "FB00
    \unihangulchar{#1}\else
  \ifnum #1<65280 %%% "FF00
    \uni@char{#1}%
  \else
    \unihangulchar{#1}\fi\fi\fi}
\DeclareRobustCommand\unihangulchar[1]{%
  \ifnum #1<13312 %% "3400
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup\else
  \ifnum #1<44032 %%% "AC00
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\global\@josa#1\CloseHangulChar\endgroup\else
  \ifnum #1<63744 %%% "F900
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\CloseHangulChar\endgroup\else
  \ifnum #1<64256 %%% "FB00
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\global\@josa#1\CloseHangulChar\endgroup\else
  \else %%% ..
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup
  \fi\fi\fi\fi}
마지막 \else 두 개 중에 하나는 없애야겠네요...
헉, 그렇군요. ;)

이로 인하여 자동조사 루틴 \josa@hyper@link정의 부분에 다음을 추가하여야 합니다.
  \let\unihangulchar\josa@is@uni@hangul@
기존의 \let\unichar\josa@is@uni@hangul@ 대신 이것을 정의하라는 말씀이시지요?
본디 추가를 뜻했습니다만 대신도 좋겠죠. 이제 며칠 지났으니...

또한 Uploads:makeindex-dhucs.pl도 수정되어야 합니다. 가장 core에 해당하는 부분의 수정이라 걱정이 많습니다. 문제가 없나 살펴봐 주세요. --DohyunKim

제가 가진 모든 테스트용 문서에서 잘 동작하였습니다. 이것을 version 1.5로 하고, 다음 버전에서 한자 조사와 합치도록 하겠습니다. 제가 걱정한 것은 한자 자동조사를 처리하기 위해 지불해야 하는 코드가 너무 엄청난 데 비해서 과연 이것이 실용적으로(!) 필요한가와, 이에 따라 예상하지 못한 문제가 발생할 가능성은 없는가 였습니다만, 두번째 문제는 현재까지의 테스트로 우선 문제가 없어 보이므로, 일단 구현된 기능은 릴리스하는 것이 옳다고 생각됩니다. --Karnes
한자 자동조사를 쓰지 않는 문서에서는 if 검사가 6번 추가되는 정도로 부하가 더 걸립니다. 이 경우 3개의 방대한 조사 테이블 파일을 읽지 않습니다. 한자 자동조사가 요구되는 경우에 한해서만 필요한 테이블을 읽어들입니다. 따라서 일반적인 경우 부하가 크지 않습니다. 대신 한자 자동조사가 요구되면 그때마다 테이블 파일을 읽기 때문에 부하가 급격히 가중될 수 있습니다. 하지만 제 생각으로 현대적인 운영체제 하에서는 두번째 읽을 때부터는 캐쉬메모리를 읽을 것이므로 큰 무리는 아니라고 봅니다.

2.8 Prerender Unicode Revisited

수정하신 코드로 1.3을 릴리스했습니다만, 저는 한 가지 문제에 봉착했습니다. 즉, ledmac을 이용해서 다중각주를 단 문서에서 Prerender Unicode가 전혀 먹지 않습니다. 1.2의 코드로는 약 1,000바이트가 넘는 .pru를 만들면서 잘 처리해준 것이었거든요... 어디서 문제가 된 것인지 모르겠습니다. 테스트 파일을 링크하겠습니다. --Karnes [http]prutest.tex
dirty hack의 연속입니다 -.-; 다음과 같이 수정하여 테스트해 보십시오. 이제 \thanks 따위의 재정의가 필요 없습니다.
\makeatletter
\newtoks\dh@prerender@toks
\dh@prerender@toks={}
\DeclareRobustCommand\dhucsPrerenderUnicode[1]{%
  \dhucsPrerenderUnicode@#1\dh@prerender@nil}
\def\dhucsPrerenderUnicode@#1#2#3\dh@prerender@nil{% <"FFFF only. FIXME!
  \ifnum`#1<"E0 \ifx #3\empty\empty
                  \dhucsPrerenderUnicode@@{#1#2#3}%
                \else
                  \typeout{***** Rerun or insert \string\PrerenderUnicode{??} into preamble. *****}%
                \fi
  \else \dhucsPrerenderUnicode@@{#1#2#3}\fi}
\def\dhucsPrerenderUnicode@@#1{%
    \PrerenderUnicode{#1}\global\dh@prerender@toks
    \expandafter{\the\dh@prerender@toks^^J\dhucsPrerenderUnicode{#1}}%
}
\InputIfFileExists{\jobname.pru}{}{}
\def\utf@viii@undeferr#1#2#3#4#5#6{%
  \ifx\@gobble#1\else ??\dhucsPrerenderUnicode{#1}\fi}
\AtEndDocument{\newwrite\dh@prerenders@pru
  \immediate\openout\dh@prerenders@pru=\jobname.pru\relax
  \immediate\write\dh@prerenders@pru{\relax\the\dh@prerender@toks}%
  \immediate\closeout\dh@prerenders@pru
} 

이것이 좋습니다. 1.4 버전을 릴리스하고, snapshot들을 http://ftp.ktug.or.kr/KTUG/dhucs/ 에 저장하였습니다. --Karnes
여전히 버그가 있습니다. 문제의 원인은 chapter title을 페이지 헤더에 넣을 때 uppercase가 적용되기 때문입니다. 이를테면 eab080("가")이 ^^ca9080으로 바뀐 채 dhucsPrerenderUnicode의 인자로 들어오는 것입니다. 그래서 이렇게 잘못된 utf-8이 먹여지면 uppercase의 반대 기능을 하는 lowecase하도록 구상한 것입니다. 그런데 다시 생각해보니 이런 단순한 논리는 성립하지 않더군요. "aBc"를 uppercase한 후 다시 lowercase하면 최초의 "aBc"가 아니라 "abc"가 돼버리니니까요. "가"를 uppercase했다가 lowercase하면 ^^eab080이 아나라 ^^eab0^^a0가 돼버리지요. 그렇다면 잘못된 utf-8이 들어오면 강제로 lowercase할 것이 아니라 차라리 아무 짓도 않고 그냥 통과시키는 것이 더 낫다고 생각합니다. 어차피 book class라면 tableofcontents를 이용할테고 다음 컴파일에서 dhucsPrerenderUnicode가 제대로 실행될테니까요. 물론 모든 케이스를 해결하지는 못하지만 이렇게만 해도 대부분의 경우 정상적으로 작동할 것으로 봅니다. 요컨대 위 코드에서 두 줄을 없애주거나 주석처리하는 것이 좋겠습니다. --DohyunKim
만약 그렇다면, 현재는 ucs-hangul에만 있는 MakeUppercase 재정의(hangul.sty에서 가져온 것입니다)를 dhucs 전체에 대해서 적용하면 어떻게 될까요? 일반적으로 chapter 명령의 인자로 한글이 들어가는 상황은 한글 문서를 작성하는 상황이기 때문에 hangul 옵션 인자를 줄 것이므로, 큰 문제없이 처리되는 것이 아닌가 합니다만... --Karnes
MakeUppercase를 재정의해도 별 차도가 없을 것 같습니다. hangul옵션에서 이런 일이 생기지 않는 것은 chapter명령에 \PrerenderUnicode를 넣어둔 탓이지, MakeUppercase 재정의 때문은 아닌 듯 합니다. 당장은 해법이 떠오르지 않네요. T1 영역의 uccode, lccode를 재정의하는 무자비한 방법을 쓸 수는 없을 것입니다. 결국 256개 chars을 가지고 유니코드 전영역을 표현하려 한데서 기인하는 약간의 불편이 아닐까 합니다... 아무 것도 하지 않는 것보다 메시지라도 주는 것은 어떨까 모르겠습니다. --DohyunKim
이 정도면 저로서는 만족합니다. 이와 같은 상황에서 hangul 옵션으로 문서를 작성하라는 정도의 지침을 문서에 포함하면 어떨까요? 실제로 hangul 옵션 없이 작성하는 문서는 기반 언어가 한글이 아니지 않겠습니까? --Karnes

만약 \PrerenderUnicode 명령이 라틴 글자에 대해 무해하다면, MakeUppercase 정의 자체에 이것을 한 번 넣어주는 (좀 무식해보이는) 방법은 어떻겠습니까? 이것만으로 일단 chapter 인자의 uppercase 문제는 대부분 .pru 파일을 거치면서 식자되는 것으로 생각됩니다. --Karnes
이 방법도 나쁘진 않겠지만 T1 영역의 uccode,lccode를 재정의하는 방법이 ucs 패키지 하에서는 어쩌면 무해할지 모른다는 생각이 듭니다. 테스트를 당장 해보고 싶지만 제가 개인적인 사정으로 이번 주에는 잠깐씩 피시방을 이용하는 외에는 컴퓨터를 만질 수 없는 사정입니다. 시간되시는 분이 먼저 시도를 해 주실 수 있다면 좋겠습니다.--DohyunKim
uccode, lccode를 재정의했더니 \MakeUppercase는 잘 작동하는데 primitive 명령인 \uppercase가 먹지 않더군요. 따라서 이 아이디어는 폐기입니다. 제안하신 바 \MakeUppercase\PrerenderUnicode를 넣어주는 코드는 어떻게 짜면 될까요? --DohyunKim

제가 의도한 것은 간단히
\DeclareRobustCommand{\MakeUppercase}[1]{\PrerenderUnicode{#1}\uppercase{#1}}
이렇게 하자는 것이었습니다. 이 경우 #1 인자로 dhucs가 한글로 간주하는 코드가 올 때는 문제가 없을 것이고, 문제는 라틴 문자들인데 영문자의 경우는 uppercase가 되겠지만 예컨대 그릭 문자 같은 것이 오면 그대로 식자될 것입니다. 그것이 과연 허용가능한 것이냐가 관건이겠지요. 아무튼 이렇게 해주면 이 글자가 한번 .pru로 들어갔다가 다음번에는 올바르게 표시될 것으로 기대합니다. --Karnes

2.9 자동조사 관련. 한자 등.

한자 카운터는 다음과 같이 정의하였습니다.
\def\hanjanum#1{\@hanjanum{\@nameuse{c@#1}}%}
}
\def\@hanjanum#1{\ifcase#1\or 一\or 二\or 三\or
	四\or 五\or 六\or 七\or 八\or 九\or 十\or
	十一\or 十二\or 十三\or 十四\or 十五\or
	十六\or 十七\or 十八\or 十九\or 二十\or
	二十一\or 二十二\or 二十三\or 二十四\else\@ctrerr\fi}

이 카운터에 대해서 자동조사가 작동하지 않습니다.

\renewcommand\theenumi{\hanjanum{enumi}}
\begin{enumerate}
\item 가나다\label{hnc:1}
\item 라마바\label{hnc:2}
\item 사자차\label{hnc:3}
\item 카파하\label{hnc:4}
\item 카타파\label{hnc:5}
\end{enumerate}

\ref{hnc:1}\은 \ref{hnc:2}\은 \ref{hnc:3}\은 \ref{hnc:4}\은

\make@josa 정의에 다음과 같이 추가하는 방법밖에는 모르겠습니다. \num@josa를 쓸 수도 없고... 뾰족한 대안이 없네요.
\ifnum\@josa=19968\rieul\else
  \ifnum\@josa=20108\jung\else
  \ifnum\@josa=19977\jong\else
  \ifnum\@josa=22235\jung\else
  \ifnum\@josa=20116\jung\else
  \ifnum\@josa=20845\jong\else
  \ifnum\@josa=19971\rieul\else
  \ifnum\@josa=20843\rieul\else
  \ifnum\@josa=20061\jung\else
  \ifnum\@josa=21313\jong
  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi

한편 아래 prerendering을 위한 코드가 들어가서인지 아니면 처음부터 그랬는지는 확실치 않으나 가끔 자동조사가 불안합니다. dhucsdoc의 hvfloat 삽입부분이 그러한데, 이를 해결하기 위해 josa@hyper@link 정의를 다음과 같이 바꾸는 것이 좋겠습니다. 차이점이라곤 \edef\protected@edef로 바꾼 것이 전부입니다.
\def\josa@hyper@link#1\@nil{%
  \begingroup
  \let\null\empty
  \let\relax\empty
  \let\unichar\josa@is@uni@hangul@
  \protected@edef\josa@tempa{#1}%
  \expandafter\josa@lastt@kens\josa@tempa\josa@nil\empty\empty\empty
  \endgroup}

josa@hyper@link를 고친 상태로 올렸습니다. 한자 카운터 문제는... 천천히 수정하기로 하는 것이 좋겠습니다. --Karnes
Uploads:dhucs_hanja_josa.tar.gz Unicode BMP의 한자 전체에 대하여 자동조사를 지원하도록 해 봤습니다. 이렇게까지 할 필요가 있는지, 과연 이 기능을 사용할 사람이 있을지 의문입니다만 일단 시도는 해봤습니다. 문제가 없나 살펴봐 주세요. --DohyunKim
버그가 있어 다시 올렸습니다. 2005-01-15 2005-01-15 03:13:27 --DohyunKim
제가 원한 한자 카운터는 잘 됩니다. 이것을 1.2beta로 당분간 함께 올려두겠습니다. 말씀하신 대로, 이 기능이 과연 얼마나 쓰일지는 저도 확신이 서지 않습니다만 필요하다고 생각합니다. --Karnes
자동조사는 정말 골치 아픕니다. \section{\TeX{} 그리고 Donald Knuth}라는 이름을 nameref로 참조하고 그 뒤에 자동조사를 붙이면 현재 dhucs는 에러를 냅니다. 이를 해결하기 위해 \josa@lastt@kens를 이렇게 수정해야 할 것입니다. --DohyunKim
\def\josa@lastt@kens#1#2#3#4{\let\josa@last@\relax \let\josa@tempb\relax
  \ifx#1\josa@nil\empty \else
  \ifx#2\josa@nil\empty \ifx#1^^J\empty \else \let\josa@last@\josa@hyper@link@
                                              \def\josa@tempb{00#1}\fi\else
  \ifx#3\josa@nil\empty \ifx#2^^J\empty \else \let\josa@last@\josa@hyper@link@
                                              \def\josa@tempb{0#1#2}\fi\else
  \ifx#4\josa@nil\empty \ifx#3^^J\empty \else \let\josa@last@\josa@hyper@link@
                                              \def\josa@tempb{#1#2#3}\fi
  \else \let\josa@last@\josa@lastt@kens
        \def\josa@tempb{#2#3#4}\fi\fi\fi\fi
  \expandafter\josa@last@\josa@tempb}

이 코드를 반영하였습니다.(version 1.2). 자동조사가 골치아프다는 데 동의합니다. :) --Karnes

2.10 Windows 전각 특수문자의 처리


윈도 기본 입력기의 특수문자로 얻어지는 글자들 중에서 U+2025, U+2015, U+02D0, U+2312 네 개의 글자를 처리하지 못하는군요. 그리스 문자 관련 사항은 DohyunKim 님께서 말씀하신 방향을 따르는 것이 옳겠다고 생각됩니다. 관련된 내용을 지웠습니다. 다만, \textalpha 등의 정의는 좀 조정되었으면 좋겠다는 생각은 있습니다.
\textalpha 정의가 다른 무언가와 충돌하나보죠? 아니라면 무슨 문제가 있습니까?

이 가운데 U+02D0은 tipa의 \textlengthmark에 할당되어(uni-2.def) 있어서, tipa 패키지를 얹으면 될 것도 같고, U+2025는 \uc@dclc{8229}{autogenerated}{\unichar{46}\unichar{46}} 으로 정의되어 있어서 에러를 내었습니다. U+2015는 uni-32.def 정의에서 빠져 있네요. U+2312 역시 uni-35.def 정의에서 빠져 있습니다.
제 생각엔 빠져있는 것만 고려하면 될 것 같습니다. U+02D0는 ucs를 dhucs보다 먼저 부르면서 tipa 옵션을 주고 tipa 패키지를 그 뒤에 얹으면 되겠고, autogenerated 의 경우는 단지 autogenerated 옵션을 ucs패키지에 주면 되지 않을까 합니다. 다음처럼요:
\usepackage[autogenerated,tipa]{ucs}
\usepackage{dhucs}
\usepackage{tipa}

U+02D0은 그냥 예컨대 \uc@dclc{720}{default}{\ensuremath\colon}% 과 같이 바꾸면 어떨까 싶고, 다른 것도 적당한 정의를 추가해야 하는지 모르겠습니다. 다음은 한 가지 예입니다. --Karnes
\makeatletter
\DeclareRobustCommand*\textsubscript[1]{%
    \@textsubscript{\selectfont#1}}
  \newcommand{\@textsubscript}[1]{%
    {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}%}}%}
}}%}
}
\uc@dclc{188}{default}{\textsuperscript1\kern-.45em\unichar{65295}\kern-.45em\textsubscript4}% uni-0.def
\uc@dclc{189}{default}{\textsuperscript1\kern-.45em\unichar{65295}\kern-.45em\textsubscript2}% uni-0.def
\uc@dclc{190}{default}{\textsuperscript3\kern-.45em\unichar{65295}\kern-.45em\textsubscript4}% uni-0.def
\uc@dclc{720}{default}{\ensuremath\colon}% uni-2.def
\uc@dclc{8213}{default}{\unichar{9472}}% uni-32.def
\uc@dclc{8229}{default}{\unichar{183}}% uni-32.def
\uc@dclc{8978}{default}{\ensuremath\frown}% uni-35.def
\makeatother
앞의 세가지 분수는 ucs가 제공하는 것보다 훨씬 멋지네요. colon과 U+02d0는 모양부터 다르니 굳이 고칠 필요가 있을지 의문입니다. U+2015는 같은 dash 계열인 U+2014 emdash로 지정하는 쪽이 나을 것 같고요(검색, 추출도 고려해서 가능하면 문자의 의미를 살려야겠죠). \frown은 전적으로 동의입니다. 그리고 이런 정의는 ucs가 제공하는 \DeclareUnicodeCharacter 명령을 이용하는 것이 더 간편할 것으로 생각됩니다. 이를테면 다음과 같이 은글꼴을 일부 문자에 사용할 수도 있겠습니다. --DohyunKim
\DeclareUnicodeCharacter{"2025}% ‥
  {\bgroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont\textunicodechar{"2025}\egroup}

\unichar의 처음 부분을 다음과 같이 바꾸면 몇 가지 기호 문자를 은글꼴의 것으로 사용할 수 있을 듯합니다.
  \ifnum #1<8448 %%% "2100
     \uni@char{#1}\else
  \ifnum #1<8944 %%% "22F0
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup\else
그리고, 분수 세 개와 \frown을 추가하고 U+2015, U+2025, U+02D0은 \DeclareUnicodeCharacter하는 정도로 하면 될까요? (모두 일곱 개 문자 정의를 추가하는 것입니다.) U+02D0은 tipa의 장음부호로 정의되어 있지만... 그냥 은글꼴의 것을 쓰도록 하면 어떨까 하는 것이 제 생각입니다. 그리고 이 특수문자 처리는 hangul 옵션을 주었을 때만 작동하도록 했으면 좋겠다고 생각합니다. --Karnes
그렇다면 U+22F0에서 그 다음 경계인 U+2460까지는 얼마 떨어져 있지도 않고 특출난 글자도 없는 것 같으니 전부 은글꼴로 하는 쪽은 어떻습니까? 즉 U+2100부터 통합한자A 시작 전까지를 합치는 것이죠. \if 개수가 두 개쯤 줄겠군요. 기타 특수문자 처리는 찬성합니다. --DohyunKim

정리하겠습니다. :) ucs-hangul 에 다음 코드를 추가합니다.
\DeclareRobustCommand*\TEXTsubscript[1]{%
    \@TEXTsubscript{\selectfont#1}}
  \newcommand{\@TEXTsubscript}[1]{%
    {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}%}}%}%
}}%
}
\DeclareUnicodeCharacter{"00BC}% 1/4
	{\textsuperscript1\kern-.45em\unichar{65295}\kern-.45em\TEXTsubscript4}% uni-0.def
\DeclareUnicodeCharacter{"00BD}% 1/2
	{\textsuperscript1\kern-.45em\unichar{65295}\kern-.45em\TEXTsubscript2}% uni-0.def
\DeclareUnicodeCharacter{"00BE}% 3/4
	{\textsuperscript3\kern-.45em\unichar{65295}\kern-.45em\TEXTsubscript4}% uni-0.def
\DeclareUnicodeCharacter{"02D0}% ː
  {\bgroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont\textunicodechar{"02D0}\egroup}
\DeclareUnicodeCharacter{"2025}% ‥
  {\bgroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont\textunicodechar{"2025}\egroup}
\DeclareUnicodeCharacter{"2015}% ―
  {\bgroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont\textunicodechar{"2015}\egroup}
\DeclareUnicodeCharacter{"2312}% ⌒
	{\bgroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont\textunicodechar{"2312}\egroup}

\unichar 정의는 다음과 같이 바꿉니다.
%% \unichar
\DeclareRobustCommand*{\unichar}[1]{%
  \ifnum #1<8448 %%% "2100
     \uni@char{#1}\else
  \ifnum #1<13312 %% "3400
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup\else
  \ifnum #1<44032 %%% "AC00
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\global\@josa#1% 
    \CloseHangulChar\endgroup\else
  \ifnum #1<63744 %%% "F900
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1%
    \CloseHangulChar\endgroup\else
  \ifnum #1<64256 %%% "FB00
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\global\@josa#1%
    \CloseHangulChar\endgroup\else
  \ifnum #1<65280 %%% "FF00
    \uni@char{#1}%
  \else %%% ..
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup
  \fi\fi\fi\fi\fi\fi}
이대로 하면 되겠습니까? 테스트를 몇 가지 했는데, 의도대로 되는 것 같습니다. --Karnes
좋습니다. -- DohyunKim

2.11 Prerender Unicode

LaTeX-ucs의 특성상 이 문제를 근본적으로 해결하는 것이 불가능하다면 편리성을 도모하기 위해, newtoks 하나를 만든 다음, PrerenderUnicode가 들어가는 곳에서 이 token list에 \PrerenderUnicode{???}를 넣어두고 Document 끝에서 이를 \jobname.pru 정도의 이름을 갖는 파일에 저장해 두어 다음 컴파일에서 이 파일을 불러 올 수 있게 할 수도 있지 않을까 합니다. 다시 말해 aux파일과 유사한 방식을 생각해 볼 수 있지 않느냐는 것이죠. 아직 아이디어에 불과합니다만 시간나는대로 코드를 짜 보도록 하죠. 이번 주는 바쁜 일이 많아 시간 내기가 쉽지 않을 것 같습니다만... -- DohyunKim
이렇게 복잡하게 할 필요가 없을 것 같아서 aux 파일에 \PrerenderUnicode{???}을 써 넣는 방식을 시도해 보았습니다. 이로 인하여 의도하지 않은 문제가 생길 수 있으니 엄밀한 검토가 필요할 것입니다.
\begingroup
  \lccode`\A=`\{\lccode`\B=`\}\lccode`\C=`\\%
  \lccode`\P=`\P\lccode`\U=`\U%
  \lowercase{%
\endgroup
  \def\utf@viii@undeferr#1#2#3#4#5#6{%
    \ifx\@gobble#1\else[Please insert CPrerenderUnicodeA#1B into preamble]%
      \immediate\write\@mainaux{CPrerenderUnicodeA#1B}\fi}}

이것은 조금 더 테스트해보도록 하겠습니다. memhangul-ucs에서는 kshangul.prerenders를 아예 include하도록 해두었습니다만... 자원 낭비가 아닐까 하는 생각이 있습니다. 간단한 테스트를 해본 결과입니다. 우선,
    \ifx\@gobble#1\else[Please insert CPrerenderUnicodeA#1B into preamble]%
      \immediate\write\@mainaux{CPrerenderUnicodeA#1B}\fi}}
이 부분은 그냥
    \ifx\@gobble#1\else[Please insert CPrerenderUnicodeA#1B into preamble]%
      {CPrerenderUnicodeA#1B}\fi}}
이렇게 해도 .aux 파일에 제대로 써질 것으로 생각됩니다. 그리고 다시 한번 latex을 돌리면 적어도 .aux에서는 이 설정이 효과가 있는 것 같습니다. 그런데, .idx에서는 좀처럼 없어지지 않는군요... :( 어차피 dhucs가 Prerenders.def이라는 파일을 기본으로 불러들이도록 되어 있으므로, 이 파일을 \newwrite 해주는 방법을 한번 생각해보았으면 싶습니다. --Karnes

idx파일은 makeindex-dhucs.pl이 처리해주니까 염려하지 않아도 될 것 같습니다. 어쨌든 애초 생각했던 바를 Prerenders.def 파일에 대해서 시도해봤습니다. 여러번 컴파일해도 이전의 것을 보존해주니 aux에 바로 쓰는 것보단 편리하군요. --DohyunKim
\newtoks\dh@prerender@toks
\dh@prerender@toks={}
\def\@prerenderunicode#1#2{% from ucs.sty
  \begingroup
  \UnicodeCharFilter\@gobble
  \let#1\@gobble\setbox0\hbox{#2}%
  \global\dh@prerender@toks\expandafter{\the\dh@prerender@toks^^J%
    \PrerenderUnicode{#2}}\endgroup}
\InputIfFileExists{Prerenders.def}{}{}
\newwrite\dh@prerenders@def
\immediate\openout\dh@prerenders@def=Prerenders.def\relax
\immediate\write\dh@prerenders@def{\relax\the\dh@prerender@toks}
\begingroup % from utf8.def
  \lccode`\A=`\{\lccode`\B=`\}\lccode`\C=`\\%
  \lccode`\P=`\P\lccode`\U=`\U%
  \lowercase{%
\endgroup
  \def\utf@viii@undeferr#1#2#3#4#5#6{%
    \ifx\@gobble#1\else[Please insert CPrerenderUnicodeA#1B into preamble]%
      \immediate\write\dh@prerenders@def{CPrerenderUnicodeA#1B}\fi}}
\AtEndDocument{\immediate\closeout\dh@prerenders@def}
이거 제대로 작동하지 않습니다. 폐기해야 할 것 같습니다. --DohyunKim

애초에 제시하신 대로,
\makeatletter
\begingroup % from utf8.def
  \lccode`\A=`\{\lccode`\B=`\}\lccode`\C=`\\%
  \lccode`\P=`\P\lccode`\U=`\U%
  \lowercase{%
\endgroup
  \def\utf@viii@undeferr#1#2#3#4#5#6{%
    \ifx\@gobble#1\else[Please insert CPrerenderUnicodeA#1B into preamble]%
		 CPrerenderUnicodeA#1B\fi}}
이 정도로 .aux에 들어가는 \PrerenderUnicode 문제는 해결되는 것으로 생각됩니다. 우선 .aux는 이렇게 처리하고, .idx에 들어가는 것들은 makeindex-dhucs.pl이 이 부분을 Prerenders.def에 옮겨 써주도록 고칠 수는 없겠는지요? 그렇게되면 당장 눈에 보이는 문제들은 대부분 해결될 것으로 생각됩니다. .idx를 makeindex-dhucs가 고쳐주기는 하지만 .ind에서 중복 항목이 생기는 문제가 가끔 발생하였습니다. --Karnes
Uploads:makeindex-dhucs.pl여기에 맞춰서 약간 수정하였습니다. --DohyunKim

아래 코드는 대강 작동하는 듯 합니다. 만약 문제가 없다면 prerender unicode의 불편은 완전히 해소되었다고 해도 되겠습니다. 살펴봐 주세요. Uploads:makeindex-dhucs.pl여기에 맞춰서 약간 수정하였습니다. 문제가 있다면 되돌리죠, 뭐... --DohyunKim
\makeatletter
\newtoks\dh@prerender@toks
\dh@prerender@toks={}
\DeclareRobustCommand\dh@addtoprerender@toks[1]{%
  \global\dh@prerender@toks\expandafter{\the\dh@prerender@toks^^J%
    \PrerenderUnicode{#1}}% } 문자 세개 연달아 써더니 위키가 code의 끝이라고 인식하네요 ;(
}
\let\ORIG@prerenderunicode\@prerenderunicode
\def\@prerenderunicode#1#2{% 
  \ORIG@prerenderunicode{#1}{#2}\dh@addtoprerender@toks{#2}}
\InputIfFileExists{\jobname.pru}{}{}
\let\@prerenderunicode\ORIG@prerenderunicode
\begingroup % from utf8.def
  \lccode`\A=`\{\lccode`\B=`\}\lccode`\C=`\\%
  \lccode`\P=`\P\lccode`\U=`\U%
  \lowercase{%
\endgroup
  \def\utf@viii@undeferr#1#2#3#4#5#6{%
    \ifx\@gobble#1\else[Please insert CPrerenderUnicodeA#1B into preamble]%
    \dh@addtoprerender@toks{#1}\fi}}
\AtEndDocument{\newwrite\dh@prerenders@pru
  \immediate\openout\dh@prerenders@pru=\jobname.pru\relax
  \immediate\write\dh@prerenders@pru{\relax\the\dh@prerender@toks}%
  \immediate\closeout\dh@prerenders@pru}
우선 이 코드를 적용하였습니다. 2005-01-07 --Karnes
이게 문제없이 작동한다면 utf@viii@undeferr 정의를 단순화할 수도 있겠습니다. 에러유발의 가능성도 줄일 수 있고요. \begingroup부터 \endgroup은 지워버리고 please...은 ??로 대체하는 것이 어떨까요? 물론 makeindex-dhucs를 또 수정해야겠죠.
\def\utf@viii@undeferr#1#2#3#4#5#6{%
  \ifx\@gobble#1\else??\dh@addtoprerender@toks{#1}\fi}

잠깐 테스트해보았는데, 이 코드가 좋은 것 같습니다.(앞서 쓴 것은 지웠습니다). .idx에서는 여전히 문제가 남지만 makeindex-dhucs가 잘 처리한다고 생각됩니다. 이것으로 하는 것이 좋겠습니다. 말씀대로, 문제가 생기면 되돌리지요 뭐... ^^; --Karnes
Uploads:makeindex-dhucs.pl ??로 수정하였습니다. 어제 수정과정에서 들어간 버그도 하나 잡았습니다. 어쨌든 제가 이런 복잡한 방법에 집착하는 이유는 \thanks에서 생기는 prerender문제는 aux 방식으로는 해결되지 않기 때문입니다. http://www.skuniv.ac.kr/~nomos/founders/founders.tex 이것 때문이었죠. --DohyunKim
이 코드에 치명적인 버그가 있었습니다. babel 패키지와 같이 사용하다 발견하였습니다. 제 능력껏 온갖 꽁수를 다 동원하여-.-;; 다음같이 수정하였습니다. --DohyunKim
\makeatletter
\newtoks\dh@prerender@toks
\dh@prerender@toks={}
\def\dh@addtoprerender@toks#1{\global\dh@prerender@toks
  \expandafter{\the\dh@prerender@toks^^J\dhucsPrerenderUnicode{#1}}%
}
\DeclareRobustCommand\dhucsPrerenderUnicode[1]{%
  \PrerenderUnicode{#1}\dh@addtoprerender@toks{#1}}
\InputIfFileExists{\jobname.pru}{}{}
\begingroup
  \lccode`\A=`\{\lccode`\B=`\}\lccode`\C=`\\%
  \lccode`\P=`\P\lccode`\U=`\U%
  \lowercase{%
\endgroup
  \def\utf@viii@undeferr#1#2#3#4#5#6{%
    \ifx\@gobble#1\else ??CdhucsPrerenderUnicodeA#1B\fi}}
\AtEndDocument{\newwrite\dh@prerenders@pru
  \immediate\openout\dh@prerenders@pru=\jobname.pru\relax
  \immediate\write\dh@prerenders@pru{\relax\the\dh@prerender@toks}%
  \immediate\closeout\dh@prerenders@pru
}
\let\dh@ORIG@thanks\thanks
\def\thanks#1{\PrerenderUnicode{#1}\dh@ORIG@thanks{#1}}

흠... 그게 버그였군요... memhangul-ucs에서 제가 몇 번 겪은 그 증상인지도 모르겠습니다. 제가 오늘 정신없는 날이라서 내일 오후에나 버그수정판을 올릴 수 있을 것 같습니다. 아무튼지 고생해주셔서 감사드립니다. :) --Karnes
코드가 쓸데없이 복잡해져서 정리가 필요할 것 같습니다. 수정판은 천천히 올리도록 하죠. --DohyunKim 위와 같이 고쳐봤습니다. 완성본까지의 컴파일 회수가 한번 줄어드는군요 :) 참, makeindex-dhucs도 이에 갱신했습니다. Uploads:makeindex-dhucs.pl --DohyunKim

2.12 document

dhucsdoc의 그림3.1 문서예제에서 hyperref을 로드하는 부분을 프리앰블의 마지막으로 옮기는 것이 좋겠습니다. 다른 패키지보다 먼저 부르면 일부 링크가 작동하지 않는 문제가 발생할 수 있습니다. 당장 이 도큐먼트에서 각주번호를 마우스로 눌러보세요.

2.13 확장한자

확장한자A 영역의 글자를 한글 폰트에서 찾으려고 시도하는 버그 있습니다. 확장한자B 영역도 추후에 문제될 수 있습니다.

U+3400..U+ABFF 영역을 한자 폰트로 처리하도록 다음과 같이 수정하면 될까요?
  \ifnum #1<13312 %% ..33FF
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1 %
    \ifnum #1>13055 % U+3300 ..
      \CloseHangulChar\fi\endgroup\else  
  \ifnum #1<44032 %%% 3400..ABFF
      \StartHangulChar
      \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\global\@josa#1 %
      \CloseHangulChar\endgroup\else


얼추 이렇게 하면 되겠습니다만, 코드가 복잡해져서 unichar명령을 다시 정리해봤습니다. 엄밀히 하자면 더 세분해야겠지만 실행속도 문제도 있고해서 조금 단순화했습니다. --DohyunKim
\DeclareRobustCommand*{\unichar}[1]{%
  \ifnum #1<8528 %%% "2150
    \uni@char{#1}\else
  \ifnum #1<8592 %%% "2190
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup\else
  \ifnum #1<9312 %%% "2460
    \uni@char{#1}\else
  \ifnum #1<13312 %% "3400
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup\else
  \ifnum #1<44032 %%% "AC00
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\global\@josa#1% 
    \CloseHangulChar\endgroup\else
  \ifnum #1<63744 %%% "F900
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1%
    \CloseHangulChar\endgroup\else
  \ifnum #1<64256 %%% "FB00
    \StartHangulChar
    \begingroup\fontencoding{LUC}\fontfamily{\myhanjafont}\selectfont
      \textunicodechar{#1}\global\@josa#1%
    \CloseHangulChar\endgroup\else
  \ifnum #1<65280 %%% "FF00
    \uni@char{#1}%
  \else %%% ..
    \begingroup\fontencoding{LUC}\fontfamily{\myhangulfont}\selectfont
      \textunicodechar{#1}\global\@josa#1\endgroup
  \fi\fi\fi\fi\fi\fi\fi\fi}

2.14 nameref bug

hangul 옵션을 주었을 때 section에 대한 \nameref이 작동하지 않는 버그 있습니다.
수정하였습니다. --Karnes

2.15 utf8x

아직 다수의 배포판이 10월 이전의 LaTeX-ucs에 머물러 있습니다. 따라서 utf8x.def 파일이 존재하면 이 파일을, 그렇지 아니하면 utf8을 RequirePackage함이 어떨런지요. 파일명 이외에는 별다른 차이가 없는 것 같으니까요. --DohyunKim

그렇게 하는 것이 좋겠습니다.

2.16 nonfrench option

spacefactor가 1000일 때 괄호의 금칙처리가 작동하지 않는 경우가 있습니다. 여는 괄호의 spacefactor 역시 1000인 탓이죠. 그렇다면 nonfrench의 경우 \Hangul@spacefactor=1001로 하면 원하는 대로 작동하지 않을까 합니다. 테스트는 아직 안해봤습니다만... --DohyunKim

간단히 테스트해보았더니 잘 되는 것 같습니다. 1001로 바꾸겠습니다.

3 기타

dhhangul-ucs-test.sty는 지워버려도 되지 않나요? 또 dhucs.sty는 Karnes 님과 저 이렇게 두 명의 공동저자로 함이 마땅하다고 봅니다. -- DohyunKim

잘 알겠습니다. --Karnes

색인은 펄 스크립트 말고 원래 makeindex.exe로는 도저히 방법이 없는 건가요? ttf2hatelxfont.pl은 폰트 유틸리티로 보면 썩 괜찮아 보이지만 텍 자체에서 다른 스크립트를 끼워(?) 쓰는 건 좀 어색해 보입니다. 한글 트루타입 폰트를 쓰는 사람은 십중팔구 ttfhaltexfont.pl 때문에 펄을 설치하겠지만, 그렇다 해도 "한글 UCS를 쓰실 때 색인은 펄로 만드세요"라고 말하기에는 좀 거북하지 않나 싶습니다. --hoze

뭐... perl을 C 언어로 포팅하면 .exe 파일을 만들 수야 있겠지요. 스크립트 자체가 makeindex를 부르기 위한 준비작업을 하는 것이라서 makeindex 자체만으로는 곤란할테고... 현실적으로 이 패키지가 Windows 유저를 위해서 개발되고 있다고 생각되지는 않구요, 그리고 당장 ConTeXt를 돌릴려고 해도 Perl은 필수인 셈이니까, 제 생각에는 C로 포팅하는 것이 큰 메리트가 있을 것 같지는 않습니다. ActivePerl을 설치하는 것이야 실행파일만 한번 더블클릭해주면 그만인 셈이니까, 설치가 까다롭다고 생각되지도 않습니다. :) --Karnes

perl2exe(http://www.indigostar.com/perl2exe.htm) 라던가 ActiveState Perl 중에서 Perl Dev Kit 의 perl2exe 를 사용하시면 perl 을 exe 로 만드는 것이 가능합니다. -smcho


Uploads:makeindex-dhucs.pl makeindex-dhucs.pl에서 글자 하나가 불필요하게 삽입된 것이 있어 삭제하였습니다. prerender unicode의 불편함을 제외하고 그다지 큰 문제는 없는 것으로 보이는데 이제 COPYING 파일을 포함시키고 코드를 정리해서 정식 릴리스 하는 것이 어떨까요? 아, 그리고 dhucs.sty의 제 email 주소에서 skuniv.ac.kr을 gmail.com으로 바꾸어 주십시오. --DohyunKim
makeindex-dhucs를 바꾸고 문서를 수정하여 내일쯤 릴리스할까 합니다. 원하던 대부분의 기능이 구현되어서 매우 기쁩니다. --Karnes


안녕하십니까? 여기에 있는 makeindex-dhucs.pl를 이용해서 tex4ht에서 sorting이 되는 index를 만드는 데는 일단은 성공했습니다. 감사합니다. 그냥 실험적으로 만들어 본 것이지만요. http://synapse.linuxtop.co.kr/tex4htindex/makeindexattex4ht.html 입니다. 그런데요! 여기서 보면 ㄱ 과 ㅅ에서 단락이 나누어 지지 않습니다. 왜 일까요? 그나 저나 감사합니다. 오랫동안 가슴에 안고 있던 문제를 풀수 있는 길을 열어 주셔서요. 다시 한번 감사드립니다.

혹시 라도 해서 어떻게 만들었던 것에 대해서 소개 해 드리겠습니다. 우선 utf8-tex4ht.cfg를 이용해서 html문서를 utf8로 해서 만들었습니다. index에 필요한 것은 filename.4dx이므로 이것을 iconv -f euc-kr -t utf8로 바꾸고 나서 makeindex-dhucs.pl를 돌리고 나서 다시 iconv로 다시 euc-kr로 바꾸어 주었습니다. 아마도 두개정도 밖에 해 보지는 않았지만 제대로된 sorting이 되는 index를 얻을 수 있을 것 같습니다. 감사드립니다. --synapse


Hlatex과 폰트들을 관련 홈페이지의 설명에 따라 다운받고, 복사하고 설치한다음 texhash하고... 은글꼴을 texmf/fonts에 다른 폰트들과 함께 깔고, euc-kr에서 코드를 바꾸지 않아도 되게 유니코드를 지원하는 dhucs... 라는 최근 패키지를 설치하였습니다. 그 안에 test 해보는 *.tex 파일이 있어 emacs로 불러 compile시키려는데 File `utf8.def' not found 라는 경고가 나오면서 실패했습니다. 혹시 원인과 해결책을 아시는 분이 계신지 ?
LaTeX-ucs 패키지는 제대로 설치가 되었는지요?
인스톨 설명대로 은글꼴과 hlatex를 설치하였습니다. hlatex-ucs 모듬에 있던 건가.. 아마 그 안의 파일이던 readme.eng를 읽으면서 각종 파일들을 복사하고.. 그런건 했는데. Latex-ucs는 Hlatex-ucs와 따로 설치해주어야 하는지요 ?
Hlatex-ucs는 들어본 적이 없습니다... hlatex과 DHUcs는 상관없기 때문에 dhucs를 사용하시려면 hlatex은 필요하지 않습니다. 그렇지만 LaTeX-ucs는 꼭 필요하니까 반드시 설치하셔야 합니다.

제가 착각했나봅니다.. 찾아보니, To install this LaTeX UTF-8 support, simply put the files ucs.sty, utf8x.def, ucsencs.def and data/* somewhere in your TeX-path 라고 나오는데요, 여기서 Tex-path가 구체적으로 어떤 directory인지요 ? tetex실행명령어가 있는 곳인지, texmf인지요 ?
texmf-local/tex/latex/unicode/ 정도면 되지 않을까 합니다. TEXMF 트리 아래여야 합니다.


DeleteMe 궁금해서 그러는데요 여기저기서 언급되는 LUCLaTeX UniCode를 의미하나요? 너무 자의적인 해석인가요? 너무 궁금해요 ~! :-9 --2006-05-27hermian

^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-05-27 20:31:45
Processing time 0.1331 sec