マクロツイーター

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

単独の Unicode 文字を命令として扱う(newunicodechar パッケージ)

文字を素敵に出力したい

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}

*1:欧文 (pdf)LaTeX の場合は不可。