文字を素敵に出力したい
Unicode で入力できる LaTeX ――つまり、LuaLaTeX/XeLaTeX、および utf8 入力エンコーディングを有効化した欧文 (pdf)LaTeX――において、ASCII 外の Unicode 文字はそのまま“その文字の入力”の意味になる。すなわち、“状況が許せば”現在のフォントでその文字が出力される。
例えば、“☃”を書くと“☃”が出力される。当然である。
% LuaLaTeX/XeLaTeX 文書; 文字コードはUTF-8 \documentclass[a4paper]{article} \usepackage{fontspec} \setmainfont{Source Han Serif Regular} \begin{document} All you need is ☃. \end{document}
しかしこの出力は物足りない。せっかく文書に☃を出力するのであれば「そのマフラーは色付きにしたい」と思うのが普通であろう。というわけで、早速 scsnowman パッケージを導入してみる。
% LuaLaTeX/XeLaTeX 文書; 文字コードはUTF-8 \documentclass[a4paper]{article} \usepackage{fontspec} \setmainfont{Source Han Serif Regular} \usepackage{scsnowman} \begin{document} All you need is \scsnowman[hat,arms,snow,scale=1.3,muffler=red]. \end{document}
これで確かに出力は素敵になったがまだ問題がある。文書ソースを見ると、そこでは肝心の☃が消滅して味気ない ASCII 文字の列に変わってしまっている。何とかして「☃を書いてカラーの☃を出力する」ことはできないだろうか。
LuaLaTeX/XeLaTeX の場合であれば、“\☃
”というマクロを定義することができる。*1
\newcommand*{\☃}{\scsnowman[hat,arms,snow,scale=1.3,muffler=red]} All you need is \☃.
大分改善されたが、しかし“\☃
”は結局は命令であるため、どこか間接的であることは否めない。もっと直接的に、「☃という文字の定義をカラーの☃にする」ことはできないだろうか。
newunicodechar で素敵な文字定義
このような「Unicode 文字そのものを命令として扱いたい」という要求を実現するのが newunicodechar パッケージである。このパッケージは次の命令を提供する。
\newunicodechar{<文字>}{<テキスト>}
:[命令] これ以降、指定の<文字>
(単一の非 ASCII 文字((ASCII 文字の意味は LaTeX の文法によって定められているため、\newunicodechar
て新たな意味を“定義する”ことはできない。)))が入力されると<テキスト>
を実行する。
これを利用すると、「☃を書いてカラーの☃を出力する」ことが簡単にできる。
% LuaLaTeX/XeLaTeX 文書; 文字コードはUTF-8 \documentclass[a4paper]{article} \usepackage{fontspec} \setmainfont{Source Han Serif Regular} \usepackage{scsnowman} \usepackage{newunicodechar} \newunicodechar{☃}{% "☃を定義"する \scsnowman[hat,arms,snow,scale=1.3,muffler=red]} \begin{document} All you need is ☃. \end{document}
欧文 LaTeX でも素敵な文字定義
newunicodechar パッケージは欧文 (pdf)LaTeX でも全く同じように使用できる。ただしこの場合は utf8 入力エンコーディングが有効化されている必要がある。(utf8x はサポートしていない。)
% (pdf)LaTeX 文書; 文字コードはUTF-8 \documentclass[a4paper]{article} \usepackage[utf8]{inputenc}% これが必要! \usepackage[T1]{fontenc} \usepackage{pxfonts} \usepackage{scsnowman} \usepackage{newunicodechar} \newunicodechar{☃}{% "☃を定義"する \scsnowman[hat,arms,snow,scale=1.3,muffler=red]} \begin{document} All you need is ☃. \end{document}
(u)pLaTeX で素敵な文字定義するときの注意
newunicodechar パッケージは (u)pLaTeX でも一応使えるが少し制限がある。それは、「和文文字は命令扱いにできない」ということである。すなわち、定義対象の文字は欧文扱いになっている必要がある。
“☃”の文字は(大変遺憾なことに)JIS X 0208 には含まれないので、pLaTeX では自動的に欧文扱いになる。だから、pdfLaTeX と同じ方法で“☃を定義”できる。
% pLaTeX 文書; 文字コードはUTF-8 \documentclass[dvipdfmx,a4paper]{jsarticle} \usepackage[utf8]{inputenc}% これが必要! \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{scsnowman} \usepackage{newunicodechar} \newunicodechar{☃}{% "☃を定義"する \scsnowman[hat,arms,snow,scale=1.3,muffler=red]} %\newunicodechar{8}{% 全角"8"は和文なのでダメ % \scsnowman[hat,arms,snow,scale=1.3,muffler=red]} \begin{document} もう☃しか要らない。 \end{document}
upLaTeX の場合は pxcjkcat パッケージを用いて何を欧文扱いにするかを選択する。“☃を定義”したい場合は、☃(U+2603)を含むブロック“Miscellaneous Symbols”を欧文扱いにする必要がある。
% upLaTeX 文書; 文字コードはUTF-8 \documentclass[uplatex,dvipdfmx,a4paper]{jsarticle} \usepackage[utf8]{inputenc}% これが必要! \usepackage[prefercjkvar]{pxcjkcat} \cjkcategory{sym19}{noncjk}% "Miscellaneous Symbols"は欧文 \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{scsnowman} \usepackage{newunicodechar} \newunicodechar{☃}{% "☃を定義"する \scsnowman[hat,arms,snow,scale=1.3,muffler=red]} \begin{document} もう☃しか要らない。 \end{document}