フォーマット出力

Wolfram言語はバージョン3以来,任意の数学タイプセットおよびレイアウトに対して十分なサポートを提供してきた.そのパワーの根底にあるのは「ボックス言語」と呼ばれるものであり,これによりノートブック自体がWolfram言語式となるのである.このアプローチは非常に強力になり,Wolframシステムの多数のユニークな機能の基礎を形成した.しかし,ボックス言語のパワーにかかわらず,実際にユーザが直接アクセスするには難しいものであった.

バージョン6から,ボックスを直接使用する面倒くささをほとんど排除しながらも,同じタイプセットおよびレイアウトのパワーがすべて使用できる,このボックス言語の高レベルインターフェースが導入されている.この新しい層の関数は「ボックスジェネレータ」と呼ばれるが,ボックス言語を効率的に使うためにそれを認識しておく必要はない.このチュートリアルでは,広範な式の表示に適したボックスジェネレータを見て,それを使って簡単な数学タイプセットを超えた,きれいにフォーマットされた出力を生成する方法を紹介する.

出力のスタイル

Wolframシステムフロントエンドは,フォントの特性の変更メニューを含む,ワープロで使用できる通常のスタイル機能をすべてサポートする.しかし,生成された出力で自動的にこれらのスタイル機能にアクセスすることは非常に難しかった.出力は引き続きほとんど一般的に標準の12ポイントCourier(TraditionalFormを使っている場合はTimes)である.これを修正するために関数Styleが作成された.Style式を評価するたびに,その出力は指定されたスタイル属性をアクティブにして表示される.

Styleはどのような種類の式にもラップすることができる.以下の例は,Styleで異なるフォントの重みと色を使った素数および合成数を表示する.

In[1]:=
Click for copyable input
Out[1]=

Styleで適用することのできるフォーマットオプションは何百もある.詳細はStyleのドキュメントに記載されている.以下にリストするのは,最も一般的なもののいくつかである.

メニュー
Style[] オプション
Style[] 指示子
書式 サイズ 14FontSize->1414
書式 文字の色 FontColor->GrayGray
書式 文字飾り 太字FontWeight->BoldBold
書式 文字飾り 斜体FontSlant->ItalicItalic
書式 背景色 Background->Yellow
書式 フォントFontFamily->"Times"
書式 スタイル Subsection"Subsection"

Styleは任意の数だけネストすることができ,競合があった場合は最も内側のものが優先される.以下ではリスト全体にStyleをラップし,リストのすべての要素に新しいフォントを適用する.

In[2]:=
Click for copyable input
Out[2]=

他に一般的に望まれることは,出力の一部をテキストのようなスタイルにしたいという場合がある.コードで使用することを意図したフォントでテキストが表示されると非常におかしく見えることがある.そのため,関数Textで引数が常にテキストフォントで描画されるようにする(Wolframシステムグラフィックスに詳しい人はText関数をグラフィックスプリミティブと認識するだろうが,そのように使ってもグラフィックス外ではグラフィックスプリミティブとしての使用とは競合しない).

In[3]:=
Click for copyable input
Out[3]=

Styleはフォントに関するオプションだけではなく,どのオプションがアクティブであるスクリーン上の領域を設定するために使うことができる.このチュートリアルの後半では,StyleGridTooltip等の他のフォーマットコンストラクトの属性の表示にどのように影響を与えることができるかを説明する.

格子のレイアウト

二次元レイアウト構造を使うことは,その構造にスタイル指示子を適用するのと同様に便利である.Wolfram言語では,そのようなレイアウトのための主な関数はGridである.Gridには配置,枠要素,伸張要素等のものを任意に調整することのできる機能を含む,非常に柔軟なレイアウト機能がある(他のチュートリアルでGridの機能について詳しく述べているので,ここでは要点だけを説明する).

ここでもう一度,素数と合成数とを別々に表示するStyleの例題を見てみる.

In[11]:=
Click for copyable input

これをGridに入れ,まずPartitionを使いこの100個の要素を10×10の配列にする.Gridに不揃いな配列(要素がころなる長さのリストとなっているリスト)を与えることもできるが,ここでは規則的な配列を与える.結果の表示はきれいにフォーマットされたレイアウトになる.

Click for copyable input

