\documentclass[b5paper,11pt]{oblivoir}

\usepackage{fapapersize}
\usefapapersize{*,*,.75in,*,.75in,*}

\ifLuaOrXeTeX
\setobmainfont[texgyrepagella](-regular.otf)(-bold.otf)(-italic.otf)
\setobsansfont[QTOptimum](.otf)(-Bold.otf)(-Italic.otf)
\setmonofont{jetbrainsmono}[Scale=.91]
\setkomainfont(Noto Serif CJK KR)[Scale=MatchUppercase,WordSpace={1.1,1,.5}]
\setkosansfont(Noto Sans CJK KR)[Scale=MatchUppercase]
\setkomonofont(D2Coding)[Scale=.9]
\fi

\usepackage[parentype=moreparens]{kskorsymb}
\usepackage{kswdash}
\usepackage{ksvqt}

\usepackage{fbox}
\usepackage[tcolorbox,backcolor=gray!8,framecolor=gray!80]{srcandtext}
\usepackage{kotex-logo}
\def\pdfTeX{\texorpdfstring{\hologo{pdfTeX}}{pdfTeX}\index{pdfTeX@pdf\TeX}}
\usepackage{figureversions}
\IfPackageLoadedTF{luatexko}{}{%
	\usepackage[normalem]{ulem}
}

\usepackage{graphicx}
\usepackage[export]{adjustbox}
\usepackage{kotex-logo}
\def\pdfTeX{\texorpdfstring{\hologo{pdfTeX}}{PDFTeX}}

\usepackage{ksforloop}
\usepackage{ksmiscmisc}

\ExplSyntaxOn

