読者です 読者をやめる 読者になる 読者になる

TeX Alchemist Online

TeX を使って化学のお仕事をしています。

ゴシックのローマ数字にヒゲを付ける

f:id:doraTeX:20161206113714p:plain

この記事は TeX & LaTeX Advent Calendar 2016 の8日目の記事です。 2日目6日目に続く今年3回目のエントリーとなります(スミマセン)。 7日目はaminophenさんでした。 9日目はyuracoさんです。

ローマ数字 Ⅲ はアイアイアイか組文字か

昨年の TeX & LaTeX Advent Calendar 2015 の3日目の記事「今さら人に聞けないローマ数字とその組み方」や『LaTeX2e 美文書作成入門』などで繰り返し言及されているように,LaTeX でローマ数字を組む場合,半角アルファベットを単に並べて,I(アイ),II(アイアイ),III(アイアイアイ),IV(アイブイ),…… のように書くのが正しい組み方です。「Ⅲ」のような全角(組文字)のローマ数字は用いるべきでないとされています。

しかし,本田さんが TeX Q&A 237649355 で述べておられるように,実際の現場では,「組文字のローマ数字(時計文字)でなければ受け入れてもらえない」場面が多々あります。(また,特に縦書きのときには,全角ローマ数字が馴染みます。)

新聞社におけるローマ数字の取り扱いについては,次の朝日新聞の記事が参考になります。

www.asahi.com

どうしても LaTeX で組文字ローマ数字を使いたいなら

従来の pLaTeX では,JIS X 0208 までしか扱えず,組文字ローマ字は「機種依存文字」(環境依存文字)という扱いでしたので,「組文字のローマ数字を出力する」というのは多少厄介な課題でした(otfパッケージを使えば可能)。

それに対し,今時の upLaTeX の場合,Unicode に含まれる Ⅲ (U+2162 ROMAN NUMERAL THREE) のような全角ローマ数字をソース中にそのまま入力すれば,普通に出力できます。ですから,「正しい組み方はどうであるか」という問題はさておき,もし「どうしても組文字のローマ数字を出力したい」というのであれば,それに技術的困難はなくなりました。

ゴシック体のローマ数字にヒゲは付くべきか?

しかし,「昔ながらの組文字ローマ数字にとことんこだわる人々」には,単に「全角ローマ数字を出力できる」だけでは満足してもらえません。「ゴシック体でもローマ数字の上下に横線がなければローマ数字とは認めない」と要求されることがあります。

例えば,ヒラギノフォントの全角ローマ数字は次のようになっており,ゴシック体の上下に横線は付きません。

f:id:doraTeX:20161206005812p:plain

これは,明朝体が欧文での serif, ゴシック体が san serif に相当することを考えれば自然です。明朝体のローマ数字の上下の横線は serif(ヒゲ)の一種です。ゴシック体は sans serif (= without ヒゲ)に相当する以上,ゴシック体のローマ数字の上下に serif(ヒゲ)にあたる横線が入っていてはおかしいのです。

しかし,そうは言っても,巷で見かけるローマ数字は,多くの場合ゴシック体でも横線が入っています。また,実際に「横線が入っていないと読者にローマ数字と認識してもらいづらい」というケースもあり,悩ましいところです。

次の朝日新聞の記事においても,社内でゴシックローマ数字のデザインに悩んだ経緯が詳細に記されており,参考になります。

www.asahi.com

代表的な和文フォントのローマ数字のデザインの比較が,次の記事にあります。

koikekaisho.hatenablog.com

モリサワフォントは,ゴシック体でもローマ数字にヒゲが付くポリシーのようです。

興味深いのはMSゴシックです。

f:id:doraTeX:20161206012038p:plain

MSゴシックの全角ローマ数字には全てヒゲが付いています。さらに,全角アルファベットについては,I だけにヒゲが付くという,不統一なデザインとなっています。これは「ヒゲがない I だと数字の1や単なる縦棒と見分けが付きにくい」という事情によるものでしょう。このように,MSゴシックは,デザインの統一性よりも,多くの日本人に好まれることを優先した設計になっていると言えるでしょう。

どうしてもヒラギノゴシックの全角ローマ数字にヒゲが欲しいなら

