マクロツイーター

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

TikZ の$が£だった件

これはひどい……。

$ が £ になるのは「OT1 エンコーディングの罠」のせいである。これは一般の LaTeX ユーザも留意すべき内容であるので、少し詳しく解説しておく。

OT1 エンコーディングはやっぱりアレ

LaTeX の既定設定である OT1 エンコーディングのアレ性については、 既に次の記事でその一端が示されている。

しかし、OT1 エンコーディングにはもっとアレな点を有している。それは「シェープによって微妙に文字の配置が異なる」ということである。*1

例えば、LaTeX の既定のフォントシェープである cmr10(OT1/cmr/m/n 相当)のエンコーディングは次の通りである。

ところが、イタリックのシェープ(\itshape)である cmti10(OT1/cmr/m/it 相当)のエンコーディングは先のものと 1 ヶ所だけ異なる。"24 が〈$〉ではなく〈£〉に変わっている。

等幅のフォントファミリ(\ttfamily)の cmtt10(OT1/cmtt/m/it 相当)は次の通り。同じ OT1 でもかなり異なり、こちらは "21〜"7E の範囲が ASCII と一致している。*2

そしてそのイタリックシェープである cmitt10(OT1/cmtt/m/it 相当)の配置は、cmtt10 の〈$〉を〈£〉に変えたものになっている。

LaTeX での対処とその限界

ただし、この変則性について、LaTeX 側である程度の対処は行われている。従って、“普通に”LaTeX でこれらの記号を入力する――すなわち、〈$〉を \$、〈£〉を \pounds((厳密にいうと、〈$〉と〈£〉の LICR(標準の文字命令)は \textdollar\textsterling であり、\$\pounds は「テキストでも数式でも使える」という便宜性を持たせた一般命令である。))で入力する――分には、この「OT1 の変則性」は表面化しない。

\documentclass{article}
\begin{document}
% 直立体(OT1/cmr/m/n)
Which is more valuable, \$1 or \pounds1?\par
% イタリック体(OT1/cmr/m/it)
\itshape Which is more valuable, \$1 or \pounds1?\par
\end{document}

しかし、「LaTeX の命令」を間に挟まずに文字が出力される場合はこの対処も効かない。特に verbatim 系の機能が注意を要する。例えば、「イタリックや太字の指定の中にある verbatim については、verbatim のフォントにもイタリックや太字の指定を効かせたい」と望んだとする。これは次のような TeX コードで実現できる、はずである。((ただし LaTeX\ttfamily の既定設定である「CM Typewriter」フォントファミリには太字がないので、実際に太字にするには \ttfamily の割当を変える必要がある。なお、後で紹介する lmodern を使用した場合は \ttfamily は「LM Typewriter」でありこれは太字のシリーズを持っている。))

[verbshape.sty]
% ファミリだけ \ttfamily に変えて, シリーズ・シェープは変えない
\def\verbatim@font{\ttfamily}

ところが、この設定を使ってイタリックで \verb を実際に使うと、〈$〉が〈£〉に化けてしまう。verbatim 状態では「$ の入力で〈$〉がある(はずの)"24 の文字を出力する」という動作になるので、「OT1 の変則性」の影響を直に受けてしまうのである。

\documentclass[a5paper]{article}
\usepackage{verbshape}% さっきのやつ
\begin{document}
Sometimes braces can be omitted:
\verb|$a_{2}$| and \verb|$a_2$| both result in ``$a_2$''.
{\itshape But beware: \verb|$a_10$| would result in ``$a_10$''.}\par
\end{document}

OT1 逝ってよし

それでは、この「OT1 の変則性」に対して根本的に対処するにはどうすればよいか。答えは簡単である。

OT1 を使うな。

要するに、OT1 を使う限りどうにもアレなので、エンコーディングを別のものに変えるしかないのである。例の Qiita の記事には次の対策が書かれている。

  • フォントエンコーディングを T1 に変更する。
  • フォントの設定が既定のまま(CM フォント使用) である場合は、「Latin Modern フォント」に変更する。
    \usepackage[T1]{fontenc}% T1エンコーディングに変更
    \usepackage{lmodern}% Latin Modern フォントに変更
    

これだけで、欧文フォントに関する、「何故かうまくいかない」現象から解放される。

\documentclass[a5paper]{article}
\usepackage[T1]{fontenc}%←とにかくコレと
\usepackage{lmodern}    %←コレを書く
\usepackage{verbshape}% さっきのやつ
\begin{document}
Sometimes braces can be omitted:
\verb|$a_{2}$| and \verb|$a_2$| both result in ``$a_2$''.
{\itshape But beware: \verb|$a_10$| would result in ``$a_10$''.}\par
\end{document}

おまけ: 最新の TikZ の $ は $ である件

ところで、話の元ネタである TikZ のマニュアルについては、TeX Live 最新版の PGF/TikZ では直っている。

*1:だから本来は別のエンコーディングとして扱うべきなのだが、Knuth の Computer Modern フォントを LaTeX で“まともに”使い続けられるようにするため、無理やり“単一のエンコーディング”と見なしているのである。

*2:いや、実は完全には一致してなくて、"27 にあるのは U+0027〈'〉ではなく U+2018〈‘〉、"60 にあるのは U+0060〈`〉ではなく U+2019〈’〉である。これらの特異性は歴史的な理由によるのだが、現在でも LaTeX ではこれらの文字の組は“故意に混同”されていることが多い。