GraphvizでTeXの数式を表示する(2) - PDFにしたい場合

TeXのレポートに貼り付けたいが、TeXではSVG形式は扱えないのでPDFにしたくなった。やってみたら思ったより面倒だったので備忘録として残す。 dotファイルの用意 前回と同じにする。ファイル名はgraph.dotとする。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 digraph { graph [ rankdir="LR" ]; node [ shape="circle", fixedsize=true, height=0.6 ]; Q0 [texlbl="$q_0$"]; Q1 [texlbl="$q_1$"]; Q2 [texlbl="$q_2$"]; Q3 [texlbl="$q_3$"]; Q4 [texlbl="$q_4$"]; Q5 [texlbl="$q_5$"]; Q6 [texlbl="$q_6$"]; Q7 [texlbl="$q_7$"]; Q8 [texlbl="$q_8$"]; Q9 [texlbl="$q_9$"]; Q10 [texlbl="$q_{10}$"]; Q11 [texlbl="$q_{11}$"]; Q12 [texlbl="$q_{12}$"]; Q13 [texlbl="$q_{13}$"]; Q0 -> Q1 [label=" ", texlbl="$\varepsilon$"]; Q0 -> Q4 [label=" ", texlbl="$\varepsilon$"]; Q0 -> Q7 [label=" ", texlbl="$\varepsilon$"]; Q1 -> Q2 [label=" ", texlbl="$a$"]; Q2 -> Q3 [label=" ", texlbl="$b$"]; Q3 -> Q7 [label=" ", texlbl="$\varepsilon$"]; Q4 -> Q5 [label=" ", texlbl="$b$"]; Q5 -> Q6 [label=" ", texlbl="$b$"]; Q6 -> Q7 [label=" ", texlbl="$\varepsilon$"]; Q7 -> Q8 [label=" ", texlbl="$a$"]; Q7 -> Q0 [label=" ", texlbl="$\varepsilon$"]; Q8 -> Q9 [label=" ", texlbl="$\varepsilon$"]; Q8 -> Q11 [label=" ", texlbl="$\varepsilon$"]; Q9 -> Q10 [label=" ", texlbl="$b$"]; Q10 -> Q13 [label=" ", texlbl="$\varepsilon$"]; Q11 -> Q12 [label=" ", texlbl="$c$"]; Q12 -> Q13 [label=" ", texlbl="$\varepsilon$"]; } dot → tex $ dot2tex graph....

2020-02-11 · (updated 2020-02-11) · 2 min · 290 words

GraphvizでTeXの数式を表示する(1)

Graphvizはグラフを描画してくれる素晴らしいソフトなのだが、単体では数式を表示することができない。 dot2tex dot2texを利用すると、グラフのラベルに数式が使えるようになる。 次の手順でグラフを作る。 dot言語でグラフを書く dot2texでdotファイルをtexファイルに変換 texを使ってpdfなりsvgなりを作る。 pdfならplatex + dvipdfを使う(詳細は別記事にて) svgならplatex + dvisvgmを使う。 いやGraphviz使ってないじゃないか、と思うかもしれない。しかしDependensiesにGraphvizが含まれているから、おそらくGraphvizの描画エンジンを利用してノードの位置を決定しているのだと思う。 インストール Python製のソフトウェアみたいで、pip経由でインストールする。 $ pip3 install dot2tex 利用の手順 dot言語でグラフを書く 今回は次のようにする。ファイル名は適当にgraph.dotとする。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 digraph { graph [ rankdir="LR" ] node [ shape="circle", fixedsize=true, height=0.6 ] Q0 [texlbl="$q_0$"]; Q1 [texlbl="$q_1$"]; Q2 [texlbl="$q_2$"]; Q3 [texlbl="$q_3$"]; Q4 [texlbl="$q_4$"]; Q5 [texlbl="$q_5$"]; Q6 [texlbl="$q_6$"]; Q7 [texlbl="$q_7$"]; Q8 [texlbl="$q_8$"]; Q9 [texlbl="$q_9$"]; Q10 [texlbl="$q_{10}$"]; Q11 [texlbl="$q_{11}$"]; Q12 [texlbl="$q_{12}$"]; Q13 [texlbl="$q_{13}$"]; Q0 -> Q1 [label=" ", texlbl="$\varepsilon$"]; Q0 -> Q4 [label=" ", texlbl="$\varepsilon$"]; Q0 -> Q7 [label=" ", texlbl="$\varepsilon$"]; Q1 -> Q2 [label=" ", texlbl="$a$"]; Q2 -> Q3 [label=" ", texlbl="$b$"]; Q3 -> Q7 [label=" ", texlbl="$\varepsilon$"]; Q4 -> Q5 [label=" ", texlbl="$b$"]; Q5 -> Q6 [label=" ", texlbl="$b$"]; Q6 -> Q7 [label=" ", texlbl="$\varepsilon$"]; Q7 -> Q8 [label=" ", texlbl="$a$"]; Q7 -> Q0 [label=" ", texlbl="$\varepsilon$"]; Q8 -> Q9 [label=" ", texlbl="$\varepsilon$"]; Q8 -> Q11 [label=" ", texlbl="$\varepsilon$"]; Q9 -> Q10 [label=" ", texlbl="$b$"]; Q10 -> Q13 [label=" ", texlbl="$\varepsilon$"]; Q11 -> Q12 [label=" ", texlbl="$c$"]; Q12 -> Q13 [label=" ", texlbl="$\varepsilon$"]; } texlblとはdot2texが読むための属性。おそらくtex labelの略で、これがnodeまたはedgeのラベルとして、texファイルに直接展開される。そのため、数式を描きたいなら$で囲む。もしdotファイル上にlabel属性が定義されていたら、texlblの内容に上書きされる。...

