マクロツイーター

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

TeX で数式を生成する 〜アッカーマン関数編〜

……いや、「SATySFi Advent Calendar 2018」(参加者募集中!)の記事「SATySFiで数式を生成する 〜アッカーマン関数編〜」を読んで、何となく作りたくなったので。

目標

TeX で以下の命令(マクロ)を実装する。

方針

  • 元ネタで代数的データ型が使われているので、TeX で代数的データ型を扱う手法を利用する。
  • 特にその必要がないため、完全展開可能にはしない。「関数の返り値」の扱いは「特定の制御綴への代入」を採用する。
  • plain TeXLaTeX の両方で通用するコードを書く。e-TeX 拡張は使わない。

式構造

式構造を表すデータは以下のトークン列で表す。

  • \my@Num{<n>}: 整数n
  • \my@Fun{<m>}{<n>}: Ack(m,n)

例えば、「Ack(2,8)」という式は \my@Fun{\my@Num{2}}{\my@Num{8}} で表される。

値を \edef で代入するときの便宜のため、以下のマクロを用意する。

%% 構築子
\def\my@@Num{\noexpand\my@Num}
\def\my@@Fun{\noexpand\my@Fun}

式を印字する

式を印字するための構築子の定義を与える。

\def\my@print@Num#1{#1}
\def\my@print@Fun#1#2{A(#1,#2)}

\my@use@print を実行すると実際の構築子の意味がこれらの定義に切り替わるようにする。

%% \my@use@print
% 式を印字する状態に移行する.
\def\my@use@print{%
  \let\my@Num\my@print@Num
  \let\my@Fun\my@print@Fun}

例えば、

\my@use@print $\my@Fun{\my@Num{2}}{\my@Num{8}}$

を実行すると以下の出力が得られる。

式が整数であるかを判定する

先の \my@use@isnum と同じ要領で構築子を定義する。真偽値を“返す”必要があるので、そのための変数を用意する。

\newif\ifmy@ok % 真偽値の返り値専用のスイッチ

%% \my@use@isnum
% "式が単なる整数であるか"を判定する状態に移行する.
% この状態で構築子を実行するとスイッチ my@ok に結果を返す.
\def\my@use@isnum{%
  \let\my@Num\my@isnum@Num
  \let\my@Fun\my@isnum@Fun}
\def\my@isnum@Num#1{\my@oktrue}
\def\my@isnum@Fun#1#2{\my@okfalse}

例えば次のようになる。

\my@use@isnum \my@Fun{\my@Num{2}}{\my@Num{8}}
\message{\ifmy@ok True\lese False\fi}
%→ False

式を一段評価する

次の仕様を満たす構築子のマクロ(\my@eval@...)を実装したい。

\let\my@ret\relax % トークン列返り値専用のマクロ

%% \my@use@eval
% 式を一段評価する状態に移行する.
% この状態で構築子を実行すると \my@ret に一段評価した結果の式を
% 表す値が代入される.
\def\my@use@eval{%
  \let\my@Num\my@eval@Num
  \let\my@Fun\my@eval@Fun}

例えば次のようになってほしい。

\my@use@eval \my@Fun{\my@Num{2}}{\my@Fun{\my@Num{8}}{\my@Num{0}}}
\message{\meaning\my@ret}
%→ macro:->\my@Fun{\my@Num{2}}{\my@Fun{\my@Num{7}}{\my@Num{1}}}
式が Num の場合

数値はそれ自身に評価されるので、次のようになる。