列は中心に配置され,枠の線はない.Gridのオプションを使うと,このどちらでも簡単に変更することができる.

Click for copyable input

Gridのオプションすべてとそのシンタックスについての詳細は,このドキュメントの範疇を超えるが,オプションを使って驚くようなことができる.詳細はGridのドキュメントを参照のこと.

Gridに関連した便利なコンストラクトがいくつかある.そのうちのひとつはColumnであり,要素の平坦なリストを取りそれらを縦に配列する.これをGridで行うと少しおかしくなる.次の簡単な例では列のオプションを見る.

Click for copyable input

ではリストを横に並べるにはどうすればよいか.この場合,問題は結果の表示を数式やテキストの行のように改行したいか,1行にとどめたいかである.後者の場合,Gridを1× n 配列に適用する.

In[5]:=
Click for copyable input
Out[5]=

しかし,以下の例題では格子全体が使用可能なウィンドウ幅に合うように縮小されている.その結果,グリッドの要素で複数行に改行されるものもでてくる.これはGridのデフォルトのItemSizeオプションのために起る.格子の要素が自然の幅になるようにするためにはItemSizeFullに設定する.

In[7]:=
Click for copyable input
Out[7]=

もちろんこれで,このウィンドウ幅を大きく広げない限り格子全体が1行に収まらないほど広くなった.そのため見えない格子の要素もある.ここで別の水平レイアウト関数のRowが役に立つ.

Rowに要素のリストを与えると,結果全体がテキストや数式の行のように自然に改行される.この種のレイアウトは昔の(現在では使われていない)SequenceForm関数を使ったことのある人にとっては馴染みのあるものであろう.

Click for copyable input

ご覧の通り,Rowはデフォルトで要素間にスペースを空けない.しかし第2引数を与えると,その式は要素間に挿入される.以下ではコンマを使っているが,どのような式でも使える.

Click for copyable input

ノートブックウィンドウの大きさを変更すると,ItemSize->Automaticという設定のGridRowとは異なる動作をするのが分かる.どちらも状況に応じて便利である.

入力としての出力の使用

ここでStyleGrid,その他すべてのボックスジェネレータは,出力に固執するということを述べておきたい.StyleあるいはGridにより生成されたあるフォーマットを持つ出力の一部を取り,それを入力として再利用する場合,文字通りのStyleあるいはGrid式が入力式に現れる.昔のStyleBoxあるいはMatrixForm等の関数に慣れている人は,これが変更点であると分かるであろう.

埋め込まれたスタイルを多数含んでいるこのGridコマンドの出力を取り,ある入力式で使ってみる.

In[17]:=
Click for copyable input
Out[17]=
In[18]:=
Click for copyable input
Out[18]=

格子は格子のままであり,色も青いまま,また要素も前と同様太字とグレーのままである.また,文字通りのGridおよびStyleを式に入れると,スカラーを行列に加えたものと干渉し,結果がベキ乗になる.これらの複合構造はほとんど常に自動的に解釈されないようにしたいものであるから,この違いは非常に重要である.しかしながら,そのようにしたい場合は,ラッパーを外しデータを得ればよいので簡単である.

In[19]:=
Click for copyable input
Out[19]=

特殊な格子要素

Gridは,より柔軟な2Dレイアウトを作成するために,項目としてSpanFromLeftのような2,3の特殊シンボルを取る.項目SpanFromLeftは格子のすぐ左の項目がそのスペースと伸張文字のスペースを占めることを意味する.このようなシンボルにはSpanFromAboveSpanFromBothがある.詳細は「WolframシステムのGrid,Row,Column」を参照のこと.

Click for copyable input

このアプローチは,複雑な伸張設定を生成するために使うことができる.入力として以下のようなものをタイプすると,長時間かかる.しかし挿入 表・行列サブメニューの要素の結合要素の分割を使うと,それをインタラクティブに生成することもできる.手で入植するにはどうすればよいかが見たい場合は,以下のセルを評価するとよい.

In[18]:=
Click for copyable input

これまで,配列や背景を格子全体に,あるいは個々の列あるいは行に適用する方法を見てきた.しかし,各要素についてそれをどのようにオーバーライドするかということである.例えば,格子全体で数個の特別な要素を除いてすべてを同じ背景色にしたいとする.これを行う簡単な方法は,その特別な要素をItemでラップして,GridのオプションをオーバーライドするItemの対応するオプションを指定することである.

