KETpicのtips

Last modified: 2018 年 12 月 30 日 03 時

Scilab & KETpicで出力したTeXファイルを使う

Scilabから出力したTeXファイルはpicture環境で書かれています。たとえば、曲線上の矢印で生成したTeXファイル"arrow_sample2.tex"を例にとってみます:

arrow_sample2.tex

%%% tex/arrow_sample2.tex 2015-2-3 1:1
%%% arrow_sample2.sce 2015-2-3 0:52
{\unitlength=2cm%
\begin{picture}%
(   1.40000,   1.40000)(  -0.20000,  -0.20000)%
\special{pn 8}%
%
\special{pn 14}%
\special{pa 787 0}\special{pa 0 -787}\special{pa 0 0}\special{pa 787 0}%

(中略)

\settowidth{\Width}{O}\setlength{\Width}{-1\Width}%
\settoheight{\Height}{O}\settodepth{\Depth}{O}\setlength{\Height}{-\Height}%
\put(-0.0500,-0.0500){\hspace*{\Width}\raisebox{\Height}{O}}%
%
%
\end{picture}}%

これを実際に図として利用してみましょう。figure環境内やminipage環境内で\input{..}すればよいです。ここでは、以下のようなTeX文書を用意してみます:

line_integral_sample.tex

%#! latexmk -dvi -pdfdvi line_integral_sample.tex
\documentclass[b5paper]{article}
\usepackage{amsmath,amssymb}
\usepackage[top=4cm, bottom=4cm, left=1cm, right=1cm, includefoot]{geometry}
\usepackage[T1]{fontenc}
\usepackage{euler}
\usepackage{concrete}
\newlength{\Width}%
\newlength{\Height}%
\newlength{\Depth}%
\pagestyle{empty}
\renewcommand{\labelenumi}{(\arabic{enumi})}
\begin{document}
{\Large 線積分の問題のサンプル}\\[15mm]
 \begin{minipage}{\textwidth}
  \begin{minipage}{4cm}
   \input{arrow_sample2}
  \end{minipage}
  \begin{minipage}{11cm}
  次で与えられる閉曲線$C$に対し、線積分
  $\displaystyle \int_C (x+y)\,dx+xy\,dy$の値を求めよ。
   \begin{enumerate}
    \item 4点$A=(1,0),\,B=(0,1),\,O=(0,0),\,A$を通る折れ線$ABOA$
 	\item 反時計回りに向き付けられた、原点を中心とし半径が$1$の、
          点$A$から点$B$までの円弧$C_4$
   \end{enumerate}
  \end{minipage}
 \end{minipage}
\end{document}

これをコンパイルすると、次のようになります:

line_integral_sample.pdf

[このページのトップへ]

挿入用のPDFファイルを作る

上の手順では、直接TeX文書に挿入しましたが、一旦PDFファイルにしてから、画像としてTeX文書に貼り付ける方法もあります。拡大縮小が手軽にできるので、私は普段こちらを使っています。

次の手順はUbuntu上で行っています。KETpicを利用して得られたTeXファイルhoge.texを、実際にTeX文書に図(ここではPDF形式とする)として挿入するために、次のTeXファイルhoge_ketpic.texを用意します:

hoge_ketpic.tex

\documentclass{article}
\usepackage{amsmath,amssymb}
\newlength{\Width}%
\newlength{\Height}%
\newlength{\Depth}%
\pagestyle{empty}
\begin{document}
 \input{hoge}
\end{document}

自分の場合は、これを latexmk (platex > dvipdfmx) にかけて、PDFを作り、それを pdfcrop で余白を削除、最後に extractbb でバウンディングボックスの情報を取っています:

latexmk -dvi -pdfdvi hoge_ketpic.tex
pdfcrop hoge_ketpic.pdf hoge_ketpic.pdf
extractbb hoge_ketpic.pdf

これであとは、TeX文書の使いたいところでincludegraphics*{hoge_ketpic.pdf}とすればOKです。そして、この一連の流れを、以下のようにシェルスクリプトconvert_ketpic.shにしておくと便利です:

templete_ketpic.tex

\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{euler}
\newlength{\Width}%
\newlength{\Height}%
\newlength{\Depth}%
\pagestyle{empty}
\begin{document}
 \input{tmp}
\end{document}

convert_ketpic.sh
#!/bin/bash
# -*- coding: utf-8 -*-

