MePoTeXによる図形グラフの作成

in [TeXの部屋]

MePoTeXを利用した図形やグラフの作成手順を取りまとめました。

MePoTeXを活用して,図形とグラフを究めよう!

(注1) MathJaxを使用しているので、 スマホでは表示に時間がかかることがあります。
(注2) 図やコードが文章に被って表示されるときは「再読み込み」して下さい。
(注3)モバイル利用(Android)でのメニュー選択は、 SiteMapを利用するか、 「長押し」から「新しいタブを開く」を選択してください。
■MePoTeXによる図形やグラフの作成法  [Map]


[御案内] TeXを利用して数学プリントを作成するとき, いろいろな図形やグラフを作成する必要があります. それを作成するアプリはTeXのシステムにすでに含まれています. 「MetaPost」です.さらに,それをTeXソースの中で利用できるようにした パッケージが「MePoTeX」です.詳細なマニュアルもあるのですが, TeXを使い慣れていない場合は全体像を把握しにくいかもしれません.
 そこで,ここでは,TeXを使い始めた方を念頭に, MePoTeXを用いた図形やグラフの作成方法について解説します. ただし,TeXのインストールはすでになされており, TeXによる通常文書は作成できるレベルにあることを前提とします. emathと類似したコマンドで 曲面の描画まで行うことができ、 図形をGhostscriptを経由しないEPSファイル(MPS)で保存することができます。

■「MePoTeX」とは?

はじめに
最初に,MePoTeXを利用するとどのような図形が作成可能であるかをみてみましょう. 下記の[1][2]は,MePoTeXパッケージに含まれるマニュアルにある図です. いちいち画像を\includegraphicsで取り込む必要はありません。 ローレンツアトラクターや球面調和関数のグラフも, TeXのソースファイルにMePoTeXのコードを記述するだけで済みます。 emathと併用すれば、数学教材の作成に他のアプリを利用する必要はない ようにさえ思えます!
■MePoTeXとMetaPostのマニュアルとインストール
[1] A User's Manual for MePoTeX (Ver4.50) [PDF]
[2] A User's Manual for MePoTeX グラフ編 [PDF]
[3] Metafont&MetaPostで楽々お絵かき [PDF]
[4] MetaPost, A User's Manual(英文) [PDF]
[5] MePoTeXのマクロパッケージは、下記よりダウンロードできます。
MePoTeX〜MetaPost in TeX〜MetaPostで楽々お絵かき
(注) パッケージに含まれるマニュアル[1][2]の本サイトでの登録については、 著者「みなも」氏の了解を得ています。 なお、MePoTeXは2022年1月にVer 4.50に更新されました。

  • TeXに付属する描画ツールは、 最近は「TikZ」(ティクス)が 主流になっているようですが、emathを使いなれた者からみると、 コマンド体系はMePoTeXの方が自然に感じられます。
  • 下記解説は、上記マニュアルの[1][3]を参照して作成したものです。 [1][2]はMePoTeX、[3][4]はMetaPostについて、詳細に解説されています。
  • 本サイトの解説の間違いに気づかれたときは、 お知らせいただけるとありがたいです。
  • MetaPostを使いやすくしたMePoTeXの作者「みなも」氏には、 多大の敬意を表します。このパッケージは2000年にver.1.00が発表され、 2004年のver3.00では主要なマクロが作成済みです。 最新版は2022年1月のver4.50です。 MePoTeXが広く利用されることを祈念します。
  • MePoTeXの概要について「数学教育セミナー『TeXによる教材作成』」で発表しました。
    • (第3回: R3.3.6) 「教材作成におけるMePoTeXの利用」 (PDF)
    • (第4回: R4.3.5) 「MePoTeX(Ver4.50)の新機能とグラフ描画」 (PDF)

MePoTeXの概要
TeXのフォントを作成するツールとしてMetafont があります. これは,TeXの創始者であるDonald D. Knuth氏が作成したものです。 出版業界のフォントの成り立ちまで調べて作成したといわれています。 Metafontでは曲線でフォントの輪郭が作られますが, その描画機能を取り出して図形やグラフの作成に生かそうとしたのが, John D. Hobby氏によるMetaPostです. Metafontはビットマップフォントを生成するのに対して, MetaPostはPostscriptファイルを生成します. つまり、MetaPostで生成される画像ファイルはEPS形式のファイルです。 さらに、そのファイルはTeXの処理体系の中で処理することができ、 通常のEPSのようにGhostscriptを経由する必要がありません。 その意味で、Purified EPSと呼ばれています。 このようなEPSを出力することができるのは、MetaPostだけです。 通常のEPSと区別するために、拡張子はMPSで表示することが推奨されています。 そして、このMetaPostをTeXのソースファイルの中で利用できるように 多数のマクロを追加して改良されたパッケージが、 「みなも」氏による「MePoTeX」です。 全体像は「こちら」を参照してください。 最新版は Ver 4.50 (2022.01.10) です。

手っ取り早く概要を把握したい方は「こちら」 (PDF1PDF2) を参照してください。 また、さっそく試してみたい方は、 下記は読み飛ばして「図形描画の基本」にお進みください。実際にインストールするにはTeXのバージョンに注意が必要なので、「インストール」の箇所には必ず目を通してください。

▲戻る(トップメニューマップ)

