2015年9月20日日曜日

ketpicによる被覆空間の習作2

曲面上の領域を斜線塗りする方法を利用して、被覆空間における平行移動と被覆変換を図示してみました。
この図では簡素過ぎてよくわからないのでさらにinkscapeに取り込んでさらに加工する必要がありますが、この図を出力するためのソースは次の通りです。
currentdir=pwd()

tic();

a=2;//内側の円の半径
b=2;//被覆空間のxy平面からの距離
R=3;//外側の円の半径と内側の円の半径の差

//視点のアングル
phi=20;
theta=75;
Setangle(theta,phi);


//曲面の定義
function x=CX(u,v)
    x=(u+a)*cos(2*%pi*v)
endfunction

function y=CY(u,v)
    y=(u+a)*sin(2*%pi*v)
endfunction

function z=CZ(u,v)
    z=2*v+b
endfunction
//



//被覆空間
FD=list('p','x=CX(U,V)','y=CY(U,V)','z=CZ(U,V)','U=[0,R]','V=[0,4]');

//底空間
GC1=Spacecurve('[CX(0,V),CY(0,V),0]','V=[0,1]');
GC2=Spacecurve('[CX(R,V),CY(R,V),0]','V=[0,1]');


//被覆空間の輪郭線・境界線データ
SFb=Sfbdparadata(FD,[50,250],0.01,0.001);



//被覆空間上の領域
EHSC=list();//斜線で塗った領域を曲面に埋め込んだもののリスト
ESC=list();//領域の境界を曲面に埋め込んだもののリスト
for K=list(-1,0,2,3)
  
function Z=Embz(X,Y)
  if K>0 then
    //atanの出力値は(-pi, pi]なので注意する。
    Z=atan(Y,X)/%pi+2*floor(K*0.5)+b;
  else
    //K=-1,0の場合はZ=0の平面
    Z=0
  end
endfunction


//埋め込み関数の定義
deff('Out=Emb(X,Y)','Out=[X,Y,Embz(X,Y)]');

//埋め込む平面上の領域の境界線を定義
function Y=CvY(T)
  Y=sin(T)+(a+0.5*R)*(-1)^(K+1)
endfunction
SC=Paramplot('[cos(T),CvY(T)]','T=[-%pi,%pi]');

//境界内を斜線で塗る
HSC=Hatchdata(list('i'),list(SC),45,2.5);

//領域を曲面に埋め込む
EHSC1=Embed(HSC,Emb);
ESC1=Embed(SC,Emb);

EHSC($+1)=EHSC1;
ESC($+1)=ESC1;

if K>0 then
  EHSC2=Translate3data(EHSC1,[0,0,4]);
  ESC2 =Translate3data(ESC1,[0,0,4]);
  EHSC($+1)=EHSC2;
  ESC($+1)=ESC2;
end

end


//ファイバー
Fibre=list();
SFibre=list();
for K=1:2
  Fibre1=Spacecurve('[0,(a+0.5*R)*(-1)^(K),T]','T=[0,10]');
  Fibre($+1)=Fibre1;
  SFibre1=Crvsfparadata(Fibre1,SFb,FD)
  SFibre($+1)=SFibre1;
end

//パス 後でスケルトンデータを取るため、曲面よりもz座標が少し大きくなるようにする
SPath=list();
for K=0:2
  if K>0 then
    Vmax=0.75+2*(K-1);
    Vmin=1.25+2*(K-1);
    SPath1=Spacecurve('[CX(0.5*R,V),CY(0.5*R,V),CZ(0.5*R,V)+0.02]','V=[Vmax,Vmin]');
    SPath($+1)=SPath1;
  else
    SPath1=Spacecurve('[CX(0.5*R,V),CY(0.5*R,V),0.02]','V=[0.75,1.25]');
    SPath($+1)=SPath1;
  end
end

//陰線処理
SkDom=Skeletonparadata(list(ESC,EHSC),list(Fibre,SPath),1,0.01);
SkSFb=Skeletonparadata(SFb,Fibre);
SkGC2=Skeletonpara3data(GC2,Fibre);

//曲面に隠れる曲線 曲面と交わらないときは最後に-1を付ける。
SGC2=Crvsfparadata(SkGC2,SFb,FD,-1);



