以下の内容はhttps://doratex.hatenablog.jp/entry/20260312/1773315851より取得しました。


日本式相似記号 ∽ を LaTeX で出力する

日本式相似記号∽は,標準的なLaTeXの命令で出力することが難しく,日本の中高教育業界では悩みの種となっています。

この記事では,日本式相似記号を出力するための過去の様々な方法を紹介し,また,TikZを用いた新たな解決策も紹介します。


【目次】


背景

相似記号は,欧米では ∼ ($\sim$) を使うのが標準的です。

【入力】

\[ \triangle\mathrm{ABC} \sim \triangle\mathrm{PQR} \]

【出力】

一方,日本の中学・高校数学では,∼ とは逆向きに波打った,∽ という記号が使われることが標準的です。LaTeX では,そちら向きの相似記号を出力するための,\backsim という命令が,amssymb パッケージに用意されています。

【入力】

\documentclass{article}
\usepackage{amssymb}
\begin{document}
\[\triangle\mathrm{ABC}\backsim\triangle\mathrm{PQR}\]
\end{document}

【出力】

しかし,この字形は,単に ~ (tilde) の波打ち方を逆にしたもの (reversed tilde) であって,日本の中高教科書に記載されている「横倒しのS」のような∽という字形 (lazy S) *1にはなりません。

Unicodeでは,U+223D REVERSED TILDE として,「~ の波打ち方を逆にしたもの」(reversed tilde) と「Sを横倒しにしたもの」(lazy S) が同じ文字として包摂されています。

inverted lazy S (∾) に対しては U+223E という独立したUnicode位置が与えられているのに,inverted でない lazy S に対しては reversed tilde と包摂されてしまっているとは,困ったものです。

※なお,U+223D に対する 異体字セレクタ (Standardized Variation Sequence, SVS) で,両字形を区別する仕組みが導入される予定とのことです。

これまで考えられてきた対策

この問題に対しては,先人達が様々な解決策を考えてきました。

MathJax の出力において ∽ を出力する工夫

honyajitsu.cocolog-nifty.com

emath での解決策

emath では,和文フォントに含まれる全角文字の相似記号を,位置や空白を微調整した上で出力する方針で実装されています。

\DeclareRobustCommand\souzi{\@ifnextchar[{\@souzi}{\@souzi[\empty]}}%
\def\@souzi[#1]{%
(中略)
  \mathrel{\hbox{\chgfontsizeratio{\sz@s}\raisebox{-\sz@r ex}{}}}%
}%

この方法の場合,使用している和文フォントの種類によって,相似記号のグリフ形状が変化してしまうというのが難点です。

ceo.sty での解決策

ceo.sty では,専用の Type1 Font を用意することで,相似記号\soji,および inverted lazy S の字形の逆相似記号 \gyakusoji が定義されています。

(ceo.sty のマニュアルより)

ceo.sty はインストールはやや難しいというのが難点ですが,Cloud LaTeX ならば,ceo.sty がデフォルトで利用できるようになっています

\qbezier を使った描画による解決策

こちらのページからリンクされている次のコードでは,picture 環境で用いられる*2ベジェ曲線描画命令 \qbezier を用いて,相似記号を描画しています。

また,このコードでは,ボールド数式環境下において相似記号もボールドになるよう配慮されています。

ただし,この方法で描画される相似記号は,LaTeXのデフォルト状態では,拡大するとあまり美しくないという難点があります。

LaTeXのデフォルト状態

【入力】

\documentclass{jlreq}
\usepackage{amsmath}
\pagestyle{empty}

\makeatletter
\def\proportionalto{%
   \mathrel{\mathchoice
      {\@proportionalto\tf@size}{\@proportionalto\tf@size}%
      {\@proportionalto\sf@size}{\@proportionalto\ssf@size}}}
\def\@proportionalto#1{%
   \vcenter{\hbox{%
      \dimen@#1\p@\unitlength.1\dimen@
      \@proportionalto@check@boldness
      \qbezier(3.4,2.7)(2.5,3.375)(1.6,2.7)%
      \qbezier(1.6,2.7)(.7,1.5)(1.6,.3)%
      \qbezier(1.6,.3)(2.5,-.375)(3.4,.3)%
      \qbezier(3.4,.3)(5,1.5)(6.6,2.7)%
      \qbezier(6.6,2.7)(7.5,3.375)(8.4,2.7)%
      \qbezier(8.4,2.7)(9.3,1.5)(8.4,.3)%
      \qbezier(8.4,.3)(7.5,-.375)(6.6,.3)%
      \vrule\@width\dimen@\@height\z@\@depth\z@}}}