Click for copyable input

このオプションはStyleでオーバーライドすることもできる.しかしItemの目的はGridの二次元レイアウトについて分かっている方法でオーバーライドすることである.上の出力で分かるように,黄色いセルが2つ隣合せているとこにはその間のスペースに青は入っていない.これはItem以外のコンストラクトではできないことである.

これと同じことがBackgroundだけでなくItemのオプションすべてについて起る.Frameオプションを考えてみる.ある指定した要素以外には枠要素は必要ない場合,その要素を設定Frame->TrueGridでラップするであろう(次のセクションでは,任意の式に枠を加えるずっと簡単な方法を紹介する).

Click for copyable input

しかし,枠の付いた隣接する要素は境界線を同じくしない.これと以下のItemを使った例を比べてみる.後者は必要以上の沸く要素を描画しないという情報が十分にある.2と11の枠は1つの点を共有し,2と3の枠は1ピクセルの線を共有しており,この線が13と23の枠の左辺と完璧に揃っている.これがItemのパワーなのである.

Click for copyable input

枠とラベル

式に枠あるいはラベルを加えることはGridを使って行えるが,これは一般の二次元レイアウトよりもずっと単純な操作なのでもっと簡単に行うことができる.例えば,Framedは任意の式の周りに枠を描画するための簡単な関数である.これは,式の一部に注意事項を描画するとき等に便利である.

Click for copyable input

Labeledもそのような関数のひとつである.これは指定された式の周りの任意の位置にラベルを置くというものである.ここでは上のGridの例題に凡例を加える(Spacerは空のスペースを残しておくための関数である).

In[19]:=
Click for copyable input
Out[19]=

Panelもまた枠のコンストラクトであり,オペレーティングシステムに内在するパネル枠を使用する.オペレーティングシステムによりパネル枠にドロップシャドウ,角丸,おしゃれなグラフィックデザイン等異なるものが使われているため,PanelFrameとは異なる.

In[20]:=
Click for copyable input
Out[20]=

Panelにはフォントファミリおよびサイズに対して固有の概念があるため,Gridの内容でフォントファミリとサイズが変更され,Textでフォントサイズが変更される(Textにはフォントファミリについて独自の規定があるので,TextはWolframシステムのテキストフォントのままである).これについては以下のBaseStyleオプションについてのセクションで触れる.

最後に述べておきたいのは,Panelでは1つ以上のラベルを指定するためのオプショナルの第2引数が取れるということである.このラベルは自動的にパネルの外側に置かれる.またオプショナルの第3引数ではその位置の詳細を指定することができる.詳細はPanelのドキュメントを参照するとよい.

In[37]:=
Click for copyable input
Out[37]=
In[38]:=
Click for copyable input
Out[38]=

その他の注釈

ここまでで見てきた注釈は,非常に明確な視覚的要素となっていた.しかし,ユーザが必要とするまで実質的に不可視となっている注釈も多数ある.例えば,Tooltipはその第1引数の表示は変更せず,その表示の上にマウスを置いたときだけ第2引数をツールチップとして表示する.

Click for copyable input

Mouseoverもそのような関数であるが,ツールチップで結果を表示する代りに,マウスポインタをその上に持ってくる前まで表示に使用されていたスクリーン上の同じ部分を使用する.2つの表示の大きさが異なる場合は,その効果が目障りなので,同じ大きさに近い表示を使うか,どちらが表示されているかにかかわらずそのうちの大きい方に十分なスペースを取るためのMouseoverImageSizeオプションを使うかした方がよい.

Click for copyable input

Tooltipに似たものにStatusAreaPopupWindowがある.StatusAreaではノートブックのステータスエリア(通常左下)に追加情報が表示され,PopupWindowはクリックすると新しいウィンドウに追加情報が表示される.

Click for copyable input
Click for copyable input

またAnnotationMouseAnnotationを使うことで注釈の位置を指定することができる.

Click for copyable input

スクリーン上のある領域にマウスポインタを動かすことによってのみ表示される注釈を使うときは,ユーザのことを考えることが大切である.マウスを動かすことで長い評価が始まったり見にくくなったりしてはならない.注釈は慎重に使うとユーザにとって大変便利なものである.