Setwindow([-6,6],[-2,11]);//ウィンドウ範囲を設定
Windisp(list(Projpara(GC1,SGC2,SFibre,SPath),SkDom,SkSFb));

cd(currentdir);


Openfile('fiber_translation.tex')//書き出し用ファイルを開く
Beginpicture('10/12cm');//picture環境を始める。引数は単位長
Drwline(list(Projpara(GC1,SGC2,SFibre,SPath),SkDom,SkSFb),1);
Endpicture(0);//picture環境を終える(座標軸を書かない)
Closefile();//書き出し用ファイルを閉じる


T=toc();
minute=floor(T/60);
second=floor(T-60*minute);
disp(strcat([string(minute), ' minutes ', string(second), ' seconds']));
出力したpdfをinkscapeで取り込んで、パスを簡略化したあとsvg2tikzでtikzのコードに変換し、文字や矢印を入れていくと次のような図になりました。
これはこれでゴチャゴチャし過ぎな感じがします。もうちょっと修正が必要かな。

2015年9月17日木曜日

ketpicで曲面を斜線塗りする

ketpicのEmbed関数を利用して曲面上の領域を斜線塗りする試みをしました。
今回作成したのは、円の内部の領域$x^2+y^2\leq 1$に斜線を入れたものを曲面$z=x^2-y^2$に持ち上げた図です。
この図を作成するためのソースは次の通りです。
currentdir=pwd()

tic();

//視点のアングル
phi=60;
theta=40;
Setangle(theta,phi);
//


//曲面の関数
function z=Sfc(x,y)
  z=x^2-y^2
endfunction

//曲面のデータ
Fd=list('Z=Sfc(X,Y)','X=[-1.5,1.5]','Y=[-1.5,1.5]');
Sb=Sfbdparadata(Fd);//境界線の3dデータ
Sbh=BorderHiddenData();//曲面に隠れる境界線の3dデータ

//曲面に埋め込む円
GC=Paramplot('[cos(T),sin(T)]','T=[0,2*%pi]');
deff('Out=Emb(X,Y)','Out=[X,Y,Sfc(X,Y)]');
GH=Hatchdata(list('i'),list(GC));
SC=Embed(GC,Emb);
SH=Embed(GH,Emb);

Setwindow([-3,3],[-3.5,3]);

Windisp(Projpara(Sb,Sbh,SH,SC));

Openfile('test.tex')//書き出し用ファイルを開く
Beginpicture('1cm');//picture環境を始める。引数は単位長
Drwline(Projpara(Sb,SH,SC));
Dottedline(Projpara(Sbh));
Endpicture(0);//picture環境を終える(座標軸を書かない)
Closefile();//書き出し用ファイルを閉じる


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

ここでは曲面に隠れるべき部分も描かれてしまっていますが、どうやって対処すべきかまだ理解できていません。

2015年9月4日金曜日

highlight.jsを利用してBloggerでLaTeXのソースコードに色付けを行う設定

はてなブログやwordpressではLaTeXのソースに色付けする機能が標準で備わっていて、日頃から羨ましく感じていました。
ソースコードの色付けを行う方法としては、syntaxhighlighterを使うのが有名なようで、検索で引っかかる情報が多かったです。しかしsyntaxhighlighterではLaTeXが公式にサポートされていません。こちらで紹介されているように、非公式には存在しているみたいです。

今回は、LaTeXのソースの色付けが公式にサポートされているhighlight.jsの導入を試しました。kakurasanの備忘録さんの「HTML内のコード色付き表示highlight.jsのBloggerへの設置とカスタマイズ」という記事を参考にしました。
公式サイトに行き、「Get version 8.7」のボタンをクリックすると次の 画面になります。現在のバージョンは8.7です。
最初の説明によると、よく使われる22の言語についてはCDNにホストされているので自前で導入しなくとも使えるそうで、この部分のコードをテンプレートに記述することだけで良いのですが、TeXはこの中に含まれていません。下にスクロールしてみると利用可能な言語の一覧があります。
Common部分がCDNにホストされている言語で、それ以外の言語についてはチェックを入れてパッケージをダウンロードし、自分で設定を行う必要があります。