# convert_ketpic.sh         使い方は convert_ketpic.sh hoge.tex など
file=${1%.tex}_ketpic.tex   # hoge.tex > file=hoge_ketpic.tex
name=${1%.tex}              # hoge.tex > name=hoge
pdf=${1%.tex}_ketpic.pdf    # hoge.tex > pdf=hoge_ketpic.pdf 

cp templete_ketpic.tex $file
sed -i -e "s/tmp/$name/g" $file   # $file中の"tmp"というワードを$nameで置き換える
latexmk -dvi -pdfdvi $file
pdfcrop $pdf $pdf
extractbb $pdf

[このページのトップへ]

重要なキーボード・ショートカット

Scilab中で重要なキーボード・ショートカットたち:

Ctrl + Space(関数を途中まで書いて) 補完する
Ctrl + e選択した領域を実行
F5現在のファイルを保存して実行
Ctrl + d現在カーソルのある行をコメントアウト。領域を選択した状態だと、その領域をコメントアウトする
Ctrl + Shift + d選択した領域をコメントアウトを外す
[このページのトップへ]

よくあるエラー

Paramplotなどでのパラメータの注意

例えば、一見同じように見えて、Paramplotで以下の式は前者はエラーで後者は正常に実行されます:

      C1=Paramplot('[cos(s), sin(s)]', 's=[0,2*%pi]');
C2=Paramplot('[cos(t), sin(t)]', 't=[0,2*%pi]');
      
Paramplotの第一引数はあくまで文字列なので、cosの's'とパラメータの's'とが重なってしまいます。なので、後者のように、't'などとパラメータの文字を変えなければなりません。

改行について

関数 (マクロ) の途中で改行するときは、'..'を文末に加えましょう。

      A=[1,0,0;..
   0,2,0;..
   0,0,4];
B=[1,0,0; 0,2,0; 0,0,4];  // A=B
      
AとBは同じ行列を表しています。

曲面の描画時のエラー1

Wireparadata関数で、エラーが出ることがありますが (sample:曲面上の曲線の描画)。原因はわかっていません。

曲面の描画時のエラー2

曲面の描画でエラーが出たときは次のことを疑ってみたほうがよいでしょう。曲面のパラメータ付けで原点を含むケース、例えば、関数 $f(x,y)=x^2y\;(0\leq x\leq 1,\,0\leq y\leq x)$ のグラフのワイヤーを描画するときにエラーが出ます。原点 $(x,y)=(0,0)$ の部分が問題になるようで、$x=0$ の部分を避けるようにして、以下のようにコードを書くとエラーが回避されます:

      e=0.01;
fd=list('z=x^2*y',..
'x=s', 'y=s*t', 's=[0+e,1]', 't=[0,1]', 'esn');
// 's=[0,1]'としてはエラーが出る
surface=Sf3data(fd, 25, 25);
outline=Sfbdparadata(fd, 100);
wire=Wireparadata(outline, fd, 5, 5);
      
サンプルコードはこちら

[このページのトップへ]

プレビュー Windisp

Setwindowや3次元プロットの投影方向を決めたり、グラフの表示の感じをつかむために、Windisp関数をよく使います。例えば、曲面の陰線処理は時間がかかるため、計算の早い、曲面のワイヤーフレームをWindispで表示させてみて、構図を決めておいたほうがよいでしょう。選択領域を実行するショートカットCtrl + e とあわせて使うと効率的です。

Windisp(プロットデータの列);

[このページのトップへ]

表示・描画する枠の設定 Setwindow

Setwindow([xmin,xmax],[ymin,ymax])で、表示する範囲を $[\textrm{xmin},\textrm{xmax}]\times[\textrm{ymin},\textrm{ymax}]$ に設定します。Windispで表示する範囲や、TeXファイルに出力するときの描画範囲に影響します。3次元のプロット場合は、Setangleで指定した視点(投影方向)から見た、見かけの範囲になります。

Setwindow([xmin,xmax],[ymin,ymax]);

[このページのトップへ]

図の縦横比を変える Setscaling

Ketpicでは、デフォルトで図の縦横比は1:1になります。縦横比を変えるには、Setscaling(数値r)で、出力する図を縦r:横1の比率に変えることができます。これは、Windispにも、出力したTeXファイルにも適用されます。

図の縦横比を変える
Setwindow([-15,15], [-0.5,1.2]);
Setscaling(6);

curve=Paramplot('[x, sin(x)/x]', 'x=[-25,25]', 'N=300');

//Windisp(curve);

Openfile('tex/scaling_sample.tex');
Beginpicture('0.5cm');
Drwline(curve, 0.4);
for i=-9:9
  Htickmark(%pi/2*i, ' ');
