%% File `oblivoir-xl.cls`
%%
%% (C) Copyright 2006-2023 Kangsoo Kim <modviv2k15 at gmail dot com>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%  http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2006/05/20 or later.
%%
%% an oblivoir-compatible package for using with LuaLaTeX or XeLaTeX.
%% depends upon Dohyun Kim's xetexko and the author's memhangul-x.
%%
\ProvidesClass{oblivoir-xl}
  [2023/03/08 v3.2.1 memoir-based class to typeset Korean]

\providecommand\@DisabledOption[1]{%
  \typeout{[#1] option is deprecated}}

%\RequirePackage{xkeyval}
%% expl3 and xparse
%\RequirePackage{xparse}

%%% Disabled Options
\DeclareOptionX{dvips}{\@DisabledOption{\CurrentOption}}
\DeclareOptionX{romanfixed}{\@DisabledOption{\CurrentOption}}
\DeclareOptionX{finemath}{\@DisabledOption{\CurrentOption}}
\DeclareOptionX{nofinemath}{\@DisabledOption{\CurrentOption}}
\DeclareOptionX{strictcharcheck}{\@DisabledOption{\CurrentOption}}
\DeclareOptionX{noreserveinserts}{\@DisabledOption{\CurrentOption}}

%%% active Options
\newif\ifnokorean\nokoreanfalse
\DeclareOptionX{nokorean}{\nokoreantrue}
\newif\if@polyglossia\@polyglossiafalse
\DeclareOptionX{polyglossia}{\@polyglossiatrue}
\newif\if@babelhangul\@babelhangulfalse
\DeclareOptionX{babelhangul}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}} %%2023-03
\DeclareOptionX{babelvacant}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}} %%2023-03
\newif\iftwosidedoc\twosidedocfalse
\DeclareOptionX{twoside}{\twosidedoctrue}
\newif\ifopenrightdoc\openrightdocfalse
\DeclareOptionX{openright}{\openrightdoctrue}
\newif\ifkosection\kosectionfalse
\DeclareOptionX{kosection}{\kosectiontrue}
\newif\ifnobookmarks\nobookmarksfalse
\DeclareOptionX{nobookmarks}{\nobookmarkstrue}
\newif\ifbookmarkpkg\bookmarkpkgfalse
\DeclareOptionX{bookmark}{\bookmarkpkgtrue}
\newif\ifhyperrefwithlyx\hyperrefwithlyxfalse
\DeclareOptionX{lyxhyper}{\hyperrefwithlyxtrue}{\hyperrefwithlyxfalse}
\DeclareOptionX{nohyperref}{\hyperrefwithlyxtrue}{\hyperrefwithlyxfalse}
\newif\if@tendotfive\@tendotfivefalse
\DeclareOptionX{10.5pt}{\@tendotfivetrue}
\newif\if@koreanfn\@koreanfnfalse
\DeclareOptionX{footnote}{\@koreanfntrue}
\newif\if@toclofentry\@toclofentryfalse
\DeclareOptionX{tocentry}{\@toclofentrytrue}
%\newif\if@itemph\@itemphfalse
\DeclareOptionX{itemph}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
\DeclareOptionX{gremph}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
\newif\if@chapter\@chapterfalse
\DeclareOptionX{chapter}{\@chaptertrue\@toclofentrytrue}
\newif\if@microtype\@microtypefalse
\DeclareOptionX{microtype}{\@microtypetrue}
\newif\if@subfigure\@subfigurefalse
\DeclareOptionX{subfigure}{\@subfiguretrue}
\newif\if@manspace\@manspacefalse
\DeclareOptionX{obspace}{\@manspacetrue}
\DeclareOptionX{adjustmath}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}} %%% disabled 2020
\DeclareOptionX{mathdisp}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
%
%%% new Options
\DeclareOptionX{latinquote}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
%%% changed fontspec -> manualfontspec
\DeclareOptionX{fontspec}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
\newif\if@moreverb\@moreverbfalse
\DeclareOptionX{moreverb}{\@moreverbtrue}
\newif\if@foursix\@foursixfalse\newlength\fa@setheight\newlength\fa@setwidth
\DeclareOptionX{faht}[]{\fa@setheight=#1\@foursixtrue}
\DeclareOptionX{fawd}[]{\fa@setwidth=#1\@foursixtrue}
\newif\if@amsmath\@amsmathfalse
\DeclareOptionX{amsmath}{\@amsmathtrue}
\DeclareOptionX{nowinname}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
%
\newif\ifPRELOAD\PRELOADfalse
\DeclareOptionX{preload}[]{\PRELOADtrue\gdef\PRELOADstr{#1}}

\ExplSyntaxOn
\tl_new:N \g_preload_option_str 
\DeclareOptionX{preloadoption}[]{
	\tl_gset:Nn \g_preload_option_str { #1 }
}
\ExplSyntaxOff

\newif\if@lwarp\@lwarpfalse
\DeclareOptionX{lwarp}{\@lwarptrue}{\@lwarpfalse}
\ExplSyntaxOn
\tl_new:N \g_lwarp_option_str
\DeclareOptionX{lwarpoption}[]{%
	\tl_gset:Nn \g_lwarp_option_str { #1 }
}
\ExplSyntaxOff
\def\LWARPlan{en-US}
\DeclareOptionX{lwarplanguage}[]{\gdef\LWARPlan{#1}}

%% [nounfonts] 
\DeclareOptionX{unfonts}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
\DeclareOptionX{nounfonts}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
\DeclareOptionX{nanum}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
\DeclareOptionX{hcr}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}

\DeclareOptionX{figtabcapt}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}

\DeclareOptionX{cjk}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}
%\DeclareOptionX{cjkoption}[]{\PassOptionsToPackage{#1}{cjkutf8-ko}}
\DeclareOptionX{dhucs}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}

%%% compatibility options
\DeclareOptionX{uset1font}{\PassOptionsToPackage{usecjkt1font}{cjkutf8-ko}}
\DeclareOptionX{usedotemph}{\PassOptionsToPackage{\CurrentOption}{memhangul-x}}

%%% 
\DeclareOptionX*{%
 \PassOptionsToClass{\CurrentOption}{memoir}%
}
%
\ProcessOptionsX

%%% moreverb
\if@moreverb
 \RequirePackage{moreverb}
\fi

%%% preload
\ifPRELOAD
\ExplSyntaxOn
	\RequirePackage[\g_preload_option_str]{\PRELOADstr}
\ExplSyntaxOff
\ifx\medspace\undefined\relax\else\let\medspace\relax\fi
\fi

%% LyX compatibility
%\ifx\@textsubscript\undefined\else
%  \let\@textsubscript\relax
%\fi

%%% memoir/memhangul-ucs 로드.
\if@chapter
  \LoadClass[openany]{memoir}
\else
\iftwosidedoc
  \LoadClass[article,openany]{memoir}
\else
  \LoadClass[article,openany,oneside]{memoir}
\fi
\fi

%%% fontspec problem
%  \RequirePackage{etex}\reserveinserts{40}%

%%% workaround with flowfram
\if@foursix
 \newcommand*{\fa@dblfoursix}{\stockheight=\fa@setheight \stockwidth=\fa@setwidth}
 \fa@dblfoursix
\fi

%%%
\ifopenrightdoc\openright\fi

\RequirePackage{ifluatex}
\RequirePackage{ifxetex}

%%\RequirePackage{comment}
%%\def\finemath@status{}

%\ifxetex\else\ifluatex\else
%  \PackageError{xoblivoir}{This Document requires Xe(La)TeX or Lua(La)TeX!}{}
%\fi\fi

%%% lwarp
\ExplSyntaxOn

\if@lwarp
  \if@polyglossia\else
	\ifluatex
		\RequirePackage{luatexko}
	\else\ifxetex
		\RequirePackage{xetexko}
	\fi\fi
  \fi
	\RequirePackage[\g_lwarp_option_str]{lwarp}
	\RequirePackage{xob-lwarp}
\fi

\ExplSyntaxOff

%%% ams{math|symb}
\if@amsmath
 \RequirePackage{amsmath,xob-amssymb}
\fi

\def\@Load@Memhangul{%
  \if@polyglossia
    \RequirePackage[polyglossia]{memhangul-x}
  \else
    \RequirePackage[nonfrench,hangulpagestyle]{memhangul-x}
  \fi
}

\ifnokorean\else
  \@Load@Memhangul
\fi

\if@chapter\else
  \counterwithout{section}{chapter}
\fi

%%%
%%% xetex doesn't know microtype,
%%% but xetexko has hangingpunctuation feature, which
%%% we will use instead.
%%%
\ifnokorean\else
\if@microtype
  \ifxetex
    \usepackage{xetexko-hanging}
	\AtBeginDocument{\hangingpunctuation}
	\typeout {xoblivoir: use xetexko-hanging instead of microtype}
  \else
%   \ifluatex
%      \enablemicrotype
%    \fi
  \fi
\fi
\fi

%%% 기본 자간
\newdimen\ob@hu  % 1jw=.95em, 1hu=1/16jw. see hfontspec.oblivoir
\ifnokorean\ob@hu=\z@\else\ob@hu=.059375em\fi
%%% defaultskip: suppressed (2015/04/19)
\if@manspace
\def\ob@DEFAULTskips{%
	\def\memucshangulskips{}%
	\def\memucsinterwordskip{%
		\spaceskip = .390\BASE@FONTsize plus .1\BASE@FONTsize minus .1\BASE@FONTsize
%		\if@nonfrench
		\xspaceskip = .432\BASE@FONTsize plus .11\BASE@FONTsize minus .1\BASE@FONTsize
%		\fi
	}%
	\def\memucsinterwordchapterskip{%
		\spaceskip = .41\BASE@FONTsize plus .11\BASE@FONTsize minus .1\BASE@FONTsize
%		\if@nonfrench
		\xspaceskip = .55\BASE@FONTsize plus .1\BASE@FONTsize minus .1\BASE@FONTsize
%		\fi
	}%
}
\let\DEFAULTskips\ob@DEFAULTskips
\else
\let\memucshangulskips\relax
\let\memucsinterwordskip\relax
\let\memucsinterwordchapterskip\relax
\let\DEFAULTskips\relax
\fi
\def\ob@thinthinspace{\hskip2\ob@hu}
\def\ob@onethirdspace{\hskip5\ob@hu}

\ifnokorean\else
\if@koreanfn
%%% footnote setting
%%% 99)에 해당하는 박스 길이를 구한 다음
\newsavebox\mytmpbox\sbox\mytmpbox{\footnotesize 99)\ }
%%% 각주 번호 박스를 길이에 대하여 오른쪽 정렬함. 두 자리
%%% 각주 번호 기준으로 오른쪽 정렬되도록 만든다.
\footmarkstyle{\makebox[\wd\mytmpbox][r]{#1)\ }}
\setlength\footmarksep{\wd\mytmpbox}
\setlength\footmarkwidth{0pt}
\setlength\footparindent{0pt}
%\ifnokorean\else
\SetFnmark{\textsuperscript}{\textsuperscript{)}}
%\fi
\fi\fi
%%% footnotes and floats. codes from memmanadd.pdf
\renewcommand*{\footnoterule}{\kern-3pt\vfill
  \hrule width 0.4\columnwidth \kern 2.6pt}
\setlength{\skip\footins}{1.2\onelineskip}

%%% toc 등의 레이아웃.
\if@chapter\else
\renewcommand\chaptitlefont{\Large\bfseries}
\renewcommand\printchapternonum{}
\renewcommand\printchaptertitle[1]{\chaptitlefont #1}
\setlength\afterchapskip{\onelineskip}
\setlength\beforechapskip{1.5\onelineskip}
\fi

\setlength\cftsectionindent{0pt}
\ifnokorean\else
\setlength\cftsectionnumwidth{1.8em}
\setlength\cftsubsectionindent{1.8em}
\setlength\cftsubsectionnumwidth{2.5em}
\fi
\if@chapter\else
\let\cftchapterindent\cftsectionindent
\let\cftchapternumwidth\cftsectionnumwidth
\let\cftbeforechapterskip\cftbeforesectionskip
\fi

\renewcommand\cftsectionpresnum{\hfill}
\renewcommand\cftsectionaftersnum{\hskip.8em}

%% moved kscntformat to memhangul-x
%%%% kscntformat
%%%% HLaTeX의 \kscntformat 명령을 흉내냄
%%%% \kscntformat{section}{제}{절} 형식으로 쓴다.
%\newsavebox{\tmp@XXbox}
%\newdimen\tmp@XXdim
%\def\kscntformat#1#2#3{%
%	\sbox{\tmp@XXbox}{#2\expandafter\number\csname c@#1\endcsname#3}%
%	\setlength\tmp@XXdim{\wd\tmp@XXbox}\advance\tmp@XXdim by1em%
%	\expandafter\def\csname the#1\endcsname{#2\expandafter\number\csname c@#1\endcsname#3}%
%	\expandafter\renewcommand\csname cft#1numwidth\endcsname{\tmp@XXdim}%
%	\expandafter\renewcommand\csname cft#1presnum\endcsname{}%
%	\expandafter\renewcommand\csname cft#1aftersnum\endcsname{}%
%}

%\ifnokorean\else
%\ifkosection
%\kscntformat{section}{제}{절}
%\renewcommand\thesubsection{\arabic{section}.\arabic{subsection}}
%\fi\fi

%%% misc settings
\raggedbottom
\ifnokorean
\renewcommand\sectionmark[1]{\markboth{\thetitle}{#1}}
\else
\renewcommand\sectionmark[1]{\markboth{\thetitle}{#1}}
\fi
%\renewcommand\subsectionmark[1]{\markright{#1}}
\ifnokorean
\newcommand*\MarkDocTitle{\markboth{\thetitle}{}}
\else
\newcommand*\MarkDocTitle{\markboth{\thetitle}{}}
\fi

%%% for bookmarks and hyperref
\def\CallHyperref{%
 \ifnobookmarks
   \@Call@Hyperref@Without@Bookmarks
 \else 
   \@Call@Hyperref@With@Bookmarks
 \fi
 \ifbookmarkpkg
   \RequirePackage{bookmark}
 \fi
}

\def\@Call@Hyperref@Without@Bookmarks{%
% \ifluatex
%  \usepackage[unicode,bookmarks=false]{hyperref}
% \else\ifxetex
%  \usepackage[bookmarks=false]{hyperref}
% \else
%  \usepackage[unicode,bookmarks=false]{hyperref}
% \fi\fi
  \RequirePackage[bookmarks=false]{hyperref}
}

\def\@Call@Hyperref@With@Bookmarks{%
% \ifluatex
%  \usepackage[unicode]{hyperref}
% \else\ifxetex
%  \usepackage{hyperref}
% \else
%  \usepackage[unicode]{hyperref}
% \fi\fi 
  \RequirePackage{hyperref}
}

%% LyX 1.6.x의 Insert-Hyperlink 기능과 충돌하지 않게 하기 위하여
%% hyperref을 로드하지 않음. (lyxhyper 옵션)
%% lyxhyper = nohyperref
%% note: memhfixc는 memoir 자신이 로드해준다.
\ifnokorean\relax\else
  \ifhyperrefwithlyx\relax\else
    \CallHyperref
\fi\fi

%%% \engtxt를 일일이 쓰기 귀찮고 space가 하나밖에 없을 때
%%% 쓰기 위한 \ensp 매크로.
\newskip\@ensp
\@ensp=.297em plus .02em minus .01em
\def\ensp{\hskip\@ensp}

%%% article의 pagestyle 기본값은 plain임.
\pagestyle{plain}

%%% 2006/09/01 \title, \author 문제. reported by IsCho
\AtBeginDocument{%
 \@ifundefined{thetitle}{\title{}}{\relax}
 \@ifundefined{theauthor}{\author{}}{\relax}
}

%%% 2006/09/05 [10.5pt] option, [romanfixed] 2006/10/22.
\if@tendotfive
  \RequirePackage{10_5}
\fi

%%%% 2006/10/19. 현범석 님이 지적한 lof, toc 문제
\if@chapter\else
 \usepackage{ob-toclof}
\fi

%%% oblivoir-chapter (12/20)
\if@chapter
\newcommand\oblivoirchapterstyle[1]{%
 \chapterstyle{#1}
 \renewcommand{\chapterheadstart}{\clearforchapter\vspace*{\beforechapskip}}
}
\fi

%%%%%%%%%%%%% APPENDIX

\ifnokorean\def\appendixrefname{Appendix}\else\def\appendixrefname{부록}\fi
\def\appref#1{\appendixrefname~\ref{#1}}

\newif\if@AppendixTitleToToc\@AppendixTitleToTocfalse
\newif\if@AttachAppendixTitleToSecnum\@AttachAppendixTitleToSecnumfalse

\def\AppendixTitleToToc{%
 \@AppendixTitleToToctrue
}

\def\AttachAppendixTitleToSecnum{%
 \@AttachAppendixTitleToSecnumtrue
}

\def\AppendixTitle{%
 \chapter*{\appendixname}
}

\ifnokorean
\usepackage{ob-nokoreanappendix}
\else
\usepackage{ob-koreanappendix}
\fi

%%%%%%%%%%%%%%% enumerate
\@ifpackageloaded{enumerate}{}{\RequirePackage{enumerate}}
\def\@enloop@{%
%%% why @enhook doesn't work?
  \ifx 가\@entemp		 \def\@tempa{\@enLabel\gana  }\else
  \ifx ㈎\@entemp		 \def\@tempa{\@enLabel\pgana }\else
  \ifx ㉮\@entemp		 \def\@tempa{\@enLabel\ogana }\else
  \ifx ㄱ\@entemp		 \def\@tempa{\@enLabel\jaso  }\else
  \ifx ㈀\@entemp		 \def\@tempa{\@enLabel\pjaso }\else
  \ifx ㉠\@entemp		 \def\@tempa{\@enLabel\ojaso }\else
  \ifx ⑴\@entemp		 \def\@tempa{\@enLabel\pnum  }\else
  \ifx ①\@entemp		 \def\@tempa{\@enLabel\onum  }\else
  \ifx ⒜\@entemp		 \def\@tempa{\@enLabel\peng  }\else
  \ifx ⓐ\@entemp		 \def\@tempa{\@enLabel\oeng  }\else
  \ifx ⅰ\@entemp		 \def\@tempa{\@enLabel\hroman}\else
  \ifx Ⅰ\@entemp		 \def\@tempa{\@enLabel\hRoman}\else
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \ifx A\@entemp         \def\@tempa{\@enLabel\Alph  }\else
  \ifx a\@entemp         \def\@tempa{\@enLabel\alph  }\else
  \ifx i\@entemp         \def\@tempa{\@enLabel\roman }\else
  \ifx I\@entemp         \def\@tempa{\@enLabel\Roman }\else
  \ifx 1\@entemp         \def\@tempa{\@enLabel\arabic}\else
  \ifx \@sptoken\@entemp \let\@tempa\@enSpace         \else
  \ifx \bgroup\@entemp   \let\@tempa\@enGroup         \else
  \ifx \@enum@\@entemp   \let\@tempa\@gobble          \else
                         \let\@tempa\@enOther
                         \@enhook
             \fi\fi\fi\fi\fi\fi\fi\fi
             \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
  \@tempa}

%%% subsection까지 항번을 붙이고 toc에 두자.
\maxtocdepth{subsection}
\maxsecnumdepth{subsection}

%%% oblivoirallowbreak
\ifx\oblivoirallowbreak\undefined
\def\oblivoirallowbreak{\hskip1sp\hskip-1sp}
\fi

%%% subfigure package compatibility
\if@subfigure
 \let\c@lofdepth\relax
 \let\c@lotdepth\relax
\fi

%%% redefine \see or \seealso
\ifnokorean\else
\@ifundefined{see}{}{%
 \renewcommand*{\see}[2]{#1\seename, \hyperpage{#2}}
}
\@ifundefined{seealso}{}{%
 \renewcommand*{\seealso}[2]{#1\alsoname, \hyperpage{#2}}
}
\fi

%%% to avoid conflicts with etextools
\ExplSyntaxOn
\cs_if_exist:NF \globcount
{ \let\globcount\newcount }
\ExplSyntaxOff

%%% for LaTeX programmers
\let\ifLwarp\if@lwarp

\endinput

%%% ChangeLog:
%%% 2023-03-08 : polyglossia, babel, babelvacant added.
%%% 2015-10-19 : fix conflicts with etextools package.
%%%% 2015-08-01 : drop etex.sty 
%%% 2015-07-27 : fix nokorean bug 
%%% 2015-07-10 : etex-pkg conflicts fixed.
%%% 2015-04-19 : suppress space factors
%%% 2014-06-12 : introduce new xob-font.sty
%%% 2014-06-06 : replace false \renewcommand with \setlength
%%% 2013-10-26 : moved \kscntformat definition to memhangul.
%%% 2013-09-12 : integrate ifluaorxetex.sty
%%% 2013-09-01 : [cjk], [dhucs] option introduced.
%%% 2011-09-26 : [preloadoption] bugfix.
%%% 2011-09-15 : [fontspec] renamed to [manualfontspec]; and intrudoce [fontspec, xcolor, hyperref, preloadoption]
%%% 2010-09-16 : reserveinserts, lyx compatibility etc. (for TeX Live 2010)
%%%      08:46 2010-02-09 : [microtype] -> hanging punctuation (xetexko)
%%%      10:16 2009-10-27 : [preload] 옵션
%%% 오전 3:12 2009-04-07 : [lyxhyper] 옵션
%%% 오전 6:36 2008-09-18 : revive microtype option, in spite of its impotence.
%%% 오후 2:16 2008-09-18 : latinquote 옵션
%%% 오전 4:58 2008-09-30 : xkospace 새 버전에 맞춘 대대적인 수정.
%%%                      : enumerate, hangul item title, 기호문자 등을 추가.
%%% 오후 5:25 2008-10-07 : revive gremph/itemph
%%% 오전 10:51 2008-10-08 : revive kscntformat
%%% 오전 5:12 2008-10-12 : fontspec, moreverb, xob-hanfont
%%% 오전 1:19 2008-10-13 : xetexko v0.1 반영
%%% 오전 12:50 2008-10-22 : fawd, faht 옵션 추가. (workaround with flowfram)
%%% 오후 12:22 2008-10-24 : add [unicode] option to hyperref under LuaTeX
%%% 13:49 2008-11-24 : add [amsmath] option to avoid LyX's auto loading problem under XeLaTeX.
%%% 오후 17:59 2008-12-03 : nowinname 옵션 추가
