検索キーワード「TikZ」に一致する投稿を日付順に表示しています。 関連性の高い順 すべての投稿を表示
検索キーワード「TikZ」に一致する投稿を日付順に表示しています。 関連性の高い順 すべての投稿を表示

2025年12月13日

Typst: fletcherで図式

Typst Advent Calendar 2025の13日目です.

Typst,その軽さもあり数学なものを簡単に書くのに使ったりしています.で,何書いてもどっかで図式を描きたくなる.LaTeXではtikz-cdを使っていて,論文書く時も大体読み込んでいます.SATySFiならばmatrixcdですね.というわけでTypstではどうするか.commuteというそれっぽい名前のパッケージもありますが,fletcherというtikz-cdに書式が近く見えるパッケージを使ってみました.tikz-cdの例に並べて書いてみます.なお,図式以外にもいろいろとグラフが描けるようですが,ここでは図式のみ考えます.

とりあえず

次で読み込んでおきましょう.

#import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge

簡単な例です.


#diagram($
  A edge("r", ->, f) edge("rd",->) & B edge("d",->, g) \
  & C
  $)

ディスプレイ数式で使うことが多いでしょう.

$
#diagram($
  A edge("r", "->", f) edge("rd","->") & B edge("d","->", g) \
  & C
  $)
$  

#diagramコマンドで描きます.#diagramの中身も数式に入れておきます.対象(マニュアル内ではvertex)は表のように並べ,横方向の対象の並びは&で分けて,縦方向の区切りは\で行います.edgeコマンドで矢印を引きます.その書式は次の通り.

edge(<対象>, <mark>, <ラベル>, <オプション>)

markというのは矢印の形のようです.上の例でわかるように,矢印の時には->とします.これを渡さないと単なる線になります.ラベルは矢印の上などに出てくるやつです.

#diagram($
  A edge("r", "->", f) & B edge("->", g, label-side: #right) & C edge("->",h,label-side: #center) & C
$)

ラベルの付く方向を変えるにはlabel-sideオプションを指定します.#rightを指定することで矢印に従い右に出ます.#centerとするとど真ん中.二つ目と三つ目のedgeでは行き先の指定を省略しました.「一番近く」に出るようです.なお基本数式モード内ですが,オプション引数は大体コードモード内で有効なものなので,基本的には#でいったんモードを切り替えることになります.

#diagram($
  A edge("r", "hook->") & B edge("hook'->") & C & D edge("l","hook'->")
$)

矢印の形(mark)の指定はこんな感じで文字列で指定するみたいです."hook->"hook""->"の組み合わせで,他のもこういう組み合わせでできるようです.ちなみに単にedge("r",->)でもよかったりするのですがマニュアルのどこに書いてあるのかな.試しにedge("r",arrow.hook)としても上みたいになりました.

#diagram($
  A edge() & B edge("->>") & C edge("=") & D edge("|->") & E edge("-->") & F edge("..>") & G
$)

矢印いろいろ.マニュアル見るともっとあります.

#diagram($
  A edge("rd","->",a, label-angle: #auto) & \
  & B 
$)

label-angleオプションでラベルが傾きます.#autoでよい感じになりますが,#right#left#top#bottomを指定できます.これらは矢印の傾きにあわせてくれますが,90度ずつ違います.なお,#(-15deg)とすると-15度になります.

