TeX と SATySFi 主要記法比較
SATySFi ってな〜に
SATySFi は以下の点において TeX と共通しています:
- 組版ソフトである.
- ソースコードをコンパイルして PDF などに変換できる.
- 本やレポートが書ける.
- 数式が書ける.
一方,以下の点において TeX と異なります:
- 文法や型システムなど,プログラミング言語としての部分.SATySFi は静的型付きの関数型言語.
この記事では,TeX は知ってるけど SATySFi は知らないよ〜という人のために,色々な場面における TeX と SATySFi の記法を比較します.
全体の構成
タイトルと著者の入れ方,プリアンブルなど.
TeX:
\documentclass[uplatex]{jsarticle}
% プリアンブル
\title{タイトル}
\author{著者}
\begin{document}
\maketitle
段落1
段落2
\end{document}
SATySFi:
@require: stdjareport
% プリアンブル
document(| title = {タイトル}; author = {著者} |)'<
+p{ 段落1 }
+p{ 段落2 }
>
このあたりはだいぶ違いますね.
TeX は空行で段落を分けますが,SATySFi は +p{〜} で段落を表します.
数式
正の整数
と実数 n , a_1, \ldots, a_n に対し b_1, \ldots, b_n \left(\sum_{k=1}^n a_k^2\right) \left(\sum_{k=1}^n b_k^2\right) \geq \left(\sum_{k = 1}^n a_k b_k\right)^2.
TeX:
正の整数$n$と実数$a_1, \ldots, a_n$,$b_1, \ldots, b_n$に対し
\[
\left(\sum_{k=1}^n a_k^2\right)
\left(\sum_{k=1}^n b_k^2\right)
\geq \left(\sum_{k = 1}^n a_k b_k\right)^2.
\]
SATySFi:
正の整数${n}と実数${a_1, \ldots, a_n},${b_1, \ldots, b_n}に対し
\eqn(${
\paren{\sum_{k=1}^n a_k^2}
\paren{\sum_{k=1}^n b_k^2}
\geq \paren{\sum_{k=1}^n a_k b_k}^2.
});
上付き ^2 下付き _1 とか \sum あたりはおおよそ同じです.
文中の数式は TeX だと $〜$,SATySFi だと ${〜}.
別行立て数式は TeX だと \[〜\] や equation 環境を使いますが,SATySFi だと \eqn(〜); や +math(〜); を使います.
TeX で (〜) の大きさを調節するには \left \right などを使いますが,SATySFi だと \paren{〜} だけで大きさが自動調節される括弧になります(プリアンブルで azmath を require しておくと \p{〜}).
\begin{align} \Gamma(z) &= \int_0^\infty t^{z-1} e^{-t} dt \\ &= \left[-t^{z-1} e^{-t}\right]_0^\infty + (z-1) \int_0^\infty t^{z-2} e^{-t} dt \\ &= (z-1) \Gamma(z-1) \end{align}
TeX:
\begin{align}
\Gamma(z) &= \int_0^\infty t^{z-1} e^{-t} dt \\
&= \left[-t^{z-1} e^{-t}\right]_0^\infty
+ (z-1) \int_0^\infty t^{z-2} e^{-t} dt \\
&= (z-1) \Gamma(z-1)
\end{align}
SATySFi(azmath なし):
\align[
${| \app{\Gamma}{z} |= \int_0^\infty t^{z-1} e^{-t} \ordd t |};
${||= \sqbracket{-t^{z-1} e^{-t}}_0^\infty
+ \paren{z-1} \int_0^\infty t^{z-2} e^{-t} \ordd t |};
${||= \paren{z-1} \app{\Gamma}{z-1} |}
];
SATySFi(azmath あり):
\align(${
| \app{\Gamma}{z} |= \int_0^\infty t^{z-1} e^{-t} \ordd t
||= \sqbracket{-t^{z-1} e^{-t}}_0^\infty
+ \p{z-1} \int_0^\infty t^{z-2} e^{-t} \ordd t
||= \p{z-1} \app{\Gamma}{z-1}
|});
複数行にわたる数式は,TeX では align 環境を使って & と \\ で位置を揃えますが,SATySFi だと \align(〜); を使って | で区切ります.
章立て
TeX(jsarticle):
\section{夏休みの宿題}
\subsection{概要}
多くの学校では夏休みに宿題が課される.
\subsection{主な宿題}
問題集,日記,読書感想文,自由研究などがある.
\subsection{期限までに出来なかった時にはどうするべきか}
なんとか言い訳を考える.
SATySFi(stdjabook):
+section{夏休みの宿題}<
+subsection{概要}<
+p{
多くの学校では夏休みに宿題が課される.
}
>
+subsection{主な宿題}<
+p{
問題集,日記,読書感想文,自由研究などがある.
}
>
+subsection{期限までに出来なかった時にはどうするべきか}<
+p{
なんとか言い訳を考える.
}
>
>
大きく違いますね.TeX は章や節の先頭に \section{} や subsection{} を入れるだけですが,SATySFi は <〜> を使って章や節の始まりと終わりを明記します.
箇条書き
TeX:
\begin{itemize}
\item ごはん
\item 麺
\begin{itemize}
\item うどん
\item そば
\item ラーメン
\end{itemize}
\item パン
\end{itemize}
SATySFi:
\listing{
* ごはん
* 麺
** うどん
** そば
** ラーメン
* パン
}
TeX では itemize 環境を使って各項目の先頭に \item を付けます.一方 SATySFi では \listing{〜} を使い,各項目の先頭に * を付けます.入れ子にするときは,TeX だと新しく itemize 環境を始め,SATySFi だと ** の数を増やします.
コマンドの定義
毎回 \mathbb{R} と書く代わりに \bR を定義しておく.文字を赤くする \red を定義しておく.どちらもよくあるコマンド定義です.
TeX:
\documentclass[uplatex]{jsarticle}
\usepackage{amssymb}
\newcommand{\bR}{\mathbb{R}}
\usepackage{color}
\newcommand{\red}[1]{\textcolor{red}{#1}}
\begin{document}
$\bR$を\red{実数}全体の集合とする.
\end{document}
SATySFi:
@require: stdjareport
let-math \bR = ${\mathbb{R}}
let-inline ctx \red it =
let red = RGB(1., 0., 0.) in
read-inline (set-text-color red ctx) it
in
document(| title = {}; author = {} |)'<
+p{
${\bR}を\red{実数}全体の集合とする.
}
>
これもけっこう雰囲気が違いますね.
SATySFi は数式コマンドを let-math で,インラインコマンド(文中で使うコマンド)を let-inline で定義します.TeX はどちらも \newcommand です.
SATySFi は OCaml や F# の影響を大きく受けているだけあって,関数型言語の記法ですね.
ちなみに文中の ${\bR} は(デフォルトの場合)\math(${\bR}); と同じ意味になっていて,後者を使って書くと以下のようにローカルな(その場だけで有効な)コマンドを定義することもできます.
@require: stdjareport
document(| title = {}; author = {} |)'<
+p{
\math(
let-math \bR = ${\mathbb{R}} in
${\bR}
);を実数全体の集合とする.
% ここで ${\bR} は使えない
}
>
表
TeX SATySFi 作者 D. Knuth gfngfn 開発年 1978 2017
TeX:
\documentclass[uplatex]{jsarticle}
\begin{document}
\begin{tabular}{lcc}
\hline
& \TeX & SATySFi \\
\hline
作者 & D. Knuth & gfngfn \\
開発年 & 1978 & 2017 \\
\hline
\end{tabular}
\end{document}
SATySFi:
@require: stdjareport
@require: easytable/easytable
open EasyTableAlias
in
document(| title = {}; author = {} |)'<
+p{
\easytable[l;c;c]{
| | \TeX; | \SATySFi;
| 作者 | D. Knuth | gfngfn
| 開発年 | 1978 | 2017
|}
}
>
こちらも,TeX は & と \\ で区切るのに対し,SATySFi は | で区切ります.
他に何か思いついたら書き足します.
Discussion
easytable パッケージの紹介ありがとうございます。ほかに思いつくのは
あたりでしょうか。
また、「数式」セクションで述べられている
\alignコマンドの数式の例は azmath パッケージが必要となります。標準の math パッケージで定義されている\alignコマンドとは引数の型が異なるため、念のため。ありがとうございます!箇条書きとセクションについて追加しました.あと
\alignは標準と azmath を併記しました.