\documentclass[nanum,b5paper]{oblivoir}

\usepackage{fapapersize}
\usefapapersize{*,*,1in,*,1in,*}

\usepackage{kotex-logo}

\usepackage{ksforloop}
\usepackage{hanjacnt}

\usepackage{multido}

\begin{document}

\title{ksforloop}
\author{Nova De Hi}
\date{2015년 5월 18일, v0.3}
\maketitle

\begin{abstract}
정수 기반의 for-형 반복문 \verb|\ksforloop|를 정의한다.
\end{abstract}

\tableofcontents*

\section{사용법}

\begin{boxedverbatim}
\ksforloop{<cnt>=<start>+<step>}{<end>}{<code>}
\end{boxedverbatim}

\verb|<cnt>|는 \verb|i|, \verb|j|나 그밖에 원하는 카운터 변수 이름을 쓴다. 이 카운터는 내부적으로 사용되므로 미리 선언할 필요 없다.

\verb|<start>|, \verb|<step>|, \verb|<end>|는 모두 숫자(정수)이다.

for 블럭 안에서 지역적으로(locally) \verb|\ksfor<cnt>| 명령(cs)이 정의된다. 즉, \verb|\ksforloop{i=1+1}{10}{do}|라고 하였을 때
이 반복문 블럭 안에서 \verb|\ksfori|라는 변수를 쓸 수 있다. 현재 진행되는 반복 횟수를 의미한다.
이것은 수(number)가 아니라
콘트롤 시퀀스이므로 정수로서 사용하려면 \verb|\number|를 앞에 붙여준다.

\verb|<code>|는 \verb|\par|를 포함할 수 있다. 그러나 verbatim 텍스트는 올 수 없다.

\begin{boxedverbatim}
\ksforquit
\end{boxedverbatim}
강제로 루프를 종료한다.

\verb|\ksforloop*| 명령은 loop로 실행될 부분을 그루핑하지 않는다. scope가 문제가 될 때
사용할 수 있다.

\section{예제}

첫 번째 인자를 비우면 \verb|{i=1+1}|한 것과 같다.

\begin{boxedverbatim}
\ksforloop{}{10}{\ksfori\ }
\end{boxedverbatim}
\begin{framed}
\ksforloop{}{10}{\ksfori\ }
\end{framed}

루프 카운터를 지정하는 표준적인 사용법은 다음과 같다.

\begin{boxedverbatim}
\ksforloop{ct=1+1}{10}{\ksforct\ }
\end{boxedverbatim}
\begin{framed}
\ksforloop{ct=1+1}{10}{\ksforct\ }
\end{framed}

다음 보기에서 \verb|\par|를 쓸 수 있는 것, \verb|\ksforquit|의 사용, \verb|\ksfor<cnt>|를 \verb|\ifnum|으로 체크하는 것을 테스트한다. \verb|\ksforquit|이라는 미리 정의된 명령이 있기 때문에 카운터 이름을 \texttt{quit}으로 하면 안 된다.

\begin{boxedverbatim}
\newcount\Result
\ksforloop{i=1+1}{10}{%
    i = \ksfori, 
    \Result = \numexpr\Result+\number\ksfori\relax 
    sum = \the\Result
    \ifnum\number\ksfori=5 \ksforquit \fi\par
}
\end{boxedverbatim}
\begin{framed}
\newcount\Result
\ksforloop{i=1+1}{10}{%
    i = \ksfori, 
    \Result = \numexpr\Result+\number\ksfori\relax 
    sum = \the\Result \ifnum\number\ksfori=5 \ksforquit \fi\par
}
\end{framed}

중첩도 허용한다.

\begin{boxedverbatim}
\ksforloop{i=0+2}{10}{%
    \ksforloop{j=1+1}{5}{%
        \ksfori, \ksforj\ || 
    }\par
}
\end{boxedverbatim}
\begin{framed}
\ksforloop{i=0+2}{10}{%
    \ksforloop{j=1+1}{5}{%
        \ksfori, \ksforj\ || 
    }\par
}
\end{framed}

\section{팁}\label{sec:tabular}

tabular의 내용을 채우기 위해 forloop을 써야 할 일이 있다. 다음은 그럴 경우의 한 예이다.

\begin{boxedverbatim}
\protected\def\tnlinehline{\tabularnewline\hline}
\def\test{ A & B & C \tnlinehline }
\makeatletter
\ksforloop{}{4}{%
  \ksforloop{j=1+1}{3}{%
    \protected@xdef\test{\test
      (\ksfori,\ksforj) \ifnum\number\ksforj=3 \else &\fi
    }}%
  \protected@xdef\test{\test \tnlinehline}%
}
\makeatother
\begin{tabular}{|c|c|c|}
\hline
\test
\end{tabular}
\end{boxedverbatim}

\protected\def\tnlinehline{\tabularnewline\hline}
\def\test{ A & B & C \tnlinehline }
\makeatletter
\ksforloop{}{4}{%
  \ksforloop{j=1+1}{3}{%
    \protected@xdef \test{\test
      (\ksfori,\ksforj) \ifnum\number\ksforj=3 \else &\fi
    }
  }
  \protected@xdef\test{\test \tnlinehline}
}
\makeatother
\begin{tabular}{|c|c|c|}
\hline
\test
\end{tabular}

\section{참고}

\hologo{plainTeX}의 반복문 \verb|\loop...\repeat| 외에, 
\LaTeX 에서 for 스타일 loop문은 다음과 같은 것이 있다.
\begin{itemize}\tightlist
\item \textsf{forloop} 패키지의 \verb|\forloop| 문.
\item \textsf{multido} 패키지의 \verb|\multido| 문.
\item \textsf{tikz}의 \verb|\foreach| 문.
\item \textsf{xfor}의 \verb|\@for| 문.
\end{itemize}

이 가운데 \textsf{xfor}의 \verb|\@for| 문은 \LaTeX\ 커널 명령과 마찬가지로
리스트에 대하여 적용되는 것이므로 논외로 한다.
\textsf{forloop} 패키지의 \verb|\forloop|는 예컨대 다음과 같은 방식으로 쓰는데,
\begin{verbatim}
\newcounter{ct}
\forloop{ct}{1}{\value{ct} < 10}{ \arabic{ct} }
\end{verbatim}
새로운 카운터를 직접 만들어야 한다는 점, 그리고 \textsf{ifthen}의 조건문을 주어야 한다는 것이
for-스럽지 못하다.

\verb|\multido|는 매우 훌륭하다. 다양한 설정이 가능하다. 다만 반복문에 \verb|\par|를 직접 
쓸 수가 없는데(확장시켜서 하는 방법은 있다) 이따금 불편을 느끼던 차에 이것을 만들게 되었다.

\verb|\multido|만큼 복잡한 것은 아니지만 \verb|\forloop| 대용으로 그럭저럭 쓸 만하다.

\section{Known Problems}
\parindent=0pt

\textbullet\ tabular, array 환경 안에서 동작하지 않음. \ref{sec:tabular}절을 보라.

\textbullet\ verbatim 텍스트 사용 불가.

\end{document}

