白屋書房Blog

組版・縦書きサイト「白屋書房」のブログです

改行問題解決しました!

今まで小説における改行を「見たまま出力」するために、プリアンブルで \obeylines を宣言してたんですが、これだと空行そのもの、原稿中の1行とか2行アキは結局無視されるという問題がありました。
仕方ないから入れたい空行の数だけ \vspace{baselineskip} をソースに書くという手に頼っていましたが、WYSIWYG的には見づらいわセマンティック的には間違ってるわでもうどうしようもなかった。
早くなんとかしたかったものの私の知識が足りなすぎて五里霧中だったのが、先日∃x(x=a)さんがアドバイスを下さり、改行問題はここに見事に解決されました!

具体的には以下のマクロをプリアンブルに入れてやります。もちろん外部のパッケージにしても。

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

んでbegin{document}の直後で、 \xobeylines を宣言するだけ!
これで晴れて本文を、ガチで見たまま改行できるようになりました。


そもそも元の\obeylinesは、以下のように定義されてるそうです。

{\catcode`\^^M=\active % these lines must end with %
\gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
\global\let^^M\par} % this is in case ^^M appears in a \write

^^Mが改行文字を表すので(ASCIIの13番)、それを全部\parに変えちゃうことでオール改行を実現しているようです。

ただこの方法だと、一つの行(=段落)を組み終わって次の行に移るためにvertical modeに遷移した時、「中身が何もない\parだけの行は無視する」というTeX本来の動作が勝ってしまいます。
そこで^^M\par\leavevmodeにしてやることで、空の行でも立ち止まって出力することが可能になった、という寸法らしいです。

TeXレベルの命令を書き換えてしまうのはちょっと怖かったので、新しい命令として定義してみました。命名は適当です。もっとちゃんとしたコマンド名があればそっちの方がいいです。
あと本家obeylinesに揃えてプリアンブルで宣言したかったんだけど、それだと機能しなかったのでdocumentの内側に書くことにしてます。(トンチンカンなこと言ってたらすみません)

これでいわば「空行含め全ての論理行をことごとくパラグラフとして扱う」ことになったので、TeX流の意味論的にはもう完全に間違ってることになりましたが、もともと正しい文法なんぞ目指しちゃいないのでよしとします。
「可能な限り生原稿に寄せた形のTeXソースにする」という(無駄な)原則に一歩近づけました。嬉しい。∃xさん本当にありがとうございました。

サイトの方の記事はこれから編集します。早くレイアウト編まで作らないと……。

参考

TEX in Practice: Volume III: Tokens, Macros - Stephan v. Bechtolsheim - Google ブックス