% 数値mの場合
\def\my@eval@Num#1{%{<m>}
  \def\my@ret{\my@Num{#1}}}
式が Fun の場合

「構築子の定義を切り替える」という方法で通すことも可能であるが、見通しが極めて悪くなるため、別の方法を考えることにする。

まず、構築子の名前(Num または Fun)を取り出す補助マクロを作る。

%% \my@name\my@XXX : 'XXX'に展開される.
\begingroup\lccode`\?=`\@ \lowercase{%
  \gdef\my@name#1{\expandafter\my@name@a\string#1;}
  \gdef\my@name@a#1?#2;{#2}
}\endgroup

その上で、引数の式の構築子が何であるかによって別のマクロに処理を委譲する。このとき、構築子の引数は委譲先のマクロの引数に渡す。

% Ack(X,Y)の場合 (X,Yは式)
\def\my@eval@Fun#1#2{%{<X>}{<Y>}
  \my@eval@Fun@a#1*;#2*;}% {}を外す
  %※'*'はダミーで, 後で除去される
\def\my@eval@Fun@a#1#2;#3#4;{%\X...*;\Y...*;
  \csname my@eval@Fun@@\my@name#1@\my@name#3\endcsname#2;#4;}

例えば、

\my@eval@Fun{\my@Num{2}}{\my@Fun{\my@Num{8}}{\my@Num{0}}}

を実行すると、結果的に次のトークン列が実行される。

\my@eval@Fun@@Num@Fun{2}*;{\my@Num{8}}{\my@Num{0}}*;

それでは、Fun の引数が両方とも Num である場合の処理(\my@eval@Fun@@Num@Num)を作ろう。

% 変数
\newcount\my@m
\newcount\my@mm
\newcount\my@n

% Ack(m,n)  (m,nは数値)
\def\my@eval@Fun@@Num@Num#1*;#2*;{%{<m>}*;{<n>}*;
  %※#1,#2の{}は外れるこに注意
  \my@m=#1\relax \my@n=#2\relax
  \ifnum\my@m=\z@ % Ack(0,_)
    \advance\my@n\@ne
    \edef\my@ret{\my@@Num{\the\my@n}}%
  \else\ifnum\my@n=\z@ % Ack(_,0)
    \advance\my@m\m@ne
    \edef\my@ret{\my@@Fun{\my@@Num{\the\my@m}}{\my@@Num{1}}}%
  \else % Ack(_,_)
    \my@mm\my@m \advance\my@m\m@ne \advance\my@n\m@ne
    \edef\my@ret{%
      \my@@Fun{\my@@Num{\the\my@m}}{%
        \my@@Fun{\my@@Num{\the\my@mm}}{\my@@Num{\the\my@n}}}}
  \fi\fi}

ここで、\my@ret に代入すべきトークン列を構成するのに、先ほど用意した \my@@... を利用している。例えば、\my@n が 8 のときに

\edef\my@ret{\my@@Num{\the\my@n}}%

を実行すると、\my@ret\my@Num{8} となる。

次に、引数が (Num,Fun) である場合の処理を定義する。

\newtoks\my@toks

% Ack(m,Ack(X,Y))  (mは数値)
\def\my@eval@Fun@@Num@Fun#1*;#2#3*;{%{<m>}.;{<X>}{<Y>}*;
  % Ack(X,Y) の一段評価を求める(結果は \my@ret)
  \my@eval@Fun{#2}{#3}%
  % \my@ret の内容のトークン列を \my@toks に代入する
  \my@toks\expandafter{\my@ret}%
  \edef\my@ret{\my@@Fun{\my@@Num{#1}}{\the\my@toks}}}

\my@ret の内容を一旦トークン列レジスタに移しているのは、「edef 中でトークン列レジスタの参照はそれ以上展開されない」という性質を利用したいからである。もし、e-TeX 拡張の \unexpanded を使ってよいなら、最後の \my@ret の代入は次のように書ける。

% 中の \my@ret は一度だけ展開されてほしい
\edef\my@ret{\my@@Fun{\my@@Num{#1}}{\unexpanded\expandafter{\my@ret}}}

残りは引数が (Fun,Num) と (Fun,Fun) である場合であるが、実はこれの実装は不要である。なぜなら、評価の途中で Fun の第 1 引数が Fun になることは、実際には起こらないからである。従って、これまでのコードで \my@use@eval は完成である。

公開マクロ \Ack の実装

これは今までに作った部品を組み合わせるだけなので、特に難しいところはない。

%%<*> \Ack{<m>}{<n>}
% 公開マクロ.
\def\Ack#1#2{%
  % 元の式構造の値を \my@expr に代入.
  % (#1, #2の値を評価しておく.)
  \my@m=#1\relax \my@n=#2\relax
  \edef\my@expr{\my@@Fun{\my@@Num{\the\my@m}}{\my@@Num{\the\my@n}}}%
  % "(元の式)"を印字した結果を \my@box に入れる.
  \my@use@print \setbox\my@box\hbox{$\my@expr$}%
  % \my@expr を一段評価する.
  \my@use@eval \my@expr \let\my@expr\my@ret
  % 1行目"(元の式)=(今の式)"を印字する.
  \par\noindent \copy\my@box
  \my@use@print ${}=\my@expr$%
  \my@Ack@loop}
\def\my@Ack@loop{%
  % \my@expr を一段評価する.
  \my@use@eval \my@expr \let\my@expr\my@ret
  % "(今の式)"を左側の空きを入れて印字する.
  \par\noindent \hskip\wd\my@box
  \my@use@print ${}=\my@expr$%
  % 式構造がNumであるか検査する.
  \my@use@isnum \my@expr
  \ifmy@ok\else % Numでないならばループ
    \expandafter\my@Ack@loop
  \fi}

完成

以上のプログラムをプレアンブルに書いた上で、本体で \Ack{3}{1} を実行する LaTeX 文書を用意した。*1

これを LaTeXコンパイルすると、Ack(3,1) の計算過程が印字された文書が得られる。

(1 ページ目先頭)
(3 ページ目先頭)

まとめ

というわけで、TeX 言語はアレなので、アッカーマン関数したい人は是非とも SATySFi を使いましょう!(えっ)

*1:えっ、パッケージに仕上げたほうがいいですか?;-)

SATySFi のデモ文書をチョット素敵にする

これは「SATySFi Advent Caleandar 2018」の 3 日目の記事です。
(2 日目は hanachin さん でした。4 日目は na4zagin3 さん です。)

「The SATySFi book」の頒布(@技術書典)から、もうすぐ 2 ヶ月が経とうとしています。世の中(ツイッタァー)を見た感じでは、SATySFi のユーザも大分増えてきているという印象です。

例の画像、それが問題だ

さて、SATySFi を実際に導入した人々を観察してみると、SATySFi の導入の目的は大まかに分類すると次の 2 つに分かれるようです。

  1. 自分で作った SATySFi 文書を組版したい。
  2. SATySFi 付属のデモ文書(demo.saty)を組版したい。

1 については「SATySFi 完全に理解した」強い人に任せて、ここでは 2 について考察してみます。この場合、demo.saty が無事にコンパイルできればコンプリート、ということになるのですが、その際の一番の懸案となるのが「あの画像」でしょう。

SATySFi のロゴ画像

件のデモ文書の中では、画像挿入機能の実例として、「SATySFi のロゴ」の画像が掲載されています。

この図の部分を出力するコードは以下のようになっています。

+p{
  画像が挿入できる証拠として,ロゴを図\ref(`fig:logo`);に掲げておこう。
  \figure ?:(`fig:logo`){\SATySFi;のロゴ}<
    +image-frame{\insert-image(7cm)(`satysfi-logo.jpg`);}
  >
}

これを見ると、図の中にある画像の正体は satysfi-logo.jpg というファイルであることがわかります。しかし SATySFi のレポジトリの demo.sty があるディレクトリには、satysfi-logo.jpg というファイルは置かれていません。従って、自分で satysfi-logo.jpg を置かないと、コンパイルは失敗していしまいます。

> satysfi demo.saty
 ---- ---- ---- ----
  target file: 'demo.pdf'
  dump file: 'demo.satysfi-aux' (will be created)
  parsing 'demo.saty' ...
  parsing 'stdjabook.satyh' ...
……(略)……
  reading 'demo.saty' ...
  type check passed. (document)
 ---- ---- ---- ----
  evaluating texts ...
! [Error] satysfi-logo.jpg: No such file or directory
フツーのロゴ画像、フツーのデモ文書

実は SATySFi のロゴ画像のファイルはレポジトリの中に含まれていて、tests/images/satysfi-logo-rgb.jpg にあります。

従って、このファイルを作業ディレクトリに satysfi-logo.jpg という名前でコピーすれば、コンパイルが通って、フツーのロゴ画像が入ったデモ文書の PDF ファイルが得られます。

この方法はいわば“模範解答”的なものですが、「デモ文書の組版を最終目標とする」人にとってはどこか物足りなさを感じるでしょう。ここで生成されるのは、これまでに大勢の人が得てきた「フツーのデモ文書」に過ぎません。目標がデモ文書であったとしても、せめてロゴ画像くらいはもっと自分好みのものを使いたいところでしょう。

素敵なロゴ画像、素敵なデモ文書

というわけで、「チョット素敵なデモ文書を作りたい」という人という人のために、チョット素敵なフォント*1を使ったロゴの画像を作ってみました。


satysfi-logo-fm.jpg(JPEG 画像;1282px×376px)


satysfi-logo-aho.jpg(JPEG 画像;1282px×376px)


satysfi-logo-csm.jpg(JPEG 画像;1282px×376px)


satysfi-logo-pp1.jpg(JPEG 画像;1282px×376px)

……えっ、もっと派手な方が好みでしょうか? そこで、もっと彩豊かなロゴ画像も用意しました!


satysfi-logo-aec.jpg(JPEG 画像;1282px×376px)


satysfi-logo-pdd.jpg(JPEG 画像;1282px×376px)


satysfi-logo-are.jpg(JPEG 画像;1282px×376px)

彩豊かなデモ文書

それでは早速、素敵なロゴ画像を使ってデモ文書をコンパイルしてみましょう。

トッテモ素敵なデモ文書ができましたね!

*1:上から順に、「Fetamont」「Computer Modern Funny Italic」「Comic Sans MS」「HGS創英角ポップ体」。

非常にアドベントがはじまった ― \begin{texadvent2018}

☃︎
 
TeX & LaTeX Advent Calendar ☃︎
 

2018/12/01 〜 2018/12/25
〜とにかくLua(La)TeXしよう〜

TeX & LaTeX アドベントカレンダー 2018

*  *  *

TeX 界のおける年末の恒例イベントとなったかも知れないアドベントカレンダーが今年も始まりました。

重点テーマ

今年の重点テーマはコレです。

とにかく Lua(La)TeX しよう

「LuaTeX はいいぞ」とよく言われますが、具体的に何がいいのかは十分に知られていません。熱狂的な LuaTeX ファンの皆さん、是非とも LuaTeX の魅力について熱く語りましょう!

※例によって、重点テーマは「必須」ではありません。あんまり LuaTeX でない TeX ネタ、さっぱり LuaTeX でない TeXネタ、なんでも歓迎しております。

で、初日のネタは

こちらになります。

まだ参加できます!

TeX & LaTeX Advent Calendar 2018(#texadvent2018)は

まだまだ参加者募集中です。

LaTeX なネタ、TeX 言語なネタ、expl3 なネタ、MiKTeX なネタ、dvips なネタ、CaTeX なネタ、pTeX-ng なネタ、LaTeXML なネタ、その他ナントカカントカ、お持ちの方はぜひぜひ、

ご参加おねがいします!

もう空きが残りわずかとなっています。登録はお早めに!

*  *  *

あっ、SATySFi な人はこっち。

〠︎
 
SATySFi Advent Calendar 〠︎
 

2018/12/01 〜 2018/12/25
〜皆で一緒にサティスファイ!〜

去年のアレ(非常に)を振り返ってみる

ステマ

☃︎
 
TeX & LaTeX Advent Calendar ☃︎
 

2018/12/01 〜 2018/12/25
〜とにかくLua(La)TeXしよう〜

TeX & LaTeX アドベントカレンダー 2018

*  *  *

昨年(2017 年)の「TeX & LaTeX Advent Calendar」はこんな感じでした。

12/01zr_tex8rTeXでつくるプロポーショナル組日本語文書
12/02wtsnjpPackage Gotoh: TeX で生物配列アライメント
12/03golden_luckyTeXでつくる『RubyでつくるRuby』
12/04abenori行取り
12/05imaginarywisdomお手軽「自分専用パッケージ」のすすめ
12/06trueroadLilyPondとGhostscriptとTeXで作る楽譜と文章を組み合わせたドキュメント
12/07yuracoLaTeX Pub.
12/08munepi[改訂第7版]LaTeX2e美文書作成入門 ヒラギノフォントパッチ
12/09hak7a3PDFの注釈機能で遊ぶ
12/10aminophenTeX Live 2017 注目ポイントまとめ
12/11isaribi_saitohTeXでつくる可能な限りWYSIWYGな文書
12/12tattsanTeXで不動産投資
12/13mattskalatikzpeopleで新しいキャラ
12/14p_typoLuaLaTeXで貂明朝
12/15_MadChemiker_LaTeXでつくる注釈・補足情報の入った図 (の入った文書)
12/16keisuke495500JupyTeX(LaTeX版Jupyter)を作った
12/17uwabamiDebian 9.x (Stretch) での TeX 環境
12/18munepiインストーラープロファイルを用いてTeX Liveをインストールしよう
12/19doraTeX“TeXでつくる”小ネタ集
12/20domperorExcelの表をそのままTeXにコピペで貼り付ける話
12/21bd_gfngfnLaTeXで括弧を自動で補うマクロを書く
12/22VoDMETAFONT で踊る
12/23wtsnjpTeX で作る時計
12/24golden_luckyTeXでつくるMarkdownパーサ
12/25zr_tex8rTeXで覗くシステムプログラミングの世界(えっ)
\Finalezr_tex8r今年も Merry TeXmas! ― \end{texadvent2017}

というわけで、今年はこれをカラッキシ参考にせずに、自分が非常に素敵だと思うネタを全力でぶつけていきましょう!

今年も非常に TeX で Advent Calendar する件について

やります!!

TeXLaTeX Advent Calendar 2018

とっておきの TeXLaTeX ネタを皆で持ち寄って楽しむ
TeXLaTeX Advent Calendar」
今年で 7 回目の開催となります。
皆さんの、心をこめた非常に素敵なネタをお待ちしております!
ハッシュタグは「#texadvent2018
TeXLaTeX 初心者大歓迎。 (重要)
TeXLaTeX 非初心者大歓迎。

今年の重点テーマは……コレです!

今年の重点テーマ

今年の重点テーマはコレです。
「とにかく Lua(La)TeX しよう」

v1.0 のリリースから 2 年を迎え、新しいエンジンである LuaTeX に関心を持つ人も増えていますが、
残念ながら、まだまだ情報(特に日本語文書作成に関するもの)が不足しているように思います。 LuaTeX/LuaLaTeX に関する知見を広めていきましょう。

LuaTeX がもっと普及すべきだと思っている皆さん、その理想の実現に必要なのはあなたの書く貴重な記事です。TeX 界隈の人々に「LuaTeX を使ってみよう」と思わせるような、そんな素敵な記事を書いてみましょう。

例によって「重点テーマ」は「制限」ではありません。

(前略)……以下の何れかテーマに該当する何かを書きます。

  • 「とにかく Lua(La)TeX しよう」に非常に関連する TeXLaTeX ネタ。
  • 「とにかく Lua(La)TeX しよう」にチョット関連する TeXLaTeX ネタ。
  • 「とにかく Lua(La)TeX しよう」にサッパリ関連しない TeXLaTeX ネタ。

このように、以前と同じく、TeX に関連するもの(LaTeX、plain TeX、ConTeXt、TeX Live、METAFONT、MetaPost、Asymptote、pandoc、SphinxRe:VIEW)なら何でも構いません。

皆さんの、心温まる TeX ネタで寒い冬を乗り越えましょう☃︎

pxchfon の unicode オプションについてもうチョット語ってみる

(u)pLaTeX + dvipdfmx のワークフローにおいて、何らかの和文文字について、

その文字は Unicode に入っているし、
今使っているフォントにも入っているはず

なのに文字が“なぜか出力できない”、という奇妙な不具合に出会ったら、pxchfon の unicode オプションを試してみよう。

もっと丸数字したい話
% pLaTeX 文書
\documentclass[a4paper]{jsarticle}
\usepackage{otf}
\begin{document}
\ajMaru{10}\ajMaru{20}\ajMaru{30}\ajMaru{40}\ajMaru{50}%
\ajSnowman
\ajKuroMaru{10}\ajKuroMaru{20}
\end{document}
% upLaTeX 文書; UTF-8
\documentclass[uplatex,a4paper]{jsarticle}
\begin{document}
⑩⑳㉚㊵㊿☃❿⓴
\end{document}

この例では、㊵(丸40)や㊿(丸50)といった丸数字の一部および黒丸数字が出力されていない。しかし、upLaTeX 文書ソースに直接書けていることから判るように、これらの文字は Unicode に含まれている。*1ここで実際に使われているフォントは「IPAex 明朝」である(☃の字形を見れば判る)が、このフォントは先に挙げた丸数字に対応している。(これはワープロソフト等で「IPAex 明朝」を指定して当該の文字を書いてみれば判る。)

つまり、この不具合は“なぜか出力できない”の例である可能性がある。

そういうわけで、早速 unicode 付きの pxchfon を試してみることにしよう。従来通り IPAex フォントが使われてほしいので、プリセットとして ipaex を指定する。

% pLaTeX 文書
\documentclass[a4paper]{jsarticle}
\usepackage{otf}
\usepackage[ipaex,unicode]{pxchfon}
\begin{document}
\ajMaru{10}\ajMaru{20}\ajMaru{30}\ajMaru{40}\ajMaru{50}%
\ajSnowman
\ajKuroMaru{10}\ajKuroMaru{20}
\end{document}
% upLaTeX 文書; UTF-8
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[ipaex,unicode]{pxchfon}
\begin{document}
⑩⑳㉚㊵㊿☃❿⓴
\end{document}

スバラシイ。

縦組でダブルミニュートしたい話

upLaTeX + dvipdfmx の環境で、実際に使われているフォントが IPAex フォントである場合、縦組においてダブルミニュート(〝 〟)を使うと、閉じ側の文字が正常に出力されない。

% upLaTeX 文書; UTF-8
\documentclass[uplatex,tate,book,paper=a4]{jlreq}
\begin{document}
ここから判るように、静的型付けには
明らかな優位性が〝存在〟する。
(実際に存在するとは言ってない。)
\end{document}

先の例と同じく、IPAex フォント自体は縦組のダブルミニュートを正しく扱える。(ワープロソフト等で確認できる。)従って、これも“なぜか出力できない”現象だと考えられる。

というわけで、再び pxchfon + unicode を試してみると……。

% upLaTeX 文書; UTF-8
\documentclass[uplatex,tate,book,paper=a4]{jlreq}
\usepackage[ipaex,unicode]{pxchfon}
\begin{document}
ここから判るように、静的型付けには
明らかな優位性が〝存在〟する。
(実際に存在するとは言ってない。)
\end{document}

スバラシイ。

*1:Unicode には丸数字の 1〜50 と黒丸数字の 1〜20 が含まれている。

unicode-math を完全に理解したい話(3)

前回の続き)

unicode-math の理論を完全に理解したい(続き)

入力における立体と斜体の自動補正

「立体と斜体の“非区別”」の小節で述べた通り、数式中のラテン小文字は普通は斜体が使われる。従って、従来の LaTeX 数式では x を入力すると「斜体の x」が出力される。しかし、これまでに述べた理屈をそのまま適用すると、unicode-math では x(U+007B) の入力では「立体の x」が出力されて、「斜体の x」を出力するには U+1D465 の文字または \symit{x} を入力する必要が生じてしまう。

この面倒を避けるための対処として、unicode-math では「入力の立体と斜体を自動的に補正する」「立体と斜体を区別しない特殊な数式英字フォント命令を用意する」という入力補正を行っている。

  • up の(“基本”の)文字、it の文字の入力 → \symup または \symit に補正される
  • bfup の文字、bfit の文字、\symbf 命令の入力 → \symbfup または \symbfit に補正される
  • sfup の文字、sfit の文字、\symsf 命令の入力 → \symsfup または \symsfit に補正される
  • bfsfup の文字、bfsfit の文字、\symbfsf 命令の入力 → \symbfsfup または \symbfsfit に補正される

※具体的な数式英字フォント命令(\symup\symsfit 等)は入力補正の対象にならない。

先述の通り「立体と斜体の何れを常用するか」に様々な習慣があるため、入力補正の方式をオプション*1で選択できる。up 対 it の補正結果は math-style オプションの値により決まる。

オプション値 ラテン小 ラテン大 ギリシャ ギリシャ
ISO it it it it
TeX it it it up
french it up up up
upright up up up up

literal指定で補正が抑止され、入力の立体と斜体の区別が保持される。

bfup 対 bfit の補正結果は bold-style オプションの値により決まる。((先述の通り、math-style の TeX の設定は米国の習慣を反映したものといえそうだが、bold-style の TeX、特に「ギリシャ小文字を斜体とする」については注意が必要だと思う。単なる「LaTeX 者の習慣」なのかもしれない。))

オプション値 ラテン小 ラテン大 ギリシャ ギリシャ
ISO bfit bfit bfit bfit
TeX bfup bfup bfit bfup
upright bfup bfup bfup bfup

literal指定で入力補正が抑止され、入力の立体と斜体の区別が保持される。

sfup 対 sfit、および bfsfup 対 bfsfit の補正結果は sans-style オプションの値により決まる。

オプション値 意味
italic sfit および bfsfit
upright sfup および bfsfup

literal指定で入力補正が抑止され、入力の立体と斜体の区別が保持される。

※ところで、Unicode の「数式書体付文字」においては、ギリシャ文字サンセリフ太字(bfsf)をもつが単なる太字(sf)はもたないという規定になっている。何故なんだろう?

※bold-style と sans-style の既定値は math-style の設定値に依存する。math-style の既定値は TeX である。

math- 設定値 bold- 既定値 sans- 既定値
ISO ISO italic
TeX TeX upright
french upright upright
upright upright upright
literal literal literal
ナブラ記号と偏微分記号

ナブラ記号(∇;U+2207)と偏微分記号(∂;U+2202)は Unicode で「数式書体付文字」として扱われている。*2従って、これらの文字も「数式英字」の範囲に含まれ、また入力補正の対象となる。入力補正の方式は各文字ごとに個別のオプションで指定する。

ナブラ記号の補正結果は nabla オプションの値により決まる。偏微分記号の補正結果は partial オプションの値により決まる。

  • italic: 斜体(it/bfit/bfsfit)になる。
  • upright: 立体(up/bfup/bfsfup)になる。
  • literal: 入力補正が抑止される。

nabla の既定値は upright、partial の既定値は italic であるが、math-style が literal の場合は両方の既定値が literal に変わる。

\symliteral 命令

オプションの設定に関わらず、\symliteral 命令を利用すると入力の補正を抑止できる。例えば、math-style が literal 以外の場合、x(U+007B) と U+1D465 は同じ出力(立体か斜体の何れか一方)になるが、\symliteral の引数に入れた場合は x は立体、U+1D465 は斜体で出力される。

*1:“オプション”はパッケージオプションや物理フォント設定関連の命令のオプションとして指定できる。

*2:この 2 つの文字のサポートする数式書体の範囲はギリシャ文字と同じである。つまり単なるサンセリフは無い!