\NewDocumentCommand \showcmd { m }
{
	\par\vspace{\medskipamount}
	\clist_set:Nn \l_tmpa_clist { #1 }
	\dim_zero:N \l_tmpb_dim
	\clist_map_inline:Nn \l_tmpa_clist
	{
		\settowidth{\l_tmpa_dim}{\ttfamily\tl_to_str:n { ##1 } }
		\dim_compare:nT { \l_tmpa_dim > \l_tmpb_dim }
		{
			\dim_set_eq:NN \l_tmpb_dim \l_tmpa_dim
		}
	}
	\dim_add:Nn \l_tmpb_dim {6pt}
	
	\noindent\hspace*{-2em}
	\fparbox[bt,boxrule=1.5pt,linewidth=\l_tmpb_dim]{
		\setstretch{1}
		\int_zero:N \l_tmpa_int
		\clist_map_inline:Nn \l_tmpa_clist
		{
			\int_incr:N \l_tmpa_int
			\cmd{##1}
			\int_compare:nF { \l_tmpa_int == \clist_count:N \l_tmpa_clist }
			{ \newline }
		}
	}
	\nopagebreak\par
	\vspace{\smallskipamount}
	\noindent
	\ignorespaces
}

\makeindex

\ExplSyntaxOff

\makeatletter 
\renewcommand{\cmd}[1]{\cmdprint{#1}%
  \index{\expandafter\@gobble\string#1@\string\cmdprint{\string#1}}}
\patchcmd{\theindex}{\@makeschapterhead{\indexname}}{\section*{\indexname}}{}{}
\patchcmd{\theindex}{\addcontentsline{toc}{chapter}{\indexname}}{ \addcontentsline{toc}{section}{\texorpdfstring{\string\kern1.8em\indexname}{\indexname}}}{}{}
\makeatother 

\AddToHook{env/examplebelow/begin}{\makerqother}
\AddToHook{env/exampleside/begin}{\makerqother}

\makeindex 
\renewcommand*\indexname {명령어 색인}

\def\pkg#1{\textsf{#1}\index{Packages!#1@\textsf{#1}}}
\def\ucp#1{\texttt{[U+#1]}\index{Unicode Characters!#1@\texttt{[U+#1]}}}
\newcommand*\env[1]{{\sffamily\itshape #1}}
\let\beginScope\begingroup
\let\endScope\endgroup
\def\sto#1{\texttt{#1}\index{Options!#1@\texttt{#1}}}
\let\opt\sto
\apptocmd\koTeX{\index{Packages!ko.TeX@\textsf{ko.TeX}}}{}{}
\newcounter{dummy}

\begin{document}

\title{ksmiscmisc}
\author{Nova de Hi\qquad version0.3}
\maketitle

2019년에 KTUG에서는 Expl3 학습모임을 가졌다. 
이때 공부용으로 작성했던 소소한 매크로 몇 개를 묶었다.

\section{tl pop}

\showcmd{
\ks\_{}pop\_{}left:NN,
\ks\_{}pop\_{}right:NN,
}

\verb|\ks_pop_left:NN|과 \verb|\ks_pop_right:NN|은 \verb|<tlvar1>|의 왼쪽(오른쪽) 끝의 item을
하나 꺼내어 \verb|<tlvar2>|에 넣고 \verb|<tlvar1>|에서 삭제한다.

Expl3에는 \verb|\seq_pop_left:NN|\allowbreak 이 있지만 tl(token list)에 대해서는 \verb|\tl_head:N|와 \verb|\tl_tail:N|이 있는 대신 pop 명령이 없어서 만든 것이다. 이를 이용하여 tl을 간단한 stack처럼 활용할 수 있다.

그러나 이 명령은 \verb|\ks_seq_set_from_tl:NN|과 \verb|\ks_clist_set_from_tl:NN|을 작성하기 위한 것이기도 하다. clist와 seq의 막강한 데이터 조작 능력을 tl에 대하여 얻고자 하는 것이 이 명령의 목적이다.

다음 예를 참고하라. (\verb|\ks_for_loop:nnn| 명령은 ksforloop.sty를 요구한다. 이것은 \verb|\ksforloop|와 달리 루프 코드를 그루핑하지 않는 대신 nesting이 불가능하다.)

\begin{examplebelow}
\ExplSyntaxOn
\NewDocumentCommand \test { m }
{
    \tl_set:Nn \l_tst { #1 }
    \ks_for_loop:nnn {}{\tl_count:N \l_tst }
    {
        \ks_pop_right:NN \l_tst \l_tmp
        \fbox{\l_tmp}
    }
}
\ExplSyntaxOff
\test{가나다라마바사아{자차}카타파하}
\end{examplebelow}

\section{tl and sequence}

\showcmd{
\ks\_{}clist\_{}set\_{}from\_{}tl:NN <clist> <tl>,
\ks\_{}seq\_{}set\_{}from\_{}tl:NN <seq> <tl>
}

\verb|\ks_clist_set_from_tl:NN|은 이름 그대로 token list의 각 item을 comma separated list로 만든다. 

\verb|\ks_seq_set_from_tl:NN|도 마찬가지로 tl의 item을 seq로 만든다. \verb|<clistvar>|\allowbreak 와 \verb|<seqvar>|는 전역적(global)으로 정의된다.

\begin{examplebelow}
\ExplSyntaxOn
\NewDocumentCommand \testa { m }
{
    \tl_set:Nn \l_tst { #1 }
    \ks_clist_set_from_tl:NN \g_tst_cl \l_tst
    \clist_use:Nnnn \g_tst_cl {\과~} {\과~} {,~그리고~}
}
\ExplSyntaxOff
\testa{123456789{10}}
\end{examplebelow}

\section{int step break}

\showcmd{\ks\_{}int\_{}step\_{}break:}
Expl3의 \verb|\int_step_...| 함수의 내부에서 루프를 중단한다.

\begin{examplebelow}
\ExplSyntaxOn
\int_step_inline:nn {10} {
    \int_compare:nT { #1 >= 6 }
        { \ks_int_step_break: }
    \fbox{#1}\space
}
\ExplSyntaxOff
\end{examplebelow}

\end{document}