\def\@proportionalto@check@boldness{%
   \def\@varpropto@temp{bold}%
   \ifx\math@version\@varpropto@temp\thicklines\else\thinlines\fi}
\makeatother

\begin{document}
\begin{align*}
&A \proportionalto B\\
&\boldsymbol{A \proportionalto B}
\end{align*}
\end{document}

【出力】

pict2e または BXeepic パッケージを導入した場合

pict2e または BXeepic パッケージ を用いると,DVIware固有の描画機能が使えるようになり,綺麗な曲線が描かれるようになります。しかし,拡大してよく観察してみると,線のつなぎ目が見えてしまう点が不満点となります。

【入力】

\documentclass{jlreq}
\usepackage[dvipdfmx]{bxeepic} % LuaLaTeXの場合は [dvipdfmx] のドライバ指定は不要
\usepackage{amsmath}

(以下前掲のコードと同じ)

【出力】

unicode-math で特定のフォントの U+223D を出力する方法

LuaLaTeX のように,unicode-math が使える環境の場合は,自分のお気に入りのフォントを指定して,U+223D (∽) のグリフが出力できます。

Apple Gothic のグリフを呼び出す方法

たとえば,次のコードの場合,macOS環境下にインストールされた Apple Gothic のグリフを呼び出すことで相似記号を出力しています。 (ただし,このコードの場合,Apple Gothic がインストールされているmacOS環境下でしかコンパイルが通りませんので,ソースコードの可搬性・再現性としては下がってしまいます。)

【入力】

【出力】

IPAフォントのグリフを呼び出す方法

次のコードでは,\backsim の定義を IPA P明朝体 の U+223D (∽) に差し替えています。TeX Live には標準でIPAexフォント群が同梱されているので,TeX Liveがインストールされている環境下ならば同一のコンパイル結果が得られます。

【入力】

%#!lualatex
\documentclass{jlreq}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math}
\setmathfont{IPAPMincho}[range=\backsim]
\begin{document}
$A\backsim B$
\end{document}

【出力】

【追記】unicode-math で特定のフォントの U+223E の出力を反転して埋め込む方法

LuaLaTeX のように,unicode-math が使える環境の場合であれば,\invlazys という命令によって U+223E inverted lazy S (∾) を数学記号として出力できます。そこで,その出力を左右反転させることによって,他の数式部分の記号でのデザインの統一性を保ちつつ,日本式相似記号∽を出力できます。

【入力】

次のコードにより,unicode-math のデフォルトの LM Math によって,U+223E inverted lazy S (∾) とその左右反転版を,統一的デザインで出力できます。

%#!lualatex
\documentclass{jlreq}
\usepackage{graphicx,unicode-math}
\newcommand\mJaSim{\mathrel{\text{%
  \reflectbox{$\invlazys$}}}}
\begin{document}
$A \invlazys B \propto C \mJaSim D$
\end{document}

【出力】

TikZ で描画する解決策の考案

現在の環境ならば,picture 環境に頼ることなく,TikZでよりリッチな描画表現が使えます。TikZが使える環境ならば,LuaLaTeX / (u)pLaTeX + dvipdfmx など,エンジンに依存せず使用可能であり,どの環境でも同一のコンパイル結果が得られる点がメリットです。

「線」として描画する方法

次のコードは,TikZ でベジエ曲線として相似記号を描く \proportionalto という命令を定義します。ボールド数式環境の場合は太い線で出力されるよう考慮してあります。(以下の座標は生成AIに計算させて作りました。)

【入力】

このコードでは,TikZによる相似記号の描画前に,

\node[overlay,text=white,anchor=west] {};

によって白いダミーテキストを出力することによって,PDFからテキストをコピーしたときに U+223D (∽) が取り出せるように工夫してあります。(白以外の背景の場所で相似記号を出力するとダミーテキストが見えてしまいますが。)

【出力】

「塗り」として描画する方法

上記の方法の場合は,一定幅の線として描画されます。それに対し,LaTeX標準の \sim\backsim の場合は,中央部は太く,端の方ほど細く,という筆遣いが見られます。

このような筆遣いをTikZで再現するためには,「線(draw)として」ではなく「塗り(fill)として」描画させる必要があるでしょう。

【入力】

【出力】

複雑な図形の出力となるので,コンパイルが遅くなる点が難点ではありますが,それは必要ならば \setbox で組版済みのボックスを保管しておくようにすれば解決可能です。

*1:ここでの lazy は「横倒しの」という意味。

*2:このコードでは,picture環境自体は用いられておらず,\unitlength を手動設定することで,picture環境相当の状況が自前で実現されています。




以上の内容はhttps://doratex.hatenablog.jp/entry/20260312/1773315851より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14