Unicode,TeX,MathJaxで空集合の記号に似た記号

概要

数学書籍で使われる空集合の記号は次の表1に示すように、おおよそ3種類あります。(TeXの欄は実際にはMathjaxに依っているのでうまく表示できていないかもしれません)

表1-空集合の記号
画像 TeX 説明
1 ∅ $\varnothing$ ○を貫く斜線
2 0̸ $\emptyset$ 0(零)を貫く斜線
3 φ $\phi$ ファイに類似

TeXなどで文書を作る時にどれを使うべきかという問題です。結論は、

Unicodeで
U+2205 '∅' または U+2205 U+FE00 '∅'
TeX と Mathjax
\emptyset '∅' または \varnothing '∅'

UnicodeでもTeX系でも表の1と2を使えますが、前者は1を、後者は2を推しているように感じられます。

執筆時点(2019)で参照したバージョンは Unicode 14.0, TeX 3.14159265 (TeX Live 2019/dev/Debian), MathJax 3.0

以下、詳しく見てゆきます。

Unicode

Unicodeでは文字に"LATIN CAPITAL LETTER O WITH STROKE"などの名前が付いています。一覧はunicode.orgのCharacter Name Indexで見ることができます。

この表で"EMPTY"や"PHI"で検索をかけると、カテゴリごとの表にリンクしていて文字の説明や似た文字をたどることができます。

例えば"EMPTY SET"の2205のリンクから次のような説明(pdf文書)にたどり着くことができます。

unicode.org のU+2205前後の説明

ここには似た文字として、00D8 や 2300 などが紹介されています。これらをたどって一覧表にしたものが次の表2です。

表2-Character Name Index から集めた∅に似た記号
codeimgnameCat.&#
0030 FE00 short diagonal stroke formBL 0︀0
00D8 LATIN CAPITAL LETTER O WITH STROKEL1 ØØ
00F8 LATIN SMALL LETTER O WITH STROKEL1 øø
0278 LATIN SMALL LETTER PHIIPA ɸɸ
03A6 GREEK CAPITAL LETTER PHIGr ΦΦ
03C6 GREEK SMALL LETTER PHIGr φφ
03D5 GREEK PHI SYMBOLGr ϕϕ
2205 EMPTY SETMa
2205 FE00 zero with long diagonal stroke overlay formMa ∅︀
2300 DIAMETER SIGNMT
233D APL FUNCTIONAL SYMBOL CIRCLE STILEMT
2349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASHMT
29B0 REVERSED EMPTY SETMM

「code」の欄はUnicodeの値。「img」欄は説明のpdfから画像として切り取ったもの。「Cat.」欄はその文字のカテゴリーを略記(表3参照)したものです。「&#」の欄はhtmlの数値文字参照で ⦰ などと書いたもの。「直」の欄はpdf文書からエディタに文字をコピー&ペーストしたものです。「&#」と「直」の欄はブラウザの使用フォントにより表示が異なります。

表3-カテゴリーの略記
Cat.CATERGORY
BLBasic Latin
L1Latin-1 Supplement
IPAIPA Extensions
GrGreek and Coptic
MaMathematical Operators
MTMiscellaneous Technical
MMMiscellaneous Mathematical Symbols-B

短い斜線が入ったゼロ

表2の画像のゼロは縦長の円に短い斜線が入ったものですが、斜線は円を貫いておらず、空集合とは見た目が異なります。0と大文字のOが紛らわしい場合にゼロの方に斜線を入れるというものです。昔からフォントによってまちまちでした。筆者の環境ではブラウザ(Ubuntu20.04.3 の firefox96.0)で見ると斜線なしのゼロで、別のPC(Debian10 の Firefox 91.5.0esr)では斜線付きのゼロになります。つまりグリフ(フォントのデザイン)の違いであり、文字としては区別をしていないのです。Unicodeではどちらもコード位置は U+0030 です。