2020-01-26 · (updated 2020-02-11) · 2 min · 224 words

Elmメモ - 画像のプレビュー機能を作る

Elmを利用して、画像を選択してそれを表示するアプリを作る。 ファイル読み込みの方法 Select.file関数を利用する。これはファイル選択用のエクスプローラを開くためのCmd Msgを作成してくれる。選択したファイルはMsgに載せられる。 適切なMIMEタイプを指定すると、エクスプローラ上にてそのタイプのファイルしか選択できなくなる。例えば、text/plainを選択しておけば、拡張子.txtのファイルしか選択できなくなる。 1 Select.file "MIMEタイプのリスト" "Msg" 画像ファイルへの変換 こうして得られたファイルはFileと呼ばれる型で保持される。 もしファイルを文字列として扱いたいなら、File.toStringを利用する。 もし画像として扱いたいなら、File.toUrlを利用する。これは画像をBase64符号化した文字列を作る。これをimgタグのsrc属性に指定すれば、画像が表示される。 画像を選択し、それを表示するアプリの作成 準備 プロジェクトを作成して、elm/fileをインストール。 $ elm init $ elm install elm/file src/Main.elmの雛形を作る。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 module Main exposing (....

2020-01-13 · (updated 2020-01-13) · 4 min · 699 words

Elmメモ - 文字列をIPアドレスに変換(2) Parserを用いる方法

準備 前回のsrc/IPAddr.elmを全て消し、内容を以下の通りにする。 1 2 3 4 5 module IPAddr exposing (..) import Parser type IPAddr = IPAddr Int Int Int Int $ elm repl > import Parser exposing (..) > import IPAddr exposing (..) Parserの基本 以下の2つのステップに分かれる。 Parserを作る Parserを実行する - Parser.runを用いる ライブラリでは、標準で用意されているParserと、それらを組み合わせて新たなParserを作るための関数が用意されている。 > run int "123" Ok 123 : Result (List Parser.DeadEnd) Int > run int "123abc" Ok 123 : Result (List Parser.DeadEnd) Int > run int "abc123abc" Err [{ col = 1, problem = ExpectingInt, row = 1 }] : Result (List Parser....

2020-01-05 · (updated 2020-01-05) · 3 min · 549 words

Elmメモ - 文字列をIPアドレスに変換(1) splitを用いる方法

IPv4アドレスの文字列"192.168.1.1"をパースする方法を考える。IPAddrの内部表現は次のようにする。 1 type IPAddr = IPAddr Int Int Int Int 思いつくのは次の2通り。 ピリオドでsplitして、整数値に変換する。 パーサを利用する。 いずれにしても結構面倒。この記事では前者だけやる。 準備 適当なディレクトリで次のコマンドを実行。 $ elm init $ elm install elm/parser src/IPAddr.elmを作り、内容を以下の通りにする。 1 2 3 module IPAddr exposing (..) type IPAddr = IPAddr Int Int Int Int $ elm repl > import IPAddr exposing (..) 方針 次の処理を行う関数をfromStringとして定義する。 文字列を.でsplitする。 Listの要素数が4でなければ失敗。 Listの各要素にString.toIntを適用し、どれか一つでも失敗すれば全体としても失敗。 Listを[a,b,c,d]としたとき、IPAddr a b c dを返す。 traverseの実装 3の処理は、次の関数として抽象化できる: リストの各要素にfを適用し、その結果すべてがJustを返したときだけ、全体の結果を返す。 1 traverse : (a -> Maybe b) -> List a -> Maybe List b 原始的な実装 なるべくfoldrとかを使わずに書こうとするとこんな感じになる。...

2020-01-05 · (updated 2020-01-05) · 3 min · 437 words

Elmメモ - ランダムな位置に円を描画する

乱数の練習に。 準備 プロジェクト用のディレクトリを適当に作り、そこで以下のコマンドを実行。 $ elm init 必要なモジュールを入れる。 $ elm install elm/svg $ elm install elm/random Main.elmを作成し、最低限の文を定義しておく。 1 2 3 4 5 6 7 module Main exposing (..) import Browser import Svg exposing (..) import Svg.Attributes as SA exposing (..) import Svg.Events as SE exposing (..) import Random 円の描画 こんな感じの円を描画する。 1 SVGでは次のように書く。 1 2 3 4 5 6 <svg width="100px" height="100px"> <g transform="translate(50, 50)"> <circle r="10" fill="white" stroke="black" /> <text text-anchor="middle" dominant-baseline="central">1</text> </g> </svg> 円の情報で必要なのは次の4つ:...

2020-01-01 · (updated 2020-01-05) · 5 min · 904 words

JavaScript/Elm ビット演算のときにはまったこと

結論 JavaScriptにおいて、>>>以外のビット演算は32ビット符号付き整数値として扱われる。 → 例えば&|^~の計算前に、オペランドに型変換が起こる(ソース)。 JSにおいて数字はNumberという型しかないが、ビット演算のときだけ32ビット整数値に変換されるっぽい JavaScriptにおいて、x >>> 0を使うと符号なし整数になる。 負数を2で割り続けても、コンピュータにおける2進表現にはならない。 これはすごく当たり前だった コンピュータにおける2進数表現にしたいなら,論理シフトを使うこと。 ElmはJavaScriptに変換されるので、上の事実はすべてElmでも当てはまる。 各種ビット演算は、JSの演算をそのまま使っているっぽい(ソース) 検証コード $ elm init src/MyBitwise.elmを作成し、内容を以下のようにする。 1 2 3 4 5 6 7 8 9 10 11 12 13 module MyBitwise exposing (..) import Bitwise toBinaryString : Int -> String toBinaryString x = let bit = Bitwise.and x 1 rem = Bitwise.shiftRightZfBy 1 x in if rem > 0 then (toBinaryString rem) ++ (String.fromInt bit) else String.fromInt bit elm replを起動し、試す。まず必要なモジュールをimportする。...

2019-12-31 · (updated 2019-12-31) · 3 min · 440 words

iPhoneアプリ開発メモ - 棒グラフの作成(Chartsの利用)

今度は外部ライブラリChartsを利用して、棒グラフを作成してみる。 目標 値が最大のデータは色をオレンジにする アニメーションがある 棒グラフの上に値を表示する ページ切り替えができる棒グラフを作る タップしたらイベントを発生させる 1〜3、5は機能としてある。4だけ頑張って作る。思い通りのレイアウトにするためにはプロパティとかドキュメントとかを漁る必要があるが、どこにどのプロパティがあるのかは大体予想できる。 ChartDataSet.colorsで各棒の色を変更できる。 BarChartView.animate(yAxisDuration:)を利用。 BarChartView.drawValueAboveBarEnabled = trueとする。表示形式を変更するためにはChartDataSet.valueFormatterにフォーマット用のオブジェクトを指定する。 ScrollViewの中ににBarChartViewを複数配置。 ChartViewDelegateを利用。 その他デフォルトの設定だと表示する情報量が多すぎるので、いくつかのプロパティをいじる。 Chartsのインストール まず、CocoaPodsがインストールされていることが前提。 プロジェクトフォルダで以下のコマンドを実行。 1 $ pod init podfileが作成されるので、それを編集する。use_frameworks!の下に以下の記述を追加。 1 pod 'Charts' プロジェクトフォルダで以下のコマンドを実行。 1 $ pod install 以降、プロジェクトはプロジェクト名.xcodeprojではなくプロジェクト名.xcworkspaceから開く。 基本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import UIKit import Charts struct BarChartModel { let value: Int let name: String } class ViewController: UIViewController { let barItems = [ (7, "太郎"), (1, "次郎"), (2, "三郎"), (6, "四郎"), (3, "五郎"), (9, "六郎"), (2, "七郎"), (3, "八郎"), (1, "九郎"), (5, "十郎"), (1, "十一郎"), (1, "十二郎"), (6, "十三郎") ] override func viewDidLoad() { super....

2019-12-29 · (updated 2019-12-29) · 4 min · 685 words

iPhoneアプリ開発メモ - 棒グラフの作成(UIStackView) (2) アニメーションとタップ処理

棒グラフをアニメーションさせたり、タップしたら詳細画面に遷移するようにしたい。 (寄り道) StackViewのアニメーション 自分がいままでやったことがあるのは以下のような感じで、frameやlayer.positionをいじるパターン。 1 2 3 4 UIView.animate(withDuration: 1, animations: { view.position.x += 100 view.frame.size.height += 20 }); ただし、これをAutoLayoutと混ぜて使おうとすると動かなかったり、動いたとしても変な挙動を起こす。そもそも、AutoLayoutは制約を設定して位置やサイズを決定する仕組みで、frameは位置やサイズを手動で決める仕組み。これが競合を起こすのは当たり前な気もする。 StackViewはframeを設定しても何も反応しない。これは内部的にAutoLayoutっぽいことをやっているからなのかもしれない。例えば次のようにしてもStackViewの子要素は変更されない。 1 2 subView.frame.size.height = 100 stackView.addArrangedSubview(subView) その代わり、次のようにすると、ちゃんと子要素の高さは100になる。 1 2 subView.heightAnchor.constraint(equalToConstant: 100).isActive = true stackView.addArrangedSubview(subView) よって、StackViewでアニメーションするためには、AutoLayoutでのアニメーションの方法を知る必要がある。 AutoLayoutでのアニメーション 例えば、「ボタンを押すと長方形が0から伸びる」アニメーションを実現したい。 まずは次のように、高さ制約を0に設定しておく。ただし、それを何か変数に入れておく。 1 2 3 4 5 var constraint: NSLayoutConstraint view.addSubview(view0) constraint = view0.heightAnchor.constraint(equalToConstant: 0) constraint.isActive = true アニメーションをしたいタイミングで、次のように書けば良い。 1 2 3 4 UIView.animate(withDuration: 1, animations: { constraint.constant = 100 view.layoutIfNeeded() }) constraintにはconstantプロパティがあるので、そこで制約の定数を変更できる。layoutIfNeededは、アプリにレイアウト変更を直ちにさせるメソッド。...

2019-12-26 · (updated 2019-12-26) · 7 min · 1328 words

iPhoneアプリ開発メモ - 棒グラフの作成(UIStackView) (1)

前に頑張ってCoreGraphicsを使って棒グラフを描いたが、やはりViewを棒に見立てて扱った方が良さそうだ。考えられる利点は次の3つ。 タップ時に何かアクションを起こせる。例えば、棒グラフをタップしたら、そのデータに関する詳細ページに飛ぶ、などの処理が実装できる。 アニメーションについてのコードを描きやすい。例えば棒グラフの高さを0から伸ばしていくアニメーションが実現できる。 StackViewで棒を管理すれば、棒のサイズや棒同士の間隔を自動で設定してくれる これはやるしかない。 基本的にはこちらを参考にしながら進めていく。 UIStackViewをコード上で使う基本 とりあえず使い方を確認する。 Main.storyboard こんな感じにする。 ViewController.swift 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class ViewController: UIViewController { let colors: [UIColor] = [.systemRed, .systemBlue, .systemPink, .systemGreen, .systemIndigo] let percentages: [CGFloat] = [0.1, 0.2, 0.5, 0.3, 0.9] @IBOutlet weak var graphStackView: UIStackView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view....

2019-12-24 · (updated 2019-12-26) · 4 min · 820 words