MePoTeXのコード
MePoTeXでは、図やグラフがどのようにして描かれているのでしょうか?
プリアンブル部分を
\documentclass{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{MePoTeX}
とするとき、次のようなコードで放物線 \(\small y=4x-x^2\) と 直線 \(\small y=4-x\) のグラフが描画されます。
  • \begin{document} \begin{MPpic}<5mm>(5|1,5|1) \mptXaxis[l]<1mm,0mm>{$x$} \mptYaxis[b]<0mm,1mm>{$y$} \sendMP{ xdraw() kansu(4*t-t**2)   (0,4,20); z0=InSecPoint(4*t-t*t)(4-t)   (0,2,10); z1=InSecPoint(4*t-t*t)(4-t)   (3,5,10); xdraw(red) ExtLine(z0,z1) xdraw(hasen()) Pline(z0); Tanten(z0)(1.5pt);} \mptLabel{z0}[l]<1mm,0mm>{P} \mptLabel{(x0,0)}[t]   <0mm,-1mm>{$a$} \mptLabel{(0,y0)}[r]   <-1mm,0mm>{$b$} \mptLabel{origin}[tr]   <-.5mm,-.5mm>{O} \end{MPpic} \end{document}
順番に解説すると、次のような内容になります。 詳細解説は「参照」をクリックしてください。
  1. \begin{MPpic}で、MePoTeXのマクロを利用したコードを 記述することを宣言します。<5mm>で、単位あたりの長さを指定し、 (5|1, 5|1) は、2つの座標軸の範囲をいずれも -1〜5 とすることを指定しています。[参照]
  2. \mptXaxis は、\(\small x\) 軸を描画します。[l] では、 \(\small x\) の左側(left)が矢印の先端に来るように指定し、 <1mm, 0mm>で、さらに右に1mm ずらして配置しています。 上下左右は、それぞれ[t][b][l][r]です。これらは、 emathでの東西南北[e][w][s][n]に相当するものです。 [参照]
  3. \mptYaxis は、同様にして \(\small y\) 軸を描画します。
  4. \sendMP{ } では、{ } 内に MetaPostのコードを記述できます。[参照]
  5. xdraw() kansu(1)(2); では、関数のグラフを描画します。 (1)には関数の式を \(\small t\) の式で記述します。 べき乗は「**」を利用します。(2)では、描画の範囲とその区間の分割数を 指定します。ここでは、\(\small [0, 4]\) の区間を20分割して描画しています。
    モバイルフレンドリー表示の関係で2行に分けて表示していますが、 実際には続けて記述します。つまり、括弧( )が2つ連続することになります。 他の行でも同様です。\sendMP内では、行末には「;」が必須です。 なお、空白には全角を使っているので、 コピーして試すときは半角かTABに置き換えるか、 空白部分を削除してください。他の行でも同様です。[参照]
  6. z0=InSecPoint(1)(2)(3) では、(1)と(2)に記述された関数の グラフの(3)の範囲内における交点の座標を求めて、それを「z0」に保存しています。 ここでは、\(\small y=4x-x^2, y=4-x\) のグラフの左側の交点を求めています。[参照]
  7. z1=InSecPoint では、同様にして右側の交点を「z1」とします。 この交点は、超越方程式になる場合でも求めることができます。
  8. xdraw(red) Extline(z0,z1) では、1.で定義した範囲内で、 2つの交点を結ぶ直線を赤色で描画します。[参照]
  9. xdraw(hasen()) Pline(z0) では、 左側の交点「z0」から座標軸に下ろした垂線を破線で引いています。[参照]
  10. Tanten(z0)(1.5pt) では、交点「z0」に直径 1.5pt の黒丸を配置しています。 \sendMPの中括弧は、ここで閉じます。[参照]
  11. \mptLabel{z0} では、交点「z0」の箇所にラベル「P」を配置します。 Pの左側(left)が配置点z0にくるようにして、 さらに1mmだけ右にずらして配置しています。 Pの下側で直線と若干かぶる部分は、直線部分が少し消えているのに注意して下さい。 図形描画を行ってからラベルを配置すると、 ラベルとかぶる部分は消すような処理が行われています。 [参照]
  12. \mptLabel{(x0,0)} の \(\small x0\) は、 交点「z0」の \(\small x\) 座標です。\(\small x\) 軸上に \(\small a\) を 書き込んでいます。配置点に「a」の上部がくるようにして、 さらに 1mm 下にずらしています。
  13. 同様にして、\(\small y\) 軸上に \(\small b\) を書き込んでいます。 配置点に「b」の右側がくるようにして、さらに 1mm 左にずらしています。
  14. \mptLabel{orijin} では、原点に「O」を書き込んでいます。
  15. \end{MPpic}で、MPpic環境を閉じます。

コマンドの体系はemathとは独自に作成されていますが、 自然と同じような書式になっています。 \sendMP{ }の括弧内には MetaPost のコードを直接書き入れることもできますが、 簡潔に記述できるようにマクロ化されています。 たとえば、「xdraw()」もMePoTeXのマクロです。この括弧内では、 線種や色などを細かく指定することができます。

このファイル名を、たとえば「mptest.tex」します。 出力先をPDFにしてコンパイルすると図が表示されますが、 ファイルを置いているフォルダーをみると、 「@mptest.mp」「@mptest001.mps」というファイルが生成されています。 「@mptest.mp」は、MePoTeXの形式で書かれた内容を MetaPostの形式で書き出したものです。 「@mptest001.mps」は、 MetaPostにより生成された図のEPSファイルです。 MetaPostが生成したことを示すために拡張子はmpsが使用されます。 このファイルを\includegraphicsで読み込むと、 他のTeXファイルでも利用することができます。 MPpic環境の数だけmpsファイルが生成されますが、 mpファイルは最後の図のものだけが残ります。 他に、sav、sft の拡張子を持つファイルも生成されます。 mp以外のファイルを、 別フォルダーに保存するようにすることもできます[参照]。


▲戻る(トップメニューマップ)

MetaPost
MePoTeXを利用すると、 前述のようにTeXのソースファイルに直接書き入れることで MetaPostの生成する図形が表示されます。 そこではMetaPostを意識する必要はありません。 MePoTeXを利用しない場合は、
  1. 図形を定義するMetaPostのコマンドを書いたmpファイルを用意する。
  2. それをもとに、MetaPostでEPSファイルを生成する。
  3. 生成されたEPSファイルを、TeXのファイルで\includegraphicsで読み込む。
という操作が必要になります。 参考までに上記の操作を行ってみましょう。

まず、図形として、 「 TeXWiki:MetaPost」の冒頭で取り上げられている ハートマークを作成してみましょう。 heart.mpの内容は、次のようになります。 なお、MetaPostでは、2点間を 「..」でつなぐと曲線で結ばれ、 「--」でつなぐと線分で結ばれます。

prologues := 3;
beginfig(1); % ハートマークを描く
pickup pencircle scaled 2;
draw (0,40)..(10,50)..(20,40)
               ..(8,20)..(0,0);
draw currentpicture xscaled -1;
endfig;
end

これを、MetaPostで処理します。 オリジナルのMetaPostの実行ファイルは「mpost.exe」ですが、 後述する理由により、実際には「r-mpost.exe」を利用すべきです。 日本語対応したものは「r-pmpost.exe」です。 逆にいうと、\binフォルダーにこれらの実行ファイルが含まれていない場合は、 かなり古いTeXシステムです。 その場合の対応は、「MePoTeXのインストール」の 箇所をみてください。

DOS画面で「r-mpost heart」とすると、 EPSファイルとして「heart.1」が生成されます。 このファイルをTeXで利用するには、拡張子をmpsに変更して、 「heart.mps」を\includegraphicsで読み込みます。
\documentclass{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\begin{document}
\includegraphics{heart.mps}
\end{document}
MetaPostの生成するEPSファイルは、 TeXの処理体系で処理できるEPSファイルなので、 そのことを明示するため拡張子は「mps」とするようになっているようです。 Ghostscriptは呼び出されません。 仮に拡張子をepsのままにしても、 MetaPostから出力されるファイルは次の項目で述べる「Purified eps」なので、 Ghostscriptは経由しないで処理されます。

(注) MePoTeXのマニュアルによると、 MetaPostの実行ファイルをTeXから呼び出すときの動作に セキュリティホールが見つかったようです。 それを修正した実行ファイルは「r-mpost.exe」と 日本語化された「r-pmpost.exe」であり、 2019以降のTeXであれば、その\binフォルダーに含まれています。

MePoTeXを利用するとあまりMetaPostを意識しなくても済みますが、 少し込み入った処理をしようとすると、どうしてもMetaPostの仕組みについて ある程度理解している必要があります。 MetaPostについては、冒頭であげたマニュアル[3]を 参照してください。


▲戻る(トップメニューマップ)

Purified EPS
MetaPostの生成するEPSファイルは、 通常のEPSファイルとは異なり、 Ghostscriptに頼らずともTeXが直接処理できるEPSファイルです。 区別するために、「Purified EPS」と呼ばれます。 画像の拡張子は、「EPS」ではなく「MPS」とする必要があります。 このようなEPSを生成できるのは MetaPostに限られるようです。

TeXの\binフォルダーには、 既存のEPSファイルをMetapostの生成するEPSファイルに 変換するアプリが含まれています。「purifyeps.exe」です。 マニュアルらしきものは「\texmf-dist\doc\man\man1」にある 「purifyeps.man1.pdf」です。 いろいろなオプションの種類と簡単な使用例が書かれています。 利用するには、 「\texmf-dist\pstoedit\data」にある「mpost.fmp」が必要です。 このファイルを変換しようとするEPSファイルのあるフォルダーに コピーして、DOS画面のEPSファイルのあるフォルダーで

purifyeps 入力ファイル.eps 出力ファイル.mps

とします。出力ファイル名を指定しないと、 出力内容が画面に表示されて流れていくだけです。 ファイル保存するには出力ファイル名が必須です。 拡張子は「mps」とします。 「mpost.fmp」を当該フォルダーにコピーしないときは、 入力ファイル名を指定する前に、「--fontmap=」として ファイルのある場所をフルパスで指定し、 フォルダー名の最後で「\mpost.fmp」とします。 打ち込んで「ENTER」を押してから、 実行されまでに数秒間の空白時間が必要です。 エラーのときはその旨が表示されるので、 じっと待つことです。

試みに、Ghostscriptに住む有名な虎さん(tiger.eps)を変換してみました。 変換後のファイル名は「tiger_p.mps」としました。 ファイルの冒頭部分を比較すると次のようになっており、 「tiger_p.mps」はMetaPostで生成されたことが記されています。

「tiger.eps」の場合
%!PS-Adobe-2.0 EPSF-1.2
%%Creator: Adobe Illustrator(TM) 1.2d4
%%For: OpenWindows Version 2
%%Title: tiger.eps
%%CreationDate: 4/12/90 3:20 AM
%%DocumentProcSets: Adobe_Illustrator_1.2d1 0 0
%%DocumentSuppliedProcSets: Adobe_Illustrator_1.2d1 0 0
%%BoundingBox: 17 171 567 739
%%EndComments

「tiger_p.mps」の場合
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 612 792
%%HiResBoundingBox: 0 0 612 792
%%Creator: MetaPost 2.00
%%CreationDate: 2021.02.08:1617
%%Pages: 1
%%BeginProlog
%%EndProlog
次に、画像が一つだけではコンパイルスピードの違いが分からないので、 同じ画像を変形して6つの画像を配置してコンパイルしてみました。 私の環境では、EPSの場合(tiger.eps)とpurified EPSの場合(tiger_p.mps)では 3秒ほどの違いが生じました。 下記の「サンプルファイル」で検証してみてください。 なお、画像配置に、「emath」の edaenumerate環境を利用しました。


▲戻る(トップメニューマップ)

MePoTeXのインストール
MePoTeXのファイル一式は、下記よりダウンロードできます。 Sift-JIS版とutf-8版のZIPファイルが登録されているので、 必要なファイルをダウンロードして解凍します。 解凍されたファイルのコピー先は、上記サイトの後半に書かれています。 基本的に必要なファイルは、.styファイルと、 各種のマクロが登録されている.mpファイルです。 指示にしたがい、私の場合は、.styファイルは \texmf-local\tex\mepotexに、. mpファイルは\texmf-local\metapostにコピーしました。 コピー後は、それらのファイルをTeXに認識させるために、 mktexlsr.exeを実行します。

ちゃんと動くかどうかを確認するには、 「manual」フォルダーにマニュアルのソースファイルが置いてあるので、 それをコンパイルしてみるとよいでしょう。 ただし、多数の画像関連ファイル(mps,sav,sft)が生成されるので注意してください。 ファイルの生成先をデスクトップにしていると、 あっという間にデスクトップがファイルで埋まってしまいます。 画像ファイルを保存するサブフォルダーをあらかじめ作成して、 そこに保存するように設定した方が良いでしょう[参照]。

■TeXのバージョンに注意
ただし、TeXのシステムをインストールした期日には注意が必要です。 MePoTeXは、TeXから外部アプリであるMetaPostを呼び出して処理しています。 TeXから他のプログラムを起動しようとすると、 許可リストにないものまで起動されてしまう セキュリティホールが発見されているのです。 それへの対策が2019年以降にはなされていますが、 2019/01/07以前にインストールしたTeXを使用している場合は、 インストールガイド(mptinst.pdf)の4〜5節を熟読してください。 対応が取られた mpost.exe のファイル名が変更になっています。 MePoTeXの最新版では、MetaPostは 「r-mpost.exe」が起動するように設定されています。

  • 2009〜2016年のTeXの場合: \usepackage{MePoTeX}の直後で「\mptMP{mpost}」とする。
  • 2017〜2018年のTeXの場合: \usepackage{MePoTeX}の直後で「\mptMP{rmpost}」とする。
    ただし、「mpost.exe」のファイル名の変更や、texmf.cnfの書き換えが 必要になるようです。mptinst.pdfの3ページを熟読してください。
  • 2019年以降のTeXの場合: 特に設定は不要と思われますが、 mpost.exe を見つけれないというようなエラーのときは、 \usepackage{MePoTeX}の直後で「\mptMP{r-mpost}」としてみてください。 それでもエラーのときは、TeXフォーラムで質問してください。
古いシステムのまま利用している場合は、この際なので TeXのシステム自体をインストールし直すのが良いかもしれません。 ただし、おそらく標準出力はPDFになると思われます。 DVIOUTを利用する場合は、画像処理でエラーになります (対応法は「こちら」)。

■Ver 4.50での主な更新内容
このページは Ver 4.40 をもとに作成されていますが、 最新版は 2022.01.10に発表された Ver 4.50 です。 インストールガイドによれば、Ver 4.50 での主な更新内容は下記の通りです。

  • mpsファイル等をサブディレクトリーに格納するマクロが新設された [参照]。
  • CSV, TSV ファイルを読み込むマクロが新設された [参照]。
  • 平均・標準偏差・共分散・相関係数・回帰直線を求めるマクロが新設された [参照]。
  • 1階・2階の \(\small \frac{du}{dt}=F(u,t), \frac{d^2u}{dt^2}=G(u,u',t)\) のタイプの微分方程式の解曲線を得るマクロが新設された [参照]。
  • 化学の「エネルギー図」を書くときの座標管理等を行うマクロが新設された。
  • マニュアルにMETAPOSTの乱数の紹介が追加された(3.8節, p.19)。


▲戻る(トップメニューマップ)

利用上の留意点
MePoTeXは、TeXの処理系の中で外部ソフトであるMetaPostを呼び出して 処理を行わせています。MetaPostの実行ファイルは、TeXをインストールした段階で、 すでに「\bin」フォルダーに含まれています。 MePoTeXを実際に利用すると、TeXを使いこなしてきた方であっても、 おそらくは見慣れないエラーに見舞われるかもしれません。 多くは、TeXがMePoTeXの指示により内部で実行しようとしている MetaPostのエラーと思われます。 その場合は、前述した 「MPpic」環境内のコードを注意深く見直してください。 だいたいは単純ミスであることが多いです。 私の経験上では、特に、下記のことに注意してください。
  • マクロ名など、コマンドのスペルミスをしていないかどうか。
  • 大文字と小文字を取り違えていないかどうか。
  • 「\sendMP{」が、ちゃんと「}」で閉じられているかどうか。
  • いろいろな括弧 ( )、[ ]、{ } が利用されます。 括弧の種類やその対応関係に注意してください。
  • 「\sendMP」内で、行の終わりに「;」がついているかどうか。
  • 「\sendMP」内に空行が含まれていないかどうか。
  • 「\mpt」で始まるコマンドが、「\sendMP」内に配置されていないかどうか。 このコマンドはMetaPostではなくTeXのマクロなので、 「\sendMP」の外側に配置する必要があります。 内部に配置するとMetaPostは理解できません。
  • xdraw() で結ぶとき、「--」「..」と2つ連続になっているかどうか。 たまに、書き損なって「-」や「.」だけの場合があります。
  • 「for」文による繰返し処理の場合は、 分母が0になることがないように配慮する必要があります。 0になる場合の回避処理は自動では行われません。
  • MPpic環境の数だけのmpsファイルが生成されます。 多数の図を配置したいときは、専用の別フォルダーを作成しておいて、 画像をそこに収めるマクロ「\mptSubDir」(Ver4.50で新設) を利用した方がよいです。
  • 本サイトで提示しているコードは、 空白調整のために全角スペースを使用しています。 コピーして使用するときは、それを半角スペースかTABに置き換えてください。
  • カラーを扱うには、プリアンブルで 「\usepackage[dvipdfmx]{graphicx,color}」を組み込んでおく必要があります。 [ ] は、個々の使用環境により異なります。
  • MePoTeXのマニュアルにあるコードをコピーして 実行すると、「\dis」が見当たらないというエラー(Undefined control sequence)が 表示される場合があります。これは、 マニュアルの図にラベルやカラーでの表示をさせるための設定が、 MePoTeXとは別なマクロで行われているためです。 そのようなときは、 「\usepackage[dvipdfmx]{graphicx,color}」を組み込んでおいた上で、 「\usepacakage{mepotex}」を「\usepackage{mepotex, mepoman}」 としてください。

▲戻る(トップメニューマップ)

他アプリとの比較
TeXのソースコードの中で曲面まで描画できるアプリとしては、 MePoTeXの他にも幾つかのアプリがあります。 いずれを利用すべきであるかは利用者側の好みの問題と思われますが、 下記に他のアプリの描画サンプルやコードを紹介しているサイトを 紹介しておきます。動画やHTMLでの利用は考えず 日々の数学教材の作成で利用するのであれば、 スタイルファイルやそのマクロを定義しているmpファイルを インストールするだけで済み、 コードも簡潔に記述できるMePoTeXで十分なように思います。

MePoTeXは2000年にはver1.00が発表されているのに、 これまで利用がはかどらなかったのは、 おそらくは詳細マニュアルやサンプルがWeb公開されていなかったからでは ないかと思われます。Web検索で参照できるのは マニュアル[3]ですが、これは2006年次のものであり、 その内容はMePoTeXよりもMetaPostを中心とした解説です。 MePoTeXの多数のマクロは、その時点ですでに大部分が作成済みです。 本ページでは、MePoTeXの作者である「みなも」さんの了解を得て、 パッケージをダウンロードしないと閲覧できない詳細マニュアルを 登録しました。MePoTeXのマニュアル[1]に 多数掲載されているサンプルと、 下記に登録したサンプルとを比較して、 どちらが使いやすいか検討してみてください。

  • TeX Wiki:TikZ
    TeXWikiでの解説です。Web上で「TikZ」で検索すると膨大なページが表示され、 世界中で利用されているようです。私はTeX生活は長い方だと思いますが、 「emath+gnuplot」で間に合ってきたので、 「最近は世界的にはTikZが主流である」ということは 今年(2021年)になってから初めて知りました。
  • TeXample.net:3D examples
    「TeXample.net」には、TikZによる多数のサンプルが登録されています。 ここでは、3Dでのサンプルにリンクを貼りました。
  • PSTricks
    TeXの文書内でPostScriptの命令を直接使って描画できるパッケージです。
  • KeTCindy:TikZとの比較
    KetCindyでは描画ソフト「Cinderella」が利用されています。 他に、統計ソフト「R」も必要です。 ここでは、TikZとの比較が行われています。
  • asymptoteの使い方
    asymptoteは、MetaPostを発展させたベクトルグラフィック記述言語です。 その使い方について解説されています。

▲戻る(トップメニューマップ)

■図形描画の基本

■画像関連ファイルのフォルダー
MePoTeXでは、 図形の定義はMPpic環境の中で行います。 mpsファイルはMPpic環境の数だけ生成されるので、 MPpic環境を何度も開くとその数だけmpsファイルが生成されます。 場合によってはファイルを置いているフォルダーがmpsだらけになるので、 特に出力先をデスクトップにしている場合は注意が必要です。 Ver4.50で新設されたマクロ「\mptSaveDir」を利用すると、 画像関連のファイルを別フォルダーに保存することができます。 あらかじめ別フォルダー(たとえば「sub」)を自分で作成しておき、 TeXのソースコードのプリアンブルで次のように指定すると、 コンパイル時に生成される拡張子が mps, sav, sft のファイルが そのフォルダーに格納されます。
\documentclass{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{MePoTeX}
\mptSaveDir{sub}
図形描画の基本
簡単な図形として、たとえば、 \(\small 0\leqq x\leqq 4,~0\leqq y\leqq 4\) の範囲に、 外枠と1辺が1の正方形を配置するには、 ドキュメント部分は次のようなコマンドになります。 個々のコマンドの意味は、この後で順を追って説明します。
  • \begin{document} \begin{MPpic}<1cm>(4,4) \sendMP{  pair O,A,B,C;  u=1cm;  O=(0,0);A=(1w,0);  B=(1w,1h);C=(0,1h);  xdraw(0.1pt) (0,0)--(4u,0)   --(4u,4u)--(0,4u)--cycle;  xdraw(0.5pt) O--A--B   --C--cycle; } \end{MPpic} \end{document}

(注) Webのモバイルフレンドリー表示の関係で、 全角の空白で調整して2行に分けて表示している箇所があります。 以下に提示されたサンプルコードをコピーして実行するときは、 全角の空白を削除するか、 または半角の空白かtabで置き換えてから実行してください。


描画範囲と単位
2行目では、単位あたりの長さと描画範囲が指定されています。 <1cm>を指定しないと<1bp>が仮定され、 内側の正方形OABCはほとんど点でしか表示されません。 1bp=1/72インチ=0.35mmです。逆にみると、1mm=2.83bpです。 横と縦の縮尺を変えたい場合、たとえば<1cm, 0.5cm>とすると、 縦が半分に縮小されます。縦を省略すると、横と同じ長さで設定されます。

横軸と縦軸の範囲を(p, q)の形で指定すると、 \(\small 0\leqq x\leqq p,~0\leqq y\leqq q\)を指定したことになります。 指定範囲内だけが描画されるわけではなく、 描画コマンドによっては指定した範囲を超えて描画されます。 負の範囲を指定するには、 (p1|p2, q1|q2) として「|」で区切って指定します。 「|」の左側は正の範囲、右側は負の範囲です。 たとえば、\(\small -1\leqq x\leqq 4,~-1\leqq y\leqq 4\) としたいときは 次のようにします。なお、 下図では座標軸を表示しています。

  • \begin{MPpic}<1cm>(4|1,4|1) \sendMP{  pair O,A,B,C;  u=1cm;  O=(0,0);A=(1w,0);  B=(1w,1h);C=(0,1h);  xdraw(0.1pt) (0,0)--(4u,0) --(4u,4u)--(0,4u)--cycle;  xdraw(0.5pt) O--A--B    --C--cycle; } % 座標軸の描画 \mptXaxis[tr]   <0mm,-1mm>{$x$} \mptYaxis[tr]   <-1mm,0mm>{$y$} \end{MPpic}
xdraw( )は、 指定された太さで2点間を線でつないでいきます。 太さを省略して xdraw() とするとデフォルトの太さ(0.6pt)で繋がれます。 xdraw() の「()」は省略できません。 最後の「cycle」は、最初の点と結んで閉じることを指定しています。 また、最初のxdrawを2行に分けて書いていますが、 1行に続けて書いてかまいません。 2行に分けたのは、スマホ等で閲覧したときに 表示が乱れないようにするモバイルフレンドリーのためです (以下、このことについてはいちいちコメントしません)。

▲戻る(トップメニューマップ)

\sendMP
\sendMPにより、 { }内に書かれたコマンドがMetaPostに引き渡されます。 個々のコマンドは「;」で区切る必要があるので気をつけてください。 最初は「;」を書き損ねてエラーとなる場合が多いです。 逆に、\sendMPの外側の「\mpt・・・」というコマンドでは 「;」をつける必要はありません。 「;」をつけてもエラーにはなりませんが、 「;」が図にも表示されます。 コンパイルが成功すると、図が表示されると同時に、 MetaPostのコードを書き込んだmpファイルと、 図形をPurified EPSの形式で書き込んだmpsファイルが 生成されます。

MetaPostにどのようなコマンドが引き渡されたのか、 一度は生成されたmpファイルの内容を見ておくとよいでしょう。 そのmpファイルをmpost.exeで実行すると 同じ図形ファイルが生成されますが、 MePoTeXをインストールしていない場合はエラーが生じると思われます。 生成されたmpファイルの上から2行目に「input mptUser.mp」と書かれていますが、 これにより、MePoTeXの作者である「みなも」氏により作成された MetaPostの多数のマクロをが呼び出されています。 MePoTeXがインストールされていないと、 そのマクロが見当たらないとしてエラーになると思われます。 \sendMP内に書き込むコマンドはMetaPostのコマンドですが、 簡潔に記述できるよう「みなも」氏により改良されています。


▲戻る(トップメニューマップ)

点の座標
数学で (a,b) と書いた場合は、平面上の点の座標を意味するときと、 ベクトルの成分表示である場合とがあります。 MetaPostでは、この記法を両方の意味合いで利用することができます。 ここでの例では、点の座標として利用しています。 まず、「pair O,A,B,C;」により、 これらの変数は2次元ベクトルまたは平面座標であることを宣言しています。 この宣言をしないと、左辺のAは数値変数と認識されてエラーとなります。

サンプルプログラムでは、点を2通りの方式で定義しています。 「B=(1w,1h)」の w, h は、横幅(width)と高さ(height)のことで、 1行目に書いた<1cm>が w, h の単位として設定されます。 <1cm, 0.5cm>とした場合は、1w=1cm、1h=0.5cmとなります。 w, hを省略して単に「B=(1,1)」とすると、Bは(1bp, 1bp)の点となります。 1bpは、1/72インチ=0.3527mmです。

もう一つの定義の仕方として、「u=1cm」を指定して、 (4u, 4u)のような指定の仕方をすることができます。 この指定を利用すると、MPpic環境の1行目で指定した単位とは別の単位で 指定することができます。 整数である必要はなく、0.5uやu/2などでもかまいません。 具体的な数との積では、積の記号「*」は省略することができます。

なお、MetaPostでの「z」は、単なる変数ではなくマクロであるようです。 O,A,B,Cではなく、z.O, z.A, z.B, z.Cとして定義すれば、 pairの宣言を省略することができます。 あるいは、z0,z1,z2,z3として定義することもできます。 その場合、たとえばz2の\(\small x, y\)座標は、それぞれ z2x, z2y として 参照することができます。 複素数の感覚で利用できるので、zを利用した方が良いようです。

なお、変数名を「color」宣言すると、 空間の点の座標やベクトルを定義することができます。 一見すると奇異に感じられますが、 color指定はRGB形式で3つの数を指定することによります。 \sendMP内で「color iro;」とすると、iro は3つの数の組 \(\small (a,b,c)\) からなります。その組の成分は任意の数でかまいません。 0〜1の範囲内の数からなるときは色指定として利用することができます。 つまり、「pair」宣言すると2次元ベクトル、「color」宣言すると3次元ベクトル として利用することができます。 さらには、「cmykcolor」宣言すると4次元ベクトルとして利用できます。 後述しますが、 色の指定の仕方は、RGB、HSB、CMYKの3種類あります。

MePoTeXで点を配置するコマンドは\mptPointです。 書式は複数通りありますが、1つは次の書式です。

 \mptPoint{配置点}[点のラベル]
 [ラベル位置]<横補正,縦補正>
 (点の直径){座標}

「配置点」には、その点を表すpairで宣言された変数を書きます。 「z」をつけると特に宣言しないで済みます。 「点のラベル」は、その点の場所に書き入れるラベル(文字列)です。 「ラベル位置」でt(上部),b(下部),B(ベースライン),r(右部),l(左部)の 1つまたは2つを利用できます。何も指定しないと c(中央)が仮定されます。 「点の直径」は、黒丸を入れたいときに、その直径を指定します。 「配置点」と「座標」は必須で、他は省略することができます。 下記では、「z」をつけた形で点を定義したものです。 点Bについては、その定義とラベルの配置、さらに黒丸までつけています。 ラベル位置は「bl」を指定して、「B」という文字の下部の左側が 配置点にくるように指定しています。

つまり、\mptPoint を利用すると、点の座標とそれを保持する変数名、 そこに割り振るラベルと位置の指定、さらには黒丸の有無や直径の大きさまで 一度に指定できるということです。 これらの指定をMetaPostで行おうとすると、 それぞれについてのコマンドを書き並べる必要があります。 関連する指定を一つのコマンドでできるようにマクロ化されているのです。

  • \begin{MPpic}<1cm>(4|1,4|1) % 点の配置 \mptPoint{z.O}{(0,0)} \mptPoint{z.A}{(1w,0)} \mptPoint{z.B}[B][bl]  (3pt){(1w,1h)} \mptPoint{z.C}{(0,1h)} % 外枠・正方形・座標軸の描画 \sendMP{  u=1cm;  xdraw(0.1pt) (0,0)--(4u,0)   --(4u,4u)--(0,4u)--cycle;  xdraw(0.5pt) z.O--z.A   --z.B--z.C--cycle;  } \mptXaxis[tr]<0mm,-1mm>{$x$} \mptYaxis[tr]<-1mm,0mm>{$y$} \end{MPpic}

▲戻る(トップメニューマップ)

座標軸
座標軸を書き入れるには\mptXaxis、\mptYaxisを利用します。 (参照:)。 \mptXaxisは横軸に矢印をつけます。 「\mpt」はMePoTeXのTeX側のマクロであることを示しています。 これらはMetaPostのマクロではないので、 \sendMPの外側で記述します。外側では「;」を入れる必要はありません。 \sendMPの外側のコマンドに「;」をつけると、 図にも「;」が書き込まれます。 \mptXaxisは下記のような書式で記述します。\mptYaxisも同様です。 2行に分けていますが、続けて入力してかまいません。

 \mptXaxis[ラベルの位置]
  <横補正, 縦補正>{ラベル文字列}

ラベルの位置には、t, b, B, l, r の1つまたは2つを利用できます。 何も指定されないときは c(中央) が仮定されます。 ここでは [tr] としていますが、これはラベル文字「\(\small x\)」の 上部の右部が配置点にくるように指定するものです。 この場合の配置点は、矢印の先端です。そのまま配置すると文字が 矢尻とかぶるので、<0mm,-1mm> としてちょっと下に下げています。 その配置のされ方は、[ ]内をいろいろ変えて自分で試してみるとよいでしょう。 配置しようとする文字の左右上下を、配置点のどこに置くか?ということです。

その位置関係の詳細は下図のようになります。 MePoTeXのマニュアル[2]の3ページの図です。 \(\small hg(x)\) を配置する場合の図になります。

▲戻る(トップメニューマップ)

線で結ぶ
2点間を線や曲線で結ぶには、描画コマンド「xdraw」を用います。 2点間を「--」で結ぶと線で、「..」で結ぶと曲線(3次ベジェー曲線)で結ばれます。 たとえば「xdraw(0.1pt)」は、 点を結ぶ「draw」というMetaPostのコマンドと、 結ぶ線の太さを指定するコマンドを合体させたMetaPostのマクロです。 MetaPostのコマンドで太さを指定するには、本来は 「pickup pencircle scaled 0.1pt;」と記述する必要があります。 簡潔に記述できるよう「みなも」氏により改良が図られているのです。 2点間を結ぶだけでなく、いろいろな図形をあらかじめ定義しておくと、 xdrawはその図形を描画することができます。

サンプルプログラムでは 四角形を描画するために「O--A--B--C--cycle;」となっていますが、 最後の「--cycle;」は、最初の点Oと結んで図形を閉じる巡回パスで あることを示しています。点を結んで得られる経路を「パス」と呼びます。 線を繋ぐだけであれば「O--A--B--C--O;」と同じことですが、 閉じられた内部の塗りつぶしを行うには、 最後は「--cycle;」としておく必要があります。

■曲線で結ぶ
曲線で結ぶには、「O..A..B..C..cycle;」とします。 下図のような円が描かれます。 MetaPostでは、円周上の等間隔な4点を与えて「..」で結ぶと、 完全な円が描かれます。詳細は「曲線で結ぶ」を見てください。

  • \begin{MPpic}<1cm>   (4|1,4|1) \mptXaxis[l]   <1mm,0mm>{$x$} \mptYaxis[tr]   <-1mm,0mm>{$y$} \sendMP{  pair O,A,B,C;  u=1cm;  O=(0,0);A=(1w,0);  B=(1w,1h);C=(0,1h);  xdraw(0.1pt) (0,0)--(4u,0) --(4u,4u)--(0,4u)--cycle; % 「..」で描画  xdraw(0.5pt) O..A..B    ..C..cycle; } \end{MPpic}

▲戻る(トップメニューマップ)

目盛りとラベル

座標軸に目盛りを打つには\mptDrawTickを、 座標の数値を書き入れるには\mptCoordを、 適当な位置に文字を書き込むには\mptLabelを、 それぞれ\sendMPの外側で使用します。 つまり、これらはTeX側のマクロです。 以下、順に説明します。
  • \begin{MPpic}<1cm>(4|1,4|1) \mptXaxis[l]  <0mm,-1mm>{$x$} \mptYaxis[tr]  <-1mm,0mm>{$y$} % 目盛り・数値・原点記号 \mptDrawTick  {2w step 2w until 4w}  {1h step 1h until 4h} \mptCoord(2,0)(2,0){2}[t]   <0mm,-1mm>{\xcoord} \mptCoord(0,1)(0,1){3}[r]   <-1mm,0mm>{\ycoord} \mptLabel{(0,0)}[tr]   <-0.1mm,-0.1mm>{O} % 点の定義・外枠・正方形の描画 \sendMP{  u=1cm;  z0=(0,0);z1=(1w,0);  z2=(1w,1h);z3=(0,1h);  xdraw(0.1pt) (0,0)--(4u,0) --(4u,4u)--(0,4u)--cycle;  xdraw(0.5pt) z0--z1--z2   --z3--cycle; } \end{MPpic}
この図では、横軸のラベルの位置を矢印の先端の右側に配置するため、 [tr]を[l]に変更しました。 また、\sendMP内で、点の定義をz0,z1,z2,z3に変更しています。 「;」が必要なのは、\sendMP内のコマンドだけなので注意してください。 また、点の座標は、w, h などの単位つきで指定する必要があります。

目盛りを打つ(\mptDrawTick)
横軸と縦軸に目盛りを打つには\mptDrawTickを利用します。 それぞれで目盛りの間隔を変えることもできます。 ここでは、横軸は2wの箇所から2w刻みで4wまで、 縦軸は1hの箇所から1h刻みで4hまで目盛りを打つことを指定しています。 {初期位置 step 刻み幅 until 終了位置}の形で指定します。 横軸と縦軸の縮尺が同じ場合は、 wとhを間違えても問題はありません。1wと1hは、 \begin{MPpic}の次の< , >で指定された値が入ります。 <1cm>だけだと「w=h=1cm」となります。 \mptDrawTickに{ }は2つ必要です。1つだけだと横軸にだけ目盛りが打たれます。 縦軸にだけ必要なときは、{}{縦軸の目盛り}として最初に空白の{}を入れます。 横軸の上側にだけ、あるいは縦軸の右側にだけ目盛りを打つには、 コマンドの直後に[ ]で区切って次のようにします(図は略)。

 \mptDrawTick[xmin=0mm,xmax=2pt,
 ymin=0mm,ymax=2pt]{以下同じ}

数値を入れる(\mptCoord)
目盛りの下に数値を配置するには、\mptCoordを利用します。 書式は、次のようになります。 これは、軸ごとに設定するしかありません。 以下は続けて入力してかまいません。

 \mptCoord(x開始, y開始)
   (x刻幅, y刻幅){配置回数}
   [ラベル位置]<横補正, 縦補正>
   {ラベル文字列}

座標軸の数値は、それぞれ\xcood, \ycoordに入っています。 上記のサンプルでy軸は「(0,1)(0,1){3}[r]」となっていますが、 これは最初の括弧( )の\(\small y=1\)の箇所から、 2つ目の括弧( )にある1刻みで、 3つ目の{ }にあるように3回記入し、 位置はラベルの右端が配置されるようにしています。 x軸では「(2,0)(2,0){2}[t]」として、\(\small x=2\)の箇所から 2刻みで2回記入し、位置はラベルの上部が配置されるようにしています。 ここでの座標に w, hをつける必要はありません。

文字を書き入れる(\mptLabel)
原点記号「O」のように、適当な位置にラベル(文字列)を配置するには \mptLabelを利用します。

  \mptLabel{座標}[ラベル位置]
   <横補正,縦補正>{ラベル}

ここでは、ラベルの右上が配置されるようにしています。 原点以外の座標を指定するときは、 具体的な座標を ( , ) の形で指定するか、 または 座標を保存した変数で指定します。 座標は (2w,1h) のようにw, hをつけて具体的に指定するか、または 「\sendMP」内で定義した「u」をつけて指定する必要があります。 ラベルに日本語も大丈夫ですが、" " で囲むとエラーが出ます。" " は不要です。 TeXの書式で $ で囲って数式を配置することもできます。 また、「\mptLabel{座標}[ラベル位置][key=value]<補正>{ラベル}」の形で 2つ目の [ ] を指定すると、 その中でいろいろな指定 をすることができます。


▲戻る(トップメニューマップ)

線種と色

線の太さは「xdraw( )」の括弧内の指定で変えることができますが、 この( )内では、 線種や矢印の種類、あるいは色を順不同で指定することができます。

線種
破線で結ぶには「hasen(倍率)」とします。 数値を指定しない「hasen()」は、1.5ptの線分と1.5ptの空白が連続します。 この場合は、倍率を表す数値は1が仮定されます。 hasen(2)とすると、それらを2倍したもの、 つまり 3pt の線分と 3pt の空白が連続します。

  • \begin{MPpic}<1cm>(4,4) \sendMP{   u=1cm;   for s=1 step 1 until 4:     xdraw(1pt,hasen(s))       (s*u,0)--(s*u,4u);   endfor;   xdraw(1pt,tensen())    (.5u,1u)--(4.5u,1u);   xdraw(2pt,tensen(2))    (.5u,2u)--(4.5u,2u); } % 下段の数値の配置 \mptLabel{(1u,0)}[t]   <0mm,-1mm>{1} \mptLabel{(2u,0)}[t]   <0mm,-1mm>{2} \mptLabel{(3u,0)}[t]   <0mm,-1mm>{3} \mptLabel{(4u,0)}[t]   <0mm,-1mm>{4} \end{MPpic}
ここでは、繰り返しの「for--endfor」を利用しました。 倍率を1から1ずつ増やして、4まで描画しています。 「:」で区切って、繰り返す処理を記述します。 複数の処理を行うときは、それぞれを「;」で区切ります。 「s*u」を「su」にすると新たな変数を見なされてエラーとなります。
「tensen(倍率)」とすると、点線になります。 たとえば、「xdraw(1pt, tensen())」で指定すると、 1ptの点が2.5pt間隔で並びます。 tensen(2)とすると、2ptの点が 5pt 間隔で並びます。
\mptLabel」を利用して、 指定した場所に倍率を表す数字を配置しています。

▲戻る(トップメニューマップ)

矢印
「xdraw( )」の( )内では、矢印の描画も指定できます。 下図のように、" " で囲んで形を指定します。 黒丸や白丸は、「*」と「o」(小文字のオー)で指定します。 コードは、図の下の矢印から順に記述されています。

  • \begin{MPpic}<1cm>(4,4) \sendMP{   u=1cm;   xdraw(.5pt,"->")    (.5u,.5u)--(4.5u,.5u);   xdraw(.5pt,"<->")    (.5u,1u)--(4.5u,1u);   xdraw(.5pt,"->|")    (.5u,1.5u)--(4.5u,1.5u);   xdraw(.5pt,"|<->|")    (.5u,2u)--(4.5u,2u);   xdraw(.5pt,"|-|")    (.5u,2.5u)--(4.5u,2.5u);   xdraw(.5pt,"|-*")    (.5u,3u)--(4.5u,3u);   xdraw(.5pt,"o->")    (.5u,3.5u)--(4.5u,3.5u);   xdraw(.5pt,">->")    (.5u,4u)--(4.5u,4u); } \end{MPpic}


▲戻る(トップメニューマップ)


「xdraw( )」の括弧内で色を指定するには色名を入れるだけですが、 プリアンブルで「\usepackage[dvipdfmx]{graphicx,color}」を 組み込んでおく必要があります。色名は、 graphicパッケージで定義されている68色の名前を書き入れます。 他に、RGB、CMYK、HSB形式で定義された色も利用できます。 ただし、大文字と小文字を区別するので、入力には気をつけてください。 「yellow」でエラーが出て、いろいろ悩んでしまいました・・・。
  • \begin{MPpic}<1cm>(4,4) \sendMP{   u=1cm;   xdraw(.5pt,"->",red)    (.5u,.5u)--(4.5u,.5u);   xdraw(.5pt,"<->",blue)    (.5u,1u)--(4.5u,1u);   xdraw(.5pt,"->|",green)    (.5u,1.5u)--(4.5u,1.5u);   xdraw(.5pt,"|<->|",Yellow)    (.5u,2u)--(4.5u,2u);   xdraw(.5pt,"|-|",Cyan)    (.5u,2.5u)--(4.5u,2.5u);   xdraw(.5pt,"|-*",Magenta)    (.5u,3u)--(4.5u,3u);   xdraw(.5pt,"o->",Orange)    (.5u,3.5u)--(4.5u,3.5u);   xdraw(.5pt,">->",NavyBlue)    (.5u,4u)--(4.5u,4u); } \end{MPpic}
色は、RGB形式の場合は(赤,緑,青)の3次元で表されます。 そのような形式の変数は「color」として宣言することができます。 色を表す場合、各成分は0〜1の値を取りますが、 3次元ベクトルや空間の点の座標を表す場合は、値の大きさに制限はありません。 デフォルトでは、 black=(0,0,0)、red=(1,0,0)、green=(0,1,0)、blue=(0,0,1)、white=(1,1,1) が定義済みです。色のコードをRGB形式で示すとき、 通常は16進数で表示されますが、ここでは 十進数の 0〜1 の値で考える必要があるので、 十進のコードを255で割った値で指定します。 色を任意に指定したいときは、たとえば次のようにします。

まず、変数「iro」をcolor型の変数(3次元)として宣言し、 具体的な成分を定義します。 その後は、色名を指定する箇所で「iro」を使用することができます。 具体例は、下記のコードを見てください。

3つの成分での色指定には、RGBの他にHSB形式の色があります。 これは、色を色相(Hue)、彩度(Saturation)、明度(Brightness)の 3つの属性で数値化したものです。 単なる (a,b,c) はRGBですが、 HSBの色として使用するときは「hsb(a,b,c)」 として使用します。 色として利用するときは、各成分は 0〜1 の範囲の数で表します。

red, green, blue の初字を大文字にしてRed, Green, Blueも指定できますが、 ちょっと暗くなります。これらはCMYK形式で指定した色名のようです。 CMYK形式の色指定は、色をシアン(C)、マゼンタ(M)、黄色(Y)、黒(K)の 4つの色で指定するものです。 \sendMP内で、「cmykcolor iro;」などと指定すると、 「iro=(a,b,c,d);」という4次元ベクトルを定義できます。 色として利用するときは 0〜1 の値である必要がありますが、 任意の値で利用すると4次元ベクトルとして利用することができます。 下記では、色を RGB, HSB, HMYK形式の3つの形式で表示しています。 指定したiroの値は 0〜1 の範囲で適当に決めました。 iroa は、RGBでは255を掛けて(51,102,153)の色です。

  • \begin{MPpic}<1cm>(4,4) \sendMP{  color iroa;  cmykcolor irob;  iroa=(0.2, 0.4, 0.6);  irob=(0.2, 0.4, 0.6, 0.8);  xdraw(5pt,"|-|",iroa)    (1.5w,2h)--(4w,2h);  xdraw(5pt,"|-|",hsb(iroa))    (1.5w,h)--(4w,h);  xdraw(5pt,"|-|",irob)    (1.5w,0)--(4w,0); } \mptLabel{(0,2h)}[l]{RGB} \mptLabel{(0,h)}[l]{HSB} \mptLabel{(0,0)}[l]{CMYK} \end{MPpic}

▲戻る(トップメニューマップ)

JISカラー
MePoTeXのマニュアルでは言及されていませんが、 MePoTeXのマクロを納めているフォルダーには「JIScolor.mp」があります。 中を見ると、JISの定める 和名の色のうち、 74色がローマ字の大文字で定義されています。 「\sendMP」の先頭に「input JIScolor.mp;」を挿入すれば、 これらの色を利用することができます。
TOKI、TUTUZI、SAKURA、BARA、SANGO、MOMO、BENI、ENZI、AKANE、AKA、SYU、TOBI、AZUKI、AKATYA、KAKI、RENGA、HIWADA、KURI、HADA、DAIDAI、TYA、KOGETYA、ANZU、MIKAN、KASSYOKU、TUTI、KOMUGI、KOHAKU、TAMAGO、YAMABUKI、OUDO、HIMAWARI、SUNA、KARASI、KI、UGUISU、MATTYA、KIMIDORI、KOKE、WAKAKUSA、MOEGI、KUSA、WAKABA、MATUBA、MIDORI、ROKUSYOU、HUKAMIDORI、MOeGI、WAKATAKE、AOTAKE、AOMIDORI、ASAGIMIZU、SORA、AO、AI、TUYUKUSA、KONZYOU、RURI、KON、GUNZYOU、KIKYOU、HUJI、AOMURASAKI、SUMIRE、SYOUBU、EDOMURASAKI、MURASAKI、KODAIMURASAKI、SIKON、AYAMEBOTAN、AKAMURASAKI、ZOUGE、
  • \begin{MPpic}<1cm>(4,4) \sendMP[10pt]{ input JIScolor.mp; xdraw(TOKI)   (0,4h)--(4w,4h); xdraw(ANZU)   (0,3h)--(4w,3h); xdraw(SYU) (0,2h)--(4w,2h); xdraw(KUSA) (0,h)--(4w,h); xdraw(AI) (0,0)--(4w,0); } \end{MPpic}
上記では、「\sendMP[10pt]」とすることで、 ここでの線の太さはすべて 10pt にしています。 上から順に、朱鷺(TOKI)、杏(ANZU)、朱(SYU)、草(KUSA)、藍(AI)です。

▲戻る(トップメニューマップ)

格子の描画
格子を描画するには、\mptDrawGridを利用します。 書式は、座標軸のときと同様です。 [ ]では、線種や色などを指定することができます。

(参照) \mptXaxis\mptDrawTick\mptCoord\mptLabel

  • \begin{MPpic}<1cm>(4|1,4|1) % 座標軸と目盛り \mptXaxis[l]   <0mm,-1mm>{$x$} \mptYaxis[tr]   <-1mm,0mm>{$y$} \mptDrawTick   {2w step 2w until 4w}   {1h step 1h until 4h} % 格子の描画 \mptDrawGrid   [linetype=dashed hasen()]   {-1w step w until 4w}   {-1w step w until 4w} % 軸上の数値 \mptCoord(2,0)(2,0){2}[t]    <0mm,-1mm>{\xcoord} \mptCoord(0,1)(0,1){3}[r]    <-1mm,0mm>{\ycoord} \mptLabel{(0,0)}[tr]    <-0.1mm,-0.1mm>{O} % 外枠と正方形 \sendMP{   u=1cm;   z0=(0,0);z1=(1w,0);   z2=(1w,1h);z3=(0,1h);   xdraw(0.1pt) (0,0)--(4u,0) --(4u,4u)--(0,4u)--cycle;   xdraw(0.5pt) z0--z1--z2    --z3--cycle; } \end{MPpic}
上段の図では、[linetype=dashed hasen()]として破線を指定しています。 xdraw() のときと違い、「dashed」の後に指定する必要があります。 「dashed」は線種を変更する MetaPost のコマンドです。 [ ]内では、他に次のような指定をすることができます。 複数の指定をするときは、「,」で区切ります。 下段は[ ]内を

[pensize=2pt,linetype=
  dashed tensen(2),
  linecolor=Magenta]

としたものです。 なお、「step」の値によっては、右端や上端の線が描かれない場合が あります。それは、step値を積み上げていったときの数値誤差によるためです。 そのようなときは、「-1w step 3 until 4.1w} などのように、 最後の値をちょっと大きな値で設定します。
  • linetype
    線種の変更は、最初に「dashed」をつけます。 「hasen()」の括弧内に数値を入れると、破線の長さを制御できます。 デフォルトの数値は1になっています。 「hasen()」の他に、「tensen()」も使用できます。 試してみてください。
  • linecolor
    「linecolor=」として色名を指定します。 color.styで定義されている68色が利用できます。当然ながら、 「\usepackage{graphicx,color}」が組み込まれている必要があります。 大文字、小文字には注意してください。 color宣言した変数を用いて、自分で指定した色を利用することもできます。
  • pensize
    線の太さを指定できます。デフォルトの太さは0.6ptです。 「pensize=1pt」などとすると、太くなります。
  • polar
    極座標による同心円と動径で描画させたいときは、 「polar=true」を指定します。

▲戻る(トップメニューマップ)

曲線で結ぶ

ベジェー曲線
xdraw( )を利用して点間を「..」で結ぶと、 3次のベジェー曲線で結ばれます。 しかし、点の与え方によってはとんでもない曲線になったりします。 下図では、描画範囲が左側に大きくはみ出してしまうので、 範囲を \(\small -4\leqq x\leqq 4\) にしました。
  • \begin{MPpic}<1cm>(4|4,4) % 点の定義と配置 \mptPoint{z.O}[O][t]  <0mm,-1mm>(3pt){(0,0)} \mptPoint{z.A}[A][b]  <0mm,1mm>(3pt){(1w,4h)} \mptPoint{z.B}[B][t]  <0mm,-1mm>(3pt){(2w,1h)} \mptPoint{z.C}[C][b]  <0mm,1mm>(3pt){(3w,3h)} \mptPoint{z.D}[D][t]  <0mm,-1mm>(3pt){(4w,2h)} % 点を曲線で結ぶ \sendMP{  xdraw(0.5pt) z.O--z.A--z.B    --z.C--z.D;  xdraw(0.5pt,red) z.O..z.A   ..z.B..z.C..z.D; } \end{MPpic}
接線方向
望むような曲線を得るために 指定した点での接線方向を指定することができます。 たとえば、点Oでの接線を80度方向としたいときは、 z.O{dir(80)}とします。点Bの左側では0度で右側が30度方向としたいときは、 {dir(0)}z.B{dir(30)}とします。( ) を省いて、それぞれ dir80, dir0, dir30 でもかまいません。負の角度で dir-30 でも大丈夫です。
  • \begin{MPpic}<1cm>(4,4) (上記と同様) \sendMP{  xdraw(0.5pt) z.O--z.A--z.B    --z.C--z.D;  xdraw(0.5pt,red) z.O{dir(80)}   ..z.A..{dir(0)}z.B{dir(30)}   ..z.C..z.D; } \end{MPpic}
張り詰め度
特定の箇所をあまり曲線にしたくないときは、 「tension」を間に挟みます。数値で、張り詰め方を指定します。 下図では、CD間に指定しています。
  • \begin{MPpic}<1cm>(4,4) (上記と同様) \sendMP{   xdraw(0.5pt) z.O--z.A--z.B     --z.C--z.D;   xdraw(0.5pt,red) z.O{dir(80)}     ..z.A..{dir(0)}z.B{dir(30)}     ..z.C..tension 2..z.D; } \end{MPpic}
カール
端点で巻かせたいときは「curl」を用います。 数値で巻かせ方の度合いを決めます。
  • \begin{MPpic}<1cm>(4,4) (上記と同様) \sendMP{  xdraw(0.5pt) z.O--z.A--z.B    --z.C--z.D;  xdraw(0.5pt,red) z.O{dir(70)}    ..z.A..z.B..z.C    ..{curl 3}z.D; } \end{MPpic}

任意方向
結ぶ点を指定するとき、座標ではなく、 原点を中心に上下左右の方向と距離を指定することで点を表すこともできます。 途中に上述の「接線方向」「張り詰め度」「カール」を挟めば、 経過点を指定して自分の望む曲線を描くことができるでしょう。
  • \begin{MPpic}<1cm>(4,4) \mptDrawGrid  [linetype=dashed hasen()]  {0 step w until 4w}  {0 step w until 4w} \mptPoint{z0}[O][tr]  (3pt){origin} \mptPoint{z1}[A][tl]  (3pt){4w*right} \mptPoint{z2}[B][bl]  (3pt){3*sqrt(2)*w*dir45} \mptPoint{z3}[C][br]  (3pt){4*h*up} \sendMP{  xdraw() z0..z1..z2   ..z3..cycle; } \end{MPpic}
上記では、原点からみたとき、右に4wの点A(4w,0)、 45度方向に \(\small 3\sqrt{2}\) の点(要するに B(4w,4h))、 上方向に4hの点 C(0,4h) を結んで「cycle」により原点に戻っています。

上記は、原点から見た点で指定しましたが、 座標をベクトルや複素数とみて、「次の点」に向けた方向を 加えていくことで描くこともできます。 その場合、\(\small {\rm AB}={\rm BC}=\sqrt{10}\) であり、 \(\small \angle{\rm OAB}=\tan^{-1} 3\doteqdot 71.6^{\circ}\) であることから、z1, z2, z3 はそれぞれ次のように定義することになります。 角度は、つねに水平方向からの角で考える必要があります。 図は同じです。

  • \begin{MPpic}<1cm>(4,4) (同上) (z1,z2,z3の定義部分) \mptPoint{z1}[A][tl]  (3pt){z0+4w*right} \mptPoint{z2}[B][bl](3pt)  {z1+sqrt(10)*w*dir108.4} \mptPoint{z3}[C][br](3pt)  {z2+sqrt(10)*w*dir161.6}  (以下、同上) \end{MPpic}

▲戻る(トップメニューマップ)

塗りつぶし
指定された閉領域を色で塗りつぶしたり、斜線を引いたりするには 「xfill(色名や斜線タイプ)」か 「xfilldraw(色名や斜線タイプ)(境界線の色や太さ)」を用います。 最初の括弧では塗りつぶしに関する指定を、 2つめの括弧では境界線に関する指示を行います。
  • \begin{MPpic}<1cm>(4,4) % 点の定義と配置 \mptPoint{z.O}[O][t]  <0mm,-1mm>(3pt){(0,0)} \mptPoint{z.A}[A][tl]  <0mm,-1mm>(3pt){(4w,0)} \mptPoint{z.B}[B][bl]  <0mm,1mm>(3pt){(4w,4h)} \mptPoint{z.C}[C][b]  <0mm,1mm>(3pt){(0,4h)} \mptPoint{z.D}[D][t]  <0mm,-1mm>(3pt){(2w,0)} \mptPoint{z.E}[E][b]  <0mm,1mm>(3pt){(2w,4h)} % 塗りつぶし \sendMP{  xfill(blue)   z.O--z.E--z.A--cycle;  xfilldraw(5pt*dir45)   (green,2pt)   z.C--z.D--z.B--cycle;   } \end{MPpic}
塗りつぶし
「xfill」や「xfilldraw」の色名や斜線は、次のように指定します。 境界線にこだわりがなく、内部の塗りつぶしの色と同一で良いときは、 「xfill( )」だけでかまいません。△OAEは、xfillを利用しています。
  1. 「blue」などの色名を書けば、その色で塗りつぶされる。 ただし、色の名前には注意が必要です。
  2. 0から1の数値を書くと、その値に応じた灰色になります。 0は黒、1は白。
  3. 斜線を引くには、線の太さと角度を「2pt*dir45」のように 指定します。右下がりのときは「2pt*dir-45」とします。 斜線の色は、色名を「,」で区切って指定します。
  4. 塗りつぶしや斜線は、その順番に気をつける必要がある。 斜線を引くときは最後に引くのがよいでしょう。

境界線
「xfilldraw」の2つめの括弧内では、「xdraw」と同じような指定をすることで、 境界線の太さや色、そして線種を指定することができます。 hasen()を指定すると、境界が破線で引かれます(図は略)。


▲戻る(トップメニューマップ)

copyright