後述しますが、今回U+2205で Standardized variation sequences (以降SVS)という仕組みで異体字を表現していることがわかり、このゼロもSVSの例として表2に加えることにしました。UnicodeではU+0030は斜線なしのゼロで、U+0030にU+FE00を続けることで斜線付きのデザインに変わります。漢字のための異体字(IVS)は以前からありましたが、2バイトで表すことができる範囲で同様なことをするために拡張したようです。

対応していないソフトウェアは単にU+FE00を未定義文字として無視するだけですから互換がとれます。

ただし、フォントが斜線なしと斜線ありの両方を持つ必要があるでしょうし、ソフトウェアがSVSに対応していない場合のために単なるU+0030が斜線付きというフォントは残っていくと思います。

表2の&#のゼロのセルには&U+0030; &U+FE00;と入れてあります。たとえこれが斜線付きに見えても、他の0も斜線付きなら、あなたが使っているブラウザ(そしてフォント)がSVSに対応していないことになります。

ブラウザは css で font-variant-numeric: slashed-zero; の指定をすることで斜線入りの0を表現する方法も規定されているようですが、これもブラウザの対応と使用しているフォントによります。条件がクリアされれば、普通のゼロ[ 0 ]と、斜線を伴ったゼロ[ 0 ]を使い分けることができます。

U+00D8など斜線付きの英字

U+00D8は書籍の中で空集合の記号として使われているのを見たような気がします。これはラテンアルファベットの補助文字で、ウムラウト付きのO(Ö)やアクセント記号付きのO(Ó)と同様に、斜線付きのO(Ø)です。

ラテン文字のアルファベットに装飾が付いたものとして、必要な言語のために用意されたものです。U+00F8はその小文字です。空集合記号に使うのは流用ということになるでしょう。

U+0278 音声記号

国際音声記号の一つです。英語の発音記号として馴染んでいるəやðのたぐいです。

ɸは両唇の摩擦音で無声で出される音ですので、"ふ"の子音です。英語では出てこない記号ですね。

U+03A6などギリシャ文字

U+03A6,U+03C6,U+03D5はギリシャ文字です。小文字には2種類の書体があり、U+03C6の方がメインと考えられていることが番号から推察されます。

上記のゼロとは異なり、Unicodeは別のコードを割り当てていますが、Ubuntuのfirefoxの96.0では φ が 上に棒が出ない筆記体のようなファイになりません。Debian10のFirefox 91.5.0esrでは正常です。フォントはそれぞれブラウザの初期値のままです。悔しいので表3に画像を貼っておきます。

表3-環境による見え方の違い
ご覧の環境で φ⇨φ,ϕ⇦ϕ
Ubuntu20.04.3 の firefox96.0 の画像 firefoxでUnicodeと違う
Debian10 の Firefox 91.5.0esr の画像 firefoxでUnicodeに同じ

○に斜線, 0に斜線U+2205など数学記号

これが本命で、Unicodeに定義された文字です。JIS X 0208 にはありませんが、JIS X 0213 には入っていますので、今どきのPCならば対応しているでしょう。2区に入っていますので、フォントさえあれば古いソフトも行けるかもしれません。

U+0030のゼロと同様に、SVSの異体字がひとつ定義されています。U+2205は○に斜線で、U+2205にU+FE00を続けることでゼロに斜線のデザインに変わります。こちらの斜線はU+0030のときとは異なり、ゼロを貫く斜線です。U+FE00を加えて斜線を引くということではなく、それぞれのコードの文字に定義された異体字の一番目を使うという意味です。

SVSのために Variation Selectors として U+FE00〜U+FE0F の16個のコードポイントが予約されています。すべての文字に異体字があるわけではなく、一覧で定義されています。StandardizedVariants-14.0.0.txtです。

U+0030もU+2205も、いまのところ U+FE00しか定義されていません。

異体字の取扱には U+E0100〜U+E01EF を使う Ideographic Variation Sequence (以降IVS)というものもあり、葛の字の異体字などで、こちらの方が有名です。

U+2300など各種技術用記号

U+2300は直径を表すための記号。U+233DとU+2349はAPLというプログラム言語で使われるものです。

数学記号がある以上、これを流用する必要はないでしょう。

U+29B0その他の数学記号B

