段落冒頭単語のボールド化

ロシアの TeX ユーザーズグループのメーリングリスト CyrTeX-ru@vsu.ru で,「段落のはじめの単語のみ自動的にボールド書体にしたいのだが,マクロ中の \expandafter がうまく動かないのは何故」との質問が出ていた(Message #8242)。私にとって,\expandafter 云々はどうでもよかったが,段落冒頭単語を自動的にボールドにする工夫にはちょっと興味があった。自分でマクロを書いて,こんなのどう?と投稿してみた。

段落は \par で改段落される。その際に,\everypar の設定によって新しい段落のはじまり方を変えることができる。しかし, latex.ltx が別の環境への切替えのときなどに \everypar を頻繁にリセットしてしまうようで,一度 \everypar をカスタマイズしてもすぐ元通りになってしまい,なかなか思うようにはいかない。こんなことで悩むより,段落の最初の単語に対し,素直に \textbf{} をマークアップするほうが早く確実だともいえる。

とはいえ,できたものを一応掲載しておく。boldpar 環境内で,段落の冒頭の単語だけをノーマルではなくボールドにする。ただし,あくまで欧文用であり「単語」は最初の空白文字までのテキストである。和文だと,空白を探して段落の終わりに到達し,段落全体,あるいはセクション全体がゴシック体で組まれてしまうかも知れない。この環境内にはいかなる環境も記述することができない。そんなこんなであまり使い勝手がよろしくない。

% -*- coding: utf-8; -*-
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\makeatletter
\let\new@everypar=\everypar% get \everypar on the time
\newtoks\new@everypar%
\catcode32=13\relax% set space to catcode 13 
\def {\mdseries\space\catcode32=10\relax}% space is command \md
\def\boldpar{% make only the head word of paragraphs bold
\par\everypar\expandafter{\the\new@everypar%
\if@afterindent\else{\setbox\z@\lastbox}\@afterindenttrue\fi%
\bfseries\catcode32=13\relax}}%
\catcode32=10\relax% recover catcode
\def\endboldpar{\@nobreakfalse}% 
\makeatother
\begin{document}
\section{hogehoge}
\begin{boldpar}
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
\end{boldpar}% recover bfserise --> mdserise
 
Как лицо твое похоже на вечерних богородиц,
опускающих ресницы, пропадающих во мгле.
\end{document}

上例では,boldpar 環境内で先頭の "Как" だけがボールド書体になるはずである。原稿の \makeatletter から \makeatother までが boldpar 環境定義マクロである。\everypar\bfseries 命令とインデント制御を埋め込む。空白文字の分類コードを一時的に 13 に変更して,これを \mdseries に置き換える。"\def {\mdseries\space ... }" の \def の次に空白がひとつあるのは,空白文字に命令を割り付けているわけである。命令を定義したすぐそのあとで,空白の分類コードを 10 に戻しておく必要がある。こうして,段落が開始された時点で \bfserise が実行され,最初の空白文字で \mdseries が実行され,見た目に元に戻るようにするというものである。デフォルト書体が bold だとドッチラケなんだけど。現時点のウェイトをチェックして振る舞いを変える必要があるだろう。\section 命令のあとのインデントの有無をコントロールするのに悩んだ。\@afterindenttrue\@nobreakfalse を設定しないと,\sectiton 命令指定時にインデントがおかしくなり,また3段落目でボールド化が解除されてしまうのである。