I use XeLaTeX with vertically typeset CJK, using some custom macros:

% ----------------------------------------------------------------
% ruby markup stuff
% ----------------------------------------------------------------

\usepackage{accsupp}

% ----------------------------------------------------------------
% ruby and rubystack for for use in tables.
% This needs extra spacing to ensure visually appealing alignment,
% but rather than using an extra argument, it figured it'd be more
% readable, and overall less space-taking to just copy the plain
% macro and rename it
% ----------------------------------------------------------------

\newcommand*{\rtrubystack}[2]{{\relscale{0.5}%
  \begin{tabular}[b]{@{}c@{}}%
    {#1}\\%
    {\textscale{2}{#2}}%
  \end{tabular}}%
}

\DeclareRobustCommand*{\rtruby}[2]{%
  \mbox{%
    \setlength{\parskip}{0ex}%
    \BeginAccSupp{method=pdfstringdef,ActualText={#1}}%
      \rtrubystack{\phantom{#2}}{#1}%
      \llap{%
        \rtrubystack{#2}{\phantom{#1}}%
      }%
    \EndAccSupp{}%
  }%
}

% --------------------------------------------------------------
% ruby and rubystack macro, effecting ghost furigana in the PDF
% --------------------------------------------------------------

\newcommand*{\rubystack}[2]{{\relscale{0.5}%
  \begin{tabular}[b]{@{}c@{}}%
    {#1}\\%
   {\textscale{2}{#2}}%
  \end{tabular}}%
}

\DeclareRobustCommand*{\ruby}[2]{%
  \mbox{%
    \setlength{\parskip}{0ex}%
%    \BeginAccSupp{method=pdfstringdef,ActualText={#1 (#2)}}%
    \BeginAccSupp{method=pdfstringdef,ActualText={#1}}%
      \rubystack{\phantom{#2}}{#1}%
      \llap{%
        \rubystack{#2}{\phantom{#1}}%
      }%
    \EndAccSupp{}%
  }%
}

% --------------------------------------------------------------------------
% helper macro: adds space between the text and the [T]op \hline in a table
% --------------------------------------------------------------------------

\newcommand\T{\rule{0pt}{2.5ex}}% zero width, 2.5ex vertical spacing, ensures a visually appealing vertical alignment

% --------------------------------------------------------------------------
% vertical typesetting for CJK
% --------------------------------------------------------------------------

\DeclareRobustCommand*{\vruby}[2]{%
\mbox{%
\setlength{\parskip}{0ex}%
\BeginAccSupp{method=pdfstringdef,ActualText={#1}}%
\rule{0pt}{1.7em}\rubystack{\phantom{#2}}{#1}%
\llap{%
\rule{0pt}{1.7em}\rubystack{\smaller #2}{\phantom{#1}}%
}%
\EndAccSupp{}%
}%
}

\newcommand{\vertical}[4]{%
\XeTeXinterchartokenstate = 0 %
\begin{center}%
\rotatebox{-90}{%
\begin{varwidth}{\textwidth}%
\fontsize{#2pt}{#2pt}
\fontspec[RawFeature=vertical, Script=CJK]{#1}#4
\vspace{#2pt}%
\vspace{#2pt}% this padding should only exist if ruby is present, for visual offset
\vspace{#2pt}%
\end{varwidth}}%
\\
\vspace{12pt}
\XeTeXinterchartokenstate = 1 %
\fontsize{8pt}{10pt}#3
\end{center}%
\XeTeXinterchartokenstate = 1 %
}


I then use it as:

\vertical{Kozuka Mincho Pro}{21}{The いろは poem, with classical kana transcription}{色は匂へど...}

so it has baked in font name, font size, "block title", and then the actual text to typeset. This typesets the text top-down, right to left.

- Mike "Pomax" Kamermans

--------------------------------------------------
Subscriptions, Archive, and List information, etc.:
  http://tug.org/mailman/listinfo/xetex

Reply via email to