これは左右が逆になったU+2205です。数学のために用意されています。これには異体字はありません。

TeX

最初の資料は奥村晴彦さんの「[改訂第8版]LaTeX2ε美文書作成入門」(技術評論社)ですが、これにはUnicodeとの対比には言及がありません。Unicode以前からのTeXがグリフ(文字のデザイン)にも踏み込んで追求しているので、グリフの細かな違いにまで踏み込まないUnicodeの話よりは、フォントの違いによる見栄えの変化を詳しく解説しています。

しかし、Unicodeから話をはじめてしまいましたので、文字を指定するのには Unicode の値を使うのが便利です。そこで、Unicode characters and corresponding LaTeX math mode commands Last revised 2011-11-08 を参考にしました。2011年と古いので現在とは若干の変化はあるでしょうが、これを元に実験してみます。

TeX Live 2019 で、lualatex を使っています。TeXファイルはutf-8で記述されています。

lualatex amsmsth/amssymb/wasysym

TeXは汎用の組版ソフトですが、数学のために追加すると便利なパッケージがあります。一般的になっているのが、amsmsth と amssymb です。これに wasysym を加えてやってみます。

TeXファイルの内容とpdfへの出力の画像を示します。まずはTeXファイルですが、tabularの中では&が項目の区切り、 \ \ が行の区切りです。。

\documentclass[leqno,paper=a4]{jlreq}
\usepackage{amsmath,amssymb}
\usepackage{wasysym}
\begin{document}
\verb|[amsmsth/amssymb/wasysym]|\\
\begin{tabular}{lclccl}
Code(推察) & 直 & TeX記述          & 本文中 & 数式中    & 備考\\
00D8       & Ø & \verb|\O|         & \O     & $\O$     & W:invalid in math mode\\
00F8       & ø & \verb|\o|         & \o     & $\o$     & W:invalid in math mode\\
0278       & ɸ & \verb|\char"0278| & \char"0278 & $\char"0278$ &\\
03A6       & Φ & \verb|\Phi|       & \Phi   & $\Phi$     &\\	
03C6       & φ & \verb|\varphi|    & \varphi & $\varphi$ &\\
03D5       & ϕ & \verb|\phi|       & \phi    & $\phi$    &\\
...以下略

「Code(推察)」と「直」の欄はUnicodeの値とその文字を直接入力したもの、「TeX記述」の欄はTeXのコマンドを\verv| |を使ってそのまま出力したもの、「本文中」と「数式中」は本文の中と数式の中で表現が異なることがあるので、両方を並べています。「備考」内のE:,W:以下はpdfを作る際に出たエラーや警告を後から書き加えたものです。

amsmsth/amssymbにwasysymを加えて

U+00D8,U+00F8は\を前置することで出せますが、数式中では使えないと言われます。発音記号U+0278はどうやってもでてきませんがエラーにもなりません。\char" は後ろ4桁をみますので閉じの"は不要です。UTF16と推察されます。

U+03A6などのギリシャ文字は本文中と数式中で同じ文字が出ます。大文字はローマン(立体)、小文字は斜体なのは数式内の使われ方にそったもののようです。大文字を斜体にしたいときは\varPhi とします。

ファイと入力して変換すると文章内に Φ を直接入力できます。これが \Phi と同じ扱いにならないようです。 Φ の方が編集段階で確認しやすいのでちょっと残念です。ファイの2種類ある小文字はさらに問題をはらんでいます。これは、JIS X 0213 ではファイの小文字は1つしかなく、U+03C6に対応付けられて、例示字形は丸に斜線つまりU+03D5の方になっていることが原因らしいです。直接入力の欄を見るとJISに基づいていると考えると合点がいきます。

TeXの\emptyset はゼロに斜線のデザインで、\varnothing が○に斜線です。EMPTY SET といえば○に斜線というUnicodeの割当とは逆になっています。U+2205にU+FE00を続けて直接入力しても無視されるのでluatexはSVS対応でないことがわかります。

U+2300から3つの各種技術用記号は、wasysmパッケージが入っていれば使えます。直接入力の ⛝(□に×) は使用しているフォントファイルに該当データがないということでしょう。