さて,「組文字ローマ数字をこよなく愛する人々」からは,「ヒラギノゴシックの全角ローマ数字にもヒゲを付けてローマ数字らしく(!)してほしい」と要求されることがあります。そのような要求を受けたときには,次のように強引に対応しています。もはやヒラギノフォントの設計思想を冒涜する罰当たりな行為かもしれませんが……(フォントデザイナーの方々,ごめんなさい。。。m(__)m )

f:id:doraTeX:20161206102418p:plain

このような合成文字を作成することで,組文字ローマ数字主義者の方々にも納得してもらえました。*1

なお,単に横棒を書き加えるのではなく,ローマ数字の Ⅰ を回転して書き加えているのは,Ⅰ の端の膨らみがヒゲにも欲しかったからです。

f:id:doraTeX:20161206103156p:plain:w200

upLaTeX + TikZ でヒラギノゴシック全角ローマ数字のヒゲ合成を実現する

文字を伸縮・回転して全角ローマ数字のヒゲを合成する処理は,TikZ で次のように実現しています。数値はヒラギノ角ゴ W3 でちょうど合うように目分量で位置調整しています。また,前後の文字との間に適切に \kanjiskip\xkanjiskip が入るように,下記記事で紹介した和文ゴーストの手法を用いています。

doratex.hatenablog.jp

upLaTeX ソース

%!uplatex
\documentclass[uplatex,dvipdfmx]{jsarticle}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage[deluxe]{otf}
\usepackage{plext}%% 縦組用

\makeatletter
\chardef\zenkakuSpace=\jis"2121\relax % 和文ゴースト用全角スペース

\def\serifRoman#1{%
  \ifnum0\ifnum#1<1 1\fi\ifnum#1>12 1\fi>0 %%% 引数が 1~12 の範囲外ならエラー
    \@latex@error{\string\serifRoman: #1 must be 1..12}\@ehc
  \fi
  \zenkakuSpace\kern-1zw\relax %%% ゴースト処理(入口側)
  \begingroup
  \@tempcnta="215F\relax
  \advance\@tempcnta by #1\relax
  \kchardef\@roman@char=\ucs\@tempcnta\relax %% 今回対象のローマ数字
  \kchardef\@roman@I=\ucs"2160\relax %% ヒゲとして利用するローマ数字Ⅰ
  \@tempdima=-.132zw\relax
  \@tempdimb=.134zw\relax
  \@tempdimc=1zw\relax
  \setbox1\hbox to 1zw{\yoko\hfill
    \begin{tikzpicture}[baseline=(A.base),inner sep=0pt, outer sep=0pt]%
    \path[use as bounding box] (-.5\@tempdimc, -.5\@tempdimc) rectangle (.5\@tempdimc, .5\@tempdimc);
    \node (A) {\@roman@char};
    \ifcase#1
      \or % Ⅰ
        \@serifRoman@a{.45}{0}% 上ヒゲ
        \@serifRoman@b{.45}{0}% 下ヒゲ
      \or % Ⅱ
        \@serifRoman@a{.80}{0}% 上ヒゲ
        \@serifRoman@b{.80}{0}% 下ヒゲ
      \or % Ⅲ
        \@serifRoman@a{1.10}{0}% 上ヒゲ
        \@serifRoman@b{1.10}{0}% 下ヒゲ
      \or % Ⅳ
        \@serifRoman@a{.60}{-.24}% 左上ヒゲ
        \@serifRoman@a{.30}{.38}%% 右上ヒゲ
        \@serifRoman@b{.30}{-.35}% 左下ヒゲ
      \or % Ⅴ
        \@serifRoman@a{.30}{-.28}% 左上ヒゲ
        \@serifRoman@a{.30}{.28}%% 右上ヒゲ
      \or % Ⅵ
        \@serifRoman@a{.30}{-.38}% 左上ヒゲ
        \@serifRoman@a{.60}{.24}%% 右上ヒゲ
        \@serifRoman@b{.30}{.34}%% 右下ヒゲ
      \or % Ⅶ
        \@serifRoman@a{.30}{-.41}% 左上ヒゲ
        \@serifRoman@a{.75}{.20}%% 右上ヒゲ
        \@serifRoman@b{.52}{.28}%% 右下ヒゲ
      \or % Ⅷ
        \@serifRoman@a{.30}{-.41}% 左上ヒゲ
        \@serifRoman@a{.82}{.18}%% 右上ヒゲ
        \@serifRoman@b{.65}{.245}% 右下ヒゲ
      \or % Ⅸ
        \@serifRoman@a{.25}{.33}%% 右上ヒゲ
        \@serifRoman@a{.55}{-.22}% 左上ヒゲ
        \@serifRoman@b{.55}{-.22}% 左下ヒゲ
        \@serifRoman@b{.25}{.36}%% 右下ヒゲ
      \or % Ⅹ
        \@serifRoman@a{.25}{.23}%% 右上ヒゲ
        \@serifRoman@a{.25}{-.23}% 左上ヒゲ
        \@serifRoman@b{.25}{-.26}% 左下ヒゲ
        \@serifRoman@b{.25}{.26}%% 右下ヒゲ
      \or % Ⅺ
        \@serifRoman@a{.55}{.23}%% 右上ヒゲ
        \@serifRoman@a{.25}{-.34}% 左上ヒゲ
        \@serifRoman@b{.25}{-.36}% 左下ヒゲ
        \@serifRoman@b{.55}{.23}%% 右下ヒゲ
      \or % Ⅻ
        \@serifRoman@a{.75}{.20}%% 右上ヒゲ
        \@serifRoman@a{.25}{-.38}% 左上ヒゲ
        \@serifRoman@b{.25}{-.40}% 左下ヒゲ
        \@serifRoman@b{.75}{.20}%% 右下ヒゲ
    \fi
    \end{tikzpicture}%
    \hfill}%
  \box1\relax
  \endgroup
  \kern-1zw\relax\zenkakuSpace %%% ゴースト処理(出口側)
}
\def\@serifRoman@a#1#2{%
  \node[rotate=90,xscale=.7,yscale=#1] at ($(A.north) + (#2\@tempdimc,\@tempdima)$) {\@roman@I};
}
\def\@serifRoman@b#1#2{%
  \node[rotate=90,xscale=.7,yscale=#1] at ($(A.south) + (#2\@tempdimc,\@tempdimb)$) {\@roman@I};
}
\makeatother

