下線・取り消し線(ulem / soul)

下線は、組版を知る人がまず「やめたほうがいい」と言う修飾です。理由は趣味の問題ではありません。タイプライタにはイタリック体が無く、語を目立たせる唯一の方法がキャリッジを戻してアンダースコアを重ね打ちすることでした。印刷所へ回す原稿では、語の下に引いた一本の線は植字工への指示——「ここはイタリックで組め」——を意味しました。下線はスタイルではなく、スタイルを指し示す記法だったのです。LaTeX はこの歴史を二重に受け継いでいます。\underline は実体が数式用の命令で、長い句を渡すと折り返さずに右余白へはみ出します。そしてそれを直すために誰もが入れる ulem パッケージは、CTAN の説明文で自らの目的を「出力がタイプライタで打ったように見えるようにする」ためだと述べています。このページでは \underline\uline\ul の使い分け、ulemsoul の違い、そして本当に必要だったのが \emph である場面を扱います。

\underline が折り返さず余白へはみ出す理由

\underline が数式用の命令で、引数を一つの分割できない箱に組んでしまうからです。パッケージは要らず、本文でも数式でも動きますが、本来の住みかは数式モードで、$\underline{x}$ のように変数の下に線を引くための道具です。地の文で使うと、LaTeX は引数のまわりで黙って数式モードに入り、全体を一個の水平な箱として組み、その下に線を引きます。箱の内側には改行できる場所が存在しないので、句が行の幅より広ければ TeX には折る場所がなく、そのまま右余白へ流れ出ます。

latex
% fine for a single short word
This word is \underline{underlined} in running text.

% the box has no break points, so TeX pushes it into the margin
\underline{a phrase far too long to fit on one line of this measure}

ログに出る症状は覚えておく価値があります。エラーではなく警告で、Overfull \hbox (…pt too wide) in paragraph at lines … と出ます。そのとき一緒に表示される断片は []$[]$ という形で、この二つのドル記号が何よりの証拠です。下線を引くために LaTeX が文を数式モードで包んだことを、自分で白状しているわけです。もう一つの、もっと目立たない欠点は線の位置です。\underline は上の文字を見ずに決まった深さへ線を置くので、下に伸びる gp を含む語では、線が字を切っているように見えることがあります。

したがって役割分担はこうなります。\underline は数式用——引数はどのみち記号一つで、数式の中に収まっています。線を文の中に置く必要が出た時点で、パッケージに切り替えます。その仕事を担うパッケージは二つあり、互換ではありません。ulem は行末で折り返せる下線と取り消し線を、soul は蛍光ペンと字間調整を提供します。ただしどちらを読み込む前にも、下線がもともと何を意味していたかを知っておく価値があります。たいていはそれで、そもそも下線が要るのかどうかが決まるからです。

下線を避けるべきだと言われる理由——タイプライタと植字指定

下線が代用品であり、その代わりに立てるべき本物が手元にあるからです。タイプライタにはボールドもイタリックも無く、語を目立たせる唯一の方法は、キャリッジを戻して打ち終えた文字の下にアンダースコアを重ね打ちすることでした。印刷の現場では、同じ一本の線が別の仕事もしていました。指定を入れた原稿では、下線は植字工への指示だったのです。語の下の直線一本はイタリック、波線はボールド、二重線はスモールキャピタル、三重線は総大文字を意味しました。著者が下線を引いたのはイタリックを組めなかったからで、組める植字工はその線を読み取って捨てました。

だから下線はソフトウェアの中では生き延び、組版の教科書からは消えていきます。ワープロはタイプライタのキーをそのまま受け継いだのに対し、活字にはそもそも下線という選択肢が無かったからです。LaTeX 側の道具も、その血筋を隠していません。Donald Arseneau の ulem は著作権表示が 1989 年から始まるパッケージですが、CTAN の説明では \em\emph を下線に置き換えるのは「出力がタイプライタで打ったように見えるようにするため」だと書かれ、付属マニュアルは「出版社へ提出する原稿で下線を引く必要があるような文章」に向くと述べています。ulem は完成した PDF を飾るために書かれたのではありません。タイプ原稿を作るために書かれたのです。

実務の指針はここから自然に出ます。読者に語を強く読ませたいだけなら \emph{...} と書き、強調がどう見えるかは文書クラスに任せます。多くのクラスではイタリックになり、強調の中に強調が入れ子になれば正しく立体へ戻ります。本物の下線は、線が調子ではなく情報を担う場面に取っておきます。校正稿での削除、署名欄、記入する空欄、リンク——このページの残りは、そういう理由がある前提で読んでください。

ulem——行末で折り返せる下線と取り消し線