U+29B0の \revemptyset は unicode-mathパッケージでのコマンドなので、ここでは undefind になります。

U+0030にU+FE00を続けて表現するゼロに貫かない斜線のゼロを出すには、上記の範囲では方法がありません。斜線の入ったデザインのフォントに切り替えるしか方法がありません。

lualatex amsmsth/unicode-math/wasysym

次は、追加パッケージを amsmsth と unicode-math と wasysym してやってみます。

\documentclass[leqno,paper=a4]{jlreq}
\usepackage{amsmath,unicode-math}
\usepackage{wasysym}
\begin{document}
\verb|[amsmsth/unicode-math/wasysym]|\\
\begin{tabular}{lclccl}
Code(推察) &直 &TeX記述  & 本文中 & 数式中 & 備考\\
00D8	&Ø & \verb|\O|   & \O     & $\O$ &W:invalid in math mode\\
00F8	&ø & \verb|\o|   & \o     & $\o$ &W:invalid in math mode\\
0278	&ɸ & \verb|\char"0278|    & \char"0278 & $\char"0278$ &\\
03A6	&Φ & \verb|\Phi|          & \Phi    & $\Phi$    &\\	
03C6	&φ & \verb|\varphi|       & \varphi & $\varphi$ &\\
03D5	&ϕ & \verb|\phi|          & \phi    & $\phi$    &\\
...以下略

amsmsthにunicode-math/wasysymを加えて

unicode-mathパッケージはUnicodeのフォントを優先して使うというふれこみでしたが、使わないもののほうが安定しています。もちろん環境に用意されたフォントに依る可能性もあります。

特に問題なのがギリシャ文字です。直接入力した小文字は JIS X 0213 に従うというところはそのままで、さらに本文中に\phiなどと書いても出力されなくなっています(数式中では出ます)。これは斜体にするかどうかを一般の英字と同様の扱いにしようとして日本のフォントと反りが合わなかったのではないかと推察します。 x,y,z などラテンのアルファベットは本文中でローマン(立体)で、数式中では斜体です。 ギリシャ文字はどちらも斜体でした。

unicode-mathパッケージにはギリシャ文字の小文字をローマン(立体)で出力する \upphi, \upvarphi などの命令が追加されています。これも上で試していますが、数式中専用と言われます。

注目すべきは、空集合あたりです。\emptyset でも \varnothing でも本文中で○に斜線、数式中でゼロに斜線になっていることです。unicode-mathパッケージを使うことでTeXの振る舞いがこのように変わるのでは混乱を生じます。

総合的に考えて、unicode-mathパッケージはまだ使える段階ではないと思います。 \usepackage{amsmath,amssymb}として使い、必要に応じて\usepackage{wasysym}を加えるのがいいでしょう。ただし、TeX Live 2019 での実験ですから、修正されているかもしれません。

MathJax

MathJaxは名前から数学用で数学用のパッケージはすでに入った状態にあると考えて良いようです。またTeXの本文中の概念はなく本文はhtmlの本文という扱いです。MathJaxが作用するのは数式中だけです。もし本文中で使いたい場合は一文字だけ数式としと$で囲めば使えます。それができない文字ならば数値文字参照や名前文字参照でhtmlの仕組みを使えます。それも一緒に表4としました。

表4 空集合に似た記号をMathJaxで
codeimg 名前文字参照数値文字参照 TeXの命令(数式中)
00D8Ø ØØØØ \O$\O$
00F8ø øøøø \o$\o$
0278ɸ 不明ɸɸ 不明
03A6Φ ΦΦΦΦ \Phi$\Phi$
03C6φ φφφφ \varphi$\varphi$
03D5ϕ ϕϕϕϕ \phi$\phi$
2205 ∅∅ \varnothing$\varnothing$
2205 FE00∅︀ ∅ ∅︀∅︀ \emptyset$\emptyset$
2300 不明⌀ \diameter$\diameter$
233D ⌽⌽ \APLvert{\Circle}$\APLvert{\Circle}$
2349 不明⍉ \invdiameter$\invdiameter$
29B0 ⦰⦰ \revemptyset$\revemptyset$

