テクニカルノート
式のテキスト形入出力
同じ式をカーネル内部の表現に準じた記述形式で入力する:
ノートブックに入力する場合は,数学表記的な記述形式で入力することも可能である:
出力式に関しても用途に応じて表記法を選択することができる.
Wolframシステムノートブックでは,
StandardForm (標準形)と呼ばれる,より数学表記的な記述形式で答が出力される:
OutputForm (出力形)を作用させ,キーボードの文字だけを使う記述形式で答を表示する.Wolfram言語のテキスト型インターフェースではこの形式が通常使われる:
キーボードから直接入力できる文字,記号だけを使う.
InputForm (入力形)を作用させると,答を再入力可能な記述形式に変換できる:
FullForm (完全形)を使いカーネル内部で使われる関数形の記述形式で表示する:
カーネルから式の出力があるとき,上記の出力表記のいずれかに基づいたテキスト形式で式が構成される.テキスト形式の式は,内容によっては,再度入力式として使うことも可能である.上記の表記の他にさらにいくつかの表記と変換機能が用意されている.それらは主にタイプセット的な表示,もしくは,外部プログラムへの出力用途で使う.
CForm を使いC言語の記述形式に変換する.
Power はマクロのことで,その定義はファイル
mdefs.h にある:
上記以外の特殊な出力表記が必要ならば,カスタマイズすることも可能である(詳しくは,
「低レベル入出力の規則」 を参照のこと).ただし,外部プログラムへ式を送る場合は,可能であれば,Wolfram Symbolic Transfer Protocol (WSTP)を使い直接転送した方がよい.
■ 式を特定テキスト形式に変換してから外部プログラムに読み込ませる.
■ WSTPを介して式を直接転送する.
外部プログラムにおけるWolframシステムで作成した式の転送法
テキスト形式の記述文を式に変換する
計算
式を計算する
Output
評価結果としての式をテキスト形式に変換する
ユーザが
x^2 と入力したなら,まず,文字列(
x ,
^ ,
2 )の認識作業がカーネルにおいて行われる.カーネルの環境設定が標準通りになっているなら,文字列から式
Power [ x, 2] への変換が速やかに行われる.
そして,可能な処理が全部済んだら,Wolfram言語は式
Power [ x, 2] を取り,それを出力のためのテキスト形式の表現に変換する.
入力式が
x ,
^ ,
2 の文字列に分解・検査され,式
Power [ x, 2] に変換される:
In [ n ] と
Out [ n ] のセルに記録されるのは実際に評価処理された内部形式の式で,必ずしも,最終的な表示に現れる記述式ではないことに注意する.
例えば
TraditionalForm [ expr ] を使い,特別な種類の出力を明示的に要求すると,出力セルには
Out [ n ] //TraditionalForm のラベルが付く.これは,表示される式は
expr //TraditionalForm であるが,
Out [ n ] セルの内容としてはもとの式
expr のままであるということを意味している.
特定の式だけでなく大域的に出力表記法を指定することも可能である.その場合,表記名はセル番号の脇に表示されない.大域的に指定しても,
In [ n ] と
Out [ n ] のセルが持つ内容は基本的なテキスト形入出力式の記述のままでおかれる.
実際にセルに取り込まれたのはWolfram言語標準形の式である:
式のテキスト形式は,Wolframシステムの他の要素と同様に式として表現することができる.一次元の文字列から構成されるテキスト形式は,通常のWolframシステム文字列として直接表すことができる.しかし,添字(下付き文字)や指数(上付き文字)等の縦横に広がる二次元的な表示を想定した数学記号(2D記号)は標準テキスト形式では記述できない.代りにボックスオブジェクトと呼ばれる記述単位を使った拡張テキストを使う.
ボックス記述を
InputForm に変換してみる.この表記では,各成分は文字列として表示される:
ノートブック用フロントエンドを使っている場合は,メニューからのコマンドを選択すると式の表示内容をテキスト形式で見ることができる.
を使い,この式をボックス形式で表示すると,式の構成が明確になる:
ToString [ expr , form ] テキスト形式で記述した式 expr を文字列に変換する
ToBoxes [ expr , form ] テキスト形式で記述した式 expr をボックス形式に変換する
式はテキストとして入力される.入力があると,実行的な
ToExpression の機能が効果的に使われ,テキストが評価可能な式を表しているかどうかを解釈する.
ノートブック用フロントエンドを使っている場合,入力したセルの内容が評価のためカーネルに送られるものに限って上記の解釈作業が行われる.したがって,ノートブックで数式等を書くとき,それがカーネルに送られるものでなければ,特にカーネルの認識可能な形式でなければいけないということはない.
Wolframシステムには入力テキストと式の対応関係を定義した変換規則が組み込まれている.
ToExpression を使うと,その変換規則をもとに入力テキストから式への変換が行われる.
これらの変換規則が集まりWolframシステム言語の文法を形作っている.変換規則の例として,
x +y とタイプすると関数形の式
Plus [ x , y ] が生成されるとか,
xy と入力すると式
Power [ x , y ] が生成される等がある.
FullForm の入力であれば解釈に使う規則は単純明快である.つまり,「式は必ず特定頭部を持ち,頭部の後には角カッコでくくった引数要素が続く」とする.入力形式が
InputForm になると規則はやや複雑になる.演算子の
+ や,関係記号である
= や
-> を許容しながら被演算子(オペランド)を適切に読み取らなければいけない.
StandardForm においては一層複雑な規則が必要になる.対処しなければいけない演算子や被演算子は単純な一次元配置のものだけでなく,分数や積分記号に見られるような二次元的な広がりを持つものもある.
ノートブック用フロントエンドを使っているなら,
StandardForm の提供するすべての機能を利用したい.使うフロントエンドがテキスト型インターフェースなら,普通は
InputForm を使うしかない.
ノートブックで
StandardForm を使っている場合,
x2 や注釈付きのグラフィックス等の数式を直接入力し,また,編集することができる(数学記号は左右だけでなく上下等にも広がりを持つので二次元的な記述になる).しかし
InputForm では,一次元形式しか使えない.
評価しないでその解釈形が決められる
StandardForm 式をコピーすると,外部アプリケーションには
InputForm としてペーストされる.それ以外の場合は,テキストは
∖ !∖ ( … ∖ ) を使った二次元構造を正確に表す線形形式でコピーされる.この線形形式をWolframシステムノートブックに再び打ち込んだ場合,
自動的に二次元 形式に変換される.
ToExpression [ input , form ] 入力文 input がテキスト形式の表記で与えられたと仮定して式を生成する
テキスト形式を使い,
StandardForm とそのサブセットである
FullForm と
InputForm のどれでも式を記述することができる.これらの表記法に基づいた記述文は1対1の関係で確実に式に変換することができる.
テキスト形式の記述法には
TraditionalForm と呼ばれるもう1つの記述法がある.
TraditionalForm は主に出力用に使われ,Wolframシステムの認識する式なら何でも表示することができる.ただし,
TraditionalForm の記述は
StandardForm に比べ正確性に欠ける.また,一度,
TraditionalForm で式を出力したら,その式からもとの式は再構築できないときもある.
それでも,書式
ToExpression [ input , TraditionalForm ] を使えば,
TraditionalForm の記述から強制的に式を生成させることは可能である.確実な解釈は保証されない.
計算結果を
TraditionalForm で生成した場合,式の各成分に対応したボックス記述には特殊な
Interpretation オブジェクト,あるいは,
TraditionalForm 出力からどのように式を再構築するかを指定する特殊なタグの付いた形式が含まれる.
この拡張情報の埋め込み処理は
StandardForm から
TraditionalForm に変換した式に対しても行われる.ただし,はじめから
TraditionalForm で式を編集したり,
TraditionalForm の出力式に著しい変更を施した場合は,拡張情報が失われてしまい,式の正確な解釈が困難になってしまうので注意する.
計算をさせ非常に長い答が返ってくるとき,答のすべてを見たくないときもあるだろう.全体の形がどうなっているか知りたいかもしれない.そして式の形が分かったならば部分的に詳細がどうなっているか見てみたいこともある.
そのようなときは,関数
Short と
Shallow を使うと式を省略表示できる.
Short [ expr ] 式 expr の部分を1行分表示する
Short [ expr , n ] 式 expr の部分を n 行分表示する
Shallow [ expr ] 式 expr の木構造において最上位(最も浅いレベル)の部分だけを表示する
Shallow [ expr , { depth , length } ] 式 expr の木構造において指定レベルの深さと長さまで表示する
この計算結果は非常に長いものになる.実際に表示させたなら,23行程度続いてしまうだろう:
そこで
t を短縮表示させる.答の中の
<<>> とは省略された項の数を示す:
Wolfram言語により
OutputForm のようなテキスト形式の出力が生成される場合,まず,式が長くても短くても単一行で全部分が生成される.次に,表示行の幅を見て,それに収まるように式が複数行に分割される.このとき,各行には上付き文字や分数等の数学記号が入っていて実際の表示では1行分の高さ以上になることもある.なお,短縮表示関数
Short に指定できる行数は,出力装置に実際に表示される行の数ではなく「論理行数」であることに注意する.
t の答を4行分だけ表示する.先程より多くの項が見えるようになる:
Short は
StandardForm ,
TraditionalForm 等の別の形式でも使える.これらの形式を使う場合は,改行は出力を生成するときにカーネルによって決められるのではなく,出力を表示するときにノートブックインターフェースにより決められる.その結果,
Short により生成される線の数の設定は,スクリーンで表示される実際の線の数を近似するだけとなる.
Short の機能は,指定した行数になるまで出力式から部分を1つずつ除去する.場合によっては,出力する行数を制限するより,種類別に式の部分を制限した方が分かりやすい.その場合,上位部分だけを表示させるための書式,
Shallow [ expr , { depth , length } ] が使える.この短縮機能を使うと,式の木構造における指定の深さ以下の部分を出力禁止にできる.長さ
length は,出力に残しておく関数の引数最大数を指定する.
今度は,表示する関数は何でもよいとし,引数を10個までに制限する:
特に,式がネストしているときは(
Trace で得られる結果等で),
Shallow を使うと式全体を通しで一様に整理でき便利である.
帰納的関数であるフィボナッチ(Fibonacci)の関数を定義する:
トレースしてみる.結果が長くなるので,表示は禁止にしておく:
Short だと,あまり一様なアウトラインは得られず,式の形が分かりにくい:
ノートブックインターフェースで生成された出力がかなり大きい場合,Wolfram言語は自動的にその出力に
Short を適用する.このように向上したユーザインターフェースにより,ユーザが期待していないような評価の出力を生成しフォーマットするのにWolfram言語が長時間掛けるのを防ぐことができる.
通常,このような割当ての最後にはセミコロンがある:
ユーザインターフェースのボタンにより,どれくらいの出力を見るかを制御することができる.この動作が有効となる大きさの閾値は,出力式のバイト数による.そのバイト数は,ボタンで開くノートブックインターフェースの
環境設定 ダイアログで設定することができる.
文字列にはどんな種類のテキストでも入力可能である.英語以外の文字でもよいし,改行記号や他の制御情報であってもよい.文字列の構成要素の詳細については
「文字と文字列」 を参照のこと.
StringForm [ "cccc ``cccc ", x 1 , x 2 , … ] 第1引数の文字列において2重アクセント記号 `` があればそれを x i で順番に置換した文字列を構成する
StringForm [ "cccc `i `cccc ", x 1 , x 2 , … ] 第1引数の文字列においてパターン`i ` があれば番号に対応した x i で置換した文字列を構成する
文字列を使うとき,場合によっては,原形になる文字列をテンプレートとして用意しておき,そこに種々の文字要素を挿入して必要な文字列を作成できると便利である.
StringForm を使うとそれができる.
`` の位置に第2,第3の引数を順番に挿入し新たな文字列を作る:
アクセント記号と数字を組み合せて,何番目の式を挿入すべきか指定することも可能である:
StringForm における引数の文字列は,C言語やFortran言語で使う書式付き出力文の「書式指定」に相当する.標準出力変換関数を式に作用させれば,
StringForm の式がどう書式設定されるか見ることができる.
StringForm が使えるのは出力書式の指定だけであることに注意する.式自体の評価は行わない.
StringForm オブジェクトから通常の文字列を生成するには
ToString の機能を使う.
StringForm を使えば,文字列で「テンプレート」を作り,そこに,いろいろな式を埋めていくという形式の入力ができる.場合によっては,複数の式がすでにあり,それらを単につなげたいだけのこともあるだろう.そのようなときは,
Row を使う.
Row [ { expr 1 , expr 2 , … } ] 連結した expr i の出力形を返す
Row [ list , s ] 連続要素間に s を挿入する
Spacer [ w ] Row で使用することのできる
w ポイントのスペースを生成する
Invisible [ expr ] expr の物理次元により決められるスペースを生成する
Row は表示された要素間にどのような式も自動的に挿入することができる:
Spacer は要素間の正確なスペースを制御するために使うことができる:
テキスト文字列と
Row のような関数を使うと,有効なWolfram言語式には必ずしも対応しない出力を生成することができる.しかし,式が評価されない限りにおいてのみ,有効なWolfram言語式に対応する出力が生成したい場合もあろう.関数
Defer は引数の評価を保留するが,標準的なWolfram言語の出力形でフォーマットすることができる.
出力を変更したり,コピーペーストを使うことで
Defer の出力が再び評価されると,通常通りに評価される.
下の出力は上記の出力セルから入力セルへとコピーしたものである:
Interpretation を使うと,評価方法とは直接関係しない外観を持つ出力を生成することもできる.最も解読可能な形式がオブジェクトの内部表現によく対応していないような出力をフォーマットするときに,この方法がWolframシステムで効率的に使われる.例えば,
Series はデフォルトの出力で常に
Interpretation オブジェクトを生成する.
前の出力のコピーペーストにより,以前に
x に割り当てられた値が参照される:
出力にはデフォルトの書式が使われる.数値が大きければ科学表記が使われる:
今度は,工学表記で表示する.指数部が3の整数倍になるように仮数部が調整される:
会計表記では,負の数値は丸カッコでくくられる.科学表記は全く使われない:
の実数値を30桁精度で表示する:
今度は
の10桁分だけ表示する:
最終の項目を除く,テーブルにあるすべてのオプションは,整数と近似実数の両方に適用される.
上記のオプションは
NumberForm ,
ScientificForm ,
EngineeringForm ,
AccountingForm の表記変換関数のどれにでも使える.実際に,表記法に応じて個別に表示仕様を変えることも可能である.表に記載したデフォルト値は
NumberForm のものである.
区切り記号はなんでもよい.ここでは,スペース(空白)を使ってみる:
正の値にはプラスの符号を付け,小数点の位置にはピリオドの代りに垂直バー(
| )を使ってみよう:
実数の表示では,科学表記を使うか使わないかがまず選択される.使うのであれば続いて,小数点以下何桁まで表示するかが決定される.Wolfram言語内部では次の手順で表示様式が決定される.まず,数値を科学表記で記述してみて,そのとき,どのような指数部が生じるかを見る.次に,小数点の左側に桁1つ分のスペースを挿入する.さらに,指数部に
ExponentFunction で指定されている変換関数を適用し,実際に表示する形に変換する.このとき,科学表記が使われていなければ,指数部は
Null (空)とみなされる.
実数がどう表示されるか見てみよう.特に指定していない場合,指数部が
から
の範囲以外にある場合は科学表記が使われることになっている:
指数部が10以上の値のときだけ科学表記を採用する記述:
表示したい数の仮数部と指数部を決定したなら,残る最後のステップは,両方の部分を組み合せ最終的に表示する単一オブジェクトを生成することである.ここで,数値の表示書式を任意の形に変えたいときは,オプション
NumberFormat を使い書式処理に必要な関数を指定しておく.その関数には,実行時の引数として仮数部,底,指数部の数値の3つの要素が入力されることになっている.指数部を取らない場合は
"" としておく.
Fortran的な「e」形式で指数部をカスタム表示する:
PaddedForm [ expr , tot ] 式にある数のすべてを tot 桁まで表示し,桁数が足りなければ数の手前にスペースを充填して表示長を揃える
PaddedForm [ expr , { tot , frac } ] 式にある数のすべてを tot 桁まで表示し,小数点以下は frac 桁まで表示し,桁数が足りなければ数の手前にスペースを充填して表示長を揃える
NumberForm [ expr , { tot , frac } ] 式にある数のすべてを最高で tot 桁まで表示し,小数点以下は frac 桁まで表示する
Column [ { expr 1 , expr 2 , … } ] 式 expr i を左揃えで上から下へ1列で表示する
複数の数値を縦1列に表示,もしくは,表形式で表示するとき,個々の数値の桁位置を合わせておくと見やすくなってよい.例えば,表示したい領域において,各数値の位が同じ位置にくるように設定する.
位の位置合せのため,数値の直前と直後に「空白文字(パッド)」を適当に挿入して表示長を調整できるようになっている.通常は,小数点以下の桁が足りなければ,数値の直後(右端)にゼロが付け足される.また,小数点以上の桁の場合は,数値の手前(左端)にスペースがあてがわれる.
表示長を揃えてみよう.スペースがあてがわれ,7桁分の表示長が確保される:
全表示桁数を7桁とし,その内4桁分を小数点以下の表示に回す:
科学表記が使われるときは,仮数部だけに桁長の調整が施される:
NumberPadding のデフォルト設定で関数
NumberForm と
PaddedForm を使った場合,数値の右側にパッドを入れようとすればゼロが充填される.ここで,左右に充填するものとしてスペースを使いたい場合は,
NumberPadding ->{ " ", " "} と指定する.
数値の右にゼロの代りにスペースをあてがうよう指定する:
16進法で表示する.10進法以上の場合は,9より大きい数はアルファベットが使われる:
任意の底における数値の入力法と,数値の各位の数字をリストアップする方法は
「数の桁」 で説明する.必要ならばそちらを参照のこと.
表と行列の表示形を使ったリスト要素の出力書式の設定
Grid と
Column は評価しないラッパーであるが,内容を適切な形式にタイプセットする.これらはタイプセットするコンストラクトであり,フロントエンドでの正確な描画を必要とする.
これらのラッパーはすべて,グラフィカルなデータを含むどのような種類のデータをあらわすためにも使用できる:
桁数が小さすぎるときは数値手前にスペースをあてがうことで表示桁長を20桁にし,右揃えの列表示をする:
Grid は,第1引数に矩形行列を取る.
Grid の各々の要素は伸張する領域を指定することにより,複数の行・列,または矩形の部分格子に渡り伸張することができる.伸張要素は常に伸張領域の左上隅で指定され,残りの領域は適切な伸張記号で埋められる.
以下は
Grid 全体のベーススタイルをSubsectionスタイルに設定する:
Column は1列の
Grid を指定することに等しい.この2つの関数は類似しているので,どちらにも同じオプションが使える.
個々の行および列に影響を及ぼす
Grid のオプションはすべて同様なシンタックスを持つ.オプションは
{ x , y } として指定することができる.ここで
x は列すべてに適用され,
y はすべての行適用される.また,
x と
y は単独の値,あるいは各列または行を交代で表す値のリストである.
Alignment 設定がない場合,要素は水平方向では中心に,垂直方向ではベースラインに揃う:
以下で,列の水平方向の整列を右に揃えるよう変更する:
Background あるいは
ItemStyle オプションが,行と列について異なる設定を指定する場合,フロントエンドは行と列がオーバーラップする設定を組み合わせる.
以下は緑の行がどのようにさまざまな色と組み合わされるかを示している:
以下の例は,行と列の両方で指定されたスタイルを
ItemStyle がどのように組み合わせることができるかを示している:
複数の行や列に渡って個々の行と列の指定を繰り返したい場合は,リストでラップするとよい.繰り返される要素は,必要なだけ使われる.リストに複数の要素をラップする場合,全体のリストが順に繰り返される.
ItemSize と
Spacings の両オプションは,水平方向はemで,垂直方向は現行のフォントに基づく線の高さで測定する.また,どちらのオプションも
Scaled 座標を取ることができる.これは,座標が合計のセルの幅あるいはウィンドウの高さを指定するものである.
ItemSize オプションでは,キーワード
Full を使うことにより,指定された行または列の要素すべてにフィットするのに必要なスペースを要求することができる.
すべての項目の幅を3emに,高さを1ラインハイトにする:
フォントの大きさを変更すると,異なる大きさで表示される:
以下の例のボタンは,常にセルの幅の4分の1の大きさになる:
行および列全体に適用することのできる設定の多くは,
Item ラッパーを使って
Grid または
Column の要素に個別に適用することもできる.
Item を使うと,1つの項目ごとにこれらの設定を変更することができる.
Item レベルで指定された設定は,常に
Grid あるいは
Column からの全体としての設定をオーバーライドする.
以下で左下の要素に対する項目特定のオプションを設定する:
Item のオプションの多くは,それに対する
Grid での設定と同じ設定を取る.しかし,
Grid において複雑な行および列を許可するオプションの
Alignment および
ItemSize は
Item の
{ horizontal , vertical } 設定だけしか取らない.
次で,項目の領域をより大きくし,テキストの整列方法を指定する:
ここで
ItemSize は,最小の高さを2行分と指定しているが,項目はそれより大きい:
高次元データのフォーマットColumn は一次元データを,
Grid は二次元データをサポートする.任意次元の配列を出力するためには,
TableForm を使うことができる.
要素
a[ i , j ] の2
× 2の配列を均等間隔で表示する:
次元の表の表示において,通常,次に続く次元は入れ替りで列,そして,行に割り付けられる.
TableDirections ->{ dir 1 , dir 2 , … } の設定条件を与えておけば(ここで,
dir i は,
Column か
Row を指定する),数値を次元別に列方向,または,行方向に並べることが可能である.デフォルトでは,
{ Column , Row , Column , Row , … } と交互に並べられる.
TableForm は「不揃いな」配列を扱うことができる.要素が与えられていないときは空欄のままとなる.
オプション
TableDepth を使うと,
TableForm で表示するリストの最大ネストレベルを指定することができる.
TableForm で表示するが,第2レベル(二次元)以上は表示しないよう指定しておく.サブリスト
{ x, y} は表の単一の要素として扱われる:
TableDepth Infinity 表に含む最大レベル数(次元数)を指定する
TableDirections { Column , Row , Column , … } 各レベル(次元)を行にするか列にするか指定する
TableAlignments { Left , Bottom , Left , … } 各レベルの入力要素をどの方向に寄せて並べるか指定する
TableSpacing { 1, 3, 0, 1, 0, … } 要素と要素の間隔をスペース記号換算で指定する
TableHeadings { None , None , … } 各レベルに付けるラベルを指定する
表の要素配置
TableAlignments を設定することで,表の各入力要素を行や列の辺に合わせて並べることが可能になる.列合せの指定では,左,中央,右(
Left ,
Center ,
Right )を指定することができる.また,行合せでは,下,中央,上(
Bottom ,
Center ,
Top )を指定することができる.
TableAlignments ->Center と指定すれば,表の全要素が水平・垂直方向で中央に揃えることができる.デフォルトの揃え方に戻すには,
TableAlignments ->Automatic にする.
表の要素間隔
TableSpacing を使うと隣接要素の水平・垂直間隔をスペース記号の単位で指定できる.
0 とすれば,間隔なしになる.
列と列の間をスペース記号6個分にし,行と行の間は間隔なしにする:
None ラベルを付けない
Automatic 番号ラベルを付ける
{ { lbl 11 , lbl 12 , … } , … } 任意のラベルを各レベルに付ける
行には番号ラベルを付け,列には指定の文字列ラベルを付ける:
行にだけラベルを付ける.3番目のラベルに相当する行がないので,
TableForm は自動的に空の行を挿入する:
Style [ expr , options ] 設定条件に基づいて式を出力する
Style [ expr , "style "] セルスタイルに基づいて式を出力する
2番目の
を太文字表示にする:
10ポイントから20ポイントの大きさで
text を表示する:
Style ではいくつかのオプションについて短縮した形が使える.
FontSize ,
FontWeight ,
FontSlant ,
FontColor 等のオプションについては,オプションの設定だけを含むことができる.
ここではオプションが短縮された形式で指定されている:
ノートブック用フロントエンドを使っている場合,出力する式は,出力セルのデフォルトスタイルに従い表示される.
Style [ expr , "style "] を使えば,任意のスタイルで式を表示できる.
セクションの見出しに通常使うスタイルを出力される式に適用してみる:
「Wolfram言語式としてのセル」 に,セルのスタイルをどう使うか詳しい説明があるので参照のこと.
Style [ expr , "style ", options ] を使うと,特定のスタイルではあるが,あるオプションが変更された出力が生成できる.
テキスト表記の式は,究極的にすべてボックスの集合として表せる.ボックスとは二次元的に相対配置されるオブジェクトを指す.
"text " 文字列
RowBox [ { a , b , … } ] ボックスの行あるいは文字列 a , b , …
GridBox [ { { a 1 , b 1 , … } , { a 2 , b 2 , … } , … } ]
SubscriptBox [ a , b ] 下付き文字ボックス a b
SuperscriptBox [ a , b ] 上付き文字ボックス a b
SubsuperscriptBox [ a , b , c ] 上付き下付き文字ボックス
UnderscriptBox [ a , b ] 真下付き文字ボックス
OverscriptBox [ a , b ] 真上付き文字ボックス
UnderoverscriptBox [ a , b , c ] 真上真下付き文字ボックス
FractionBox [ a , b ] 分数ボックス
SqrtBox [ a ] 平方根ボックス
RadicalBox [ a , b ] b 次根
根号の中に分数を入れるためボックスをネストさせる:
文字書式ボックスを組み合せ,上付き文字を下付き文字の後に付ける:
1つのボックスで,上付き文字と下付き文字を一括で作る:
配列の列と列の間,そして,行と行の間に罫線を引く:
StyleBox [ boxes , options ] ボックス boxes に書式を適用する
StyleBox [ boxes , "style "] ボックス boxes にスタイルを適用する
StyleBox の条件設定の仕方は
Style と同じである.両者の違いは,
Style が式の表示方法を決定するよう式に対して適用される高レベル関数であるのに対し,
StyleBox は根底にあるボックス構造においてそれに対応する低レベル関数であるという点である.
今度は,文字列を現在のノートブックに登録されている見出し用スタイルで表示させる:
見出し用スタイルを使うが,文字は灰色で表示させる:
ノートブック用フロントエンドを使っている場合,スタイルや表示書式はメニューを介して直接変更できる.それでも内部では,書式変更があるたびに
StyleBox のオブジェクトが挿入される.
FormBox [ boxes , form ] ボックス boxes に表記 form に関連した規則を適用する
InterpretationBox [ boxes , expr ] ボックス boxes が指定式 expr を表すものと解釈する
TagBox [ boxes , tag ] ボックス boxes にタグ tag を関連付けて解釈する
ErrorBox [ boxes ] エラーの旨を告げ,ボックス boxes の解釈処理を停止する
InterpretationBox にあるボックスを編集してしまうと,解釈用情報が不正になってしまうかもしれない.これを防ぐために
InterpretationBox オブジェクトの選択や編集を制限するオプションが各種用意されている.
TagBox を使うと,ボックスの内容を解釈しやすくする情報を付加しておくことが可能である.例えば,ボックス
boxes に対応する式の頭部を
tag という関数にするには,
TagBox [ boxes , tag ] と指定する.オブジェクトを編集しても,それが引数だけなら,オブジェクトと関数の関連付けは残るので
TagBox は引き続き的確であると解釈できる.ボックスを編集可能にしておくため,
Editable ->True のデフォルトの条件が事実上
TagBox に与えられている.
各種の規則がボックスの内容に適用され,式の解釈が行われる.規則の適用において,通常,
StyleBox オブジェクト等の書式指定は無視される.このため,
StripWrapperBoxes ->False の条件があらかじめ設定していなければ,例えば,文字色が赤でも
x なら文字色が黒の普通の
x と同じにみなされてしまう.
文字色が赤でも,
x は通常,普通の黒の
x と同じに扱われる:
ボックスオブジェクトを文字列でコンパクトに表すこともできる.文字列表記を使うとボックスの仕様をテキスト書式でインポートやエキスポートするのに便利である.
単なる表示用ボックスと演算上意味のあるボックスは記述上違うので注意する.
∖ ( input ∖ ) 内容をボックス表示する
∖ !∖ ( input ∖ ) 内容を演算上意味のあるボックスにする
テキストエディタ等の外部プログラムに
StandardForm のセル内容をコピーすると,
∖ !∖ ( … ∖ ) の書式が必要に応じて使われ式がコピーされる.この書式を使っておけば,ユーザが式をWolframシステムにコピーし直しても,自動的に式を
StandardForm で再構築できる.
∖ !を付けておかないと,単なるボックス表示しかしない式になってしまう.
ノートブックに
∖ !∖ ( … ∖ ) の形でペーストした式は通常,二次元的な数学表記で表示される.
"∖ ( input ∖ ) " 単なる文字列
"∖ !∖ ( input ∖ ) " ボックスを含む文字列
文字列中に起る
∖ ( … ∖ ) の形の記述は単なる文字の羅列としか扱われない.これに対して,
∖ !を追加した形なら,記述文はボックスを表すものとして扱われる.ボックスオブジェクトを普通の文章に組み込むにはこの方法を使うとよい.
\! を加えると,文字列がボックスを含むことになる:
∖ ( box 1 , box 2 , … ∖ ) RowBox [ box 1 , box 2 , … ]
box 1 ∖ ^box 2 SuperscriptBox [ box 1 , box 2 ]
box 1 ∖ _box 2 SubscriptBox [ box 1 , box 2 ]
box 1 ∖ _box 2 ∖ %box 3 SubsuperscriptBox [ box 1 , box 2 , box 3 ]
box 1 ∖ &box 2 OverscriptBox [ box 1 , box 2 ]
box 1 ∖ +box 2 UnderscriptBox [ box 1 , box 2 ]
box 1 ∖ +box 2 ∖ %box 3 UnderoverscriptBox [ box 1 , box 2 , box 3 ]
box 1 ∖ /box 2 FractionBox [ box 1 , box 2 ]
∖ @box SqrtBox [ box ]
\@box 1 \%box 2 RadicalBox [ box 1 , box 2 ]
form ∖ ` box FormBox [ box , form ]
\*input input の解釈から適切なボックスオブジェクトを作成する
ボックスオブジェクトの記述は
∖ ( と
∖ ) でくくっておかなければいけない.一番外側の
∖ ( と
∖ ) の内側になら,
∖ ( と
∖ ) のペアをいくつも使いネスト形のボックス構造を構成できる.
∖ ( と
∖ ) も項のまとめに使うが,表示には現れない:
内側にある
∖ ( と
∖ ) のペアは
RowBox の構成に使っている:
例えば,
aa+bb と式を入力すると,カーネルで
aa ,
+ ,
bb の成分に分解される.各成分はシンボルとして扱われる.
∖ ( … ∖ ) の記述を使いボックスオブジェクトを入力したときもシンボルの分解が行われる.ボックスの入力では文字列の形でシンボルが与えられ,式の入力では演算的に意味ある成分として与えられる,という点が違う.
入力すると,
RowBox になり
aa ,
+ ,
bb の各文字列に分解する:
+ 記号の両脇にスペース記号を入れたが,表示には出ない:
スラッシュ記号(/)の後に何も続けなくても,上の例と同じ形のボックスが作られる:
∖ ( … ∖ ) の内側で記述すれば,
∖ ^と
∖ @のバックスラッシュ記述のボックスを構成できる.他の種類のボックスは,
∖ *に続ける形で標準のWolframシステム式として入力しなければいけない.
∖ *はエスケープのように振る舞い,
∖ ( … ∖ ) の記述中に式を挿入する場合に使う.
∖ *に続ける式の記述の中には,別の
∖ ( … ∖ ) の記述を入れても構わない.
∖ *と
∖ ( … ∖ ) の記述を交互に入力しても構わない.引用符は
∖ ( … ∖ ) 記述の外に出しておく:
∖ !∖ ( input ∖ ) 入力を現行の表記法で解釈する
∖ !∖ ( form ∖ `input ∖ ) 入力を指定の形で解釈する
テキストエディタ等の外部プログラムへセルの内容をコピーすると,バックスラッシュとバッククォートはコピー内容に明示的には含まれない.ただし,別の種類のセルから式をペーストする際は,バックスラッシュとバッククォートを加えておかないと正確な解釈が行われなくなってしまう.
ファイルや外部プログラムのデータを生成する際,通常のキーボード上の文字だけを使う,二次元的な記述が必要とされることがある.これは
OutputForm を使って行うことができる.
キーボードにある文字記号だけを使い数学表記の式を構成し,文字列に変換する:
文字列には
∖ nの改行コードが入れられ2行構成になっている:
行モード的な入力だけしかしないのなら,
ToString を使い文字列の変換操作ができる.
SyntaxQ [ "string "] 文字列の式が文法的に正確しいWolfram言語の入力かどうか検査する
SyntaxLength [ "string "] 文字列が式を表すものとして,先頭からどの位置の文字までが文法的に正確な式の要素を表しているか調べる
式の変換関数
ToExpression は,どのような内容の文字列であれ,とりあえずは式として解釈を進める.このため,式として本来機能しない間違った記述文を与えると,変換不能になり失敗のメッセージが表示され,
$Failed が返ってくる.
SyntaxQ の機能を使いWolfram言語の文法上,文字列が正確に式を表しているか判定できる.
SyntaxQ の答が
False であれば間違いがあるので,
SyntaxLength を使い文字列のどこでエラーが起ったか調べる.
SyntaxLength では文法エラーが起る地点まで検査にパスした文字数が得られる.
SyntaxLength を使うと文字列の長さより大きい値が返ってくる.これは,入力した部分に関しては問題がないが,それに続くはずの要素が見付からなかったことを意味している:
Wolfram言語の文法は組込み済みの変換規則から形作られている.文法の規則に従いテキスト形,ボックス形の式が計算可能な式に変換される.規則の中でも特に
StandardForm と
InputForm に対応した規則は重要で,それらがWolfram言語の中核を構成している.
TraditionalForm に対応した規則は目的は前者と同じだが詳細で異なる.
a
,
xyz
,
α β γ 代数記号
"some text"
,
"α +β " 文字列
123.456
,
3*^45 数値
+
,
->
,
≠ 演算子
( * コメント*) 評価上意味のない入力文
テキスト形式で式を入力すると,Wolframシステムによって演算上意味のある成分に分解される.
例えば,
xx+yy-zzzz と文字列を入力したら,
xx ,
+ ,
yy ,
- ,
zzzz の各成分に分解される.
xx ,
yy ,
zzzz は代数記号を表すシンボルとして扱われ,
+ と
- は演算子として扱われる.
式の演算子が式の構造を決定する.Wolfram言語で有効な演算子は次の表に示す種類がある.種類により演算子と被演算子の相対的な位置関係が違う.
演算子が正確に機能するには所定の位置に被演算子が配置されていることが必要不可欠である.式に複数の演算子があるときはどの演算子が被演算子を先に取り出すかによって式の解釈に違いが出る.
例えば,
a*b+c と入力したら,
* と
+ のどちらが被演算子を先に取り出すかで,
( a*b) +cか
a*( b+c) のどちらにもなり得る.
まぎらわしさを解消するため,演算子には固有の優先度が割り当てられている.優先度が高ければ高いほどその演算子の被演算子がより先に取り出されることになる.
上の例の場合は,乗算
* は加算
+ より優先度が高いので,乗算の被演算子がまず取り出される.従って,
a*b+c は
a*( b+c) ではなく,
( a*b) +cと解釈される.
乗算
* は加算
+ より優先される.どちらの場合も
Times の関数参照が内側にきている:
// は優先度が低いので,この式では最後に適用される:
演算子の優先度がどうであろうと,カッコで式の要素を適切に囲うことで任意の評価順序を強制できる.
代数記号の拡張指定
x _,
#2,
e ::s ,等
関数適用の指定
e [ e ] ,
e @@e ,等
ベキ数の指定
√ e ,
e ^e ,等
∇ e ,
e /e ,
e ⊗ e ,
ee ,等
加算関連の演算指定
e ⊕ e ,
e +e ,
e ⋃ e ,等
関係記号
e ==e ,
e ∼ e ,
e ⪡ e ,
e ⧏ e ,
e ∈ e ,等
ベクトル量の指定
e ⟶ e ,
e ↗ e ,
e ⇌ e ,
e ⥓ e ,等
論理演算記号
∀ e e ,
e &&e ,
e ∨ e ,
e ⊢ e ,等
パターン・規則の指定
e ..,
e | e ,
e ->e ,
e /.e ,等
純粋な関数の指定
e &
割当て記号
e =e ,
e :=e ,等
複文型の式の指定
e ;e
「演算子の入力形」 の表に,演算子や特殊記号が優先度の高い順に列記してあるので参照のこと.
* や
+ 等の多くの演算子の優先順位は数学で使う標準的な順位に対応して設定してある.全体の順位はなるべくカッコを使う必要がなくなるように設定してある.
カッコでくくらなくても演算順位通りの評価順序になる:
最初の要素にはカッコがないが2番目の要素と同じになる.つまり,カッコを付けても付けなくてもよい.3番目の要素はカッコでくくる必要がある:
どれも優先しない
x +y +z x +y +z
先頭ペア要素から評価
x /y /z ( x /y ) /z
末尾ペア要素から評価
x ^y ^z x ^( y ^z )
加算の評価順序を見てみよう.関数
Plus には引数がいくつあってもよい
Flat な関数なので,グループ化は行われない:
次に,ベキ乗の評価順序を見てみる.関数
Power は
Flat ではないので,要素のグループ化が行われる:
Wolfram言語の文法は,キーボードから直接入力できる文字・記号だけでなく,Wolfram言語の提供する数々の特殊文字や記号にも対応している.
,
,
等の特殊文字も標準アルファベット文字と同様に扱われるし,代数記号としても使える.また,
,
,
等の特殊記号も同じように使える.
特殊記号によっては演算子として働くものもある.例えば,
と
は中置形の演算子だし,
は前置形の演算子である.また,
と
は整合辞形の演算子である.
とは中置形の演算子である:
は掛け算の演算子で記号
* と作用は同じである.中置形の演算子でもある:
特殊記号のいくつかは組み合せることによって,複合形の演算子を形成する.例えば,積分式
∫ f x には
∫ と
の特殊記号がセットで使われる.2つ合わせてはじめて機能するので,複合形の演算子といえる.
評価優先度から考えると,
∫ … の優先度は
Times よりも低いので,カッコは不要である:
式の入力は一次元的な行モード入力だけでなく,二次元的な数学表記のボックス形式で入力してもよい.二次元的な入力形態もWolfram言語の文法でカバーしている.
上付き文字のボックス要素はベキ数の指数部と解釈される:
偏微分記号
∂ x f はボックス形の複合形演算子を形成する:
はより複雑な複合形演算子の一部になっている:
演算子としての
は
+ より優先度が高いことに注意:
2+2 と入力すると,
+ が演算子として最初に認識される.結果として式
Plus [ 2, 2] が内部で構築される.次に,
Plus について既知の規則が適用され式が評価され,評価結果
4 が出力される.
ただ,演算子の中には,演算機能的な意味を持たないものもある.Wolfram言語には数百に及ぶ補助的な演算子が提供されており,式の構築に使用できるが,デフォルトの評価規則は特に定義されていない.
これらの記号に演算機能を組み込み,ユーザ定義の演算子として使える.
は中置形の演算子として動作可能だが,機能は何も定義されていない.このため,式は評価されない:
に演算機能を定義する:
今度は,
は演算子として認識されるだけでなく,実際に評価も実行される:
演算子に関連付けられる関数は演算子の名前と同じ名前を持つようになっている.
x \[ name ] y
name
[
x
,
y
]
\[ name ] x
name
[
x
]
\[ Leftname ] x , y , … \[ Rightname ]
name
[
x
,
y
,
…
]
デフォルトでは
CirclePlus や
CircleTimes の関数には演算機能的な意味付けはされていないが,演算子
および
としては,評価優先度が割り付けられている.
「演算子の入力形」 の表にWolfram言語で使える演算子のすべてが優先度順に列記してあるので参照のこと.
下付き文字指定記号には演算機能としては何も定義されていない:
普通の上付き文字指定記号はベキ乗の機能があらかじめ定義されている:
上付き指定記号によってはベキ乗としては認識されないものもある:
入力式の評価法をカスタマイズできるように,出力式の表示書式もカスタマイズできる.カーネルから式が出力される前に書式変更関数
Format [ expr ] が適用される.この関数にカスタム書式をあらかじめ指定しておけば,式の表示様式を自由に変えれる.具体的には,指定したい書式をボックスオブジェクト等で構成し,書式変更関数
Format [ expr ] に割り当てておく.関数が出力式に適用されると,ボックス形の書式に対応した数学記号等が使われ式がカスタム表示される.
bin の要素をグリッドボックスとして表示するよう書式変更関数を定義しておく:
内部表記を見てみると,
bin の項はそのままになっている:
Format [ expr 1 ] :=expr 2 第1式 expr 1 を書式指定用第2式 expr 2 に変換する
Format [ expr 1 , form ] :=expr 2 特定の出力表記のときだけ書式変換を実行する
このように,書式変更関数
Format を個別に定義しておくことで,特定の式を別の形で表示できる.さらに,特定の要素に対応した書式変換法をプログラムに記述しておき,プログラム全体を書式変更関数に割り付けておけば,より複雑な変換が実現できる.
簡単なプログラムを使い
xrep を書式変換するように関数を定義しておく:
書式変換されると
xrep の各要素が引数に対応した長さの文字列の形で表示される:
f を前置形の演算子とし,表示上の演算記号を
<> とする:
演算子
<> は
+ より優先度が高いのでカッコでくくる必要がない:
出力する式にいくつも演算子がある場合,どの演算子の引数をカッコでくくる必要があるのだろうか.また,どうやって見分けるのだろう.実は,演算子の評価優先度に応じてカッコが使われることになっている(
「式の特殊な入力法」 を参照のこと).デフォルトの優先順位が適当でない場合は,関数
PrecedenceForm を使い演算子の優先度が変えられる.指定可能な優先度は1から1000のレベルで,高い値ほど高い優先度を意味し,また,カッコが不要になる方向である.
に優先度
100 を割り付ける.この優先度は低すぎるため,カッコが使われ要素がグループ化される:
Format [ expr ] で式
expr に対応した変換書式を定義すると,現行の出力表記が標準的な出力表記のいずれかである限り変換書式は有効である.また,
Format [ expr , form ] を使えば表記法を限定した上で式
expr の書式変換ができる.
TeX表記で出力させると,上の定義が有効になり,
x の表示書式が変わる:
Wolfram言語には入力式の解釈と出力式の生成のために膨大な数の規則が組み込まれている.それらの規則は,特に,
StandardForm において矛盾がないように設定されている.したがって,
StandardForm の入出力では入力用の式と出力用の式が交換可能になる.
演算子の処理規則をカスタマイズすることは非常にまれであろう.それは必要がないからである.Wolfram言語には多くの機能上未定義な演算子に関しても,入出力処理で使う規則がすでに組み込まれているからである.
例えば,乗算演算子の一般形を作るならば,
等の演算子に入出力処理の規則がすでに定義済みなので,それを使えば用が足りる.
出力式が
の演算子で表示される:
また,入力すると
が演算子であることが認識される:
Format [ expr ] を使い特定の式を特殊書式で表示させる方法は説明したが,一度書式変換した出力式は入力式としては使えなくなってしまうので気を付ける.
必要ならば,基本的な入出力の処理規則から定義し直すことも可能である.つまり,
MakeBoxes と
MakeExpression の割付け式を定義する.ただし,少しでも間違った定義をすると,矛盾してしまうので十分な注意が必要である.
gplus が添数付きの演算子
として表示される:
この記述は入力式として解釈できない.添数付きの
は
gplus として扱われる:
MakeBoxes を使い規則を定義することは,基本的に
Format 機能を使った変換書式の定義付けの低レベル版に相当する.両者の違いは,
MakeBoxes では引数の評価は行われないが,
Format では行われるということにある.したがって,前者を使うときは,変換した式が評価処理を経てどうなるかは全く気にせずに変換規則を組み立てることができる.
さらに,
Format は,それを使って変換して得られた二次的な式に対して再度自動的に適用される.
MakeBoxes は動作が異なり,二次的な式に変換を要するものがあっても特別に
MakeBoxes を適用しない限り変換は起らない.
■ 評価最小単位の要素に分解する.
■ スペース記号等を除去する.
■ 評価優先順に従いボックスを構築する.
■
スタイルボックス(
StyleBox
) 等の評価に無関係なオブジェクトは除去する.
■ MakeExpression 用の変換規則を適用する.
「式のテキスト形入出力」 についてのチュートリアルで説明した関数は表示用の書式をどう変更したらよいか指定するもので,実際の表示作業自体は行わない.
普通,式が処理され出力されると,特にユーザがコマンドを出さなくても自動的に出力式が表示されるようになっている.通常Wolfram言語は,与えられた入力を処理することで得られた最終的な結果を自動的に出力する.それでも,計算式によっては,各計算段階で暫定的な結果を逐次表示できると便利である.そのようなときは,関数
Print を使う.
Print [ expr 1 , expr 2 , … ] 式 expr i を間隔なしで列記する(列記終了時に改行する)
Print は間隔なしで引数を表示するが,最後には改行が入る:
関数
Print は,先に与えられた引数から順番に,間隔なしで引数をそのまま列記する.書式を付けて表示させたければ,
Print の引数部に適当な書式変換用の関数を適用しておけばよい.
Print はテキストとグラフィックスが混在していても使える:
Print で式や文を出力すると,通常,標準的な出力表記で表示される.特別に表記法を指定すればその限りではない.
Wolfram言語には
Print の他にも出力機能がいくつか用意されている.例えば,
「メッセージ」 に記載してあるように
Message と呼ばれるタグ付きメッセージを出力する関数がある.さらに,
「ストリームと低レベルの入出力」 に記した低レベルの関数を使えば,ダイアログセッションにおけるユーザとのやり取りやファイル処理や外部プログラムとのやり取りでカスタム書式で式や文を表示することも可能である.
Print と全く同様に動作するが,最終評価が終わるまで出力だけしか表示しないコマンドに,
PrintTemporary がある.
Wolfram言語はバージョン3以来,任意の数学タイプセットおよびレイアウトに対して十分なサポートを提供してきた.そのパワーの根底にあるのは「ボックス言語」と呼ばれるものであり,これによりノートブック自体がWolfram言語式となるのである.このアプローチは非常に強力になり,Wolframシステムの多数のユニークな機能の基礎を形成した.しかし,ボックス言語のパワーにかかわらず,実際にユーザが直接アクセスするには難しいものであった.
バージョン6から,ボックスを直接使用する面倒くささをほとんど排除しながらも,同じタイプセットおよびレイアウトのパワーがすべて使用できる,このボックス言語の高レベルインターフェースが導入されている.この新しい層の関数は「ボックスジェネレータ」と呼ばれるが,ボックス言語を効率的に使うためにそれを認識しておく必要はない.このチュートリアルでは,広範な式の表示に適したボックスジェネレータを見て,それを使って簡単な数学タイプセットを超えた,きれいにフォーマットされた出力を生成する方法を紹介する.
出力の書式設定Wolframシステムフロントエンドは,フォントの特性の変更メニューを含む,ワープロで使用できる通常のスタイル機能をすべてサポートする.しかし,生成された出力で自動的にこれらのスタイル機能にアクセスすることは非常に難しかった.出力は引き続きほとんど一般的に標準の12ポイントCourier(
TraditionalForm を使っている場合はTimes)である.これを修正するために関数
Style が作成された.
Style 式を評価するたびに,その出力は指定されたスタイル属性をアクティブにして表示される.
Style はどのような種類の式にもラップすることができる.以下の例は,
Style で異なるフォントの重みと色を使った素数および合成数を表示する.
Style で適用することのできるフォーマットオプションは何百もある.詳細は
Style のドキュメントに記載されている.以下にリストするのは,最も一般的なもののいくつかである.
Style は任意の数だけネストすることができ,競合があった場合は最も内側のものが優先される.以下ではリスト全体に
Style をラップし,リストのすべての要素に新しいフォントを適用する.
他に一般的に望まれることは,出力の一部をテキストのようなスタイルにしたいという場合がある.コードで使用することを意図したフォントでテキストが表示されると非常におかしく見えることがある.そのため,関数
Text で引数が常にテキストフォントで描画されるようにする(Wolframシステムグラフィックスに詳しい人は
Text 関数をグラフィックスプリミティブと認識するだろうが,そのように使ってもグラフィックス外ではグラフィックスプリミティブとしての使用とは競合しない).
Style はフォントに関するオプションだけではなく,どのオプションがアクティブであるスクリーン上の領域を設定するために使うことができる.このチュートリアルの後半では,
Style が
Grid や
Tooltip 等の他のフォーマットコンストラクトの属性の表示にどのように影響を与えることができるかを説明する.
格子のレイアウト二次元レイアウト構造を使うことは,その構造にスタイル指示子を適用するのと同様に便利である.Wolfram言語では,そのようなレイアウトのための主な関数は
Grid である.
Grid には配置,枠要素,伸張要素等のものを任意に調整することのできる機能を含む,非常に柔軟なレイアウト機能がある(他のチュートリアルで
Grid の機能について詳しく述べているので,ここでは要点だけを説明する).
ここでもう一度,素数と合成数とを別々に表示する
Style の例題を見てみる.
これを
Grid に入れ,まず
Partition を使いこの100個の要素を10
× 10の配列にする.
Grid に不揃いな配列(要素がころなる長さのリストとなっているリスト)を与えることもできるが,ここでは規則的な配列を与える.結果の表示はきれいにフォーマットされたレイアウトになる.
列は中心に配置され,枠の線はない.
Grid のオプションを使うと,このどちらでも簡単に変更することができる.
Grid のオプションすべてとそのシンタックスについての詳細は,このドキュメントの範疇を超えるが,オプションを使って驚くようなことができる.詳細は
Grid のドキュメントを参照のこと.
Grid に関連した便利なコンストラクトがいくつかある.そのうちのひとつは
Column であり,要素の平坦なリストを取りそれらを縦に配列する.これを
Grid で行うと少しおかしくなる.次の簡単な例では列のオプションを見る.
ではリストを横に並べるにはどうすればよいか.この場合,問題は結果の表示を数式やテキストの行のように改行したいか,1行にとどめたいかである.後者の場合,
Grid を1
× n 配列に適用する.
しかし,以下の例題では格子全体が使用可能なウィンドウ幅に合うように縮小されている.その結果,グリッドの要素で複数行に改行されるものもでてくる.これは
Grid のデフォルトの
ItemSize オプションのために起る.格子の要素が自然の幅になるようにするためには
ItemSize を
Full に設定する.
もちろんこれで,このウィンドウ幅を大きく広げない限り格子全体が1行に収まらないほど広くなった.そのため見えない格子の要素もある.ここで別の水平レイアウト関数の
Row が役に立つ.
Row に要素のリストを与えると,結果全体がテキストや数式の行のように自然に改行される.この種のレイアウトは昔の(現在では使われていない)
SequenceForm 関数を使ったことのある人にとっては馴染みのあるものであろう.
ご覧の通り,
Row はデフォルトで要素間にスペースを空けない.しかし第2引数を与えると,その式は要素間に挿入される.以下ではコンマを使っているが,どのような式でも使える.
ノートブックウィンドウの大きさを変更すると,
ItemSize ->Automatic という設定の
Grid が
Row とは異なる動作をするのが分かる.どちらも状況に応じて便利である.
入力としての出力の使用ここで
Style ,
Grid ,その他すべてのボックスジェネレータは,出力に固執するということを述べておきたい.
Style あるいは
Grid により生成されたあるフォーマットを持つ出力の一部を取り,それを入力として再利用する場合,文字通りの
Style あるいは
Grid 式が入力式に現れる.昔の
StyleBox あるいは
MatrixForm 等の関数に慣れている人は,これが変更点であると分かるであろう.
埋め込まれたスタイルを多数含んでいるこの
Grid コマンドの出力を取り,ある入力式で使ってみる.
格子は格子のままであり,色も青いまま,また要素も前と同様太字とグレーのままである.また,文字通りの
Grid および
Style を式に入れると,スカラーを行列に加えたものと干渉し,結果がベキ乗になる.これらの複合構造はほとんど常に自動的に解釈されないようにしたいものであるから,この違いは非常に重要である.しかしながら,そのようにしたい場合は,ラッパーを外しデータを得ればよいので簡単である.
特殊な格子要素Grid は,より柔軟な2Dレイアウトを作成するために,項目として
SpanFromLeft のような2,3の特殊シンボルを取る.項目
SpanFromLeft は格子のすぐ左の項目がそのスペースと伸張文字のスペースを占めることを意味する.このようなシンボルには
SpanFromAbove と
SpanFromBoth がある.詳細は
「WolframシステムのGrid,Row,Column」 を参照のこと.
このアプローチは,複雑な伸張設定を生成するために使うことができる.入力として以下のようなものをタイプすると,長時間かかる.しかしサブメニューのとを使うと,それをインタラクティブに生成することもできる.手で入植するにはどうすればよいかが見たい場合は,以下のセルを評価するとよい.
これまで,配列や背景を格子全体に,あるいは個々の列あるいは行に適用する方法を見てきた.しかし,各要素についてそれをどのようにオーバーライドするかということである.例えば,格子全体で数個の特別な要素を除いてすべてを同じ背景色にしたいとする.これを行う簡単な方法は,その特別な要素を
Item でラップして,
Grid のオプションをオーバーライドする
Item の対応するオプションを指定することである.
このオプションは
Style でオーバーライドすることもできる.しかし
Item の目的は
Grid の二次元レイアウトについて分かっている方法でオーバーライドすることである.上の出力で分かるように,黄色いセルが2つ隣合せているとこにはその間のスペースに青は入っていない.これは
Item 以外のコンストラクトではできないことである.
これと同じことが
Background だけでなく
Item のオプションすべてについて起る.
Frame オプションを考えてみる.ある指定した要素以外には枠要素は必要ない場合,その要素を設定
Frame ->True の
Grid でラップするであろう(
次のセクション では,任意の式に枠を加えるずっと簡単な方法を紹介する).
しかし,枠の付いた隣接する要素は境界線を同じくしない.これと以下の
Item を使った例を比べてみる.後者は必要以上の沸く要素を描画しないという情報が十分にある.2と11の枠は1つの点を共有し,2と3の枠は1ピクセルの線を共有しており,この線が13と23の枠の左辺と完璧に揃っている.これが
Item のパワーなのである.
枠とラベル式に枠あるいはラベルを加えることは
Grid を使って行えるが,これは一般の二次元レイアウトよりもずっと単純な操作なのでもっと簡単に行うことができる.例えば,
Framed は任意の式の周りに枠を描画するための簡単な関数である.これは,式の一部に注意事項を描画するとき等に便利である.
Labeled もそのような関数のひとつである.これは指定された式の周りの任意の位置にラベルを置くというものである.ここでは上の
Grid の例題に凡例を加える(
Spacer は空のスペースを残しておくための関数である).
Panel もまた枠のコンストラクトであり,オペレーティングシステムに内在するパネル枠を使用する.オペレーティングシステムによりパネル枠にドロップシャドウ,角丸,おしゃれなグラフィックデザイン等異なるものが使われているため,
Panel は
Frame とは異なる.
Panel にはフォントファミリおよびサイズに対して固有の概念があるため,
Grid の内容でフォントファミリとサイズが変更され,
Text でフォントサイズが変更される(
Text にはフォントファミリについて独自の規定があるので,
Text はWolframシステムのテキストフォントのままである).これについては以下の
BaseStyle オプションについてのセクションで触れる.
最後に述べておきたいのは,
Panel では1つ以上のラベルを指定するためのオプショナルの第2引数が取れるということである.このラベルは自動的にパネルの外側に置かれる.またオプショナルの第3引数ではその位置の詳細を指定することができる.詳細は
Panel のドキュメントを参照するとよい.
その他の注釈ここまでで見てきた注釈は,非常に明確な視覚的要素となっていた.しかし,ユーザが必要とするまで実質的に不可視となっている注釈も多数ある.例えば,
Tooltip はその第1引数の表示は変更せず,その表示の上にマウスを置いたときだけ第2引数をツールチップとして表示する.
Mouseover もそのような関数であるが,ツールチップで結果を表示する代りに,マウスポインタをその上に持ってくる前まで表示に使用されていたスクリーン上の同じ部分を使用する.2つの表示の大きさが異なる場合は,その効果が目障りなので,同じ大きさに近い表示を使うか,どちらが表示されているかにかかわらずそのうちの大きい方に十分なスペースを取るための
Mouseover の
ImageSize オプションを使うかした方がよい.
Tooltip に似たものに
StatusArea と
PopupWindow がある.
StatusArea ではノートブックのステータスエリア(通常左下)に追加情報が表示され,
PopupWindow はクリックすると新しいウィンドウに追加情報が表示される.
また
Annotation と
MouseAnnotation を使うことで注釈の位置を指定することができる.
スクリーン上のある領域にマウスポインタを動かすことによってのみ表示される注釈を使うときは,ユーザのことを考えることが大切である.マウスを動かすことで長い評価が始まったり見にくくなったりしてはならない.注釈は慎重に使うとユーザにとって大変便利なものである.
これらの注釈はすべてグラフィックスの中でも十分に使用できる.生成した複雑なグラフィックスがユーザに理解してもらえるよう,ツールチップやマウスオーバーを提供することができる.実際,
ListPlot や
DensityPlot 等の可視化関数でも
Tooltip をサポートする.詳細はドキュメントを参照するとよい.
デフォルトスタイル「枠とラベル」 のセクションで見たように
Panel のようなコンストラクトは,デフォルトのスタイルがこの内容に適用されるような環境を設定するという点で,
Style のように動作する.これは明示的な
Style コマンドでオーバーライドすることができるが,
BaseStyle オプションを使い
Panel でオーバーライドすることもできる.
BaseStyle は
Style で使用するのと同じように,スタイルあるいはスタイル指示子のリストに設定する.するとこれらの指示子はその
Panel のスコープ内の環境デフォルトになる.
前述の通り,
Panel はデフォルトでダイアログのフォントファミリとサイズを使う.しかしそれはこの
BaseStyle オプションを使ってオーバーライドすることができる.
実際にこれらのボックスジェネレータのほとんどすべてには
BaseStyle オプションがある.例えば,デフォルトのフォントの色が青である格子があるとする.内側の
Style ラッパーが外側の
Grid BaseStyle に勝っているため,グレーの要素はグレーのままである(これはオプション継承の主な特徴のひとつであるが,これはこのドキュメントの範疇を超える).
デフォルトオプション仮に
Framed や
Panel 等,同じボックス生成関数が何度も使ってある式があり,そのすべてが同じオプションを持つように変更したいとする.その関数が出てくるたびに同じオプションを加えていくのは面倒であるが,もっと簡単なやり方があるのである.
Style のオプションである
DefaultOptions は,形式
head ->{ opt ->val , … } の要素のリストに設定されると,与えられたボックス生成頭部に対する全体的なデフォルトとして,指定されたオプションを持つ環境を設定する.これらのオプションは
Style ラッパー全体で有効であるが,関連付けられたボックス生成関数の中でのみ有効である.
したがって,多数の
Framed 項目がある場合は,そのすべてが同じ背景および枠のスタイルを描画するようにしたい.
実は,上の入力は,このシンタックスの利点を見るには短かすぎる.同じリストを手動で指定したとすると以下のようになる.
Framed ラッパーのそれぞれにオプション
Background と
FrameStyle を挿入していくことは,できなくはない(あるいはそれを行うプログラムを書くこともできる)が非常に時間がかかる.しかし
DefaultOptions を使うと,すべての
Framed ラッパーが
Background および
FrameStyle に対する設定を使用するような環境が設定できる.
このアプローチにより,複数の場所でスタイルを指定する必要なく,一様なスタイルガイドラインに従う構造が簡単に生成できる.これだとコードも簡潔で,ファイルサイズも小さく管理が楽である.
数式のタイプセットフォーマット出力を語る場合,数学的シンタックスに特有のフォーマットコンストラクトについて触れないわけにはいかない.
これらについて長々と説明はしないが,これらのコンストラクトにはカーネルにおいて組み込まれた数学的意味は持っていないということは言っておきたい.例えば,
Superscript [ a , b ] は
Power [ a , b ] と同様に表示されるが,この二つは同じものとは解釈されない.よって,表示に影響する意味を心配することなくフォーマット出力でこれらを構造要素として使うことができる.
ボックス言語の使用すでにボックス言語をよくご存知の方は,これらのボックス生成関数が,低レベルボックスの構築およびそれらの出力の一部への挿入を妨害しているように思われることがあるかもしれない.これは一つの抽象化層がその下にある層を隠そうとするすべての層を使ったテクノロジーで起る.しかしこれには簡単な抜け穴があり,
RawBoxes を使って有効だと分かっているボックスを取り,出力に直接表示することができるのである.
どの抜け穴でもそうであるように,
RawBoxes で柔軟性が増すがそれで墓穴を掘ることもある.注意深く使わなければならない.まだボックス言語についてよく分かっていない場合は,使わない方がよい.
Wolfram言語のGrid,Row,Column
基本的コンストラクトWolfram言語は,スクリーンあるいはページ上に内容をレイアウトするための,後半に及ぶパワフルなコンストラクトを提供する.このコンストラクトは,初心者にとってもすぐに役立つものとして設計されており,しかも,あらゆる外観の部分に対しても細かい調整が可能である.
これらのコンストラクトは,タイプセット構造としてノートブック内に現れるコンストラクト,格子上に配列される内容を持つグラフィックスを生成する関数,フォーマットの詳細を調節するために格子内部に現れるコンストラクトの3つに分けることができる.
Grid ,
Column ,
Row はこのチュートリアルでGrid族と呼ぶ,最初のグループを形成する.Grid族を定義付ける特徴は,それがWolfram言語のタイプセットシステムと密接に統合された部分であるということである.つまり,どのような式であろうと内容として現れ,コンストラクト自身がウィンドウ幅あるいはその要素の大きさ等の変更に反応するということである.他のタイプセットコンストラクトと同様,Grid族のメンバは不活性なコンストラクトであり,評価されて別の形式になることはない.
これに匹敵するコンストラクトであるGraphics Grid族は,グラフィックスを扱う場合に特に便利な機能をサポートする.これらのコンストラクトは
GraphicsGrid ,
GraphicsColumn ,
GraphicsRow である.グラフィックスはGrid族で使うことができるが,サイズ変更と編集をサポートするGraphics Grid族はよりグラフィックスに向いている.Graphics Grid族は引数を取り新しいグラフィックス式へと評価される関数である.このことは,生成された格子をその環境での変化に反応させることは難しいが,インタラクティブに任意の注釈を加えたり,グラフィックスを追加したりが簡単にできるということを意味する.
最後の族である埋め込まれたコンストラクト族は格子自身の中に埋め込まれているコンストラクトから構成され,その内部から格子の外観を変更する.
Item は格子の要素が現れる領域を表すためにその周りをラップする.
SpanFromLeft ,
SpanFromAbove ,
SpanFromBoth は複数の行や列に渡り伸張する領域を生成するために使われる.
これらすべてのコンストラクトの基本的な例を以下に挙げる.
Grid族
Grid [ { { expr 11 , expr 12 , … } , { expr 21 , expr 22 , … } , … } ]
二次元の格子に配列された expr ij でフォーマットするオブジェクト
Column [ { expr 1 , expr 2 , … } ] expr 1 が expr 2 の上,というように列に配列された expr i でフォーマットするオブジェクト
Row [ { expr 1 , expr 2 , … } ] 数行に伸張する可能性のある行に配列された expr i でフォーマットするオブジェクト
Graphics Grid族
GraphicsGrid [ { { g 11 , g 12 , … } , … } ] g ij が二次元格子にレイアウトされるようなグラフィックスを生成する
GraphicsColumn [ { g 1 , g 2 , … } ] g 1 が g 2 の上というように,g i が列にレイアウトされるようなグラフィックスを生成する
GraphicsRow [ { g 1 , g 2 , … } ] g i が行にレイアウトされるようなグラフィックスを生成する
二次元グラフィックスレイアウト関数のGraphics Grid族
埋め込まれたコンストラクト族GridおよびGraphics Grid族の中の要素として埋め込まれたときに特殊な意味を持つコンストラクト
機能のクラスGrid およびその関連コンストラクトは,通常非常に少ないシンタックスでかなり外観をカスタマイズすることができる.下の表はサポートされる機能の種類を示している.詳細は後で説明する.
格子の領域を分割するために,枠と分割線をどこにおいてもよい.
格子とその内容は,多くの方法で配列および配置することができる.
1.234`
12.34`
123.4`
1234.`
"first" 1
"second" 100
"last" 1000
{,}
構造は伸張要素や自身が格子である要素を使って,精巧なものにすることができる.
オプションのシンタックス 格子の外観の詳細を調整するために,多数のオプションが使える.このセクションでは,そのようなオプションの多くで共有される共通のシンタックスを説明する.このシンタックスは格子全体にオプション値を割り当てるだけでなく,個々の行,列,さらには項目にまでオプション値を割り当てる方法を提供する.
Background 等,多くのオプションに対する全体的なシンタックスは,Background ->{ spec x , spec y } のような形式に基づく.ここで spec x は各列に対する値を含むモジュラシンタックスであり,spec y は各列に対する値を含む.
spec spec をすべての項目に適用する
{ spec x } spec x を連続した水平の位置で適用する
{ spec x , spec y } spec k を連続した水平および垂直の位置で適用する
{ spec x , spec y , rules } 個々の i , j 要素に対する明示的な規則も許可する
spec x と
spec y はどちらも,以下に説明する2つの形式を取ることができる.最初の形式は,指標の集合で所望の値に対する規則を与えるだけのものである.2つ目の形式は,値の列をリストで与えるということに基づいている.
上と等価である,連続した列に対して使用する背景色の値のリスト:
この2つのメソッドには,「規則の使用」 および「リストの使用」 に示すようにそれぞれ異なる利点がある.
規則の使用 規則は指定の行および列に指定の値を与えるという,直接的で判読可能なメソッドを提供する.
行数や列数が多いときは,規則を使うとそのいくつかに属性を設定するのに便利である.
可能な位置の中でわずかな数だけにオプションを適用する:
規則は,特定の格子要素や部分領域に値を与えるためにも使える.しかし,次に示すシンタックスは,概念的には同様でも spec x および spec y とは別のものである.
要素
{ 1, 1} から
{ 3, 3} までの領域に背景色を設定する:
規則は,規則の例外が存在する場合に,それが簡単に指定できる.しかし,格子のそれぞれの要素に手動で値を指定しようとしている場合は,それほど効率的とはいえない.
反復パターンを作成するためには,代りに次のセクション で説明するリストシンタックスを使った方がよい.
リストの使用 リストで連続した値を与えることは,隣接行および列に対する多数のオプション値を指定するのに簡単で便利な方法である.
また,値を循環的に使うことを表す部分リストを使うこともできる.
このような循環的な部分リストは,最初か最後で充填することができる.
リストの位置は格子の位置に対応しているので,中ほどで単独の値を指定するためにはその前までの値をすべて与えなければならない.これをより直接的に行うためには,「規則の使用」 で説明した規則を使う.
両方の使用 両方の長所を取り,格子の反復部分の指定にはリストシンタックスを,例外の指定には規則シンタックスを使うことができる.
最初と最後は赤にして,その他は青と緑を交互にした列:
{ s 1 , s 2 , … , s n } s 1 から s n まで使う.その後はデフォルトを使う
{ { c } } すべての場合に c を使う
{ { c 1 , c 2 } } c 1 と c 2 を交互に使う
{ { c 1 , c 2 , … } } すべての c i を循環的に使う
{ s , { c } } s を使う.その後は c を反復的に使う
{ s 1 , { c } , s n } s 1 を使う.その後は c を反復的に使い,最後に s n を使う
{ s 1 , s 2 , … , { c 1 ,
c 2 , … } ,
s m , … ,
s n
}
最初に s i の最初の列を使う.その後 c i を循環的に使用し,最後に s i の最後の列を使う
{ s 1 , s 2 , … , { } , s m , … , s n } 最初に s i の最初の列を使い,サイトに最後の列を使う
{ i 1 ->v 1 , i 2 ->v 2 , … } 位置 i k で何を使うかを指定する
{ spec , rules } spec の指定をオーバーライドするために rules を使う
spec x と
spec y のシンタックスのまとめ
列,行,溝,項目前のセクション で紹介した通り,Wolfram言語は格子の部分に応じてオプション値を変更するための柔軟なシンタックスを提供する.このセクションでは,その言語のコンテキストを提供し,細かい違いを述べる.
column 項目の垂直の列
row 項目の水平の列
item 格子要素を含む領域
gutter 連続する行あるいは列の境界
Grid およびGraphicsGrid は格子の各部分を記述する場合と同じ慣習に従う.Column ,GraphicsColumn ,GraphicsRow も同じ一般的な慣習に従うが,2つの可能な次元のうちのひとつだけしか扱わない.また,Row はこのシステムには入らない.
オプションの名前 以下の表は,それぞれのオプションが対処することのできる部分を示したものである.すべてのコンストラクトに対してすべてのオプションが有効であるとは限らない.任意のコンストラクトに対して生じ得るオプションは以下の凡例を参照.
Row はどのようなオプションも取らない.
列の次に行 オプションに対するシンタックスを覚えるときに,最も重要なステップは列に対する値をまず指定し,次に行に対する値を指定するということである.
opt ->val すべての項目に対して val を使う
opt ->{ colspec , rowspec } 列に colspec を,行に rowpec を使う
opt ->{ colspec } 列に colspec を,行にデフォルトを使う
Wolfram言語では,水平設定 h ,垂直設定 v のオプションは opt ->{ h , v } と指定する.この慣例が使われる代表的なオプションにImageSize とPlotRange がある.
格子では,これらの水平および垂直設定はそれぞれ列と行の値に対応する.これは,列は水平に重なっており,幅や位置等その他の属性も水平次元に対応しているためである.同様に行は垂直に重なっており,それらの属性は水平次元に対応している.
下の格子では,項目の幅が2em,高さが1exである:
すべての列に同一の幅を使う代りに,各列に別の設定を与える:
連続する水平位置に異なる背景色を与えることもできる:
溝 多くのGrid オプションは,最終的に列,行,または格子内の項目に関連付けることができる.
しかし,行と列の間の溝を扱うオプションもある.
Dividers とSpacings のシンタックスは,他のオプションのシンタックスと全く同じである.特定の方向の n 項目の格子では,Dividers とSpacings は,最初の要素の前から始めて最後の要素の後で終わるようにして,要素間に n +1 の隙間を指定することができる.
Items 最も細かい記述レベルはItemである.格子の中の各項目は,Background ,Alignment ,Frame 等のオプションに対して,それぞれの値を持つことができる.
Item は所望の設定を示すために明示的に使うことができる:
あるいは要素の
{ i , j } 指標を使い,全体的な格子レベルで値を割り当てることもできる:
仕切り線と枠Wolfram言語は格子にどのような仕切り線と枠を描画するかを記述するための広範なシステムを提供する.
Frame を使い,領域あるいは領域の集合の4方すべてに線を引く:
Frame は常に囲まれた領域の4方すべてに線を描画する.Dividers を使うとより細かく指定することができる.
仕切り線を使うときは,結果の線は1つの方向だけである.
仕切り線と枠のスタイル
一般に,
Hue ,
Thickness ,
Dashing ,
Dotted 等を含むどのような線あるいは色の指示子を使うこともできる.複数の指示子は
Directive で組み合せることができる.
優先 矛盾したスタイルが与えられると,Dividers がFrame に優先する.またこれらはどちらもFrameStyle に優先する.Item のスタイルは他のすべてに優先する.
異なるソースからのスタイルは一緒にすることができる:
整列と位置美しい格子には整列を必要とすることが多い.Wolfram言語では格子の整列方法を多数サポートしている.
Alignment オプションはグリッド全体に渡すことができる.
異なる列に対して異なる水平整列を,異なる行に対して異なる垂直整列を指定することができる.
最初の列を右に整列させ,2番目の列を左に整列させる:
位置
{ 1, 1} の要素を左に,位置
{ 1, 2} の要素を右に整列させる:
小数点,あるいは他の文字を整列させることができる.
取り囲まれた環境の中で格子の位置を決めるには
BaselinePosition を使うとよい.
{ 2, 1} 要素のベースラインが全体的なベースラインになるよう格子を整列させる:
背景とスタイル 一般的な場合要素の集まりを扱う場合,
Grid を使うとそれを一様な背景で設定することができる.
要素にはそれ自身の背景色があることもあるが,要素を並べただけでは不格好な隙間ができることがある.
Grid およびその関連関数は,その要素を含むすべての項目全体に背景色を施す.
より高度なシンタックスを使うと,さまざまなパターンを作成することができる.
オーバーラップする背景設定の優先順位以下のリストシンタックスで与えられる背景は交差する:
伸張とネスト二次元空間の高度な分割は,ネストされた格子のコンストラクトおよび/または伸張要素の使用で実現できる.
名前の通り,伸張要素とは項目が複数の列,行,その両方に渡り伸びるものである.
伸張領域は長方形でなければならない.長方形に収まらない項目は伸張させることができないため,伸張文字を表示する.
伸張要素を使うと多数のレイアウトが実現できるが,グリッドコンストラクトをネストしただけの方が速く簡単なことがある:
複雑な格子では特にそうであるが,特別に所望される構造を生成するためには,伸張の複雑なシステムを設計しようとするよりも,
Row および
Column を使った方が簡単である.
サイズ変更とスペース 格子のサイズ変更Grid は通常その要素の大きさを変更しない.また,行と列はデフォルトで内容が表示できるようできるだけ狭くなっている.
上の例では,2行目の方が1行目よりずっと高く,2列目の方が1列目よりも狭くなっており,要素の大きさは全く変更されていない.
もし格子の中の要素がインタラクティブに,または動的に変更されると,格子全体の大きさが適切に調整される.
例外として,Button はデフォルトで利用可能なスペースを満たすよう拡張する.
ItemSize を使うとデフォルトの動作をオーバーライドすることができる.
ItemSize 対して使われる単位は「ex」,「em」として知られるタイプセット単位である.
Scaled を使うと,囲んでいる領域の割合として幅を指定することもできる.
最初の2つの列をそれぞれページ幅の.3に指定する:
格子の中の改行 列が狭すぎる場合,テキスト的な項目は改行される.この場合行は指定の最小値よりも高くなる.
GraphicsGridのサイズ変更GraphicsGrid はデフォルトで項目がすべて同じ大きさの格子を返す.
これは要素全体に対して適切な縦横比を自動的に選ぶ.
これとGrid の例を比較してみると,後者は全体の大きさも縦横比も考慮しないことが分かる.
GraphicsGrid はItemSize オプションはサポートしないがImageSize はサポートする.
Wolfram言語の通常の動作では,ユーザにより入力される式が評価対象になる.しかし,プログラムの記述では,ユーザから段階的に入力を要求したい場合もある.そのようなときは,
Input と
InputString の入力取込み機能が使える.
Input と
InputString の動作はシステム動作環境や使っているWolfram言語のインターフェースにより違ってくる.テキスト型インターフェースを使っている場合は,通常,キーボードからの入力待ちになり,入力終了時に改行が実行される.一方,ノートブック型インターフェースの場合は,対話用の「ダイアログボックス」が表示されユーザからの入力が取り込まれる.
入力形態としては,
Input には自己完結型の式が入力可能であり,また,
InputString には任意の文字列が入力可能である.
計算時に発生するメッセージはすべて一般規定に基づいて処理される.組込み関数の多くがこの一般規定を使いエラーや警告用メッセージを生成している.ユーザ定義の関数についてもこの規定に基づいてメッセージを構築できるようになっている.
メッセージ構築の基本は,
symbol ::tag の形式でメッセージに固有の名前を与えることである.メッセージの参照はすべてこの名前を使う(
symbol ::tag はオブジェクトであり,その頭部は
MessageName になる).
Quiet [ expr ] メッセージを出力しないで expr を評価する
Quiet [ expr , { s 1 ::tag , s 2 ::tag , … } ] 指定されたメッセージを出力しないで expr を評価する
Off [ s ::tag ] メッセージの表示を禁止にする
On [ s ::tag ] メッセージを表示する
「警告とメッセージ」 で説明したように,
Quiet を使って評価中の特定のメッセージの出力を制御することができる.組込み関数に関するメッセージの多くはデフォルトでオンの状態にある.メッセージを継続的に非表示にしたい場合は,
Off を使うとよい.
式を入力すると,警告メッセージが表示される.また,フロントエンドは,余分は引数を赤でハイライトする:
メッセージは次の評価では再び表示されるようになる:
On と
Off を使うと,特定のメッセージの出力を大域的に変更することができる.メッセージが見たくない場合は
Off を使う.
メッセージを表示禁止にするにはこのように命令しておく:
組込み関数に関するメッセージの多くはデフォルトでオンの状態にあるが,メッセージによってはデフォルトでオフのものもある.それらはオンにしなければ表示されない.例として
General ::newsymのメッセージがある(詳細は
「シンボル生成処理の内容確認」 を参照のこと).このメッセージは新規にメッセージが定義されると表示されるものである.
s ::tag メッセージの内容を表示する
s ::tag =string メッセージの内容文を名前に割り付ける
Messages [ s ] 式s に関連付けられているメッセージをすべて列記する
名前が
s ::tag であるメッセージ文は,シンボル
s に関連した
s ::tag の「値」として保管される.メッセージ文を見るには
s ::tag と入力する.また,新たに
s ::tag に割り付けることで別のメッセージ内容を表示させることも可能である.
警告が出た式をまた入力する.今度は,ユーザ定義のメッセージが表示される:
メッセージ文は
StringForm に対応した書式付きの文字列として記述される.あるイベントについてメッセージが出力されるとき,イベントを引き起した式が書式指定に従いメッセージ文に代入される.式自体は
HoldForm がかけられ評価保留になる.また,
StringForm で式が代入処理される前に,メッセージ表示の前処理関数指定の大域変数
$MessagePrePrint に割り付けられている関数があれば式に適用される.
$MessagePrePrint のデフォルトでは,テキストのフォーマットには
Short が,タイプセットには
Short と
Shallow の組合せが使われる.
メッセージのほとんどはそれを使う関数に密着した内容になっている.これに対して,特定の関数には直接関連付けされない「一般的な」メッセージもある.
関数
F に必要な数の引数を与えなかったら,
F ::argxに登録されている警告メッセージが表示される.もし
F ::argxに何も登録されていなければ,引数不正に関する「一般的な」メッセージ,
General ::argxが表示されることになっている.また,
Off [ F ::argx] と入力しておけば,
F に関する引数警告メッセージだけを表示禁止にできる.さらに,
Off [ General ::argx] と入力しておくと,引数警告用の一般メッセージを表示禁止にする.
多すぎる引数を入力する.引数の数が不正という警告文が表示される:
引数の数が不正というメッセージは一般的なもので,実際,多くの関数で使われる:
Sqrt ::argxに
Quiet を使うことで
Sqrt 関数により発せられるメッセージを非表示にできるが,他の関数により発せられるものは非表示にはできない.
以下は
Sin ::argxメッセージを出力するが
Sqrt ::argxは出力しない:
General ::argxを無効にすると,
General ::argxを使うメッセージすべてが表示されなくなる.
F ::tag メッセージが
General ::tag を使っていないとき,
General ::tag を非表示にしても
F ::tag は非表示にならない.例えば,
General ::targメッセージを無効にしても
Entropy ::targメッセージは無効にならない.それはこの2つのメッセージが同じものではないからである.
計算処理がうまくいかないと,よく警告メッセージが何回も表示される.同じことを繰り返して表示してもあまり意味がないし,かえって,混乱させてしまうだろう.そこで,計算中に発生したメッセージはすべてWolfram言語内部に一時貯めこまれ,同じメッセージが3回連続して発生した場合,次からの表示が禁止になる.この事態が起ると,一般形メッセージ
General ::stopが表示されるようになっている.すべてのメッセージが見たい場合は
General ::stopをオフにしておく.
Wolfram言語の内部には
$MessageList の名前でリストスペースが確保され,計算が行われるたびに処理中に発生するメッセージがすべて記録される.標準設定の計算セッションでは,このリストは新たな出力行が生成された時点でクリアされてしまう.それでも,計算中にこのリストを参照することができる.また,
n 番目の出力行が生成されるときには,最終メッセージリスト
$MessageList の内容がコピーされ
MessageList [ n ] として別に保管される.
メッセージの名前には
HoldForm がかけられているので,評価の対象にはならない:
計算プログラムを作っているときには,どんなメッセージであってもそれが生成されたかどうかを自動検出できることが重要になる.例えば,計算の結果,数値が確定不能になると,あるメッセージが発生する.その場合の計算結果は多分無意味なものだろう.
Check [ expr , failexpr ] 式 expr の評価でメッセージが発生しなかったら expr の評価結果を返し,そうでなければ式 failexpr を返す
Check [ expr , failexpr , s 1 ::t 1 , s 2 ::t 2 , … ] 指定メッセージ s i :: t i に限って自動検出する
1^0 の計算では何もメッセージが発生しない.計算値がそのまま返ってくる:
0^0 を計算させると,今度は,メッセージが表示され,
Check の第2引数が返される:
Check [ expr , failexpr ] の機能を使いメッセージ出力があったかどうか検出できる.ただし,
Off で表示禁止になっているメッセージについては検出機能は働かない.
特定のメッセージに関してだけ自動検出した方が効果的になることがある.例えば,数値演算におけるオーバーフローのメッセージだけを検出したい場合がある.限定するには
Check の引数に検出したいメッセージの名前を指定しておく.
Sin [ 1, 2] の計算で発生するメッセージは
Check では無視される.指定したメッセージではないからである:
Message [ s ::tag ] メッセージの内容文を表示する
Message [ s ::tag , expr 1 , … ] メッセージに式 expr i を代入して構成した文を表示する
メッセージ関数
Message を使い組込み関数の行うメッセージ出力の詳細を再現することができる.例えば,
On と
Off 関数を使い関数のメッセージ表示をオン・オフし,もし,あるとき,メッセージ
s ::tag が表示禁止になっていたら,
Message が自動的に一般メッセージ
General ::tag を返してくれる.
f がオーバーフローを起したときに表示するメッセージの内容を定義しておく:
f の引数が10より大きいのでオーバーフロー状態になり,メッセージが表示される:
Message の動作ステップとして,まず,指定した名前(頭部とタグ)のメッセージが検索される.見付からないときは,指定タグに関連した記号
General のメッセージが検索される.それもない場合は,
$NewMessage の大域変数に割り付けられている関数を参照し,指定頭部とタグを引数として同関数を適用する.
$NewMessage を適当に設定しておくことで,例えば,特定のメッセージについて,それがはじめて必要になったときにはファイルからメッセージ文を読み込むようにすることも可能である.
標準版の組込み関数用メッセージは米国英語に対応した形で記述してある.Wolframシステムの言語別バージョンによっては英語以外の言語で記述したメッセージも提供されている.また,ユーザ定義のメッセージも英語以外の言語で記述できるようになっている.
言語指定は英語の言語名(文字列)で行われる.英語読みの名前が使われる理由は,特殊文字を必要としないためである.例えば,フランス語を指定するなら,
"French" とする.
フランス語に対応したメッセージ環境を設定しておく:
使用中のWolframシステムのバージョンがフランス語のメッセージを持つ場合,ここで生成されるメッセージはフランス語となる:
symbol ::tag メッセージ指定のデフォルト書式
symbol ::tag ::Language 特定言語で書かれたメッセージの指定書式
関数処理でメッセージ表示の要求があると,まず
$Language の言語指定が参照され,
s ::t ::Language の言語別メッセージが検索される.見付からない場合は,
s ::t の標準英語メッセージが使われる.
組込み関数で取られる上記の検索ステップは,
Message を使い
s ::t のメッセージをユーザ定義の関数から表示するときにも使われる.ただし,メッセージ指定に言語を明示した場合は,その言語のメッセージしか検索されないので注意する.
Wolfram言語にはプログラムに説明を加えるための手法がいろいろ用意されている.しかし,プログラムを分かりやすくするという意味では,特別な説明を加えるより先に,使うオブジェクトに動作・作用が直ちに分かるような意味のある名前を付けるということがより重要だろう.
それでも,プログラムの機能や流れを分かりやすくするため説明を加えるとよい.これには,いわゆるコメント文を書き入れることになるが,式の記述と区別するため,説明文の文頭と末尾にカッコとアスタリスクの組合せ記号を加える.つまり,
( * 説明文
*) というようにする.Wolfram言語では
( * と
*) で囲まれたコメント文はどのようにネストすることもできる.
( *text *) コメント文はプログラムコードのどこに入れてもよい
プログラムを書く上での約束事として,関数を定義したら「使い方メッセージ」を設けておき,関数の基本機能等が参照できるようにしておく.関数に使い方メッセージを登録するには
f ::usageの名前に使い方を説明した文を割り付ける.メッセージを参照するには
?f と入力する.
f ::usage="text "関数の使い方メッセージを定義する
?f 関数の使い方メッセージを参照する
??f 関数に関してより詳細な情報を得る
??f で詳細な情報を求める.
f の定義式自体も見られる:
単に
f の名前で関数定義だけをしたのなら,
?f と入力すれば
f の値が表示される.関数の使い方メッセージも定義してあれば,
?f と入力すると使い方メッセージだけが表示される.また,
??f と入力すれば,関数定義式を含む
f に関する詳細な情報が表示される.
1つの関数に関して
? で情報を検索するとその関数の使い方メッセージの全文が参照できる.メタキャラクタ等を使い複数の関数について情報の参照をした場合は,検索された関数名のみが,可能な場合は使用法メッセージへのリンクとともに表示される.
これは,Wolfram言語のシンボルの中で「Plot」で始まるものすべてである:
テキスト型インターフェースでは,メッセージとコメント文がプログラムに関する主要な情報源になる.ノートブック型インターフェースを使っている場合は,テキストセルの形で提供されるより詳細な説明が得られる.