(Linux) upLaTeX + jlreq で小説原稿を作る

初めに
Linux 上で、LaTex を使って、印刷用の小説原稿を作る手順を説明します。

ちなみに、私自身はまるまる一冊の小説本を作ったわけではないので、とりあえず普通の小説本文の PDF ファイルが作れる程度の工程を紹介します。

LaTex の基本については、以下のサイトを参考にしてください。

texlive のインストール
まずは、LaTex 本体をインストールします。

LaTex と言っても、upLaTex/LuaLaTex など、色々と派生したものや関連ファイルがたくさんあるので、texlive をインストールします。

texlive は、Tex に関連した実行ファイルや、多くのパッケージファイル、フォントなど、Tex に必要なファイルをまとめたディストリビューションです。
Arch Linux
Arch Linux では、texlive-* で始まるものが、texlive のパッケージです。

texlive グループにすべての texlive パッケージがまとめられていますが、これをすべてインストールすると容量が大きく、また、必要のないパッケージまでインストールされてしまうので、最低限必要なものだけをインストールすることをお勧めします。

とりあえず、ここで紹介している工程に最低限必要なのは、以下のパッケージです。

texlive-bin texlive-core texlive-langjapanese texlive-latexextra
Ubuntu 系
Ubuntu 系ディストリビューションでも、texlive-* のパッケージにまとめられています。

こちらの方がさらに細かくパッケージが分かれているので、どれが必要かはわかりませんが、Ubuntu パッケージ検索 で texlive を検索して、探してみてください。
jlreq のインストール
次に、jlreq パッケージをインストールします。

このパッケージを使うと、日本語組版処理の要件 に沿った組版が行えます。
特に、縦書きで文字数や行数を指定した組版を行いたい場合、とても使いやすいです。

jlreq は texlive にも含まれていますが、2017 年から開発されたものであるため、比較的新しく、texlive に収録されているものよりも新しいバージョンが出ている可能性があるので、出来るだけ新しいものを使います。

>> jlreq (github)

ファイルをダウンロードしたら、解凍し、解凍されたディレクトリ内で以下のコマンドを実行します。

$ make install

ファイルが生成された後、"~/texmf" ディレクトリ内に、jlreq のファイルがインストールされます。
インストールの確認
LaTex 上で、インストールした jlreq が正しく使えるかどうかを確かめる場合は、以下のコマンドを実行します。

$ kpsewhich jlreq.cls
/home/<USER_NAME>/texmf/tex/latex/jlreq/jlreq.cls

指定したファイルを LaTex が認識できるディレクトリ上から検索し、見つかったらそのパスが表示されます。

ホームディレクトリのパスが表示されていれば OK です。

texlive 内のファイルが使われる場合は、/usr/share/〜 のパスが表示されます。
フォントのインストール
upLaTex で pxchfon パッケージを使ってフォントを指定する場合、使用するフォントは、LaTex で指定されたディレクトリに置く必要があります。
(もしくは、シンボリックリンクを作る)

LaTex が認識できるフォントのディレクトリは、以下のコマンドで確認できます。

$ kpsewhich -show-path="truetype fonts"

パスはコロン (:) で区切られています。
最後が「//」になっているものは、サブディレクトリも検索の対象になります。
先頭が「!!」のものは、検索対象外です。

以下のいずれかに置いておくと良いでしょう。

~/texmf/fonts/{truetype,opentype}
~/.texlive/texmf-config/fonts/{truetype,opentype}

※ ディレクトリが存在しない場合は作成してください。

なお、TrueType フォントは truetype ディレクトリに、OpenType フォントは opentype ディレクトリに置く必要があります。

フォントが正しく認識できるかどうかは、kpsewhich コマンドで確認できます。

$ kpsewhich GenEiKoburiMin6-R.ttf
/home/<USER_NAME>/texmf/fonts/truetype/GenEiKoburiMin6-R.ttf

フリーで商用可能な明朝フォントは、「源瑛こぶり明朝」「源瑛ちくご明朝」「源ノ明朝」がオススメです。

