マクロツイーター

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

LaTeX の inconsolata がアレなので何とかする

ソースコード表示用のフリーなフォントとして人気のある Inconsolata。それを(非 Unicode な)LaTeX で使うためのパッケージが inconsolata パッケージである。

しかし、特にソースコード表示の用途で観ると、このパッケージによる出力には難点がある。

  • 数字の 0(ゼロ)の字体は、Inconsolata 自体は斜線入りのものを既定としていて、別に斜線無しのものも用意している。ところが LaTeX のパッケージでは斜線無しのものしか使えない。*1これだと英大文字の O(オー)との区別が付きにくい。

    (上の画像のソースは以下の通り。)

    \documentclass[a4paper]{article}
    \usepackage[T1]{fontenc}
    \usepackage{inconsolata}
    %\usepackage{upquote}
    \begin{document}
    \begin{verbatim}
    #!/bin/sh
    for i in `seq 100`; do
      j="$i"
      if [ `expr $i % 3` == 0 ]; then echo -n 'Fizz'; j=''; fi
      if [ `expr $i % 5` == 0 ]; then echo -n 'Buzz'; j=''; fi
      echo "$j"
    done
    \end{verbatim}
    \end{document}
    
  • ソースコードの verbatim 出力では、〈`〉(U+0060)と〈'〉(U+0027)を(単引用符で置き換えるのでなく)そのまま出力するのが望ましい。これを実現するために upquote パッケージがよく使われる((日本では jsverb パッケージを使う人が多いかも知れない。jsverb と併用した場合は、〈`〉は正常だが、〈'〉は同様に欠落する。))が、inconsolata と併用した場合、これらの文字が欠落してしまう。これは inconsolata 用の TS1 エンコーディング定義で \textasciigrave(= 〈`〉)と \textquotsingle(= 〈'〉)が抜けているからである。(無論フォントにこの 2 つの ASCII 文字が無いなんてことはない。)

    例えば、前項の例のソースで upquote パッケージの読込を行う(コメントアウトを解除)と、以下のようになる。(なお、upquote を使う場合はエンコーディングを OT1 以外にする必要がある。*2)〈`〉と〈'〉が全部落ちていることが判る。

というわけで、この点を改善したものを作ってみた。

inconsolata パッケージの代わりに bxinconsolata パッケージを使うと、T1 と TS1 エンコーディングのフォントが上記の欠点を解消したものに置き換えられる。(他のエンコーディングのものは変わらないので注意。)bxinconsolata のフォントは inconsolata のフォントを参照する仮想フォント(VF)であるので、inconsolata パッケージのインストールも必要である。

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{bxinconsolata}
\usepackage{upquote}
\begin{document}
\begin{verbatim}
#!/bin/sh
for i in `seq 100`; do
  j="$i"
  if [ `expr $i % 3` == 0 ]; then echo -n 'Fizz'; j=''; fi
  if [ `expr $i % 5` == 0 ]; then echo -n 'Buzz'; j=''; fi
  echo "$j"
done
\end{verbatim}
\end{document}

*1:斜線入りゼロを出力する手段は一応あるが、verbatim 出力で使えるようにはできない。

*2:ファミリが cmtt の場合を除いて。