マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

行頭括弧を揃えるパッケージ(bxjaprnind パッケージ)(1)

コレの続き)

というわけで、パッケージを作ってみた。

ただし、諸般の都合があって、次のように色々と多くのものに依存する。*1

インストールは面倒だが、パッケージの最も基本的な使用法は単純である。単にパッケージを読み込めば、段落頭と強制改行後の行頭で開き括弧の前のグルーが入らなくなる――つまり括弧が段落頭では \parinednt の字下げ(普通は全角)、行頭では天付きになる。(u)pLaTeX の標準的な JFM の元ではこれが最も自然なので、通常はこの既定設定を用いればよいであろう。以下は、以前に挙げた、行長を極端に短くした場合の例をこの設定で組んだものである。

% pLaTeX 文書
\documentclass[a4paper]{tarticle}
\usepackage{bxjaprnind} % これを追加するだけ
\setlength{\textwidth}{10zw} % 極端に行長を小さくする
\setlength{\textheight}{200pt} % これは適当
%**後は bxjaprnind や行頭括弧とは直接関係がない設定**
% 行長が短く行分割が難しい状況なので、tmin10 だとかなり
% 奇妙な結果になる。JIS メトリックにするため otf を使う。
\usepackage{otf}
\jcharwidowpenalty=0 % さらに文字ウィドウ処理をやめる
\sloppy
\pagestyle{empty}
\begin{document}

「どうして?」

「誠に残念な事だが、ここは現実世界だ」

「それは解っている!」

\end{document}

段落頭および強制改行後の行頭での開き括弧の字下げ量は、それぞれ \parheadparenindentamount\lineheadparenindentamount という命令で設定可能で、引数は全角単位の字下げ量である。また、括弧に対する補正とは全く別個の機能として、強制改行 \\ のオプション引数に「>」を入れることで、予め決めた量の字下げを入れることができる(強制字下げ)。

% pLaTeX 文書
\documentclass[a4paper]{jsarticle}
\usepackage{bxjaprnind}
\parheadparenindentamount{-0.5} % 段落頭での補正の量(既定=0)
\lineheadparenindentamount{3} % 強制改行頭での補正の量(既定=0)
\lineheadforceindentamount{1.5} % \\[>] で入る空きの量(既定=1)
% 段落下げ(\parindent)は 1zw
\begin{document}                             % 字下げ量(全角単位)
「鉤括弧で始まる段落」の中で強制改行して、\\ % 1 - 0.5 = 0.5
(また)括弧があります。                     % 3

括弧で始まらない段落で強制改行して、\\       % 1
やはり括弧がありませんが、次は\\[>]          % 0
強制字下げを入れました。\\[>]                % 1.5
(次の行にも入れました。)\\*[>5mm]          % 1.5 + 3 = 4.5
% 前行末尾の例のように \\ の既存オプションとの
% 組み合わせも可能。無論、ここに指定する「長さ」は
% 垂直空きの調整量であり、字下げとは無関係。
こういう指定も可能です。                     % 1.5
\end{document}

強制字下げ(\\[>])の機能は、会話の描写で別行立ての鉤括弧の行が並ぶ場合に、それをソース上で(改段落でなく)強制改行として表しつつ、その行頭に字下げを入れるためのものである。((本当に括弧で始まる行が並ぶのであれば、lineheadparenindentamount をそれに合わせて設定すれば出力としては正しくなる。でもそのような行頭の字下げはもはや「括弧の位置調整」ではなく「意味的な字下げ」であるように思えるので、そういう書き方は「本来は正しくない」のだと考えている。))例えば、最初の例で会話の中を改段落でなく強制改行を用いて書き換えると以下のようになる。

\documentclass[a4paper]{tarticle}
\usepackage{bxjaprnind}
% 残りは先の例と同じ
\setlength{\textwidth}{10zw}
\setlength{\textheight}{200pt}
\usepackage{otf}
\jcharwidowpenalty=0
\sloppy
\pagestyle{empty}
\begin{document}

「どうして?」\\[>] % 注意:この行は段落冒頭である
「誠に残念な事だが、ここは現実世界だ」\\[>]
「それは解っている!」

\end{document}

(出力結果は最初の例と同じ。)

*1:この理由のうち最大のものは「everyhook パッケージが etoolbox パッケージを使っていて、(非本質的な形で)e-TeX 拡張を必要としている」からである。このため、「非 e-TeX で etoolbox を代替する」ためにかなり以前に作成した bxtoolbox というパッケージを引っ張り出してきている。

*2:bxtoolbox は次期の BXbase バンドルに含まれる予定であるが、現状で暫定的にここに置いている。