源瑛の明朝は文字間隔が少し広めですが、外字が充実しています。
源ノ明朝は多ウェイトなので、太字を使いたい場合に有用です。
upLaTex と LuaLaTex
今回は、upLaTex を使います。
upLaTex は、LaTex を「Unicode 対応+日本語対応」したものです。

jlreq は LuaLaTex 上でも使えますが、LuaLaTex + jlreq で出力したものと、upLaTex + jlreq で出力したものでは、少し違いが出ます。

>> 比較画像

upLaTex で出力したものが黒で、LuaLaTex で出力したものを赤色にして重ねました。
LuaLaTex では、"「" が上にずれて配置されています。

なお、1行の文字数は、禁則処理などによって、指定数よりも増減する場合があります。
(折り返し後の行頭が "った」" だった場合、"あった」" というように、前の行の1文字が次の行に来る)
ある行の字間が他の行より広くなっている場合は、まず禁則処理を疑ってください。

ちなみに、upLaTex + jlreq で otf パッケージを使った場合、組版結果がだいぶ異なりました。
otf パッケージを使うと、文字サイズが少し小さくなるような気がします。
otf パッケージは使わないほうがいいかもしれません。
テンプレート
以下のテキストを、〜.tex のファイル名で保存してください。
※ 文字コードは UTF-8 にしてください。

「A5 縦書き 二段組」にしてありますが、用紙サイズと段組は変更できます。

\documentclass[uplatex,
 book,tate,twoside, % 縦書き、見開きレイアウト
 twocolumn, % 二段組
 paper=a5,  % 用紙サイズ (a0〜a10 / b0〜b10 / {横mm,縦mm})
 fontsize=13Q,jafontsize=13Q, % フォントサイズ
 line_length=26zw,   % 一行の文字数 (zw=全角1文字の幅)
 number_of_lines=21, % 行数
 gutter=20mm,        % ノド側の余白
 column_gap=10mm,    % 段と段の空白
 head_space=13mm,    % 天の余白 (天/地どちらか一方を指定)
%foot_space=15mm,    % 地の余白
 baselineskip=1.7zw, % 行送り
 headfoot_verticalposition=1.5zw, % ノンブルと本文の間の空白
 hanging_punctuation] % ぶら下げ
 {jlreq}

% ノンブルを小口/下に (小口/上なら以下2行を消す)
\ModifyPageStyle{plain}{nombre_position=bottom-left}
\pagestyle{plain}

% ノンブルを表示しない場合 (上を消してコメント解除)
%\pagestyle{empty}

% パッケージ
\usepackage[utf8]{inputenc} % 文字コードは UTF-8
\usepackage{bxpapersize} % dvipdfmx で用紙サイズを指定しなくてもいいようにする
\usepackage{pxbase} % 直入力できない文字の出力。\UI{16進数 Unicode}
\usepackage[unicode]{pxchfon} % フォント指定
\usepackage{pxrubrica} % ルビ/傍点

% フォント名 (ファイル名で指定)
\setminchofont{GenEiKoburiMin6-R.ttf}

% ルビ (pxrubrica)
% デフォルトのルビ設定
% || = ルビの前突出抑止、J = 熟語/グループ自動判定
% h = 肩付き、> = ルビを次の文字にかける、f = 小文字→大文字自動変換
\rubysetup{||J>}
% \kenten のメインを傍点に (sesame = フォントの文字を使う)
\kentenmarkintate{sesame}

% 改行で段落とする
{\catcode`\^^M=\active%
\gdef\xobeylines{\catcode`\^^M\active \def^^M{\par\leavevmode}}%
\global\def^^M{\par\leavevmode}}
\AtBeginDocument{\xobeylines}

% 段落で字下げしない (全角空白で字下げさせる)
\parindent=0pt

% 行頭に来た場合に出力させない全角空白 (\zenaki{})
\newcommand{\zenaki}{\hskip1zw plus .125zw minus 0.03125zw}

