summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/kanbun/kanbun.tex
blob: 2945b0505b1a2bac2b480a966e42d7b2ad1432ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
%% Copyright 2022 Yuanhao Chen
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% 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.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this work is Yuanhao Chen.
%
% This work consists of the files kanbun.sty, kanbun.lua,
% kanbun-example.tex and kanbun.tex.
% 
\documentclass[12pt]{ltxdockit}

\AfterTOCHead[toc]{\sffamily}
\makeatletter
  \def\@seccntformat#1{\protect\makebox[0pt][r]{\csname the#1\endcsname\hspace{\marglistsep}}}
\makeatother

\usepackage{fancyvrb}
\DefineShortVerb{\|}

\lstnewenvironment{example}[1][]
    {\lstset{
        basicstyle=\ja{\linespread{1}}\ttfamily,
        frame=single,
        columns=fullflexible,
        language=[LaTeX]TeX,
        moretexcs={
            Kanbun,
            EndKanbun,
            printkanbun,
            printkanbuncode,
            kanbunfont,
            furiokuri,
            multifuriokuri,
            ExplSyntaxOn,
            ExplSyntaxOff,
            kanjiunit,
        }
    }}
    {}

\usepackage{luatexja}
    \ltjdefcharrange{10}{"2E3A}
    \ltjdefcharrange{11}{"2039-"203A}
    \ltjsetparameter{jacharrange={-1, +2, +3, -4, -5, +6, +7, -8, +9, +10, -11}}
\usepackage[match]{luatexja-fontspec}
\en{\defaultfontfeatures{Numbers=OldStyle, Scale=MatchLowercase}}
\ja{\defaultfontfeatures{Scale=MatchLowercase}}
\defaultjfontfeatures{Scale=MatchLowercase, YokoFeatures={JFM=ja_JP/{kaiming,prop}, RawFeature={+pkna,+kern}}}
\setmainjfont[BoldFont={*-D}]{FOT-TsukuMin Pr6N}
\setsansjfont{Sarasa Mono J}
\setmonojfont[Scale=MatchLowercase, YokoFeatures={JFM=prop, RawFeature={+kern}}]{Sarasa Mono J}
\setmainfont{Minion Pro}
\setsansfont{Myriad Pro}
\setmonofont{Sarasa Mono J}

\ja{
    \parindent=1\zw
    \renewcommand{\baselinestretch}{1.2}
}

\usepackage{luatexja-ruby}
    \ltjsetruby{
        fontcmd=\addjfontfeature{
                YokoFeatures={RawFeature={-pkna,+ruby}},
                TateFeatures={RawFeature={-pkna,+ruby}},
            },
        mode=7,
    }

\usepackage[
    rubyfontcmd=\addjfontfeature{
            YokoFeatures={RawFeature={-pkna,+ruby}},
            TateFeatures={RawFeature={-pkna,+ruby}},
        },
]{kanbun}
\newcommand{\printkanbunblock}[2]{
    {
        \parindent=0pt
        \ja{\linespread{1}}
        \vspace*{1\zw}
        \hfill
        \vbox{
            \hsize=#1\zw
            {
                \tate
                \addjfontfeature{Scale=1}
                #2
            }
        }
        \hfill
        \vspace*{1\zw}
    }
}

\usepackage{bxtexlogo}
\usepackage{realscripts}
\usepackage{microtype}

\usepackage{wallpaper}

\Kanbun
以テ[二]羅(ら)蝶(てふ)ヲ[一]作ルガ[二]漢文訓読ヲ[一]用(ため)ノ包(ぱつけーぢ)
\EndKanbun
\title{\en{The \sty{kanbun} package}\ja{\sty{kanbun}パッケージ}}
\subtitle{\normalsize\normalfont\addjfontfeature{Scale=1}\printkanbun}
\author{
    \en{Yuanhao Chen (\ruby[rubysmash=true]{陳|元|鎬}{ちん|げん|こう})}
    \ja{
        \ruby[rubysmash=true]{陳|元|鎬}{ちん|げん|こう} (Yuanhao Chen) 
        \footnote{日本人ではないので、日本語ネイティヴの方がいらっしゃればマニュアルを書き直して下さると嬉しい。}
    }
}
\date{
    \en{\scshape 17 january 2022, v1.1}
    \ja{2022年1月17日, v1.1}
}


\begin{document}

\ThisCenterWallPaper{1}{kanbun-example.pdf}
\ExplSyntaxOn
\tl_set:Nn \kanbun_kumi { beta }
\ExplSyntaxOff
\maketitle
\ja{\renewcommand{\contentsname}{目次}}
\tableofcontents


\section{\en{Introduction}\ja{はじめに}}
\en{The \sty{kanbun} package, like other \emph{kanbun-kundoku} (漢文訓読) \LaTeX{} packages (such as \sty{gckanbun}), allows users to manually input macros for elements in a \emph{kanbun-kundoku} paragraph.}
\ja{\sty{kanbun}パッケージでは他の漢文訓読の\LaTeX{}パッケージ(例えば \sty{gckanbun})と同じく、手動で漢文訓読の各要素に対応するマクロを入力できる。}

\en{More importantly, it accepts input with light markup in the ``\emph{kanbun} annotation'' form when used with \LuaLaTeX, which allows typesetting \emph{kanbun-kundoku} paragraphs efficiently\footnote{The idea comes from \href{https://phesoca.com/kanbun-html/}{漢文\textsc{html}} by UntPhesoca, which is a JavaScript and \textsc{css} implementation.}.}
\ja{更に重要なことには、 \LuaLaTeX{}で実行すれば、軽量マークアップの「漢文アノテーション」で容易く効率的に漢文訓読を組版することが可能となっている\footnote{JavaScriptやCSSによって実行するUntPhesocaの \href{https://phesoca.com/kanbun-html/}{漢文HTML} が参考となっていた。}。}


\section{\en{Basic example with \LuaLaTeX}\ja{\LuaLaTeX{}での簡単な実例}}
\en{As seen in the following example, typesetting a \emph{kanbun-kundoku} paragraph with the \sty{kanbun} package requires only light annotations --- it automatically transforms the annotated plain text into \LaTeX{} macros through Lua, rather than having users type in macros themselves.}
\ja{次の実例のとおり、 \sty{kanbun}パッケージを使えばただの軽量なアノテーションで漢文訓読を組版できる。手動でマクロを入力するではなく、プログラムが自動的にアノテーションのあるプレーンテキストをLuaで処理して\LaTeX{}マクロに変更する。}

\begin{example}
\documentclass{ltjtarticle}
\usepackage[kumi=aki, tateaki=1]{kanbun}
\begin{document}
\Kanbun
月落チ烏啼キテ霜満ツ[レ]天ニ,
江楓漁火対ス[二]愁眠ニ[一]。
姑(こ)蘇(そ)城外ノ寒山寺,
夜半ノ鐘声到ル[二]客船ニ[一]。
\EndKanbun
\printkanbun
\end{document}
\end{example}

\ExplSyntaxOn
\tl_set:Nn \kanbun_tateaki { 1 }
\tl_set:Nn \kanbun_kumi { aki }
\ExplSyntaxOff
\Kanbun
月落チ烏啼キテ霜満ツ[レ]天ニ,
江楓漁火対ス[二]愁眠ニ[一]。
姑(こ)蘇(そ)城外ノ寒山寺,
夜半ノ鐘声到ル[二]客船ニ[一]。
\EndKanbun

\allowbreak
\printkanbunblock{13}{\printkanbun}
\vspace{-1.5\zw}

\en{Note that if you want to use this functionality, you have to run this document with \LuaLaTeX.}
\ja{この機能を使う場合、必ず\LuaLaTeX{}で実行してください。}


\section{\en{Usage}\ja{使用方法}}

\subsection{\en{Package options}\ja{パッケージのオプション}}
\en{Load the package with}
\ja{パッケージの読み込みは次のようにしてよい:}
\nobreak
\begin{ltxsyntax}
    \cmditem{usepackage}\oprm{\en{\sty{kanbun} options}\ja{ \sty{kanbun}のオプション}}|{kanbun}|
\end{ltxsyntax}

\en{This package provides a variety of customisable features in \emph{kanbun-kundoku}.}
\ja{以下のオプションでさまざまな漢文訓読においてのパラメーターを設定できる。}

\begin{optionlist}
    \optitem[]{scale}{\prm{\en{ratio}\ja{比}}}
    \en{Sets the ratio of the size of \emph{kanji} to that of ruby texts. Default: \verb|2|.}
    \ja{ルビ文字のサイズに対する漢字のサイズの割合を設定する。初期値: \verb|2|。}
    
    \SaveVerb{fontcmd}|\addjfontfeatures{RawFeature={+trad}}|
    \optitem[]{fontcmd}{\prm{\en{font command}\ja{書体のコマンド}}}
    \en{Sets the font command to use for \emph{kanji}. If \sty{luatexja-fontspec} is loaded, it is set default to \UseVerb{fontcmd} to obtain traditional \emph{kanji} if applicable.}
    \ja{漢字の書体のコマンドを設定する。\sty{luatexja-fontspec}パッケージが読み込まれてある場合、 \UseVerb{fontcmd} に初期化されて、旧字体のグリフに変更する。}

    \SaveVerb{rubyfontcmd}|\addjfontfeatures{RawFeature={+ruby}}|
    \optitem[]{rubyfontcmd}{\prm{\en{font command}\ja{書体のコマンド}}}
    \en{Sets the font command to use for ruby texts. If \sty{luatexja-fontspec} is loaded, it is set default to \UseVerb{rubyfontcmd} to obtain ruby glyphs when applicable.}
    \ja{ルビ文字の書体のコマンドを設定する。\sty{luatexja-fontspec}パッケージが読み込まれてある場合、 \UseVerb{rubyfontcmd} に初期化されて、ルビグリフに変更する。}

    \SaveVerb{unit}|\kanbun_init_zw|
    \optitem[]{unit}{\prm{\en{length}\ja{長さ}}}
    \en{Sets the dimensions of \emph{kanji} (assuming it is a square). Default: \UseVerb{unit}, which is a length equal to \verb|1em|.}
    \ja{(正方形だと仮定して)漢字の寸法を設定する。初期値: \UseVerb{unit} (\verb|1em| に等しい長さ)。}

    \optitem[]{yokoaki}{\prm{\en{ratio}\ja{比}}}
    \en{Sets the horizontal space between \emph{kanji} with respect to the size of ruby texts. Default: \verb|2|.}
    \ja{ルビ文字のサイズに対するインテルの幅の割合を設定する。初期値: \verb|2|。}

    \optitem[]{tateaki}{\prm{\en{ratio}\ja{比}}}
    \en{Sets the vertical space between \emph{kanji} with respect to the size of ruby texts. Default: \verb|2|.}
    \ja{ルビ文字のサイズに対する漢字間のアキ量の割合を設定する。初期値: \verb|2|。}

    \optitem[]{okuriintrusion}{\prm{\en{ratio}\ja{比}}}
    \en{Sets the intrusion of \emph{okurigana} (how much \emph{okurigana} should be vertically tucked into the space of \emph{kanji}) with respect to the size of ruby texts, if that does not cause an overlap with \emph{furigana}. Default: \verb|1|.}
    \ja{ルビ文字のサイズに対する送仮名\ruby[pre=0.5,post=1]{進入量}{イントルージョン}(送仮名を上に突かせて漢字に掛ける長さ)の割合を設定する。初期値: \verb|1|。}

    \optitem[]{kumi}{\opt{aki}, \opt{beta}}
    \en{Sets whether to use \emph{aki-gumi} (typeset with uniform inter-character spacing) or \emph{beta-gumi} (typeset with no inter-character space between adjacent character frames). Or simply call \opt{aki} or \opt{beta} without \opt{kumi=}. Default: \opt{aki}. }
    \ja{アキ組を使うかベタ組を使うかを設定する。\opt{kumi=} を書かず、単に \opt{aki} か \opt{beta} かと書いてもよい。}
\end{optionlist}

\SaveVerb{kanbunprefix}|\kanbun_|
\en{After initialising the options, you can still change the option values through \sty{exlp3} syntax, with a prefix \UseVerb{kanbunprefix} to option names. For example, to switch to \emph{beta-gumi}, you could use}
\ja{オプションを初期化する後でも、 \sty{exlp3} \ruby[pre=1]{構文}{シンタックス}でオプション名に \UseVerb{kanbunprefix} をプリフィックスして再アサインできる。例えば、ベタ組に再設定するには下記のコードを使う。}
\begin{example}
\ExplSyntaxOn
\tl_set:Nn \kanbun_kumi { beta }
\ExplSyntaxOff
\end{example}

\subsection[\en{Basic usage without \LuaLaTeX}\ja{\LuaLaTeX{}を使わない場合の基本使用}]{\en{Basic usage without \LuaLaTeX{} (not recommended)}\ja{\LuaLaTeX{}を使わない場合の基本使用(お薦めではない)}}
\en{When not using the advanced \emph{kanbun}-annotation functionality, it is possible to typeset \emph{kanbun} with any engine with \textsc{cjk} support, such as using \XeLaTeX{} with the \sty{xeCJK} package, or using \upLaTeX{} with \sty{utarticle} or other appropriate class. }
\ja{漢文アノテーションの機能を使わない場合、任意の CJK 支援のあるエンジンで漢文を組版できる。例えば\XeLaTeX{} を \sty{xeCJK} パッケージと一緒に使うか、 \upLaTeX{} を \sty{utarticle} クラス或いは他の適宜なクラスと一緒に使うか、どちらもよい。}

\begin{ltxsyntax}
    \cmditem{kanjiunit}\verb|{ |\cmd{furiokuri}\mprm{\en{right furigana}\ja{右の振仮名}}\mprm{\en{right okurigana}\ja{右の送仮名}}\verb| }|\vspace{-5pt}\\
    \mprm{\en{left (top) punctuation (e.g.~`「')}\ja{左(上)の句読点(“「”など)}}\\
    \mprm{\en{kanji}\ja{漢字}}\\
    \mprm{\en{other punctuation}\ja{他の句読点}}\\
    \mprm{\en{kaeriten}\ja{返点}}\\
    \verb|{ |\cmd{furiokuri}\mprm{\en{left furigana}\ja{左の振仮名}}\mprm{\en{left okurigana}\ja{左の送仮名}}\verb| }|

    \cmditem{kanbunfont}

    \en{Sets the font size of \emph{kanji}. Use when the \opt{unit} option is set different to the document's default font size.}
    \ja{漢字のサイズを設定する。\opt{unit} オプションと文書のデフォルト文字サイズが違う時に使う。}

    \en{Use \cmd{multifuriokuri} instead of \cmd{furiokuri} if you are putting \emph{furigana} to multiple kanji.}
    \ja{複数個の漢字に仮名を振れば、 \cmd{furiokuri} の代わりに \cmd{multifuriokuri} を使う。}

    \cmditem{multifuriokuri}\oprm{\en{length by which ruby is raised}\ja{ルビ文字を上げる長さ}}\mprm{\en{furigana}\ja{振仮名}}\mprm{\en{okurigana}\ja{送仮名}}
\end{ltxsyntax}

\en{For example, the code}
\ja{例えば、 \opt{tateaki} が \verb|1| に設定されている場合、下記のコードを使えば}
\begin{example}
% example text from https://phesoca.com/kanbun-html/
\kanbunfont
\kanjiunit{}{}{子}{}{}{}
\kanjiunit{\furiokuri{}{ク}}{}{曰}{,}{}{}
\kanjiunit{\furiokuri{}{ゾ}}{}{盍}{}{三}{\furiokuri{}{ル}}
\kanjiunit{}{}{各}{〻}{}{}
\kanjiunit{\furiokuri{}{ハ}}{}{言}{}{二}{}
\kanjiunit{\furiokuri{}{ノ}}{}{爾}{}{}{}
\kanjiunit{\furiokuri{}{ヲ}}{}{志}{。}{一}{}
\par
\end{example}
\en{outputs}
\ja{こう出力する:}

\printkanbunblock{6}{
\kanbunfont
\kanjiunit{}{}{子}{}{}{}
\kanjiunit{\furiokuri{}{ク}}{}{曰}{,}{}{}
\kanjiunit{\furiokuri{}{ゾ}}{}{盍}{}{三}{\furiokuri{}{ル}}
\kanjiunit{}{}{各}{〻}{}{}
\kanjiunit{\furiokuri{}{ハ}}{}{言}{}{二}{}
\kanjiunit{\furiokuri{}{ノ}}{}{爾}{}{}{}
\kanjiunit{\furiokuri{}{ヲ}}{}{志}{。}{一}{}
\par
}

\noindent
\en{with \opt{tateaki} set to \verb|1|.}

\subsection{\en{Usage with \LuaLaTeX}\ja{\LuaLaTeX{}での使用}}
\en{\emph{Kanbun} annotation uses the following brackets to mark different elements in \emph{kanbun-kundoku} (as described in \href{https://phesoca.com/kanbun-html/}{漢文\textsc{html}} by UntPhesoca). }
\ja{漢文アノテーションでは下記の括弧を以って漢文訓読においての各要素を示す(UntPhesocaの \href{https://phesoca.com/kanbun-html/}{漢文HTML} を参照されたい)。}
\begin{itemize}
    \item \verb|( )|: \en{\emph{furigana} (}振仮名\en{)}
    \item \verb|{ }|: \en{\emph{okurigana} (}送仮名\en{) (these brackets can be omitted)}\ja{(この括弧を省略してもよい)}
    \item \verb|‹ ›|: \en{\emph{furigana} (振仮名) of \emph{saidoku-moji} (再読文字)}\ja{再読文字の振仮名}
    \item \verb|« »|: \en{\emph{okurigana} (送仮名) of \emph{saidoku-moji} (再読文字)}\ja{再読文字の送仮名}
    \item \verb|[ ]|: \en{\emph{kaeriten} (}返点\en{)}
    \item \verb|‘ ’|: \en{multiple \emph{kanji}, potentially with \emph{tateten} inserted, as a ruby base; group ruby (グループルビ)}\ja{グループルビのベース。中に\ruby{竪|点}{たて|てん}を入れてもよい}
    \item \en{no annotation: \emph{kanji} (漢字) and punctuation}\ja{アノテーション無し:漢字と句読点}
\end{itemize}
\en{\emph{Tateten} (竪点) can be input with either \verb|―| (\verb|U+2015|), \verb|—| (\verb|U+2014|) or \verb|㆐| (\verb|U+3190|).}
\ja{\verb|―| (\verb|U+2015|) か \verb|—| (\verb|U+2014|) か \verb|㆐| (\verb|U+3190|) かで竪点を入力できる。}

\begin{ltxsyntax}
    \cmditem{Kanbun}\cmditem{EndKanbun}

    \en{Write the annotated \emph{kanbun} between the commands \cmd{Kanbun} and \cmd{EndKanbun}, and it will be processed and saved, ready to be used later.}
    \ja{アノテーションのある漢文を \cmd{Kanbun} と \cmd{EndKanbun} の間に書き込む。処理されて、保存されておいて、後で使用可能となる。}

    \cmditem{printkanbun}

    \en{Where you would like to use the most recently saved \emph{kanbun-kundoku} paragraph, use \cmd{printkanbun}.}
    \ja{最近保存された漢文訓読を使用するには、 \cmd{printkanbun} を使う。}

    \cmditem{printkanbuncode}

    \en{If you wish to make modifications on the result or to use the result with a non-\LuaTeX{} engine, it is possible to obtain the macros using \cmd{printkanbuncode} (prints in the terminal), and continue to work from there.}
    \ja{処理の結果を一部変更する、もしくは結果を\LuaTeX{}でないエンジンで使用するには、結果のマクロを \cmd{printkanbuncode} で入手して(端末に出力)、そこから作業を続けることが可能。}
\end{ltxsyntax}

\en{You can always save \cmd{printkanbun} to a macro for use later and start a new annotated \emph{kanbun} block, as in the following example.}
\ja{次の実例のとおり、後で使えるように \cmd{printkanbun} をあるマクロに保存し、新しい漢文段落を書き込み始められる。}
\begin{example}
% example text from https://phesoca.com/kanbun-html/
\documentclass{ltjtarticle}
\usepackage[kumi=beta]{kanbun}

\Kanbun
此レ乃チ信(しん)之‘所―[三]以’(ゆゑん)為ル[二]陛下ノ禽(とりこ)ト[一]也。
\EndKanbun
\let\信\printkanbun

\Kanbun
孤之有ルハ[二]孔明[一],猶ホ‹ごと›«キ»[二]魚之有ルガ[一レ]水也。
\EndKanbun
\let\孔明\printkanbun

\begin{document}
\孔明\par\bfseries\信
\end{document}
\end{example}

\Kanbun
此レ乃チ信(しん)之‘所―[三]以’(ゆゑん)為ル[二]陛下ノ禽(とりこ)ト[一]也。
\EndKanbun
\let\信\printkanbun

\Kanbun
孤之有ルハ[二]孔明[一],猶ホ‹ごと›«キ»[二]魚之有ルガ[一レ]水也。
\EndKanbun
\let\孔明\printkanbun

\ExplSyntaxOn
\tl_set:Nn \kanbun_kumi { beta }
\ExplSyntaxOff
\printkanbunblock{16}{\孔明\par\bfseries\信}


\end{document}