%$ clxelatex -synctex=1 $texname
%%
%% kskorsymb 패키지 설명서
%%
\documentclass[a4paper,colorlinks,itemph]{oblivoir}

\usepackage[a4]{fapapersize}

\usepackage{amsmath}
\usepackage{kotex-logo}

\usepackage{etoolbox}
\usepackage{xcolor}

\ifboolexpr{bool{xetex} or bool{luatex}}
{
	\setmainfont{TeX Gyre Schola}
	\setsansfont{FreeSans}
	\setkomainfont(Noto Serif CJK KR)[Scale=MatchUppercase,AutoFakeSlant]
	\setkosansfont(Noto Sans CJK KR)[Scale=MatchUppercase]
	\setkomonofont(D2Coding)[Scale=.92]
	\usepackage[pmfont={Noto Serif CJK KR},frkim]{pmhanguljamo}
	\usepackage{kshcrkey}
}
{
	\def\hg#1{#1}   %% to avoid error
	\def\hangulfontspec#1{}
	\def\fontspec#1{}
	\providecommand*\hcrkeys[2][]{#2,#1}
	\providecommand*\hcrkey[1]{#1}
}

\let\origrq"
\usepackage{kskorsymb}
\let\brr\escaperqcat\let\err\restorerqcat
\usepackage{graphicx}
\usepackage[export]{adjustbox}
\usepackage{tabularray}
\usepackage{tabto}

%\AtBeginEnvironment{boxedverbatim}{\catcode`\"=12}
\AtBeginEnvironment{verbatim}{\catcode`\"=12}

\addUserSymbol{\to=⇒,O=○,_=\expldash}

\newcommand\pkg[1]{\textsf{#1}}
\newcommand\opt[1]{\texttt{#1}}

\begin{document}

\title{kskorsymb}
\author{Nova de Hi}
\date{2025-4-8\quad version 0.8}

\maketitle

\begin{abstract}
이 작은 \LaTeX{} 패키지는 한글로 된 한국어 문장을 입력할 때에 필요한
몇 가지 문장부호의 단축 입력 명령을 정의한다.
\end{abstract}

\tableofcontents*

\section{버전과 패키지의 명칭}

버전 0.6은 이전의 0.5와는 다른 방식의 입력 체계를 채택하고 있어 호환되지 않는 부분이 있다.
만약 이전 버전에서 작성된 문서라면 이전 버전의 \verb|kskorsym.sty|를 사용하라.
혼선을 피하기 위하여 0.6부터 패키지 이름을 \verb|kskorsymb.sty|로 고쳤다.

버전 0.7에서 이전에 \pkg{troublesomeprobs}와 \pkg{somemoreparens}라는 이름으로 개발한
이 패키지의 응용판을 합쳤다.

\section{배경과 목적}

""키보드 문자""가 아닌 문장부호를 입력하려면 
워드 프로세서 "<\hg{h@ngyr}">에서는 \hcrkeys[+]{ctrl,f10}을 누르고 부호를 찾아서 입력하여야 한다(\fref{fig:hwp}).
Windows 입력기에서 \hcrkey{blank}\llap{ㄱ}, \hcrkey{blank}\llap{ㄴ}, \ldots과 
\adjustbox{scale={2}{1}}{\hcrkey{blank}}\llap{\raisebox{.7pt}{\footnotesize\sffamily 한자\:\,}} 키를 눌러서 부호를 선택하기도 한다.
긴 글을 쓰는 상황에서 이것은 주의를 분산시키고 상당한 불편감을 가져온다. 키보드 부호만으로 입력할 수 있다면 좋을 것이다.
\textsf{oblivoir}는 \verb|\bnm|, \verb|\cnm| 같은 명령을 이미 제공하고 있지만 이마저도 번거로워서 단축 명령으로 문장부호 자체를 입력하는 방법을 찾아보았다.

옛날, 공병우 박사가 "<문인용 타자기">를 만들어서 팔 적에 광고지에 다음과 같이 적었다. 이때가 아마 1976"\~1978년께였을 것이다.

\medskip

\includegraphics[scale=.4,valign=m]{munintypewriter}

\medskip

이제 이 패키지를 통하여, 이 광고전단지의 1".3번 항목을 \LaTeX{}에서도 따라잡았다 하겠다.

\begin{figure}[b]
	\includegraphics[width=.5\textwidth,center]{hwptableofchars.png}
	\caption{\hg{h@ngyr}의 문자표}\label{fig:hwp}
\end{figure}

\brr
\begin{boxedverbatim}
\begin{enumerate}
\item 인용 부호가 여러 가지 구비되어 있다. ("[, "], "<, ">, ":)
\item 모음 ㅒ자가 있어 편리하다.
\item 가운데 구두점이 있어서 문장 구성에 이용도가 높다. (".)
\item 활용하기에 좋은 로마자가 많이 들어 있다. (A, B, C, D, E, K, L, P, X)
\end{enumerate}
\end{boxedverbatim}
\err

\begin{sffamily}
\begin{enumerate}\tightlist
\item 인용 부호가 여러 가지 구비되어 있다. ("[, "], "<, ">, ":)
\item 모음 ㅒ자가 있어 편리하다.
\item 가운데 구두점이 있어서 문장 구성에 이용도가 높다. (".)
\item 활용하기에 좋은 로마자가 많이 들어 있다. (A, B, C, D, E, K, L, P, X)
\end{enumerate}
\end{sffamily}

"<문인용 타자기">를 만드는 데 소설가 정을병 선생이 함께 작업했다고 한다. 위의 항목 가운데
로마자 대문자 몇 글자가 들어간 것은, 소설가들이 등장인물을 ""K군"", ""P씨""와 같이 표기하는
습관이 있었기 때문일 것이다. 나중에 나온 공한영 타자기가 한글과 영문을 모두 타자할 수 있었던 반면
이 "<문인용 타자기">는 한글만을 찍도록 하였지만, 소설가 입장에서 로마자 대문자가 몇 자 있는 것이
훨씬 편했을 것이라 생각한다. 하필 K".L".P가 선정된 것은 ""김씨"", ""이씨"", ""박씨""가 워낙 많기 때문이 아닐까.

이 패키지 역시 소설이나 수필과 같은 긴 한국어 문장을 쓰는 때를 주로 상정하였다. "<문인용 패키지">라고나 할까.

여담이지만, 공병우 타자기 광고 중에서 내 심금을 울린 한 문장은 다음과 같다.

\begin{quote}
나이가 많은 사람이 걸어서 못할 관광을 자동차를 이용해서 마음대로 할 수 있듯이,
늙어서 펜으로 글을 쓰지 못하여도, 타자기를 이용하면 쉽게 글을 쓸 수 있다.
\end{quote}

\section{패키지 사용 선언}

\begin{boxedverbatim}
\usepackage{kskorsymb}
\end{boxedverbatim}

"= \textsf{kotex} 또는 \textsf{oblivoir}가 필요하다.
\par "= 패키지 옵션으로 \texttt{[localenv]}, \texttt{[minimal]}, \texttt{[minimalplus]}를 줄 수 있다. \texttt{[localenv]}에 대해서는 \pageref{sec:localenv}페이지 \ref{sec:localenv}절, 다른 두 옵션에 대해서는 \pageref{sec:minimal}페이지
\ref{sec:minimal}소절에서 설명한다.
\par "= \opt{[parentype]} 옵션은 괄호류 부호를 입력하는 방법을 선택하게 하는 것이다. \pageref{sec:parentype}페이지 \ref{sec:parentype}절에서 설명한다.
\par "= \opt{[wavedash]} 옵션은 물결표("\~)를 식자하는 방법을 지정한다. \pageref{sec:wavedash}페이지
\ref{sec:wavedash}절에서 설명한다.

\section{입력 스킴}\label{sec:default}

별도의 \opt{parentype}을 설정하지 않았을 때의 부호 입력은 다음과 같이 한다. 

\subsection{기본 기호}
\escaperqcat
\begin{tblr}{
	width=.85\linewidth,
	colspec={X[c]X[c]X[c]X[c]X[c]X[c]X[c]X[c]},
	hlines,
	vline{odd}={solid,gray},
	vline{even}={dashed,gray},
	row{Y,Z} = {bg=olive9!50},
	row{1} = {bg=olive2!80,fg=white},
	cell{2}{3-6} = {bg=olive9!50},
	cell{2}{1-2} = {bg=azure9}
}
input & output & input & output & input & output & input & output \\
\texttt{".} & ·  & \texttt{"\bs .} & 。 & \texttt{"\bs ,} & 、 & \texttt{":} & ： \\
\texttt{"\bs\textasciitilde }	& {\hangulfontspec{UnBatang.ttf}∼} & \texttt{"-} & … & \texttt{"'} & ‘ ’ & \texttt{""}	& “ ” \\
\texttt{"<}	& 〈 & \texttt{">} & 〉 & \texttt{"(} & 《 & \texttt{")} & 》 \\
\texttt{"[}	& 「 & \texttt{"]} & 」 & \texttt{"\bs \{} & 『 & \texttt{"\bs \}} & 』 \\
%/	= \myExtraParenMark,
\end{tblr}
\restorerqcat

\subsection{추가 기호 및 사용자 괄호}

\escaperqcat
\begin{tblr}{
	width=.99\linewidth,
	colspec={X[c]X[c]X[c]X[c]X[c]X[c]X[c]X[c]X[c]X[c]},
	hlines,
	vline{odd}={solid,gray},
	vline{even}={dashed,gray},
	vline{X}={gray,2pt},
%	row{Z} = {bg=olive9!50},
	row{1} = {bg=olive2!80,fg=white}
}
input & output & input & output & input & output & input & output & input & output \\
\texttt{"*} & ※ & \texttt{"=} & ☞ & \texttt{"?} & ◎ & \texttt{"X} & {\fontspec{UnBatang.ttf}×} & \texttt{"/} & 〔 〕 \\
\end{tblr}
\restorerqcat

\subsection{설명}

"= 모든 부호는 \texttt{\origrq}와 그 다음에 오는 부호 문자로 입력한다. \verb|"|와 부호 문자 사이에는 공백이 없어야 한다. 정해진 부호 문자가 아닌 문자가 오거나 스페이스가 오면 \texttt{\origrq}는 단순히 \origrq로 동작한다. \verb|"f| $\Rightarrow$ "f\quad \verb*|" *| $\Rightarrow$ " *.

\noindent "= "'기본 기호"' 16개의 부호와 \verb|"/|를 포함하여 17개의 부호는 패키지가 정한 값이므로, 다른 것으로 바꿀 수 없다.

\noindent "= "'추가 기호"' 4개는 \pageref{sec:usersymb}페이지 \ref{sec:usersymb}절에서 설명할 사용자 기호 명령을 이용하여 입력 방식을 바꾸거나 삭제할 수 있다.

\noindent "= "'기본 기호"' 가운데 괄효류 8개는 \ref{sec:parentype}절에서 설명할 다른 방식의 입력이 가능하다.

\subsection{\texttt{[minimal]}과 \texttt{[minimalplus]} 옵션}\label{sec:minimal}

패키지를 로드할 때에 \texttt{[minimal]} 옵션을 부여하면,
기본 기호의 가운뎃점(".) 하나를 제외하고는 어떤 기호도 정의하지 않는다(표에서 {\color{azure8}\adjustbox{valign=b}{\rule{5pt}{12pt}}} 배경색).
만약 입력 체계를 완전히 새로 설계할 생각이라면 이 옵션을 쓸 수 있다.

\texttt{[minimalplus]} 옵션을 부여하면 
고리점, 모점 및 괄호류 입력 기호(표에서 {\color{olive8}\adjustbox{valign=b}{\rule{5pt}{12pt}}} 배경색)와 추가 기호를 정의하지 않는다. 이 옵션이 부여되었을 때 미리 정의되는 기호는 다음과 같다(표에서 가운뎃점과 흰색 배경색 부분).

\begin{quote}
".  "\~  "-  ":  "'  "'  ""  ""
\end{quote}

\noindent 괄호류는 어떤 것도 정의하지 않지만 사용자 괄호 \verb|"/|는 사용가능하다(\ref{sec:userparen}소절).

\subsection{따옴표의 입력}

이 방식으로 입력하는 따옴표들은 각각 [U+2018]‘, [U+2019]’, [U+201C]“, [U+201D]”이다(이것을 "'유니코드 따옴표"'라고 부른 문헌이 있다).
\verb|`'|과 \verb|``''|로 입력하는 소위 "'\TeX{} 따옴표"'와는 조금 다른 모양으로 보인다.

큰따옴표는 \verb|""|으로, 작은따옴표는 \verb|"'|으로 입력한다. 이 부호는 두번째(짝수번째)로 호출되면 닫는 따옴표가 되므로 같은 입력 방식으로 여는 따옴표와 닫는 따옴표를 모두 표시한다.

\begin{quote}
보기": \verb|""큰따옴표""| "\to{} ""큰따옴표"" \quad
\verb|"'작은따옴표"'| "\to{} "'작은따옴표"'
\end{quote}

큰따옴표 안의 작은따옴표는 잘 동작한다. 그러나 큰따옴표 안에 다시 큰따옴표를 쓰려면 
약간의 주의가 필요하다.

\begin{quote}
\verb|"""'큰따옴표"' 안의 "'작은따옴표"'""| "\to{} """'큰따옴표"' 안의 "'작은따옴표"'"" \\
\verb|""""큰따옴표"" 안의 ""큰따옴표""""| "\to{} """"큰따옴표"" 안의 ""큰따옴표"""" ("X) \\
\verb|"""\"큰따옴표"\" 안의 "\"큰따옴표"\"""| "\to{} """\"큰따옴표"\" 안의 "\"큰따옴표"\""" ("O) \\
\verb|""``큰따옴표'' 안의 ``큰따옴표''""| "\to{} ""``큰따옴표'' 안의 ``큰따옴표''""
\end{quote} 

위에서 보인 대로, 중첩되는 따옴표는 \verb|"\"|과 \verb|"\'|을 이용하여 구분할 수 있다. 마지막 예와 같이 중첩되는 따옴표를 단순히 \TeX{} 따옴표로 표시하는 방법도 있을 것이다.

\paragraph{작은따옴표의 간격}
소위 ""유니코드 따옴표""의 폭은 폰트에 설정되어 있는 Width를 따른다. 
큰따옴표와 달리 작은따옴표는 문자폭의 설정값이 불만족스러울 경우가 있어서 닫는 작은따옴표 다음에
사용자가 간격을 추가하거나 축소할 수 있게 하였다.
\begin{verbatim}
\hskipaftersmallquote{-1pt plus .1pt}
\end{verbatim}
인자로는 skip 표현식이 온다.
이 값의 설정 전에는 "'작은따옴표"'가 현재 폰트에서 약간 넉넉한 공백을 갖지만
\hskipaftersmallquote{-1pt plus .1pt}
설정 후에는 "'작은따옴표"'와 같이 이 간격을 줄여줄 수 있다.
현재 버전에서는 닫는 작은따옴표 다음에만 간격 조절이 가능하며 여는 위치나 큰따옴표에 대해서는
아무런 수정을 가하지 않았다.


\subsection{괄호류}

홑낫표("[ "]), 겹낫표("\{ "\}), 홑화살괄호("< ">), 겹화살괄호("( "))는 엄연한 우리글 문장부호임에도
이를 입력할 방법이 마땅치 않았다. 홑화살괄호는 키보드의 부등호 키를 이용하는 것이 허용되고는 있으나 좋은
입력 관행은 아니다.

소괄호(( )), 중괄호(\{ \}), 대괄호([ ])는 별도의 KS 기호문자를 마련하지 않았다. 키보드 문자로 대용해도 상관없다고 판단했기 때문이다. 2014년 개정 이전 대괄호는 "/ "/와 같이 생긴 부호가 별도로 있었으나 키보드 문자로 만들어지는 것[]으로 통일해서 쓰게 바뀌었다.

검정대괄호(【 】)는 장식적인 목적에 주로 쓰이는 약물로 취급된다. 이 괄호의 입력 방법을 별도로 정해두지는 않았지만 다음에 설명하는 "'사용자 괄호"'를 쓸 수 있다.

\paragraph{사용자 괄호}\label{sec:userparen}

\verb|"/|를 이용해서 사용자 괄호를 입력한다. 앞서 설명한 따옴표와 비슷하게 열고 닫는 데 같은 입력 기호를 사용한다.
기본값은 "/ "/로 되어 있다.

\begin{quote}
\verb|"/임시 괄호"/|  "/임시 괄호"/
\end{quote}

이 부호를 다른 여닫는 괄호류 부호로 바꿀 수 있다.
\cmd{\defineextraparenmark} 명령의 인자로 열고 닫는 두 개의 부호를 다음과 같이 전달한다.

\begin{verbatim}
\defineextraparenmark{【】}
\end{verbatim}

\defineextraparenmark{【】}
\verb|"/임시 괄호"/|  "/임시 괄호"/

괄호류 입력의 다른 방법에 대하여는 \ref{sec:parentype}절을 보라.

\subsection{물결표} \label{sec:wavedash}

물결표("\~)를 Windows의 한글 입력기의 ㄱ키와 한자키로부터 입력하면 [U+223C]를 얻는다.
이 문자는 원래 물결표(Wave Dash)가 아니고 틸데 연산자(Tilde Operator)이다.
Wave Dash에 해당하는 문자는 [U+301C]이고, ""전각 및 반각 형식""에 정의되어 있는
KS 기호는 [U+FF5E]이다.

폰트의 사정을 보면 UnBatang은 [U+223C]는 자면을 갖추고 있지만 [U+301C]가 결자이고
Noto Serif CJK KR은 그 반대이다. HCR Batang은 이들에
모두 자면이 있으나 [U+FF5E]가 아스키 틸데와 같은 모양이다.
이런 사정이므로 우리는 \verb|"\~|로 입력되는 문자를 [U+223C]를 항상 은 바탕으로 찍는
것(고정 폰트 부호)을 디폴트로 하되, 필요하다면 옵션으로 이를 선택할 수 있게 하였다.
다음 가운데 하나를 선언할 수 있으며 \texttt{223C}가 디폴트이다.
\begin{verbatim}
  [wavedash=223C]
  [wavedash=301C]
  [wavedash=FF5E]
\end{verbatim}
여러 가지 이유로 \verb|wavedash=FF5E|를 주더라도 결과는 \verb|301C|일 때와 같이 찍히도록
해두었다. 폰트에 따라 FF5E는 301C와 같을 때도 있고 007E와 같을 때도 있기 때문이다.
특정 코드를 강제하려면 사용자 부호 추가하기(\ref{sec:usersymb}절)에서 설명하는 방법을 쓰도록 한다.

\subsection{고정 폰트 부호}

일부 기호는 항상 특정 폰트로 식자되게 하였다. pdf\TeX 에서는 효력이 없다.
\begin{itemize}
\item 기본 기호의 줄임표("-"-)는 함초롬 바탕 LVT(HANBatang-LVT.ttf)에서 
가져온다. 그러므로 KTUG 사설저장소의 \textsf{hcr-lvt} 패키지가 설치되어 있어야 한다.
줄임표를 함초롬 바탕에서 가져온 이유는 Noto Serif KR 폰트의 줄임표의 위치가 너무 낮아서 본문에 
쓸 때 마침표 위치와 구분되지 않아서였다.

\item 추가 기호의 가위표("X)는 은바탕(UnBatang.ttf)에서 가져온다.
필자는 가위표의 경우 Noto Serif KR의 것이 더 좋다고 생각한다. 그러나 이 폰트는 별도로 설치해야 하는 불편이 있어 채택하지 못했다. 다음과 같이 하는 것을 권장한다.
\begin{verbatim}
\addUserSymbol{X={\fontspec{Noto Serif CJK KR}×},O=○}
\end{verbatim}
\addUserSymbol{X={\fontspec{Noto Serif CJK KR}×},O=○}
그러면 "X와 같은 모양으로 나타난다. 위와 같이 다른 숨김표("O)도 같이 정의해두면 좋다.
가위표를 특별하게 취급하는 이유는 [U+00D7] 부호이기 때문에 (\XeTeX-\ko 에서) 라틴 폰트로 찍히는 것이
기본값이기 때문이다. 

\item 물결표("\~)를 [U+223C]로 찍도록 한 경우(default)에 은바탕으로 고정해두었다.
\end{itemize}

\section{사용자 부호}\label{sec:usersymb}

\subsection{사용자 부호 추가하기}

\cmd{\addUserSymbol} 명령으로 사용자 명령을 추가한다. \verb|<key>=<value>| 형식으로 쉼표로 구분하여 여러 개를 정의할 수 있다.

\begin{itemize}\oblivoirlist
\item \verb|<key>| 자리에는 \dotemph{단 하나의 토큰}만이 올 수 있다. 단, \verb|{|, \verb|}|,
\verb|%|는 이 자리의 토큰으로 사용할 수 없다. 
한 개의 매크로는 사용 가능하나 매크로라면 그냥 입력하는 편이 낫지 않을까.
\item (\texttt{[minimal]}이나 \texttt{[minimalplus]} 옵션을 주지 않았다면)
미리 정의되어 있는 "'기본 기호"'는 바꿀 수 없다.
\item "'추가 기호"'와 사용자가 \cmd{\addUserSymbol}한 것은 새로 정의하면
이전 정의를 덮어쓴다.
\end{itemize}

우리글 문장부호 중에서 줄표("_), 숨김표("O, "X) 같은 것이 따로 정의하고 있지 않으므로
사용자 부호로 추가하면 좋을 것이다. 다음은 한 보기이다.

\begin{verbatim}
\addUserSymbol{X={\fontspec{Noto Serif CJK KR}×},O=○,_=\textemdash}
줄표 "_ 설명을 달 때 쓴다 "_, 숨김표("O, "X).
\end{verbatim}

\addUserSymbol{X={\fontspec{Noto Serif CJK KR}×},O=○,_=\textemdash}
줄표 "_ 설명을 달 때 쓴다 "_, 숨김표("O, "X).

\medskip

\textsf{oblivoir}라면 \cmd{\textemdash} 대신 \cmd{\expldash}를 쓰면 조금 보기가 낫다.

\begin{verbatim}
\addUserSymbol{_=\expldash}
줄표"_는 oblivoir의 것이 조금 보기가 낫다"_.
\end{verbatim}

\addUserSymbol{_=\expldash}
줄표"_는 oblivoir의 것이 조금 보기가 낫다"_.

줄표 자체는 그 앞뒤에 약간의 공백을 두어야 한다. 만약 \cmd{\textemdash}를 줄표 위치에 쓰려 한다면
앞뒤로 스페이스를 두는 것이 정서법 규정에 맞는다. 다만 \textsf{oblivoir}의 \cmd{\expldash}는
이 공백을 스스로 포함하고 있으므로 줄표 입력시에 앞뒤 공백을 주지 않아야 보기좋은 결과를 얻는다.

\bigskip

약물이라고 부르는 기호문자는 사용자가 정의해서 쓰는 것이 좋을 것이다. 다음은 한 보기이다.

\begin{verbatim}
\addUserSymbol{S=★,C=♣,H=♥}
"S, "C, "H
\end{verbatim}

이렇게 정의한 다음에는 자신의 문서에서 활용할 수 있다.

\addUserSymbol{S=★,C=♣,H=♥}
"S, "C, "H

\bigskip

앞서 언급하였듯이 기호 문자의 사용자 정의에는 단 한 개의 토큰만을 주어야 한다. 그래서 예컨대 줄임표("-)를
\verb|"...|와 같이 업력할 수 없는지 궁금할 수 있는데, 이 때는 점 세 개를 하나의 토큰으로"_즉 중괄호로"_묶는다면 가능은 하다.

\begin{verbatim}
\addUserSymbol{{...}={\hangulfontspec{HANBatang-LVT.ttf}…}}
하나의 토큰으로 묶여 있어야 한다"{...}.
\end{verbatim}

\addUserSymbol{{...}={\hangulfontspec{HANBatang-LVT.ttf}…}}
하나의 토큰으로 묶여 있어야 한다"{...}.

\medskip
\textsf{oblivoir}에는 \cmd{\obellipsis}라는 명령이 정의되어 있으므로 다음처럼 하는
방법도 있을 수 있다.

\begin{verbatim}
\addUserSymbol{{...}={\hangulfontspec{HANBatang-LVT.ttf}\obellipsis}}
하나의 토큰으로 묶여 있어야 한다"{...}.
\end{verbatim}

\addUserSymbol{{...}={\hangulfontspec{HANBatang-LVT.ttf}\obellipsis}}
하나의 토큰으로 묶여 있어야 한다"{...}.

이렇게만 한다 해도 입력 수고를 훨씬 덜 수 있다고 생각한다. 소스를 읽기 쉽게 하기 위해서
줄표를 \verb|"_|가 아니라 \verb|"{---}|처럼 정의해서 쓰는 방법도 좋을 것이다.

\paragraph{유니코드 코드포인트로 사용자 부호 추가}
\cmd{\addUserUnicodeSymbol} 명령은 \cmd{\addUserSymbol}과 같은 역할을 하지만
출력될 문자를 유니코드 코드포인트로 부여할 수 있다. 코드포인트로 표시되는 단 한 문자만 설정할 수 있으며
16진수 표현(대문자)이어야 한다. 다음은 한 가지 예이다.
\begin{verbatim}
\addUserUnicodeSymbol{&=3005}
\end{verbatim}
\addUserUnicodeSymbol{&=3005}
이제 \verb|"&|로 onaji 문자를 \ksparensmall{필요하다면 폰트를 지정하여} 식자할 수 있다: {\fontspec{Noto Sans CJK JP}"&}.

\subsection{사용자 부호 삭제하기}

다음 명령은 "'추가 기호"'와 사용자가 \cmd{\addUserSymbol}(또는 \cmd{\addUserUnicodeSymbol})한 모든 것을 지운다.

\begin{verbatim}
\clearUserSymbol
\end{verbatim}

사용자가 정의한 부호(와 "'추가 기호"')를 선별적으로 제거하고자 한다면 다음과 같이 한다.
\texttt{<keys>}는 여러 개를 쉼표로 분리하여 지시할 수 있다.

\begin{verbatim}
\removeUserSymbol{<keys>}
\end{verbatim}


패키지 제작자를 위해서 \cmd{\removeDefaultSymbol}과 \cmd{\addDefaultSymbol}이라는 명령을
제공한다. 
이 패키지를 로드하는 한 어떤 방법으로도 바꿀 수 없는 가운뎃점(".) 입력 방법을 제거하는 등
"'기본 기호"' 정의를 변경할 수 있다. 문서작성자가 쓸 일은 없을 것이다.


\section{\texttt{[localenv]} 옵션}\label{sec:localenv}

패키지를 로드할 때에 \texttt{[localenv]} 옵션을 부여하여 다음과 같이 할 수 있다.

\begin{verbatim}
\usepackage[localenv]{kskorsymb}
\end{verbatim}

이 옵션이 주어지면 패키지가 정의하고 있는 \texttt{\origrq}에 의한 부호 입력 기능이
\texttt{document} 환경이 시작될 때 바로 활성화되지 않는다. 그 대신 다음 명령을 주어진 위치에서부터
\emph{local} 영역 안에서 동작하게 된다.

\begin{verbatim}
\startkorsymbols
\end{verbatim}

다음 예를 보자. (참고로, \verb|\startkorsymbols| 명령은 \verb|\makerqactive|의 alias이다.)

\begin{verbatim}
{\startkorsymbols "<">} "<">
\end{verbatim}

(\texttt{[localenv]} 옵션이 주어진 상태에서) 위와 같은 입력의 결과는 다음과 같다.
즉 범위를 벗어나면 동작하지 않는 것이다.

"<"> \escaperqcat{} "<"> \restorerqcat

\bigskip

이 기능은 \texttt{kotex} 없이 한글을 식자하는 다른 상황(예컨대 \texttt{babel})에서
활용할 수 있도록 하기 위한 것이다. 한글 텍스트를 일정한 환경 내에서만 입력하려 할 때에도
유용하리라 본다.

\section{어깨 글자, 괄호 작은 글자}

\subsection{\texttt{[parentype]} 옵션}\label{sec:parentype}

이 패키지를 개발하는 과정에서 다음 두 가지 추가적인 입력 방법이 시도되었다.
\begin{enumerate}[\quad(1)] \oblivoirlist
\item \pkg{troublesomeprobs}. KTUG 게시판 \href{http://www.ktug.org/xe/index.php?mid=KTUG_open_board&document_srl=270899}{270899} 글에서 토론한 것이다. \verb|"(|를 괄호에 쓰되
작은 글자로 하는 것과 \verb|"<|를 어깨 글자 주석에 활용하는 문제가 다루어졌다. 이와 더불어 \verb|"*|를
이용하여 괄호류 부호를 입력하게 하였다.
\item \pkg{somemoreparens}. KTUG 게시판 \href{http://www.ktug.org/xe/index.php?mid=KTUG_open_board&document_srl=271319}{271319} 글에서 다루어진 것이다. 소위 ""꺾쇠류"" 부호의
입력 방법을 재정의하고 있다.
\end{enumerate}

이 두 가지 입력 방법이 때에 따라 쓸모있을 것으로 판단하여, \pkg{troublesomeprobs}와 \pkg{somemoreparens}를 \pkg{kskorsymb}로 합치고, \opt{[parentype]} 옵션으로 이 가운데 한 가지를 선택할 수 있게 하였다.
\opt{[parentype]}은 다음 셋 가운데 하나를 선택하여 지정하여야 한다. 
\begin{itemize}\oblivoirlist
\item \texttt{normal}. \ref{sec:default}절에서 설명한 "'기본 기호"'와 "'추가 기호"'로 입력하는 방법. 아래에서 설명할 ""어깨글자""나 ""작은 글자 괄호"" 기능은 별도로 제공하지 않으며 매크로를 써야 한다.
\item \texttt{troublesome}. \pkg{troublesomeprobs} 패키지에서 제공하는 기능. 괄호류는 별표를 추가하여 입력하며 ""어깨글자""와 ""작은 글자 괄호""를 \verb|"|로 입력할 수 있다.
\item \texttt{moreparen} 또는 \texttt{moreparens}. \pkg{somemoreparens} 패키지로 제공한 기능. KS X 1001의 기호문자 괄호를 확장하여 제공한다. \opt{troublesome}과 같이 ""어깨글자""와 ""작은 글자 괄호"" 입력이 가능하다.
\end{itemize}
\texttt{troublesome}과 \texttt{moreparen}이라는 명칭은 위에 언급한 패키지 이름에서 온 것이며, 기본값은 \opt{normal}이다. 

\opt{parentype}은 \cmd{\usepackage}할 때 결정되며 문서 중간에 이들 사이에 스위칭하는 방법은 없다.

\opt{[parentype=troublesome]} 또는 \opt{[parentype=moreparen]}을 선언하면 \opt{[minimalplus]} 옵션을
준 것과 동일한 상태가 된다. 기본적인 구두점만 정의되는 것이다. 그리고 
\verb|"(|\textit{text}\verb|)|와 \verb|"<|\textit{text}\verb|>|, \verb|"!|\textit{text}\verb|!| 형식의 세 명령을 정의한다. 
이것은 \opt{troublesome}과 \opt{moreparen}에 공통이다.

\subsection{어깨 글자 주석과 작은 괄호 글자}

입력을 다음과 같이 한다. \verb|"|는 시작할 때 한번만 붙고 인자를 종료하는 위치에는 없음에 주의한다.

\begin{verbatim}
어깨 글자 주석"<어깨 글자>
괄호 안에 오는 텍스트"(괄호 안의 작은 글자)
드러냄표 강조 "!드러냄표 강조!
\end{verbatim}

[주의] 이 기능의 인자 범위 내부에서 verbatim을 사용할 수 없다.

\paragraph{명령어 형식}
명령어 매크로로써 이 기능을 사용할 수 있다. 여기서 ks는 \texttt{korsymb}를 의미한다.

\begin{verbatim}
\kssuperscript{어깨 글자}, \ksparensmall{괄호와 작은 글자}
\end{verbatim}

명령 형식의 매크로는 \opt{parentype}이 \opt{normal}일 때도 쓸 수 있다.

\medskip

만약 사용자가 이 패키지의 다른 기능은 전부 필요없고 오직 이 두 가지만을 채택하고 싶은 경우라면,\\
\verb|   \usepackage[localenv,parentype=troublesome]{kskorsymb}|\\
또는\\
\verb|   \usepackage[localenv,parentype=moreparen]{kskorsymb}|\\
와 같이 선언하고 명령어 매크로를 쓰면 된다.

\paragraph{어깨 글자 주석}
입력한 텍스트는 어깨 글자 주석\kssuperscript{어깨 글자}와 같은 결과를 얻는다. 이와 함께 다음 파라미터 변수를 재정의할 수 있다.

\begin{itemize}\oblivoirlist
\item \cmd{\hnglscriptraisedim} 어깨글자를 끌어올리는 길이이다. \cmd{\setlength}할 수 있고 기본값은 0.367em.
\item \cmd{\hnglscriptfontsize} 어깨글자의 글자 상대 크기이다. \cmd{\renewcommand}할 수 있고 기본값은 {.62}.
%\item \cmd{\hnglsmallerfactor} 괄호 안에 오는 글자의 상대 크기이다. \cmd{\renewcommand}할 수 있고 기본값은 {0.833}.
\end{itemize}

어깨 글자는 \XeTeX, Lua\TeX 에서는 한글 폰트의 속성을 이용하며,
pdf\TeX 에서는 단어 단위로 처리하는 방식을 이용한다.
또한 \XeTeX 에서는 라틴 글자도 한글 폰트로 찍는다.

어깨 글자와 괄호 작은 글자 명령 \verb|"<>|, \verb|"()|는 짧은 인자를 취한다"_즉 인자 안에 \texttt{\textbackslash par}를
가지지 못한다.

\paragraph{괄호 작은 글자}

입력한 텍스트는 \ksparensmall{괄호 안의 작은 글자}와 같은 결과가 된다.
괄호 작은 글자 명령은 인자로 주어진, 또는 \verb|()| 안에 온 텍스트를 괄호로 감싼다. 다음
파라미터 변수를 재설정할 수 있다.

\begin{itemize}\oblivoirlist
%\item \cmd{\hnglscriptraisedim} 어깨글자를 끌어올리는 길이이다. \cmd{\setlength}할 수 있고 기본값은 0.367em.
%\item \cmd{\hnglscriptfontsize} 어깨글자의 글자 상대 크기이다. \cmd{\renewcommand}할 수 있고 기본값은 {.62}.
\item \cmd{\hnglsmallerfactor} 괄호 안에 오는 글자의 상대 크기이다. \cmd{\renewcommand}할 수 있고 기본값은 {0.833}.
\end{itemize}

어떤 괄호로 감쌀 것인지를 지정할 수 있는데, 명령어 매크로 형식으로 줄 때는 다음과 같이 한다.

\begin{verbatim}
\ksparensmall[▷◁]{괄호 안에 오는 텍스트}
\end{verbatim}

이 명령의 결과는 \ksparensmall[▷◁]{괄호 안에 오는 텍스트}과 같이 나타나는 것인데 열고 닫는 부호를
바꾼 효과는 이 명령의 인자에 국한된다. 반면, \verb|"()|를 쓸 때에는

\begin{verbatim}
\defineparensmallparen{▷◁}
\end{verbatim}

\noindent 이와 같이 괄호를 지정한다. 그 결과 \verb|"(괄호 텍스트)|라 입력하면
\ksparensmall[▷◁]{괄호 텍스트}와 같이 나타나고 이 변경의 효과는 현재의 scope에서 계속된다.
괄호의 기본값은 유니코드 "<전각 및 반각 형식"> 블럭의 소괄호 （[U+FF08]）[U+FF09]이다. 단, \cmd{\ksparensmall}의 옵션 인자로든 \cmd{\defineparensmallparen}의
인자로든 \verb|"|로 입력하는 괄호\ksparensmall{예컨대 \texttt{\origrq <}} 문자가 아니라 문자 코드 또는 유니코드 문자 자체를 주어야 오류가 없을 것이다.
이 위치에는 두 개의 문자(토큰)가 와야 하고\ksparensmall{열고 닫는 것} 때에 따라 각각을 중괄호로 묶어주어야 할 수 있다.

따라서 아스키 괄호 [U+0028], [U+0029]를 쓰려 한다면 문서 앞부분에 

\begin{verbatim}
\defineparensmallparen{()}
\end{verbatim}

\noindent 을 선언하면 되겠다.

\paragraph{\pkg{luatexko} 관련 사항} \hologo{LuaLaTeX}으로 \pkg{luatexko} 문서를
작성할 때, \cmd{\setmainfont}가 명시적으로 선언되어야 위의 두 기능(kssuperscript, ksparensmall)의
작동 범위 안에서 라틴 문자와 문장부호가 정상 동작한다.

\paragraph{드러냄표 강조}

\cmd{\dotemph}를 \verb|"| 입력 방식으로 쓸 수 있게 해두었다.
폰트는 ""이탤릭체""로 인쇄한다. ""이탤릭체""가 기울어진 글자가 될지 다른 폰트가 될지는 문서 작성자에
의한 fontspec 설정에 달렸다. (\hologo{pdfTeX}에서는 \texttt{nanumgt}로 인쇄된다.)

\begin{verbatim}
상점 강조 "!상점 강조!
\end{verbatim}

상점 강조 \dotemph{\em 상점 강조}

\section{괄호류 입력의 다른 방법}

\opt{parentype}을 \opt{normal}이 아닌 \opt{troublesome}이나 \opt{moreparen}으로 했을 적에 
괄호류의 기본 입력 방법이 동작하지 않으므로 조금 다른 방법을 써야 한다.
\opt{troublesome}은 \opt{normal}과 비슷하지만 별표(*)를 더 쓰는
방법으로 간편하게 입력할 수 있고, \opt{moreparen}은 모든 KS "(꺾쇠") 괄호류를 전부 사용할 수 있다.

\subsection{troublesome 방식의 괄호류 입력}

\opt{parentype=troublesome}일 때, 괄호류 부호를 다음과 같이 입력할 수 있다.
즉 \verb|"*|로 시작하여 괄호 종류를 나타내는 토큰 하나를 덧붙이는 것이다.

\begin{verbatim}
"*< "*> "*( "*) "*[ "*] "*\{ "*\}
\end{verbatim}

출력은 다음과 같이 나타난다.

〈 〉 《 》 「 」 『  』

\subsection{moreparen 방식의 괄호류 입력}

\opt{parentype=moreparen} 또는 \opt{moreparens}일 때 괄호류는 다음과 같이 입력한다.

\begin{verbatim}
"[<id><text>]
\end{verbatim}

\texttt{<id>}에 해당하는 부호는 다음 표에 제시된 것과 같다. 예컨대 겹낫표는 \verb|"["겹낫표]|와 같이
입력하여 얻을 수 있다.

\begin{center}
\ttfamily
\begin{tabular}{ll|ll|ll}
\hline
' & \snm{SNM}     & " & \bnm{BNM}   & ; & \cnm{CNM} \\
: & \ccnm{CCNM}   & 0 & （sogwalho） & 1 & ｛junggwalho｝ \\
2 & ［daegwalho］  & 3 & 〔gakgwalho〕 & 4 & 【kkeundaegwalho】 \\
q & ‘jageunttaompyo’ & Q & “keunttaompyo” & & \snm{default}  \\ \hline
\end{tabular}
\end{center}

default라는 것은 아무런 \verb|<id>|를 제공하지 않은 경우를 말하는데 낫표가 기본으로 설정되어 있다. 즉,
\verb|"[낫표]|는 \snm{낫표}와 같이 나타난다.

\cmd{\defaultKSParenName}이라는 매크로를 재정의하여 default에 해당하는 부호를 바꿀 수 있다.

\begin{verbatim}
\renewcommand*{\defaultKSParenName}{kkeungdaegwalho}
"[괄호]
\end{verbatim}

\noindent "/괄호"/

재정의하는 명칭은 위의 표에 제시된 이름이다. 예컨대 겹낫표로 재정의하려면 

\verb|\renewcommand*\defaultKSparenName{BNM}|

\medskip

이 입력방식에서 \verb|"[| 다음에 오는 토큰 하나는 일종의 인자이다. 따라서 실제 텍스트와 혼동하지 않도록
주의해야 할 경우가 가끔 있다. 예컨대 텍스트가 숫자 \texttt{0, 1, 2, 3, 4}나
\texttt{", ', ;, :, q, Q}로 시작하는 경우라면 ""인자""와 ""텍스트""를 분명하게 구분해주어야 할 것이다. ［2024］라는
결과를 얻기 위해서는 \verb|"[22024]|와 같이 입력해야 한다. 이것이 혼동하기 쉬우므로 인자 부분을 중괄호로
감싸서 \verb|"[{2}2024]|와 같이 입력하는 것이 좋을 것이다. default일 적에 인자가 비었음을 의미하는 중괄호를
두어야 할 수 있다. \verb|"[{}2024]|.



\section{주의사항}

\subsection{verbatim과 16진수}

이 패키지를 로드하면 \texttt{\origrq} 문자의 catcode가 \texttt{document} 환경에서 \cmd{\active}로 된다(다르게 말하면 \verb|"|가 하나의 매크로와 같다).
그러므로 만약 \verb|"|를 원래의 \LaTeX 에서와 같은 용법으로 사용하려 한다면 이 토큰의 catcode를
원래대로 되돌려주어야 한다.

\begin{itemize}\oblivoirlist
\item \verb|\makerqother|. 이 선언은 \verb|"|의 catcode를 원래대로 other(12)로 만든다.
따라서 이 명령이 주어진 후로는 이 패키지가 제공하는 \verb|"|를 명령어처럼 사용하는 것이 불가능해진다.
\brr\relax ". "( ") \err
\item \verb|\makerqactive|. 이 선언은 \verb|"|의 catcode를 다시 active로 만든다. 
". "( ")
\end{itemize}

%\noindent 편의를 위하여 \verb|\escaperqcat|을 \verb|\brr|, \verb|\restorerqcat|을 \verb|\err|로 줄여쓸 수 있다.

이제 생각해볼 수 있는 몇 가지 문제에 대해 살펴보자.

\paragraph{(1)}

의도하지 않은 부호의 치환이 발생하는 때. 현재 이 문서에서는 \cmd{\verb}와
\cmd{verbatim} 환경에서는 문제가 발생하지 않도록 해두었으나, 다른 패키지를 올린다든가
하여 원치않는 결과가 나와서
\verb|"|에 의한 문자 치환이 의도하지 않게 발생할 때가 있다.

예를 들면 \textsf{memoir}의
\texttt{boxedverbatim} 환경 안에서 다음과 같은 일이 일어난다.

\begin{boxedverbatim}
"(, "), "<, ">
\end{boxedverbatim}

이를 방지하기 위해서는 다음 코드를 preamble에 두어야 한다.

\begin{verbatim}
\usepackage{etoolbox}
\AtBeginEnvironment{boxedverbatim}{\catcode`\"=12}
\end{verbatim}

\AtBeginEnvironment{boxedverbatim}{\catcode`\"=12}

이렇게 한 이후에 의도대로 동작할 것이다.

\begin{boxedverbatim}
"(, "), "<, ">
\end{boxedverbatim}

아니면, \verb|\makerqother| 등을 이용하여 \verb|"|의 catcode를 바꾸는 방법도 있다.

\paragraph{(2)}

한편, 예를 들어서 \brr \verb|\symbol{"002D}|\err 와 같은 명령을 본문에서 실행하려 한다면 \texttt{\origrq} 때문에 역시 문제가 발생할 수 있다. 다음과 같이 처리하는 것이 필요할 것이다.

\begin{verbatim}
\makerqother\symbol{"AC00}\makerqactive
\end{verbatim}

\makerqother\symbol{"AC00}\makerqactive

\subsection{이동하는 인자}

현재 \texttt{\origrq}는 fragile로 정의되어 있다. 그러므로 ""이동하는 인자""\kssuperscript{moving arguments} 위치에 올 때는 이를 \cmd{\protect}해주어야 한다. 

\begin{verbatim}
\section{가운뎃점(\protect".)}
\end{verbatim}

pdf 북마크에서"_완전히 똑같은 모양으로 북마크에 나타나지 않지만"_\verb|"|가 쓰인 부호는 대부분 에러없이 나타난다. \textsf{hyperref}이 로드되지 않았을 때 발생하는 문제 역시 version 0.5에서 대부분 해결되었다. 그래도 혹시 문제가 발생한다면 \cmd{\texorpdfstring}을 활용하기 바란다.


\subsection{다른 패키지와의 호환성}

만약 \texttt{\origrq}를 특별한 목적으로 사용하는 패키지가 있다면 상충이 있을 수 있다.
현재까지 확인된 바로는 \textsf{mathspec}의 간격 명령이 있는데, 이 패키지가 로드되면 
\textsf{mathspec}의 \texttt{\origrq}를 이용한 간격 명령은 동작하지 않는다.
\textsf{mathspec}은 아주 드물게, 그것도 \XeTeX 에서만 쓰이는 패키지이고 \textsf{unicode-math}로 이를 충분히
대체할 수 있기 때문에 이것이 큰 문제가 되지 않을 것이라고 희망한다.

\subsection{\hologo{pdfTeX} 호환성}

이 패키지는 \pkg{kotex} 또는 \pkg{oblivoir}가 로드된 상황이면 \hologo{pdfTeX}에서도 동작한다.
단, 다음과 같은 점에 유의하여야 한다.
\begin{enumerate}[\quad(1)]\oblivoirlist
\item 고정 폰트 부호는 \hologo{pdfTeX}에서 현재의 폰트로만 식자된다. 따라서 \pkg{nanumtype1}과 \pkg{uhc}에서 지원하지 않는 부호 문자는 식자할 수 없다.
\item \cmd{\defineextraparenmark} 명령의 인자는 각각의 문자를 중괄호로 둘러싸서 주어야 한다.
예를 들면 \verb|\defineextraparenmark{{【}{】}}|. \cmd{\defineparensmallparen}의 인자나 \cmd{\ksparensmall}의 옵션 인자 위치에서도 같다.
\item \cmd{\kssuperscript}가 \hologo{pdfTeX}에서도 동작하기는 하지만 어깨 글자들은 단어 사이에서만 줄바꿈이 일어난다.
\item \opt{moreparen}의 괄호류 입력 방법에서 "'default"' 방법은 반드시 빈 인자를 밝혀야 한다. 한글이 \opt{<id>} 인자 없이 바로 나타나는 경우에 에러를 보일 것이다. 예: \verb|"[낫표]| 대신 \verb|"[{}낫표]|와 같이 입력해야 한다.
\end{enumerate}


\addUserSymbol{*=※,{=}= ☞}


\section{변경 이력}

"= version 0.1\tabto*{3cm} kskorsym.sty (2024/08/15)

\noindent"= version 0.6\tabto*{3cm} 패키지의 주요 부분을 다시 쓰고 이름을 kskorsymb로 바꿈. (2024/08/25)

\noindent"= version 0.6.3\tabto*{3cm} \cmd{\removeUserSymbol} 추가. (2024/08/30)

\noindent"= version 0.7\tabto*{3cm} \pkg{troublesomeprobs}와 \pkg{somemoreparens}를 합침. (2024/09/21)

\noindent"= version 0.7.2\tabto*{3cm} minor fix. (2024/09/24)

\noindent"= version 0.7.3\tabto*{3cm} \cmd{\kssuperscript}, \cmd{\ksparensmall} (2024/09/25)

\noindent"= version 0.7.4\tabto*{3cm} functions improved. \hologo{pdfTeX} 지원 (2024/10/05)

\noindent"= version 0.7.5\tabto*{3cm} 사소한 수정 (2025/01/16)

\noindent"= version 0.8\tabto*{3cm} wavedash 옵션, \cmd{\addUserUnicodeSymbol}.

\end{document}