下の方にTeXも見つかりました。ここではScilabとTeXにチェッックを入れています。必要な言語を選んで「Download」ボタンをクリックするとhighlight.zipというファイルがダウンロードされるので解凍します。今回実質的に用いるのは、解凍したフォルダ内にあるhightlight.pack.jsというファイルだけです。これがソースコードに色付けするJavaScriptライブラリです。このファイルの内容をテンプレートに貼り付ける方法もあるようなのですが、ここではGoogle Driveにファイルをアップロードして設置する方法を取りました。

私の場合はhighlight.zipを解凍してできたhighlightというフォルダそのものをGoogle Driveにアップロードしました。以下はGoogle Driveでフォルダの中身を開いた画像です。
ここでhighlight.pack.jsを選択し、右上の左から2番目の人型アイコンから共有の詳細設定でアクセス権限を「ウェブ上で一般公開」に設定します。この画像は共有設定済みのものです。
同じアイコンをクリックするとファイルのリンクが表示されます。下の画像はその一部です。
ここで「 https://drive.google.com/file/d/…/view?usp=sharing」のドット部分にある文字列をコピーします。このファイルの実体は「https://googledrive.com/host/…」にあります。

さて、このスクリプトファイルを参照する設定をブログのテンプレートに書き込む設定をしましょう。

ブログの編集画面から、テンプレートを選択し、「HTMLの編集」ボタンをクリックします。そしてbodyで囲まれた部分の最後の方に次のように記述します。
記入した内容は
<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.7/styles/monokai.min.css' rel='stylesheet'/>
<script src='https://googledrive.com/host/「上でコピーした文字列」' type='text/javascript'/>
<script>hljs.initHighlightingOnLoad();</script>
です。最初の1行は色付けのスタイルファイルの設定で、こちらも通常は自前のファイルを使って設定をするのですが、どうにもうまくいかなかったためCDNに置いてあるcssファイルを読み込むように設定しました。ここではmonokaiというスタイルを選択しています。
他のスタイルを試したい場合は、公式ページのlive demoの部分から各言語での色付けの様子を確認することができます。

以上でテンプレートの設定は完了です。
<pre><code>...</code></pre>
で囲んだ部分が色付けされます。言語は自動判定しているので、判定がうまくいっていない場合や言語を明示したい場合は
<pre><code class="tex">...</code></pre>
のように記述しておくと良いようです。

2015年9月2日水曜日

tikz-cdで可換図を描いてみた。

横幅が広すぎる可換図をページ内に収めるため、tikz-cdのマニュアルを参考に複数行にわたる可換図を描いてみました。


次はできあがった図の画像です。
ソースは以下の通り。
\documentclass[10pt,a4paper]{article}
\usepackage[dvipdfmx]{graphicx}
\usepackage{amsmath,amssymb}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{cd}

\begin{document}
\begin{equation*}
 \begin{tikzcd}[column sep=small]
  H_{n+1}(S_\ast(U)+S_\ast(V))
  \arrow[r]
  \arrow[d]
  &(\Sigma^{-1}\mathbb{Z})_n
  \arrow[r]
  \arrow[d,equal]
  &H_n(\tilde{S}_\ast(U)+\tilde{S}_\ast(V))
  \arrow[d]
  \arrow[ddd, phantom, ""{coordinate, name=Z}]
  \arrow[dd,rounded corners,
  to path={ --([xshift=2ex]\tikztostart.east)
            |-($(Z)+(0,-1ex)$)\tikztonodes
            -|([xshift=-2ex]\tikztotarget.west)
            --(\tikztotarget)}]
\\
  H_{n+1}(X)
  \arrow[r]
  &(\Sigma^{-1}\mathbb{Z})_n
  \arrow[r]
  &\tilde{H}_n(X)
  \arrow[dd,rounded corners,
  to path={ --([xshift=2ex]\tikztostart.east)
            |-($(Z)+(0,+1ex)$)\tikztonodes
            -|([xshift=-10ex]\tikztotarget.west)
            --(\tikztotarget)}]
\\
& &H_n(S_\ast(U)+S_\ast(V))
 \arrow[r]
  \arrow[d]
 &(\Sigma^{-1}\mathbb{Z})_{n-1}
  \arrow[d,equal]
\\
&&H_n(X)
  \arrow[r]
&(\Sigma^{-1}\mathbb{Z})_{n-1}
 \end{tikzcd}
\end{equation*}
\end{document}