end
Vtickmark('m0.5n1r1');
Expr([%pi/2,0], 's6', '\frac{\pi}{2}');
Expr([%pi,0], 'n3e3', '\pi');
Expr([%pi-0.4,1/2], 'e', '\displaystyle y=\frac{\sin x}{x}');
Endpicture(1);
Closefile();

Setscaling(1);

[このページのトップへ]

3次元のプロットの視点・投影方向

Setangle(theta, phi);

Setangle 3次元のプロットでは、ひとつ方向ベクトルを決めて、その方向から、3次元のプロットデータを2次元のプロットデータに投影します。この方向ベクトルは、図のように $\varphi,\,\theta$ の角によって決まります。

上述のように、Windispでプレビューしながら調整すればよいでしょう。

[このページのトップへ]

よく使う記法

行末

行末にセミコロン ; を入れると、実行結果が出力されません。逆に、セミコロンを入れないことで、実行結果が出力できます。通常はコンソールのログを流さないように、セミコロンは入れておくのが良いかと思います。

ベクトル
     u=[1,2,3,4];
v=1:4;   // u=v
w=1:2:8; // w=[1,3,5,7]

     

Scilabでは、(列)ベクトルの記法は、要素を[]で囲むようにします。
n:mは、ベクトル $[n,\,n+1,\dotsc,\,m-1,\,m]$ を表します。
n:d:mは、ベクトル $[n,\,n+d,\,n+2d,\dotsc,\,n+Nd]$ を表します。ただし、$N$ は $n+Nd\leq m$ となる最大の自然数です。dは負でもよいです。

ベクトルの演算 (和、スカラー倍、ノルム、要素の個数、取り出し、追加)
     u=[1,2,3,4];
v=1:4; // u=v
     
U=u+v;    // 和
V=4*u;    // スカラー倍 
norm(u)   // ノルム: \sqrt(1^2+2^2+3^2+4^2)
length(u) // 要素の個数: 4
u(1,3)    // 1番目と3番目の要素を取り出す: [1,3]
u(2:4)    // 2から4番目の要素を取り出す: [2,3,4]
u($+1)=5  // ベクトルuに要素5を追加する: u=[1,2,3,4,5]

     
繰り返し (for文)

上に書いたベクトルの記法を使って

for n:m
  ...
end


for n:d:m
  ...
end

条件分岐 (if文)
if 条件式 then
  ...
else
  ...
end


if 条件式 then
  ... 
elseif 条件式 then 
  ... 
else
  ...
end

条件式には次の比較演算子が使えます:

a==ba<>ba<ba>ba<=ba>=b& (and)| (or)~ (not)
[このページのトップへ]

終了時に音を鳴らす

Scilabでsceファイルを実行し終えても、beep音が鳴ったりしません。ときには、長い計算時間を必要として、計算中に別作業もしたくもなるのが人情。実行後、音(WAVファイル)を鳴らすには、たとえば、ファイルの最後に次のコードを追加すればOKです:

y=loadwave("../sound/hoge.wav");
sound(y)

ただし、カレントディレクトリの下のsoundフォルダにhoge.wavがあると仮定しています。

[このページのトップへ]

実行にかかる時間を計る

ファイルの実行にかかる時間を計るときは、ファイルの最初にtic()を、ファイルの最後にtoc()を挿入するとよいです:

tic();

....

T=toc();
minute=floor(T/60);
second=floor(T-60*minute);
disp(strcat([string(minute), ' minutes ', string(second), ' seconds']));

こうすると、実行にかかった時間がコンソールに表示されるようになります。たとえば、パラメータ付けされた曲面の描画ソースコードを参照してみてください。

[このページのトップへ]

Virtualbox上のUbuntuでScilabを使うには

すっかりここの文章を放置していましたが、現在(2016年)はVirtualbox上のUbuntuでもScilabが問題なく使えています。

自分の場合は、自宅ではWindows 7で、TeX原稿を打つときはVirtualbox上でUbuntuを動かしています。最新のVirtualbox上のUbuntuでScilabを動かしてみようとすると、OpenGLの関係で起動すらしてくれないありさまです。回避策として、Virtualboxは古めのVersion 4.3.14を使い、Virtualboxの "設定" > "ディスプレイ" > "ビデオ" から、"3Dアクセラレーションを有効化" のチェックボックスを消す(!)という奇手を打ちます。
正直、ここまでして使うメリットがあまりないので、Windows上でScilabを実行して、適宜出力したTeXファイルをUbuntuの方に渡しているのが現状です。

[このページのトップへ]