#diagram($
  A edge("d", "->", shift: #(3mm)) edge("r","->", shift: #(-3mm))  & B \
  C edge("u", "->", shift: #(3mm)) & D edge("lu", "->", shift: #(3mm)) \
  E edge("u", "->", shift: #(3mm,-3mm))
$)

矢印をずらす.2引数与えるのは始点と終点を別方向にずらすことを意味します.


#diagram($
  A edge("r", ->,bend: #30deg) & B edge("l",->,bend: #30deg)
$)

少し迂回する矢印.

#diagram($
  A edge(->,stroke: #(2pt)) & B edge(stroke: #none, label-side: #center,in.rev) & b
  $
)

strokeオプションで矢印の太さが指定できます.#noneとすると消えます.

#diagram($
  A edge(->,f,label-pos: #0.2) & B edge(->,g,label-pos: #0.8) & C
  $)

label-posオプションでラベルの場所を指定できます.0から1までの数を指定します.0が始点の近く.

#diagram($
  A edge(->,bend: #45deg) edge(->,bend: #(-45deg)) & B$,
  edge((0.5,-0.2),(0.5,0.2),"=>",$alpha$)
)

tikz-cdでは矢印についたラベルの場所に名前をつけてその間に矢印をさらに引けましたが,そういう方法は見つけられませんでした.上ではまず数式モードから脱出してから矢印を描いています.数式モードから出ることで,edgeに始点と終点を指定することができるようになります.#diagramでできる図式は左上を(0,0)とした座標空間上に配置されていて,その座標を直接指定して線を引いています.

#diagram($
  A edge("rd",->) & B edge("ld",->, crossing: #true, crossing-thickness: #32)\
  C & D
$)

crossing: trueを指定すると,その周りを(デフォルトでは)白く塗りつぶします.これにより他の矢印が一部白抜きされます.どの程度の幅で塗りつぶすかはcrossing-thicknessオプションで指定できます.塗りつぶすという処理の事情で描画順が大事で,同じオプションをAからDの矢印に適用しても思うように機能しません.この時はDからAに逆向きの矢印をedge("lu", <-, crossing: #true, crossing-thickness: #32)として引けばよいでしょう.

#diagram($
  A edge(->,f) & B edge(->,g,label-sep: #1em) & C
$)

label-sepオプションで,ラベルの矢印からの距離を指定します.負の値を指定すると矢印にめり込んでいきます.

#diagram($
  node(#[$A$],stroke: #1pt) edge(->) & node(#[$B$],stroke: #1pt, shape: #rect)
$)

各対象を装飾するにはnodeでくくります.Aはそれだけ書けばよい気がするのですが何故か寝てくれないのでいったんマークアップモードに入ってから数式に戻しています.nodeにはいろいろオプションがあるのでマニュアルを見てみてください.

埋め込み $#diagram($Z edge("hook->",i) & X$)$ を考える.

インラインでも問題なく使えます.

デバッグ

#diagram(debug: true,$
  A edge(-gt;) & B
$)

#diagramdebug: trueを渡すとデバッグモードに入り,座標などの情報が出ます.値はtrueの他1,2,3の数字も指定できて,だんだんと情報量が増えていくようです.

2020年12月7日

SATySFiで可換図式

これはSATySFi advent calendarの七日目の記事です.昨日はpuripuri2100さんの予定です.明日はamutakeさんの予定です.

ちょっと長めの文書をSATySFiで最近作っています.で,図式を描く必要が起こったので,パッケージMatrixCDを作りました.LaTeXパッケージのtikz-cdのように書けるようにしました.実は標準パッケージに図式を描くものがあったり,それとは別に既存のパッケージNon-Commutative Squaresというのがあったりするんですが,前者はすっかり忘れていて後者は存在に気がついたのが大分できてからでした.シンタックス大分違うのでまぁいいかと.tikz-cd万歳.

ドキュメント書こうと思っていたのですが間に合わずでした.

インストール

Satyrographosが入っていれば楽です.

$ opam install satysfi-matrixcd
$ satyrographos install

またはmatrixcd.satyを適当なフォルダに置けばよいです.

使い方

プリアンブルに次が書かれていることを仮定します.

@require: matrixcd/matrixcd
open MatrixCD

簡単な例は次の通りです.

+p{
  \eqn(${
    \matrixcd{
      |A \arrow![to `r`; label ${f}]\arrow![to `rd`] | B\arrow![to `d`;label ${g}]\cr
      | | D
    |}
  });
}

これで次のような出力が得られます.

+p{}は段落,\eqn(${...});がディスプレイ数式なのはSATySFiのいつも通りです.その中の\matrixcdが図式を出力します.書式は(tikz-cdと同様に)表の形で並べて,\arrowで矢印を引きます.表組みの区切りは|です.easytableとかと同じですね.改行は\crで指定します.

矢印へのもろもろの指定は\arrow![<引数>]への引数で行います.複数の設定をする場合は;で区切ります.ほぼ必須設定がtoで,矢印の行き先を指定します.引数は``で囲まれた文字列でrludの四文字の組み合わせです.それぞれ右,左,上,下で始点からの相対位置で指定します.

矢印に付随させてラベルをつけられます.label ${<ラベル>}で指定します.

\arrowのオプション

\matrixcd{
  |A\arrow![to `r`;label ?:[swap] ${f}] | B
|}

\arrowではなくlabelのオプションです.labelへのオプションはこのようにlabel ?:[<オプション>] ${<ラベル>}のように指定します.swapは表示位置を反転させるオプションです.

\matrixcd{
  |A\arrow![to `r`;hook] | B\arrow![to `r`;twoheadrightarrow] | C\arrow![to `r`;equal] | D | E\arrow![to `l`;hook-swap]\cr
  |F\arrow![to `r`;dotted] | G\arrow![to `r`;dashed] | H\arrow![to `r`;mapsto] | I
|}

色々な矢印.

\matrixcd{
  |A\arrow![to `r`;label ?:[description] ${f}] | B
|}

これもlabelへのオプション.矢印の間に挟む.

\matrixcd{
  |A \arrow![to `d`;shift (10pt,0pt)] \arrow![to `r`;shift (0pt,5pt)] | B\cr
  |C \arrow![to `u`;shift (-10pt,0pt)] | D \arrow![to `lu`;shift (5pt,5pt)]
|}

矢印をずらす.shift (<x>,<y>)で右にx,上にyずらします.

\matrixcd{
  |A \arrow![to `r`; shift-out (0pt,5pt)] | B\arrow![to `r`;shift-in (0pt,-5pt)] | C
|}

矢印の出発地点をずらすshift-outと到着地点をずらすshift-in

\matrixcd{
  |A \arrow![to `r`; bend 90.0] | B\arrow![to `r`;bend-right] | C\arrow![to `r`;bend-left] |D\cr
  |E \arrow![to `r`; arrow-in 315.0; arrow-out 225.0] | F
|}

曲がる矢印.矢印がでたり入ったりする角度をずらします.bendは引数の角度分だけ矢印の出入りの方向を回します.bend-leftbend 30.0bend-rightbend 330.0です.この小数点は省略できません.bend 30はエラーです.arrow-inarrow-outは指定された方向へと矢印の入る方向と出る方向を変更します.

\matrixcd{
  |a \arrow![to `r`; phantom; label ${\in}] | A
|}

phantomを指定すると矢印が消えてラベルが真ん中に出ます.

\matrixcd{
  |A \arrow![to `r`; label ?:[pos 0.2] ${f}] | B\arrow![to `r`; label ?:[pos 0.8] ${g}] | C
|}

これもlabelへのオプション.posは指定された値の割合に応じてラベルの位置をずらします.0から1までの値を指定し,0の方が始点に近く,1の方が始点から遠い.

\matrixcd{
  |A \arrow![to `rd`;crossing-over] | B\arrow![to `ld`] \cr
  |C | D
|}

crossing-overで矢印を重ねます.たまにうまく行きません.上に引く矢印が後にあるとまずいみたいなんですが,逆ならともかく何でだろう.

\matrixcd{
  |A \arrow![to `r`;arrow-color Color.red] | B\arrow![to `r`; label ?:[label-color Color.blue] ${f}] | C
|}

色をつけます.

\matrixcd{
  |A | B\arrow![from `l`]
|}

矢印はtoで終点を指定する方がわかりやすいと思いますが,始点をfromで指定することもできます.両方使うこともできて,もう全然関係ない場所から矢印がでちゃう.

\matrixcd ?:![row-sep 15pt; column-sep 60pt]{
  |A\arrow![to `r`]\arrow![to `d`] | B\cr
  | C | 
|}

これは\matrixcdへのオプション.各行,各列の間の距離を指定します.デフォルトは40pt.

実装

半分メモ書きです.

  • 上のシンタックスを実現するために,可変参照を多用しています.例えば\crの実装は次のようになっています.
    let-mutable ref-cr <- false
      let-math \cr =
      let aux ctx =
        let () = ref-cr <- true in
        ${}
      in
      text-in-math MathOrd (fun ctx -> embed-math ctx (aux ctx))
    
    このようにref-cr\crが現れたというフラグをたてるだけです.なお,auxの引数ctxは不要そうに見えますが,これを消すと評価場所の関係でref-crにうまく値が入りません.いずれにせよ,このような命令が含まれているmath listを\matrixcdは受け取ります.\matrixcdはこのリストを
    % リストの中身を順番に処理している
    % itに今処理しているmathが入っている.
    let () = ref-cr >- false in % ref-crにfalseをセット
    let ib = embed-math ctx it in % itをinline-boxesに変換,\crがあればここで処理される.
    % 以下ref-crの値に応じて改行するか否かの処理
    
    という感じで処理します.\arrowも同様で,矢印の設定などの情報を適当な可変参照に代入していきます.
  • 矢印は「head」「tail」「body」の三カ所に分けて作っています.外からいじれるわけじゃないですが…….headとtailを出力するのは
    arrow-option-data -> length * length -> length * length -> context -> (length * length) * graphics list;
    という関数で,<オプション> <始点> <終点> <context>を受け取り,(<pt>,<graphics list>)を返します.オプションは\arrowのオプションとして渡される物(の一部)であまり重要ではありません.<graphics list>が矢印の形そのものです.<pt>は,bodyの終点と始点を表します.bodyを出力する関数には,tailとheadから返されたこの始点と終点が渡されます.bodyを出力する関数は
    arrow-option-data -> length * length -> length * length -> context -> graphics list;
    です.やはり始点,終点,contextを受け取り,graphics listを返します.ここに渡される始点,終点はtailおよびheadが返したものです.最も単純な実装としては始点から終点まで線を引くだけのものになります.

2020年8月27日

後期の講義のノートをSATySFiで書き出した.LaTeXの方が速く書けるので途中で諦めるかもしれないが…….

そのうち可換図式が必要になるかもしれないと思ってしまったので,tikz-cd風に書けるパッケージをでっち上げてみた.tikz-cdみたいに何でもできるのは無理だけど,まぁ必要最低限くらいはそろえてみようかと.bendhookに対応するものを作ればとりあえずは困らないかなぁ.

一日一機能,くらいに思ったけど機能次第で厳しいかな.まぁのんびり.インストールはこんな感じでできるんじゃないかな.

opam pin add https://github.com/abenori/satysfi-matrixcd.git
opam install satysfi-matrixcd
satyrographos install

ちなみにSATySFiの可換図式を書くパッケージはNCSqというのが既にあったみたい.存在に気がつかなくてなんとなく作ってしまって楽しくなってしまったし,文法がtikz-cdの方が慣れているのでそのままいじっているけど.

2020年4月25日

久しぶりにtikz-cdのを更新.下の方にインラインで数式を書く方法を追記.マニュアルにあるものそのものだけど.

2019年1月21日

tikz-cdで(というかもう殆どTikZで)蛇の補題を描く.

結論

Wikipediaにある図を描いてみました.(tikz-cdのマニュアルを参考にしています.)

%\usepackage{amsmath}
%\DeclareMathOperator{\Ker}{Ker}
%\DeclareMathOperator{\Coker}{Coker}
\begin{tikzcd}
& \Ker a \arrow[r]\arrow[d]
& \Ker b \arrow[r]\arrow[d]
& \Ker c \arrow[d]\\
& A \arrow[r,"f"]\arrow[d,"a" near start]
& B \arrow[r,"g"]\arrow[d,"b" near start]
% BからB'にダミーの矢印を引き,その中点の名前をZとする.
\arrow[d, phantom, ""{coordinate, name=Z}]
& C \arrow[r]\arrow[d,"c" near start]
% 二つの0にX,Yという名前を与えておく
& |[alias=X]|0 \\[2ex] % ここの縦方向の空きを少し広げておく
|[alias=Y]|0\arrow[r]
& A' \arrow[r,"f'"]\arrow[d]
& B' \arrow[r,"g'"]\arrow[d]
& C'\arrow[d]\\
& \Coker a\arrow[r]
\arrow[from=uuurr,crossing over,"d" at end,
rounded corners,% 角を丸める
% to pathを使って頑張って描く
to path={(\tikztostart) -| ([xshift=1em]X.east)\tikztonodes |- (Z) -| ([xshift=-1em]Y.west) |- (\tikztotarget)}]
& \Coker b\arrow[r] & \Coker c
\end{tikzcd}

to path

通常tikzcdの\arrowはまっすぐな矢印しか描けませんが,to pathキーを使うとかなり柔軟に線を引くことができます.to pathキーの値は,TikZによる描画の書式そのものが入ります.TikZのマニュアルやTeX WIkiも参考にしてください.

基本的な書式は<始点> -- <中間点1> -- <中間点1> -- …… -- <終点>です.これで<始点>から始まり<中間点1><中間点2>,……を通り<終点>へとたどり着く矢印が引かれます.点と点の間を--で引くとまっすぐな線が引かれますが,代わりに|--|を使うと縦と横との線のみを使って引こうとします.--の代わりにtoと書くこともできます.これも--と同様まっすぐな矢印を出力しますが,to [out=135,in=45]のように始点と終点の場所を角度で指定することもできます.(ちょっと曲がった矢印が出ます.)

始点は\tikztostart,終点は\tikztotargetで参照できます.中間点は上の例のように適当に名前をつけて使うとよいでしょう.名前の後に.eastをつけるとその点の右側を表します..west.north.south等など.coordinateはラベルのサイズを0にするオプションで,長い矢印は実際には「X.eastからZの右」と「Zの左からY.west」と分割されているので,coordinateがないとZの幅の分だけ空きができてしまいます.また,++<座標>とすると前の点からの相対位置を表すことができます.例えばto path={(\tikztostart) -- ++(1cm,1cm)}とすると,始点から右に1cm,上に1cm行った先の点まで矢印が引かれます.

矢印に対するラベルは,つけたい位置に\tikztonodesと書きます.もちろん\arrowへのオプションとしてラベルを指定しておく必要があります.またはnodeを直接指定することもできます.例えば上の例で,\tikztonodesの代わりにnode[at end,right]{$d$}と書いても同じ出力を得ることができます.

その他,放物線,サインカーブ,ベジェ曲線などなど…….

2018年8月17日

kmaedaさんのマニアックなネタに反応してみる.\paragraphの直後に\leavevmodeをおくよう改変してしまうと,\paragraph直後に\parがあった場合に同行見出しでなくなってしまいます.

\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\@xsect}{\fi\ignorespaces}{\leavevmode\fi\ignorespaces}{}{}
\makeatother
\begin{document}
aaa
% この\paragraphの後に改行が入る
\paragraph{bbb}

ccc
\end{document}

というか多分これを回避するためにlatexにおける\paragraphの実装はああなっているんでしょう.まともには最後に挿入されるコードを

\documentclass[a4paper]{article}
\begin{document}
aaa
\paragraph{bbb}
\makeatletter
\par
\if@noskipsec\leavevmode\fi
\vfil\penalty-10000
\makeatother
\end{document}
みたいに\paragraph出力を考慮したものにすることになるのでしょうが…….

2018年3月28日

Dynkin図形を描こう

LaTeXで.

dynkin-diagramsパッケージ

Dynkin図形を描きたいという話.dynkin-diagramsというそのものっぽいパッケージがあることに気がついた.使ってみた.Tikzを中で使うので,dvipdfmx利用の場合はドライバ指定を忘れないように.platex+dvipdfmxの場合は

\documentclass[dvipdfmx]{jlreq}
\usepackage{dynkin-diagrams}
\usetikzlibrary{backgrounds}
とする.pdflatexの場合はドライバ指定は不要.

基本書式

\dynkinという命令が用意されている.書式は

\dynkin[<オプション>]{型}{ランク}
である.ランクが空の場合は一般っぽくなる.

$B_3$:\dynkin{B}{3}

$D_4$:\dynkin{D}{4}

$E_8$:\dynkin{E}{8}

$A_n$:\dynkin{A}{}

線の長さが短いとか思っちゃう場合はオプションで解消できる(後で).ランクを空にすると,途中の辺が破線になる.この場所は適当に決まっているけど,変えたい場合は,決まったランクのDynkin図形の辺の一部を破線にすることでできる.オプションmakeIndefiniteEdgeを使う.

もともと:\dynkin{A}{},
変更:\dynkin[makeIndefiniteEdge={1-2}]{A}{4}

\dynkin[makeIndefiniteEdge={1-2},makeIndefiniteEdge={3-4}]{A}{4}のように,複数指定することもできる.頂点の番号付けはBourbakiに従う.(後のlabelオプションも参考.)

affine型は型の後にオプション引数を与える.記号はKacの本に従っているようだ.

$A_5^{(1)}$:\dynkin{A}[1]{5}

$D_4^{(3)}$:\dynkin{D}[3]{4}

オプションextendedにより,拡大Dynkin図形を描くことも可能.

$A_1$の拡大Dynkin図形:\dynkin[extended]{A}{1}

$E_7$の拡大Dynkin図形:\dynkin[extended]{E}{7}

0番目の頂点(加わった頂点)だけ白丸になるのが嫌ならば,\dynkin[extended,affineMark=*]{E}{7}とすれば良い.また,オプションKacを指定すると,見た目がKacの本っぽくなる.

\dynkin[Kac,extended]{A}{3}

佐武図形も描けるよ.(記号はHelgasonの本に従う.)

\dynkin{A}{IIIa}

Coxeterグラフを描きたい場合はオプションCoxeterを指定すればよい.

\dynkin[Coxeter]{B}{4}

スタイル指定

見た目の指定もオプションでできる.

\dynkin[radius=1mm, % 頂点の半径を1mmにする
  edgeLength=1cm, % 辺の長さは3cm
  label, % 頂点にラベルをつける
  mark=o, % 頂点は白丸
]{E}{8} % で,E8を表示

パッケージ読み込み時に指定しておけば,文書内全てに適用される.

\usepackage[radius=1mm,edgeLength=1cm,label,mark=o]{dynkin-diagrams}

ラベル

上述のように,オプションlabelにより頂点にラベルをつけることができる.順番はBourbaki式だが,他の指定もある.

\dynkin[label]{E}{8}
\dynkin[label,ordering=Adams]{E}{8}
\dynkin[label,ordering=Carter]{E}{8}
\dynkin[label,ordering=Dynkin]{E}{8}
\dynkin[label,ordering=Kac]{E}{8}

ラベルは通常数字がつくだけだが,オプションlabelMacro/.codeでカスタマイズできる.

\dynkin[label,labelMacro/.code={\alpha_{#1}}]{A}{3}% #1がラベル番号になる.

Tikz環境内に飛び込み,\dynkinLabelRootを使えば個別にラベルをつけることもできる.

\begin{tikzpicture}
\dynkin[mark=o,extended]{B}{3} % B3の拡大Dynkin図形を,頂点を白丸にして描く
\dynkinLabelRoot{0}{\textit{hs}}
\dynkinLabelRoot{1}{\textit{hs}} % 0,1番目の頂点に「hs」というラベルをつける
\end{tikzpicture}

頂点

上述のように,頂点はオプションmarkで変更できる.デフォルトの黒丸は*で,白丸にするにはo.他の指定は次のような感じ.

\dynkin[mark=O]{A}{3}
\dynkin[mark=t]{A}{3}
\dynkin[mark=x]{A}{3}
\dynkin[mark=X]{A}{3}

affine型の場合は,0番目の頂点に対してはオプションaffineMarkで指定する.

\dynkin[mark=x,affineMark=O]{A}[1]{3}

一部だけ変更したい場合は,Tikz環境内に入ってから\dynkinRootMarkを使う.

\begin{tikzpicture}
\dynkin[mark=o]{A}{5}
\dynkinRootMark{*}{2} % 2番目の頂点を黒丸に変更
\dynkinRootMark{O}{4} % 4番目の頂点を二重丸に変更
\end{tikzpicture}

affine型ならば,\dynkinRootMark{x}{0}のようにすると0番目の頂点を変更できる.(もちろんaffineMark=xと等価.)

\dynkinの第二引数はランクだったけど,ここに頂点表示のリストを並べることもできる.

\dynkin{A}{x*oOtX}% A6型

affine型の場合に0番目の頂点をこの方法で指定することはできないので,affineMarkを使う.

リストの途中に.(ピリオド)があると,makeIndefiniteEdgeと同じ効果を及ぼす.

\dynkin{A}{**.x.oo}

folding

Dynkin図形のfoldingも実装されている.(ただし「limited support」とのこと.)ply=<n>をオプションに入れることで,最大$n$個のルートが一つに潰れているfoldingを表す.例えば次の通り.

\dynkin[ply=2]{D}{4}

\dynkin[ply=3]{D}{4}

ply=2の省略形(?)としてfoldが用意されている,$D_n^{(1)}$型にfoldを指定すると左右両方ともfoldされる.左のみ,右のみとしたい場合はfoldleftfoldrightを指定する.

\dynkin{D}[1]{}
\dynkin[foldleft]{D}[1]{}
\dynkin[foldright]{D}[1]{}
\dynkin[fold]{D}[1]{}

Tikz環境に入れば,\dynkinFoldによりもっと直接に指定できる.

\begin{tikzpicture}
\dynkin{D}{4}
\dynkinFold[bend left=60]{3}{4}
\end{tikzpicture}

bend rightオプションで二つのルートをつなげている線が曲がる.60は曲がっている部分の角度.

$\mathfrak{so}(2p+1,2q+1)$のVogan図形

\dynkin[fold]{D}{oo.o*o.oooo}

2016年12月31日

今年も一年を振り返ってみる.

一月.パリで年明け.初詣(?)はノートルダム大聖堂.integral p-adic Hodge theoryの連続セミナー.フランスの国勢調査に回答.二月.\epTeXinputencodingが追加される.arXiv:1512.08296を眺めていた.全体的にもっと理解したい.VAIO Duoのペンが動かなくなり焦る.原因は電池切れ.三月.サン・マルタン運河は大掃除中.セーヌ川ちょっと増水していた.AlphaGoつえー.アナと雪の女王を買う.テロの犯人が逮捕された.ブリストルで集会.四月.Bhargavaが来て映画の話していた.びびりながらSaint-Denisの大聖堂に行った.熊本大地震.Lyon駅で売っていた駅弁はまずかった.五月.Chantillyに調べずに行って大変.Aubertさんの個展にいかせてもらう.インディアナ大学で集会.VAIO Duoのバッテリーが「注意」になった.スト.六月.雨続きでセーヌ川は大増水,一部はん濫.オルセー大学は水没.ピサの集会.EURO2016.La Fete du Cinemaでレッドタートルとファインディングドリー見た.

七月.最後のバカンス.今更フォンテーヌブロー.Fete nationale.最後に怪我して病院に行った.jlreq.cls作り始めた.八月.オリンピック.あまり見なかった.最後に駆け込み観光.特にルーブル.月末に日本に帰国.なんだか寂しい…….九月.佐賀の代数学シンポジウムを聞きに行く.学会にも行った.Compute Stick買ってみた.ファイターズ優勝.十月.デジカメ新しいのを買った.京都で幾何学的表現論の集会.二十日に早くも雪が積もった.祝鳥1.00.ファイターズ日本一.十一月.健康診断の結果がいまいち.高木レクチャーから集中講義.と京都で更に集会.十二月.arXivに投稿したらtikz-cdが古くて詰まる.大雪にやられたセミナー講演者.やまもとさん結婚式.大雪からなんとか逃げ延びて新潟でささじまにあった.というわけで飲み過ぎながら年末.

やっぱりパリから帰ってきたのが大きな一年だったなぁ.三年間年末年始に海外にいたので,久しぶりの日本での年明け.それではみなさまよいお年をー.

2016年12月6日

昨晩arXivに投稿したのだが,大変だった.論文を書くのがではなくて(それは常に大変である),LaTeXのコンパイルが通らなくて.原因はarXivが使っているTeX Liveが2011と古めのものだったこと.それでも殆どのパッケージは問題ないのだが,tikz-cdパッケージで引っかかった.おそらく2011頃が殆ど初出で,その後だんだんとよくなっていったのではないかと.

ともかくまずは\arrowの書式が違う.以前は

\arrow[<矢印へのオプション>]{<方向>}[<添え字へのオプション>]{<添え字>}
だったのだが(オプションや添え字は省略可能),新しい書式では
\arrow[<矢印へのオプション>,<方向>,<添え字へのオプション>,"<添え字>"}
といっぺんに与える.(新しいtikz-cdでは古い書式もサポートしている.)これは単に書き換えればよいだけだった.また,いくつかの矢印に対するオプションが使えなかった.具体的にはdashequalphantomあたりが引っかかった.次のように変更してみた.

  • \arrow[dash]{r}\arrow[-]{r}
  • \arrow[equal]{r}\arrow[-,double line]{r}
  • \arrow[phantom]{r}{X}\arrow[draw=none,labels={font=,anchor=center}]{r}{X}

phantomはtikz-cd.sty(の本体のtikzlibrarycd.code.tex)からとってきたもの.これでコンパイルは通ったのだが,結果がおかしい.どうもスペースあたりの調整がうまくされていないようで,数式に矢印が重なったりしている.なんとか手動調整したが,かなり手間取って,結局一部数式そのものを変更したりした.うーむ,arXivのTeX Liveがアップデートするまではtikz-cdは使わない方がよいのかもしれない…….

2016年2月18日

前に書いたtikz-cdの話に追記をした.すっかり\xymatrixは使わなくなって,tikz-cdになっている.殆ど変わらないんだけど,なんとなくtikz-cdの方が使いやすい感じです.

2015年8月6日

pgfplots

グラフを描くためのpgfplotsパッケージ.

はじめに

こんなグラフを描きたくなったりはしないでしょうか?

$y = x^3 - x$のグラフです.LaTeXでこのようなグラフを描く手段はいくつかありますが,pgfplotsはそれを実現するパッケージの一つです.その名の通り描画エンジンとしてPGFを使います.要するにナウいってことです.

かなり大きなパッケージで,マニュアルも500ページ以上あります.単なる上のようなグラフだけで無く,三次元のグラフや,データファイルをもとにしてグラフを作成するなんてこともできます.色々できすぎるので,ここでは上のような関数で指定された二次元のグラフを描いてみます.*1

使い方

W32TeX,TeX Liveどちらにも既に入っているので,改めてインストールする必要はないでしょう.プリアンブルは

\documentclass[dvipdfmx]{jsarticle}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
です.(platex + dvipdfmxの場合.ドライバ指定はtikzパッケージと同様の方法で行います.)\pgfplotssetはpgfplotsパッケージへの設定を行います.compat=1.12は「Version 1.12モード」で動かす設定です.後々pgfplotsパッケージがバージョンアップした場合,仕様の変更などが行われる可能性がありますが,この指定を入れておくことでバージョン1.12(現在の最新バージョン)との互換性を保った動きをしてくれます.

上のグラフは次のようにして描きました.

\begin{tikzpicture}
\begin{axis}[axis lines=center]
\addplot[samples=200,domain=-2:2]{x^3 - x};
\end{axis}
\end{tikzpicture}

Tikzユーザにはおなじみのtikzpicture環境で描画します.axis環境でx軸y軸を表示し,\addplotで関数の描画を行います.

\addplot

関数描画は\addplotで行います.$y = f(x)$のグラフを描きたい場合は,

\addplot[<option>]{f(x)};
とします.*2最後のセミコロンを忘れないようにしてください.引数はxを使います.利用可能な関数のうち
+,-,*(かけ算),/,^(冪),max,min,sin,cos,tan,cot,sec,cosec,atan,asin,acos,exp,ln,sqrt,abs(絶対値),pi(円周率,定数),e(自然対数の底,定数)
あたりは使うことが多そうです.何故かlogじゃなくてlnなのがはまりそうですが.sinやcosなどは度数法で扱われることに気をつけてください.そのためにdeg(弧度法→度数法),rad(度数法→弧度法)という関数があります.*3cos(deg(x))という形で使うことになるでしょう.計算自身は\pgfmathparseというPGFのマクロで行われるので,そのほか使える関数などはPGFのマニュアルの該当部分を参照してください.

実際の描画は等間隔にとったx座標の点に対してf(x)を計算し,線で結ぶことで行われます.samplesオプションでこの間隔(というか点の数)を指定します.最初の例を

\addplot[domain=-2:2]{x^3 - x};
とすると次のようになります.

少しがたがたしているのが……わかりませんね…….手元でやってみて拡大してもらった方がよさそうです.(わかりにくい場合はsamples=10などとして試してみるとわかりやすいです.)

domainオプションは変数の動く範囲を指定します.省略しても適当に定めてくれますが.例えば

\addplot[samples=200]{x^3 - x};
とするとこうなります.

……極大極小が見えないですね.ちなみにx座標とy座標の最大最小も適当にpgfplotsが定めてくれますが,これも指定可能です.(後述のaxis環境を参照.)

パラメータ表示$t\mapsto (f(t),g(t))$による指定も可能です.方法は

\addplot[<option>]({f(x)},{g(x)});
とします.やはり変数はxを使います.例えば
\addplot[samples=200,domain=0:2*pi]({cos(deg(x))},{sin(deg(x))});
とすると円になります.f(x)やg(x)を囲む{}はなくても動くことがありますが,つけておいた方がよいようです.(上の例では単に(cos(deg(x)),sin(deg(x)))とするとエラーになりました.)この例ではdomainオプションは必須です.

陰関数による指定はできないようです.ちなみにマクロも使えます.

\newcommand{\f}{x^3 - x}
\addplot[samples=200]{\f};
\newcommand{\n}{3}
\addplot[samples=200]{x^\n};

axis環境

デフォルトでは次のような座標軸を表示します.

座標軸はこのように全体を囲む形で指定されます.これは上のようにaxis linesをオプションで指定することで変更できます.x座標とy座標を個別に指定したい場合は,axis x lineとaxis y lineを使います.いずれもデフォルトは「box」です.「center」とすると上のように0の位置に引かれます.他には:

\begin{axis}[axis x line=top,axis y line=left]
\end{axis}

他には表示させなくするaxis x line=noneもあります.

座標の範囲自身は,pgfplotsパッケージがそれっぽいサイズにしてくれますが,指定することもできます.

\begin{axis}[axis lines=center,xmin=-2,xmax=4,ymin=-3,ymax=10]
\end{axis}

色々とつけてみます.

\begin{axis}[axis lines=center,title=グラフ,xlabel=$x$,ylabel=$y$,legend pos=outer north east]
\addplot[samples=200,domain=-2:2]{x^3};
\addlegendentry{$y = x^3$}
\addplot[dashed,samples=200,domain=-2:2]{x^2};
\addlegendentry{$y = x^2$}
\end{axis}

titleでタイトルを,x/ylabelでx軸y軸に名前をつけました.\addplotを二度以上使うことで複数のグラフを同時に描けます.区別するために二つ目の$y = x^2$の方にはdashedオプションをつけて破線にしました.このオプションはTikzから来ています.そのほか,dottedやdash dot,dash dot dotなどが有り,また頭にlooselyやdenselyをつけると微妙に変化します.白黒印刷を想定して破線にしましたが,色を変更することもできます.単純に\addplot[red,samples=200,domain=-2:2]{x^2};とすると赤くなります.

凡例をつけるには\addlegendentryを使います.直前の\addplotに対する凡例が表示されます.凡例の位置はlegend posオプションをaxisにつけることで行えます.ouetr north eastを指定してグラフの外に置きましたが,legend pos=north eastと指定するとグラフ内に置かれます.予想される通り,legend posには他にnorth west/south east/south westが指定可能です.

グラフを描画するその他の方法

色々な方法があるようです.殆ど使ったことはありませんが,適当に列挙してみます.

  • gnuplotを使う.グラフと言えばgnuplotですね.LaTeXと組み合わせるには.なお,pgfplotsでも
    \addplot[samples=200,domain=-2:2] gnuplot {x**3 - x};
    とすることで計算をgnuplotに行わせることができます.ただし,gnuplotがインストールされている必要があり,更にコンパイルには-shell-escapeが必要です.
  • KETpic.Maple/Mathematica/Maxima/Scilabの計算結果をLaTeXに取り込ませることができるようです.
  • WinTpic.図作成のWYSIWYGなツール.ただしWindowsに限る.図形→関数から関数を指定してのグラフが出力できます.
  • emath.小中高での算数・数学用のパッケージ.関数グラフを描くのに便利なマクロがあります.
  • Tikz.Tikz自身にもこういうグラフ出力の命令があります.TeX Wikiの例
*1
三次元についてもそのうち書けるといいなぁ.
*2
オプションがない場合でも\addplot[]{f(x)}と空のオプションを指定しておいた方がこの文脈ではよいでしょう.単に\addplot{f(x)}とすると,あるオプション指定が自動でなされてしまいます.[]をおくことでそれを打ち消すことができます.\addplot{f(x)}でどうなるかは試してみてください.
*3
\pgfplotssetにtrig format=radをつけると弧度法で扱ってくれるようになります.が,試しているとこれのせいでエラーが発生してしまったりもしました.