% xetexko-vertical.sty
%
% Copyright (c) 2013 Dohyun Kim  <nomos at ktug org>
%
% 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.

\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname ProvidesPackage\endcsname\relax\else
  \ProvidesPackage{xetexko-vertical}
    [2013/07/03 v2.1 Vertical environment for XeTeX-ko]
\fi

\unless\ifcsname @tempdima\endcsname\newdimen\@tempdima\fi
\unless\ifcsname @tempdimb\endcsname\newdimen\@tempdimb\fi
\unless\ifcsname @tempdimc\endcsname\newdimen\@tempdimc\fi

% do not veticalize headline/footline
\ifdefined\ProvidesPackage % for latex
  \protected\def\verticaltypesetting{%
    \AtBeginDocument{\XK@vertical@spacing}%
    \maxdepth\z@
    \dimen@\textwidth
    \textwidth\textheight
    \textheight\dimen@
    \edef\@outputpage{%
      \unexpanded{\xetexko@rotatebox\@outputbox\textwidth\textheight}%
      \unexpanded\expandafter{\@outputpage}}%
  }
  \@onlypreamble\verticaltypesetting
\else % for plain
  \protected\def\verticaltypesetting{%
    \dimen@\hsize\hsize\vsize\vsize\dimen@
    \edef\plainoutput{\unexpanded{\dimen@\hsize\hsize\vsize\vsize\dimen@}%
      \unexpanded\expandafter{\plainoutput}}%
    \def\pagebody{\setbox\z@\vbox to\hsize{\boxmaxdepth=\maxdepth
      \pagecontents}\xetexko@rotatebox\z@\box\z@}%
    \maxdepth\z@ \XK@vertical@spacing}
\fi

\def\xetexko@rotatebox#1{%
  \ifvbox#1\count@\@ne\else\count@\z@\fi
  \dimen@\wd#1\dimen@ii\dimexpr\ht#1+\dp#1\relax
  \setbox#1\ifnum\count@=\@ne
  \vbox to\dimen@\bgroup\hbox to\dimen@ii\bgroup\hfil\else
  \hbox to\dimen@ii\bgroup\vbox to\dimen@\bgroup\fi
    \wd#1\z@ \ht#1\z@ \dp#1\z@
    \special{x:gsave}\special{x:rotate -90}\box#1\special{x:grestore}%
    \ifnum\count@=\@ne\egroup\vfil\else\vfil\egroup\hfil\fi\egroup
}

% users can declare vertical EM size, which might be different from 1em.
\newdimen\verticalem

\def\XK@vertical@spacing{%
  \ifnum\verticalem > \z@
    \def\XK@vert@half@em{.5\verticalem}%
  \else
    \def\XK@vert@half@em{.5em}%
  \fi
  \def\precjkopenparen {\leavevmode\hbox to\XK@vert@half@em\bgroup\hss}%
  \def\precjkcloseparen{\leavevmode\hbox to\XK@vert@half@em\bgroup}%
  \def\precjkfullstop  {\leavevmode\hbox to\XK@vert@half@em\bgroup}%
  \spaceskip\XK@vert@half@em plus\XK@vert@half@em\relax
  \parindent\XK@vert@half@em \parindent2\parindent
}

\protected\long\def\vertical#1{%
  \setbox\z@\vbox\bgroup
    \hsize=#1%
    \leftskip\z@
    \rightskip\z@
    \parindent\z@
    \everypar{}%
    \XK@vertical@spacing
}

\protected\def\endvertical{%
  \egroup
  \@tempdima\wd\z@
  \@tempdimb\ht\z@
  \@tempdimc\dp\z@
  \setbox\z@\hbox{%
    \kern\dimexpr\@tempdimb+0.5em\relax
    \wd\z@\z@
    \ht\z@\z@
    \dp\z@\z@
    \special{x:gsave}%
    \special{x:rotate -90}%
    \box\z@
    \special{x:grestore}}%
  \wd\z@\dimexpr\@tempdimb+\@tempdimc\relax
  \ht\z@\z@
  \dp\z@\z@
  \leavevmode
  \raise\dimexpr\@tempdima-\@tempdimc\relax\box\z@
}

\protected\def\vertlatin#1{\leavevmode\lower0.5ex\hbox{\latinmarks #1}}

\endinput

%% example:
%\newhangulfontfamily\myvertfont
%  [Script=Hangul,Vertical=RotatedGlyphs]
%  {HCR Dotum LVT}
%\verticalem=1.05em
%\begin{vertical}{12em}\myvertfont
%  세로쓰기 영역.
%  #1 = 세로길이
%\end{vertical}