\def\test{%
数学\serifRoman{1}です\par
数学\serifRoman{2}です\par
数学\serifRoman{3}です\par
数学\serifRoman{4}です\par
数学\serifRoman{5}です\par
数学\serifRoman{6}です\par
数学\serifRoman{7}です\par
数学\serifRoman{8}です\par
数学\serifRoman{9}です\par
数学\serifRoman{10}です\par
数学\serifRoman{11}です\par
数学\serifRoman{12}です
}

\begin{document}
\setlength\parindent{0pt}
\gtfamily %% ヒラギノ角ゴ ProN W3 に
\test

\vspace{5mm}

\parbox<t>{5zw}{\test}
\end{document}

出力結果

f:id:doraTeX:20161206112249p:plain

なお,上記のヒゲの付き方の数値は,ヒラギノ角ゴ W3 に合わせて目分量で調整していますので,ウェイトを変化させると次第に破綻してきます。太いウェイトで成立させるには,より一層の個別の目分量調整が必要でしょう。

f:id:doraTeX:20161206111538p:plain

おまけ:if で OR を表すイディオム

上記ソース中で

\ifnum0\ifnum#1<1 1\fi\ifnum#1>12 1\fi>0

となっている部分は,TeX の if で OR を表すイディオムです。「#1 が 1 未満または #1 が 12 より大ならば」を表しています。\ifnum...>0... の部分が,#1 が 1~12 の間のときには 0 になるので偽となり,「1未満」または「12より大」のときは 01 になるので真となります。このイディオムは次の記事で紹介されています:

d.hatena.ne.jp

*1:さらに細かく言うと,Ⅴ の上ヒゲが1本につながっていて欲しい派と2本に分かれていて欲しい派,Ⅳ の下ヒゲが V までかかっていて欲しい派と Ⅰ の部分だけにかかっていて欲しい派など,いろいろ宗派があるようです。