\usepackage[normalem]{ulem} を読み込み、\underline{...} と書いていた場所に \uline{...} と書きます。線は行末で折り返し、語間の空きの上も走り、途中でハイフネーションが起きても構いません。パッケージには校正記号の語彙が一式そろっています——二重線、波線、語を貫く線、斜めのハッチング、破線、点線。指定を入れた原稿に必要な語彙が、そのまま揃っているわけです。数式モードの中では \uline は黙って \underline に仕事を返すので、どこで使っても安全です。

命令引かれる線
\uline下線。行末で折り返せます
\uuline二重下線。校正記号ではスモールキャピタルの指定
\uwave波下線。校正記号ではボールドの指定
\sout取り消し線。語の中央を横切る線
\xout抹消線。/ を重ね打ちして消します
\dashuline破線の下線
\dotuline点線の下線

線を左右するパラメータは二つで、設定の仕方が違う点が落とし穴になります。\ULthickness は太さで、既定値は .4pt ですが、長さではなくマクロなので \renewcommand{\ULthickness}{0.8pt} と書きます。\setlength は効きません。\ULdepth はベースラインから線までの落差で、こちらは本物の長さなので \setlength を使います。既定値は \maxdimen という旗印で、これが入っていると ulem は深さを現在のフォントから割り出します。この二つのつまみは、見かけよりずっと多くをパッケージについて説明してくれます。\sout の定義は、\ULdepth-.55ex にした下線そのものなのです。深さが負になると線はベースラインから持ち上がり、語の真ん中を通ります。ulem における取り消し線とは、わざと違う場所に引いた下線でした。\xout はもっと素朴で、/ を繰り返し重ね打ちしているだけです。

latex
\usepackage[normalem]{ulem}
\renewcommand{\ULthickness}{0.8pt}  % a macro, so \renewcommand
\setlength{\ULdepth}{1.8pt}         % a length, so \setlength

\uline{important} \uuline{urgent} \uwave{boat}
\sout{wrong} \xout{removed}
\dashuline{dashing} \dotuline{dotty}

\emph が急に下線になったら——normalem オプション

\usepackage{ulem} とだけ書くと、パッケージが強調の定義を書き換えるからです。マニュアルは悪びれずにこう書いています——「In LaTeX ulem replaces italics with underlining in text emphasized by \em or \emph」。バグではなく、このパッケージの本来の目的です。何を作るために書かれたかを思い出してください。ただし結果として、二百ページにわたって \emph を平穏に使ってきた文書が、一語に下線を引くためにパッケージを読み込んだ途端、強調のすべてに線を生やします。入れ子にするとさらに厄介で、通常の \emph は入れ子になるとイタリックと立体を交互に切り替えますが、ulem 版はマニュアルの言葉どおり「generates multiple underlining; it does not alternate on and off」——線が重なって増えるだけです。

直し方はオプションの一語です——\usepackage[normalem]{ulem}。これで強調はふだんどおりに戻り、線は \uline などを明示的に書いた場所だけに出ます。同じ切り替えは宣言としても用意されていて、\normalem で置き換えを止め、\ULforem で戻します。本当にタイプ原稿を作っているなら、文書の途中で切り替えられます。実務では、理由を口に出して言えないかぎり ulem は毎回 [normalem] 付きで読み込んでください。

latex
\usepackage[normalem]{ulem}

% \emph keeps its italics; a rule appears only where you ask for one
This is \emph{emphasis}, and this is \uline{underlined}.

% \ULforem brings the substitution back, \normalem switches it off again

soul——\hl の蛍光ペンと \so の字間

欲しいのが黄色い蛍光ペンの網かけや、強調のために字間を広げた文字なら、パッケージは soul です。しかも到達の道筋がまったく違います。テキストを TeX のハイフネーション機構に渡して音節と文字に分けてもらい、その隙間で処理をするのです。だからこそ、語の字間を空けながら、その語の途中で行を折ることもできます。作者の Melchior Franz はマニュアルで、名前についての当然の推測を先回りして潰しています——「the package name soul is only a combination of the two macro names \so (space out) and \ul (underline)—nothing poetic at all」。現在の保守は Oberdiek Package Support Group が引き継いでおり、バージョン 3 からは旧 soulutf8 を取り込んだので、UTF-8 の入力に追加の読み込みは要りません。

命令効果
\soレタースペーシング。文字の間隔を空けます
\caps大文字・小型大文字の連なりに合わせた字間調整
\ul下線。行末で折り返せます
\st取り消し線(重ね打ち)
\hl蛍光ペン風の網かけ。既定は黄色で、colorxcolor が必要です

色は効果ごとに設定します。下線は \setulcolor、取り消し線は \setstcolor、蛍光ペンは \sethlcolor で、引数を空にすれば色付けを止められます。既定では蛍光ペンは黄、二本の線は黒です。ひとつだけはっきり書いておくべき罠があります——\hl が色を塗るのは colorxcolor を読み込んでいるときだけ です。読み込んでいないと、この命令は何も言わずに下線へ退避します。画面上は「蛍光ペンが出なかった」ようにしか見えません。自分の色は \definecolor で作って \sethlcolor に渡します。