表4にあるように、U+00D8からU+2205 U+FE00 まではTeXとまったく同様になります。U+00D8, U+00F8, U+2300以下は赤い字で命令そのものが見えていると思いますが、これはエラーが起こった印です。今後の改良もあるかもしれませんので、あえてそのままにしてあります。

HTML5の名前文字参照はTeXの命令にも似ていますが同じではありません。WHATWGのHTML5の名前文字参照の一覧(JSONデータ)で調べることができます。

U+2205を表す名前はいくつかあって、どれも同じです。(同じでなければ仕様が変わったということです)

∅⇨∅$\quad$ ∅⇨∅$\quad$ ∅⇨∅$\quad$ ∅⇨∅

ゼロに斜線を使いたければ $\emptyset$⇨ $\emptyset$ でしょう。

余談:SVSを試すには

U+0030 や U+2205 に U+FE00 が続いているテキストデータを作る必要があります。Linux上の gedit や Bluefish というエディタは今の所、異体字を表示することはありません。ただし、異体字セレクタ(U+FE00などのこと)を親の字と一緒にコピー&ペーストで入力できます。いったん入力されれば勝手に削除することはありませんし、親の文字を削除すれば一緒に削除されます。漢字変換のシステムやフォントが対応していないだけかもしれません。

最初はコピー&ペーストで入力できると思っていなかったので別の文字を入れておき、置換しました。次のようにします。

  1. 0や∅の後ろに他では出てこない文字を入れる。
  2. sedコマンドで置換をする。
  3. hdコマンドでダンプしてgrepで抽出して確認する。
表5 SV1の文字コード
文字 Unicode値 utf-8
異体字セレクタ1 不可視 U+FE00 EF B8 80
置換に使った文字 U+FE40 EF B9 80
数字のゼロ 0 U+0030 30
空集合の記号 U+2205 E2 88 85

置換に使う文字はU+FE00の近くにあってエディタの画面で目立ち、コピーもしやすいものということでU+FE40にしました。テキストファイルのデフォルトのエンコードがutf-8なので、調べておく必要があります。ファイル内で使っていない文字でutf-8のコードがわかっていれば何でも良いのです。

TeXファイル(今回はemptyset5.tex)のU+FE00が入っていてほしい場所にU+FE40の文字を入れて保存し、文字が入っていることをhdコマンドで確認します。今回は本当は EF B9 80 を探すはずですが、2行に別れたりするのを警戒して2バイトの一致で探しています。

adachi@ebook:~/work$ hd emptyset5.tex|grep 'b9 80'
00000180  26 30 ef b9 80 20 26 20  5c 76 65 72 62 7c 5c 30  |&0... & \verb|\0|
00000440  30 26 e2 88 85 ef b9 80  20 26 20 5c 76 65 72 62  |0&...... & \verb|

'EF B9 80' を 'EF B8 80' に置換します。-i は直接書換(in place)

adachi@ebook:~/work$ sed -i -e 's/\xEF\xB9\x80/\xEF\xB8\x80/g' emptyset5.tex

置換されていることを確認します。

adachi@ebook:~/work$ hd emptyset5.tex|grep 'b8 80'
00000180  26 30 ef b8 80 20 26 20  5c 76 65 72 62 7c 5c 30  |&0... & \verb|\0|
00000440  30 26 e2 88 85 ef b8 80  20 26 20 5c 76 65 72 62  |0&...... & \verb|

これで慣性です。pdfに変換してどう表現されているか確認します。今回のlualatexでは無視されました。

参考資料

本文中のリンクの再掲載です。2022-02-04 現在のリンクです。

unicode.orgの文字の名前の索引: Character Name Index

unicode.orgの標準化された異体字シーケンス(SVS)の一覧: StandardizedVariants-14.0.0.txt

UnicodeとTeXコマンドの対応表: Unicode characters and corresponding LaTeX math mode commands Last revised 2011-11-08

WHATWGのHTML5の名前文字参照一覧: HTML5の名前文字参照の一覧(JSONデータ)