% 縦中横のコマンドを別名登録
\newcommand{\tcy}[1]{\tatechuyoko{#1}}

% 先頭ページ番号
\setcounter{page}{3}

%===================

\begin{document}
ここに本文。
 字下げは全角文字で。
\ruby{感嘆}{かん|たん}。\ruby{漸}{ようや}く。\ruby{長い文字}{ながいもじ}
\kenten{傍点}\kenten[s]{圏点}

感嘆符の後の全角空白が行頭に来た時のテスト・・・・!\zenaki{}行頭\zenaki{}行頭でなければ通常空白

\tcy{24}時\tcy{!?}。
外字\UI{E000}\UI{E001}
\end{document}
PDF を生成する
とりあえず、テンプレートから PDF ファイルを生成してみます。

$ uplatex test.tex
$ dvipdfmx test.dvi

uplatex コマンドで、tex ファイルから dvi ファイルを生成します。
その後、dvipdfmx コマンドで、dvi ファイルから pdf ファイルを生成します。
PDF の情報を表示
PDF ファイルの情報 (バージョンなど) を表示したい場合は、pdfinfo コマンドを使います。

なお、pdfinfo/pdffonts/pdftoppm コマンドは、Linux の poppler パッケージに含まれています。

$ pdfinfo test.pdf
PDF のフォント情報を表示
PDF ファイルにフォントが埋め込まれているかどうかなどを確認したい場合は、pdffonts コマンドを使います。

$ pdffonts test.pdf
name                                 type              encoding         emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
FYOGMB+GenEiKoburiMin6-R             CID TrueType      Identity-H       yes yes yes      5  0
FYOGMB+GenEiKoburiMin6-R             CID TrueType      Identity-V       yes yes yes      6  0

emb がフォントが埋め込まれているかどうか。
sub がサブセット化されているか (必要な文字だけ抽出されているか)。

pxchfon パッケージを使った場合、デフォルトでフォントは埋め込まれます。
PDF → PNG 変換
PDF → PNG → PSD 変換して印刷原稿にしたい場合は、pdftoppm コマンドを使って、PDF の各ページを PNG に変換できます。

$ pdftoppm -png -r 600 -aa no -aaVector no test.pdf out

-r は解像度 (dpi) です。

印刷原稿の場合、文字のアンチエイリアスは OFF にする必要があるので、-aa no -aaVector no でアンチエイリアスを切っています。

最後の out は、出力ファイル名の接頭語です。
「<接頭語>-<ページ番号>.png」のファイル名で出力されます。

px サイズで出力する
WEB 公開用などで、幅または高さを指定した px で出力したい場合は、以下の式で DPI を計算できます。
(DPI = dot / inch、1 inch = 2.54 cm から計算します)

DPI = px * 25.4 / mm

px : 出力したい幅/高さの px サイズ
mm : 用紙の幅/高さの mm サイズ

pdftoppm の -r オプションでは小数点以下も指定できるので、小数点第一位あたりまで指定してください。
LaTex の基本
  • 「%」以降はコメント。
  • 「\」で始まるものは LaTeX コマンド。
    \コマンド名[オプション(任意)]{引数1}{引数2}...
  • \begin{document}\end{document} 内に本文を書く。
  • \newcommand は、新しいコマンドを定義する。
    \def も同じですが、こちらは基本的に TeX 用の命令。
解説
ドキュメントクラスの設定
まず最初に、ドキュメントクラスを指定します。

\documentclass[オプション,...]{クラス名}

ここでは、jlreq を使うので、クラス名は jlreq にします。
オプションで用紙や文字数などの設定を指定します。
詳しくは jlreq の README に載っていますが、主な項目を説明しておきます。

uplatexupLaTex で使うことを指定します
book文章の種類を「本」に指定。
他に、article=論文、report=報告書、などがあります。
tate縦書き
twoside奇数/偶数ページを異なるレイアウトにする。
(ノド側の余白を多く取る、ノンブルを小口側に置く、などをしたい場合)
twocolumn二段組にする。
一段組なら onecolumn (デフォルト)
paper=[size]用紙サイズの指定。
jlreq では、A判なら "a0"〜"a10"、B判なら "b0"〜"b10" が指定できます。
A5 なら a5、B5 なら b5 です。

数値で指定したい場合は、{横,縦} で単位付きで指定します。
例: paper={103mm,182mm}
fontsize=[size]
jafontsize=[size]
fontsize は欧文フォントサイズ、jafontsize は和文フォントサイズです。
単位は Q, pt などが指定できます。
1Q = 0.25 mm、1pt = 1/72 inch です。
小説の場合、12Q (8.5pt) 〜13Q (9.2pt) くらいが一般的です。
line_length=[n]一行の長さ。縦書きでは、縦方向の長さとなります。
単位を zw で指定すると、全角1文字の幅=文字数となります。
number_of_lines=[n]一ページの行数。縦書きでは、横方向の文字数となります。
単位は付けません。
gutter=[n]ノド側の余白のサイズ。
tate,twoside の場合は、右綴じ扱いで、偶数ページで左側、奇数ページで右側の余白となります。

この項目を指定しなかった場合は、本文が中央寄せになります。

ノド側を多めに取りつつ表と裏で文字を重ねたい場合は、PDF → PNG 変換して、一方の画像を左右反転して重ねてみると、状態が確認できるので、数値を調整してください。
column_gap=[n]複数段組の場合、段と段の間の余白のサイズを指定します。
head_space=[n]
foot_space=[n]
head_space は天(上)の余白、foot_space は地(下)の余白です。
どちらか一方を指定してください。
指定しなかった方の余白は、余った分のサイズとなります。

どちらも指定しなかった場合は、垂直方向に中央寄せとなります。
baselineskip=[n]行送りの幅。
(縦書きの場合、文字の中央から、次の行の文字の中央までの間)
headfoot_verticalposition=[n]ノンブル/柱と本文の間の空白サイズ。
README には書かれていない項目です。
hanging_punctuationぶら下げをします。
「、。」の句読点が行頭に来る場合、前の行の最後にはみ出す形で配置します。
ノンブル設定
ノンブルを小口/上に置く場合は、jlreq のデフォルトとなっているので、何もしなくて OK です。

ノンブルを出力したくない場合は、以下を記述します。

\pagestyle{empty}

ノンブルを小口/下に置きたい場合は、以下を記述します。

\ModifyPageStyle{plain}{nombre_position=bottom-left}
\pagestyle{plain}

nombre_position でノンブル位置を指定できます。
また、縦書きのノンブルにすることもできます。
詳しくは jlreq の README をご覧ください。
パッケージ
\usepackage[オプション]{パッケージ名} で、パッケージを読み込むことができます。
なお、以下のパッケージはすべて texlive に含まれているので、別途インストールする必要はありません。

\usepackage[utf8]{inputenc}
tex ファイルの文字コードが UTF-8 であることを指定します。

\usepackage{bxpapersize}
通常、dvipdfmx で dvi → PDF 変換する時は、-p オプションで用紙サイズを指定する必要があります。

しかし、このパッケージを読み込んでおけば、-p オプションを指定しなくても、dvipdfmx に用紙サイズが伝わるようになります (このパッケージを読み込むだけでいい)。

もしくは、hyperrefpxjahyper パッケージを使って PDF 情報を指定すれば、同じように用紙サイズが設定されます。

\usepackage{pxbase}
通常の Unicode 文字は直接入力すれば出力できますが、外字領域の文字などはテキストに直接入力してもエラーとなり、出力されません。

フォントによっては、外字領域に「?!」や「!!!」、濁点付きのひらがななどの文字があるため、それらを使いたい場合があります。

そういった文字は、このパッケージの \UI{} コマンドで、Unicode のコード値を数値 (16進数) で指定して出力します。

例 : \UI{E001}

\usepackage[unicode]{pxchfon}
upLaTex でフォントファイルを指定したい場合は、このパッケージを使います。

※ オプションに unicode を指定しないと、「〝〟(ダブルミニュート)」の閉じ側が出力されません。

\usepackage{pxrubrica}
ルビや傍点を使う場合、このパッケージを使用します。
詳しくは後述します。
フォントの指定
pxchfon パッケージでフォントファイルを指定する場合、以下のようにします。
詳しくはこちら → 電脳世界の奥底にて (PXchfonパッケージ)

% 明朝フォントの指定

\setminchofont{GenEiKoburiMin6-R.ttf}

% *.ttc/*.otc などで、複数のフォントが含まれている場合は、
% オプションでインデックス番号 (0〜) を指定する

\setminchofont[0]{〜.ttc}

フォントは、拡張子を含むファイル名で指定してください (パスは指定しない)。

フォントが読み込めなかった場合、LaTex が認識できるフォントディレクトリ上にあるか確認してください。
段落と字下げ
LaTeX のデフォルトでは、改行は無視され、空行があると、そこで段落分けがされます。
また、段落の先頭では字下げが行われます。

しかし、小説を書く場合には、改行はそのまま改行して欲しいし、字下げも全角空白で行った方が書きやすいと思われます。

そこで、以下のコマンドで、改行は改行として扱い、字下げは行わないようにします。

{\catcode`\^^M=\active%
\gdef\xobeylines{\catcode`\^^M\active \def^^M{\par\leavevmode}}%
\global\def^^M{\par\leavevmode}}
\AtBeginDocument{\xobeylines}

\parindent=0pt
感嘆符の後の空白
「!」や「?」などの感嘆符や疑問符の後には、全角の空白を入れたい場合があります。

空白自体は普通に全角空白文字を入れればいいのですが、その場合、感嘆符が行末に来て空白が行頭に来た時は、行頭に空白が入ることになります。

感嘆符が行末に来た後の空白は出力しないのがベストなため、通常は空白文字として出力し、行頭に来た場合は何も出力しないようにする必要があります。

それを実現するのが、以下のコマンドです。

\newcommand{\zenaki}{\hskip1zw plus .125zw minus 0.03125zw}

感嘆符の後の空白文字の代わりに \zenaki{} と記述してください。

あああ!\zenaki{}えええ
縦中横
縦書きにおいて、半角文字を横に並べて1文字とすることを、「縦中横」と呼びます。

主に、「12」などの数字や、「!?」などの感嘆符などで使います。

(「‼」「⁇」「⁈」「⁉」については、Unicode 文字として定義されているので、フォントにグリフが含まれていれば、1文字で表現できます)

jlreq パッケージに縦中横のコマンドが定義されているので、それを使います。
\tatechuyoko{文字}

ただし、コマンド名が長くて使いにくいので、\tcy として別名登録することにします。

\newcommand{\tcy}[1]{\tatechuyoko{#1}}

\tcy{12}時

なお、行の最後が \tcy{...} で、その後に文字がない場合、エラーが出ます。
\tcy{} の後に全角空白を付加するか、\zenaki{} コマンドを書いておくといいでしょう。
ルビ
ルビは pxrubrica パッケージのコマンドを使います。

詳細はこちら → Qiita - pxrubrica パッケージ

\ruby{親文字}{おや|も|じ}
\ruby{鶯}{うぐいす}
\ruby[||->]{鶯}{うぐいす}

\ruby コマンドの最初の引数で親文字を記述し、次の引数でルビ文字を記述します。
ルビ文字は、親文字に合わせて「|」で区切ります。

[] でオプションを指定すると、ルビごとに設定を変更できます。

\rubysetup コマンドで、デフォルトのルビ設定を指定できます。
傍点
傍点・圏点も pxrubrica パッケージのコマンドを使います。

詳細はこちら → pxrubrica パッケージで圏点できる話

% 縦書きの \kenten 時のマークを指定
\kentenmarkintate{sesame}
% 縦書きの \kenten[s] 時のマークを指定
\kentensubmarkintate{bullet}

\kenten{傍点}
\kenten[s]{圏点}

他には、plext パッケージの \bou コマンドを使う方法もあります。
ページ番号
現在のページの番号を変更したい場合は、\setcounter{page}{ページ番号} を使います。
この番号は、ノンブルとして出力されるページ番号でもあります。

\setcounter{page}{3}

右綴じ本の場合、奇数ページが左側、偶数ページが右側になります。

ノンブルを表示しない場合でも、twoside で奇数/偶数ページのどちらかを指定したい場合は、このコマンドで設定します。

特定のページでノンブルを非表示にしたい場合は、そのページの位置で \thispagestyle{empty} を記述します。
右寄せ/中央寄せ
1行の中で右寄せ (縦書きの場合は下寄せ) や中央寄せをしたい場合は、\hfil コマンドを使います。

\hfil 右寄せ
\hfil{}右寄せ

\hfil 中央寄せ \hfil

\hfil と本文の間には半角空白を入れるか、本文とくっつけたい場合は \hfil{} としてください。
改段/改ページ
改ページは以下のコマンドで行なえます。

\newpage改ページ。
複数段組の場合は、改段。
\clearpage図表を全部出力して改ページ。
複数段組の場合は、改ページ。
\cleardoublepage次のページが、奇数ページになるように改ページする

ちょうどページの最後の行となる位置で改ページを行った場合、次のページが空白ページになることがありますが、その際は以下のようにしてください。
(改行によって改段落させているのが原因で、1行分の空行が出るため、それを無効にする必要があります)

■ これだと空白ページが作られる

最後の行
\clearpage
次のページ

■ 方法1: 行の最後にコメントを置いて、改行を無視させる

最後の行%
\clearpage
次のページ

■ 方法2: 行末にコマンドを書く
 
最後の行\clearpage
次のページ
段組の変更
途中で2段組から1段組に変更したい場合などは、以下のコマンドを使います。
なお、段組変更時は常に改ページされます。

\onecolumn1段組に変更
\twocolumn2段組に変更
補足
「―」を繋げる
フォントによっては、「―」を複数連続して入力した場合、間が繋がるものと繋がらないものがあります。

また、禁則処理によって一行の文字数が減ると、字間が広がって繋がらない場合もあります。

そういった時に倍角ダーシを繋げたい場合は、以下のようにします。

\def\――{―\kern-.5zw―\kern-.5zw―}

\begin{document}
\――ああ、
\end{document}

倍角ダーシは「\――」と記述します。
太字など、二種類のフォントを使いたい場合
タイトルなどで一部の文字を太字にしたい時など、二種類のフォントを使い分けたい場合は、以下の方法が使えます。

1. \setgothicfont でゴシック用のフォントを指定する。
2. そのフォントを使いたい文字で \textgt (引数内の文字をゴシック書体にする) を使う。

\setgothicfont{SourceHanSerif-Bold.otf}
...
\begin{document}
\textgt{ここがゴシックフォントになる}
通常フォント
\end{document}
禁則処理を抑制する
デフォルトでは、ひらカナの小文字などが折り返し後に行頭に来た場合、追い出し処理が行われ、その一つ前の文字から折り返されます。

この場合は前の行の文字数が1文字減るので、その分字間が空くことになります。

字間が空くと見栄えが良くないと思う場合は、以下を記述すると、対象文字が行頭に来るのを許すことができます。

% 例えば、行頭に "」" のみとなる場合、
% "かな」" と2文字追い出されるのを "な」" とする

\jcharwidowpenalty=0

% 行頭に以下の文字が来ても禁則処理しない

\prebreakpenalty`ー=0
\prebreakpenalty`ぁ=0
\prebreakpenalty`ぃ=0
\prebreakpenalty`ぅ=0
\prebreakpenalty`ぇ=0
\prebreakpenalty`ぉ=0
\prebreakpenalty`っ=0
\prebreakpenalty`ゃ=0
\prebreakpenalty`ゅ=0
\prebreakpenalty`ょ=0
\prebreakpenalty\jis"246E=0 %ゎ
\prebreakpenalty`ァ=0
\prebreakpenalty`ィ=0
\prebreakpenalty`ゥ=0
\prebreakpenalty`ェ=0
\prebreakpenalty`ォ=0
\prebreakpenalty`ッ=0
\prebreakpenalty`ャ=0
\prebreakpenalty`ュ=0
\prebreakpenalty`ョ=0
\prebreakpenalty\jis"256E=0 %ヮ
\prebreakpenalty\jis"2575=0 %ヵ
\prebreakpenalty\jis"2576=0 %ヶ
ページの背景色
WEB 公開用の画像を作る場合などで、背景に色を付けたい場合は、以下のようにします。

\usepackage{color}

% RGB で bkcol という名前の色を定義
% 値は "R,G,B" で、0.0〜1.0
\definecolor{bkcol}{rgb}{.99, .95, .88}

% ページ背景色を bkcol に設定
\pagecolor{bkcol}