これらの注釈はすべてグラフィックスの中でも十分に使用できる.生成した複雑なグラフィックスがユーザに理解してもらえるよう,ツールチップやマウスオーバーを提供することができる.実際,ListPlotDensityPlot等の可視化関数でもTooltipをサポートする.詳細はドキュメントを参照するとよい.

In[2]:=
Click for copyable input
Out[2]=

デフォルトスタイル

「枠とラベル」のセクションで見たようにPanelのようなコンストラクトは,デフォルトのスタイルがこの内容に適用されるような環境を設定するという点で,Styleのように動作する.これは明示的なStyleコマンドでオーバーライドすることができるが,BaseStyleオプションを使いPanelでオーバーライドすることもできる.BaseStyleStyleで使用するのと同じように,スタイルあるいはスタイル指示子のリストに設定する.するとこれらの指示子はそのPanelのスコープ内の環境デフォルトになる.

前述の通り,Panelはデフォルトでダイアログのフォントファミリとサイズを使う.しかしそれはこのBaseStyleオプションを使ってオーバーライドすることができる.

Click for copyable input
In[7]:=
Click for copyable input
Out[7]=

実際にこれらのボックスジェネレータのほとんどすべてにはBaseStyleオプションがある.例えば,デフォルトのフォントの色が青である格子があるとする.内側のStyleラッパーが外側のGrid BaseStyleに勝っているため,グレーの要素はグレーのままである(これはオプション継承の主な特徴のひとつであるが,これはこのドキュメントの範疇を超える).

Click for copyable input

デフォルトオプション

仮にFramedPanel等,同じボックス生成関数が何度も使ってある式があり,そのすべてが同じオプションを持つように変更したいとする.その関数が出てくるたびに同じオプションを加えていくのは面倒であるが,もっと簡単なやり方があるのである.

StyleのオプションであるDefaultOptionsは,形式 の要素のリストに設定されると,与えられたボックス生成頭部に対する全体的なデフォルトとして,指定されたオプションを持つ環境を設定する.これらのオプションはStyleラッパー全体で有効であるが,関連付けられたボックス生成関数の中でのみ有効である.

したがって,多数のFramed項目がある場合は,そのすべてが同じ背景および枠のスタイルを描画するようにしたい.

Click for copyable input

実は,上の入力は,このシンタックスの利点を見るには短かすぎる.同じリストを手動で指定したとすると以下のようになる.

Click for copyable input

FramedラッパーのそれぞれにオプションBackgroundFrameStyleを挿入していくことは,できなくはない(あるいはそれを行うプログラムを書くこともできる)が非常に時間がかかる.しかしDefaultOptionsを使うと,すべてのFramedラッパーがBackgroundおよびFrameStyleに対する設定を使用するような環境が設定できる.

Click for copyable input

このアプローチにより,複数の場所でスタイルを指定する必要なく,一様なスタイルガイドラインに従う構造が簡単に生成できる.これだとコードも簡潔で,ファイルサイズも小さく管理が楽である.

数式のタイプセット

フォーマット出力を語る場合,数学的シンタックスに特有のフォーマットコンストラクトについて触れないわけにはいかない.

Click for copyable input

これらについて長々と説明はしないが,これらのコンストラクトにはカーネルにおいて組み込まれた数学的意味は持っていないということは言っておきたい.例えば,Superscript[a,b]Power[a,b]と同様に表示されるが,この二つは同じものとは解釈されない.よって,表示に影響する意味を心配することなくフォーマット出力でこれらを構造要素として使うことができる.

In[67]:=
Click for copyable input
Out[67]=

ボックス言語の使用

すでにボックス言語をよくご存知の方は,これらのボックス生成関数が,低レベルボックスの構築およびそれらの出力の一部への挿入を妨害しているように思われることがあるかもしれない.これは一つの抽象化層がその下にある層を隠そうとするすべての層を使ったテクノロジーで起る.しかしこれには簡単な抜け穴があり,RawBoxesを使って有効だと分かっているボックスを取り,出力に直接表示することができるのである.

Click for copyable input

どの抜け穴でもそうであるように,RawBoxesで柔軟性が増すがそれで墓穴を掘ることもある.注意深く使わなければならない.まだボックス言語についてよく分かっていない場合は,使わない方がよい.