latex
\usepackage{color,soul}
\definecolor{lightblue}{rgb}{.90,.95,1}
\sethlcolor{lightblue}

\so{letterspacing} \ul{underlining} \st{overstriking}
\hl{this is highlighted in light blue}
\ul{Auf{}lage}              % {} keeps the fl ligature from forming
\so{foo \mbox{little} bar}   % \mbox, not bare braces, around hyphenable text

一文字ずつ解析する機構の代償として、引数はもはやふつうの LaTeX ではありません。soul は TeX の段落組み立てより先にすべてのトークンを読む必要があるので、いくつかの書き方が禁じられています。しかも失敗は派手です——Package soul error: Reconstruction failed が出て、出力の該当箇所には黒い四角が残ります。紙面のどこで違反したかがすぐ分かるようにです。覚えておく価値のある決まりは次のとおりです。

  • 数式は $...$ で。 ドルで囲めば使えますが、LaTeX 式の \(...\) は通りません。
  • 波かっこはまとめるためのもの。ただし改行点を隠してはいけません。 \so{foo {little} bar}Reconstruction failed になります。グループの中にハイフネーション位置があるからで、空白もその一つに数えられます。\so{foo \mbox{little} bar} と書きます。
  • 入れ子は不可。 \ul{foo \so{bar} baz} は許されません。どうしても必要なら内側を先にボックスへ入れ、そのボックスが折り返せないことを受け入れます。
  • 合字は手で割ります。 \ul\st\hl の中では、合字を作らせたくない位置に {}\null を挟みます(\ul{Auf{}lage})。
  • \verb・環境・命令定義は入れられません。 そのまま素通しさせたい素材には \soulomit{...} という抜け道があります。

ulemsoul の違いと使い分け

校正記号なら ulem、蛍光ペンなら soul です。両方必要なら両方読み込んで構いません。ulem が提供するのは \ulinesoul が提供するのは \ul で、命令名が衝突しないからです。二つのうち寛容なのは ulem のほうで、引数にはほとんど何でも入れられ、折り返しが不格好でもとにかく折り返します。soul は線を字形により丁寧に合わせ、同じ読み込みで \hl\so まで付いてきますが、引数は上の一覧のとおり制限された言語です。「ここを消して、代わりの語に下線」という原稿なら [normalem] 付きの ulem が最短で、査読者向けに黄色いマーカーが要るなら候補は一つしかありません。ulem には蛍光ペンが無いからです。

削除と追加を見せる校正原稿の書き方

\sout\uline のもっとも弁護しやすい使い道は、何が変わったかを見せる必要のある草稿です。ただし線の命令を本文へ直接書いてはいけません。意味のほうを書き、どう印刷するかはマクロに決めさせます。スイッチ付きの \deleted{...}\added{...} はプリアンブル三行の費用で、提出前に一つずつ探して消す作業を丸ごと省きます。ソースが読みやすくなる効果もあります。\deleted{古い推定値} は意味を語りますが、\sout{古い推定値} は語らないからです。

latex
\usepackage[normalem]{ulem}
\newif\ifrevisions
\revisionstrue                 % final version: \revisionsfalse

\newcommand{\deleted}[1]{\ifrevisions\sout{#1}\fi}
\newcommand{\added}[1]{\ifrevisions\uline{#1}\else #1\fi}

% The estimate was \deleted{0.42} \added{0.51}.

これを事故にしないための習慣は二つです。校正の印と強調の語彙を分けておくこと——調子は \emph、履歴は \deleted\added に持たせれば、スイッチを切っても本文の意味には触れません。もう一つは、提出前チェックリストに「スイッチを切って一度組み、PDF を目で見る」を入れておくこと。刷り上がりのファイルに残った取り消し線は、印刷されるまで誰も気づかない類いの事故だからです。

和文(CJK)で下線が折り返せないとき、そしてタグ付き PDF の問題

腹を決める前に知っておく価値のある限界が二つあります。第一に、どちらのパッケージも欧文向けに書かれています。ulemsoul は語・ハイフネーション位置・語間の空きを手がかりに考えますが、和文や中国語・韓国語の連なりはそのどれも供給しません。そのため CJK の長い下線は、変な位置で折れるか、まったく折れないかになりがちです。日本語 TeX の界隈はこれに独自のパッケージで答えていて、\Underline\Midline\Overline を備えた jumoline がよく挙がります(CTAN の外で配布されており、素の TeX Live には入っていません)。第二に、CTAN は ulemsoul の両方を「tagged PDF incompatible」の分類に置いています。LaTeX がアクセシブルな出力へ向かういま、これは効いてきます。加えて、画面では美しい黄色の \hl も、白黒印刷では灰色のにじみになります。どちらも締切の後ではなく前に確かめてください。