Sublime Text 3でのAsymptote Syntax Highlighting 改訂版

ちょっと要領が分かってきたので,Emacs版のAsymptote Syntax Highlighting に近づけるように改訂版を作ってみた。

ATOM版のSyntaxの元になっているのは,asy -l > asy.list で生成される asy.list というファイル。これに,変数やら関数やらの一覧が載っている。ところで,Asymptoteをビルドするための本家の一式を見ると,Makefileに,次のような箇所がある。

asy-keywords.el: asy
        @echo Creating $@;
        $(ASY) -l > asy.list
        ls $(addsuffix /*.asy,$(KEYWORDS)) | grep -v plain\* | \
          grep -v three_\* | grep -v featpost3D | xargs $(ASY) -l >> asy.list
        perl ./asy-list.pl asy.list 2.09svn

これを見ると,asy -l で生成された asy.list にさらに幾つかのキーワードが追加されているようだ。そして,こうして出来た asy.list を用いて,Emacs用の keywords.el が作られている。そこで,ATOM版の作成スクリプトに変更を加えて,増補されたasy.listを使って,Asymptote.csonを生成するようにした。あとは前回と同様にして,JSONに変換したのち,JSON-tmLanguage にして,最終的に tmLanguage に変換した。そのままだと,syntaxファイルとして認識できない箇所があったので,real[]といった[]を含む箇所をコメントアウトするなり,適当に手を加えた。出来上がりはまずまずだと思う。

Sublime Text 3でAsymptoteのsyntax highlight表示

最近,AtomやらBracketsやらVisual Studio Codeやら,新しいエディター(文書編集プログラム)を使っているのだが,やはり Sublime Text 3の軽快さにはかなわない。ということで,LaTeX文書に関しては,Sublime Text 3に戻ってきたのだが,図版作成プログラムのAsymptoteについては,以前と変わらず Emacs を使っているのだった。

Emacsを使う理由は Syntax Highlight ができるから。あと,C-c C-cでビルド&プレビューが出来るし。ビルドの方は,Sublime Text 3でも自前ビルドシステムを作れば簡単なのだが,シンタックス・ハイライトできるパッケージが見つからなかった。

いろいろ調べてみると,ATOM用のAsymptoteパッケージが見つかった。これに,シンタックス・ハイライト用のデータが付いているので,これを移植できないかと考えた。試行錯誤したが,以下の方法で,とりあえず出来た。

まず,ATOM用Asymptoteパッケージ付属のasymptote.csonというファイルをJSON形式に変換する。これはATOMにCSON-parserというパッケージを入れることで出来た。ファイルの先頭に無駄な{}が付いていたので,これを手動で削除。以上で,asymptote.JSONが出来た。

次に,Sublime Text 3にPackageDevというパッケージをインストールする。それを用いて,JSON形式のTextMate Languageファイルを新規に作る。パッケージ・コントロールから選んで行って,New Langauage Syntax (JSON-TextMate) 的な表示のものを選ぶと,雛形が作成される。それをasymptote.JSON-tmLanguage という名前で保存する。

pattern:[] の中身が空っぽなので,そこに,先に変換して作ったasymptote.JSONのpattern:[…] の中身をコピーする。インデントが2文字になるように調整。これは必要か分からないが。言語の名前と拡張子をそれぞれ Asymptote, asy として保存。

これをTextMateの言語ファイル形式に変換する。Build SystemをConvert to … にして,Build with … から Convert to Property List を選択。すると,なんとエラー。25行目あたりで,Expected Dictionary というエラー。このブロックだけ,begin, beginCaptures などという語句がある。そこで,このブロックをコメント・アウトして,再び Convert to Property List する。今度はエラーもなく,asymptote.tmLanguage というファイルが出来上がった。拡張子がxmlでないのが不思議だったが,どうやら,PackageDevが作ったJSON-tmLanguageの1行目がshebang的になっているようだ。コメントなのだが,
// [PackageDev] target_format: plist, ext: tmLanguage
と書いてある。これを読んで,plistに変換し,拡張子を tmLanguage にしているらしい。

以上で,asymptote.tmLanguage が完成した。これを,Package/User/ に移動して,Sublime Text 3を再起動すると,SyntaxにAsymptoteが表示されていて,拡張子 asy のファイルは自動的に,syntax highlight される。

これで,一応の目的は果たした。しかし,比較してみると,Emacsの表示の方が,まだ完成度が高いようだ。Emacsではgeometryで定義された line型なども,ちゃんと予約語として表示されるが,ATOMのAsymptoteだと line はただの変数と同じ。ということで,完全に満足はできないのだが,まずまずではある。

Atomに移行中

LaTeX用のエディターは,ずっとTeXShopを使っていたのだが,Code foldingができない,アウトライン(sectionなどの構造表示)ができない,ファイルをたくさん開くと動作が重い,などなど,不満が出てきて,代替案を探していた。しばらくは Sublime Text 3 を使っていた。幾つかのPackageを入れることで,まずまず満足できる環境にはなっているのだが,先日Atomをインストールしたところ,ずっと簡単にLaTeX環境が作れて,おまけに,パッケージの設定も(Sublime Textが直接設定ファイルを修正するのと比べて)初心者でも安心して出来る形式になっている。余計な装飾やアイコンなどがないため,画面も広く使えるし,ファイルブラウザーの表示・非表示も簡単,アウトラインも出る,コード・フォールディングも出来る,と良いことずくめ。

ということで,Atomに移行しようかと思う。設定などのメモはまたいずれ。

携帯料金がいつのまにか

職場の友人がdocomoからイオンSIMに変えたら1万6千円くらいだったのが8000円くらいになった話をしていたので,自分もちょっと考えてみた。ちなみに,この友人の場合,iPhoneだけでなくiPadやらなにやら4台くらいあって,それをデータシェアとかいうので利用しているらしい。だから,契約回線は1つだが,SIMは4枚くらいあって,合計で30Gとか40Gとかの契約らしい。

ワタシの場合,auのiPhone5sで3年目くらいになるのかな,調べてみたら月額料金が8000〜9000円くらいになっていた。2年目まではおそらくは6000円くらいだったと思う。2年が過ぎるとそれまでの様々な割引とかがなくなるらしい。長期利用ユーザーにこういう仕打ちをするなんて,ひどい会社だと思うが,これが今の日本の電話会社の実態なのであろう。

さすがに毎月1万円近くも払うのはさすがに不愉快である。契約はたぶん最初のままなので,7Gだと思うが,実は毎月2G使ったことがない。MacBook Airからテザリングすることもあるが,常時接続にはしてなくて,たまに原稿をメールで送るときに使う程度なので。そういう実態なので,実はWiMAXを4月末に解約した。それでも特に不自由はない。結局,MacBook Airの方はもっぱら原稿書き専用となっていて,メールのチェックやニュース閲覧などはiPhoneかiPadで済ませている。

考えてみると,iPhone5sの3年目以降,WiMAXの契約中は 8000+4000=12000円くらいを毎月払っていたことになる。通帳とかチェックしてなかったからなあ。

さて,どうしたものか。いろいろ調べてみるのだが,現在のau iPhone5sのままで乗り換えすると,いろいろ問題があるようだ。まず,au回線で格安SIMを契約できる会社が,UQ Mobile, mineo(マイネオ), IIJmio(みおふぉん)の3つくらいしかない。次に,UQ以外だとiPhoneのテザリングができないらしい(公式発表では。実は出来るという話もあるが。)。さらに,UQでもau iPhone5sだとテザリングはサポートされてないとか。うーむ。にっくきはauなりしか。

文字Bのときだけフリーズするという不思議な現象

とある理由で、旧版のasymptoteを利用している。asymptote 2.16 と ghostscript 9.05 なのだが、不思議なエラーに遭遇した。以前、ghostscript 7.07のときは大丈夫だったのだが。

3次元の図版なのだが、あれこれ実験した挙句に分かったことは、Computer Modern以外のフォントでも文字Bを出力しようとすると、gsが無限ループに陥ってしまう。不思議なことにBをAとかCに変えると普通に図版が出来るので、文法エラーではない。Computer ModernならBもちゃんと出る。不思議だ。まったく不思議だ。

aymptote本家のBBSに質問しようかとも思ったが、どうも旧版のサポートはしないという方針らしい。あきらめるしかないですかね、これは。

ということで、TeXLive収録のasymptote 2.41とHomebrewで入れたghostscript 9.21の組合せにした。最新版に近いと思う。パスの優先順にをTeXLive, /usr/local/bin の順にしたので、旧版のuptetexを使う際には(実は、まだメインの文書はuptetexを使っているのだ)platexの絶対パスを指定していして使うことになる。実はTeXShopのlatexは絶対パスで指定しているので、ここは大丈夫。

以上、とりあえずメモ。

Apple IDの2ファクタ認証

MacBook AirのThunderbird(メールアプリ)がAppleのiCloudメール(自分の場合は me.com だが)に接続できなくなった。一昨日くらいだろうか。

調べてみると,アップル以外の所謂サードパーティ製のアプリがiCloudに接続するには,アプリ専用のパスワードを別途生成する必要があるとのこと。そのためには,Apple IDの2ファクタ認証をする必要があること。ううむ,面倒だ。おまけに自分の場合,Apple IDが2つあるので,なおさら面倒だ。

実は,iPhone購入以前からiTunesなどで使うために取得しているApple IDがあり,iPhoneもiPadもそちらを使っている。ところが,Macで使っているAppleのメールはiPhone購入時に作ったものなのだ。今のままでは,Appleメール用のApple ID (ああ面倒だ)に紐付けられている別のデバイスがないため,2ファクタ認証が出来ず,したがって,アプリ用のPWDを生成することもできない。やれやれ。

仕方ないので,とりあえず,iPadの方をAppleメール用のApple IDに紐付けすることに。これがまったくもって面倒。まず,Macbookの方で,今のApple IDからサインアウトする。そしてAppleメール用のApple IDでサインインするのだが,2ファクタ認証のためには,別のデバイスで確認する必要があるとかで,iPhoneの電話番号を登録。そしてiPhoneでSMSを受け取り,書かれている数字をMacの方で入力して確認。やれやれ,これでようやくMacで2ファクタ認証の準備が出来た。

まだまだ作業は続く。iPadの方でも現在のApple IDからサインアウトしてAppleメール用のApple IDでサインイン。パスワード入力だけでも面倒なのに,やれ子供の頃のなになにはなーに?という質問を2つばかりされ,ようやくサインイン完了。

Macに戻る。2ファクタ認証を始める。するとiPadの方に連絡が来るので,その数字をMacで入力してやっと認証完了。これで,ようやくアプリ用のパスワードを生成することができる。生成されたパスワードをThunderbirdで入力してようやく接続に成功。ああ,疲れた。

さて,このままだと,MacとiPadがiPhoneとは別のApple IDでサインインしている状態なので,たとえばSafariのブックマークが連携しない。ということで,MacとiPadでサインアウトして,iTunes用のApple IDの方で再びサインインした方がよいだろう。これからその作業。また,いっぱり質問されるんだろうなあ。ああ面倒だ。

自家用の簡易版wrapfigure

まだ欠点があるが,とりあえず自家用としては使えるものが出来たので,メモ。

\makeatletter
\newcount\@HangLines
\newdimen\@IndentWidth
\let\@CurrentPar=\par
\def\@hangcarrypar{% hanging indentationの間は,\parはこの\@hangcarryparに置き換えられる。
	\edef\next{\hangafter=\the\hangafter\hangindent=\the\hangindent}% 現在の値を後で使うため
	\@CurrentPar %% パラグラフを終了。現在,垂直モードのはず。
	\next %%新しいパラグラフで以前の\hangindent, \hangafterを復活させる。
	\edef\next{\prevgraf=\the\prevgraf}% これまでのパラグラフで組み立てた行数を後で参照するため
	\ifnum\prevgraf>\@HangLines %% すでに組み立て行数が指定の字下げ行数より大きい場合は,
		\hangafter=0\hangindent=0pt\prevgraf=0 %%字下げを終了させて,
		\let\par=\@CurrentPar %% \parを元に戻す。
	\else %% まだまだ字下げを続行する場合。
		\leavevmode %% これなしに垂直モードのまま\next だとずっと字下げが続いてダメだった。
		%% しかし,これがあるため,\parが連続したとき無視されずに改行されるという欠点あり。要改良
		\next %% これまで組み立てた行数を\prevgrafに代入する。
	\fi}
\def\MyWrapFig#1#2#3{% #1=Lines, #2=Width, #3=図版など
	\@HangLines=#1%
	\@IndentWidth=#2%
	\setbox0=\vbox{#3}%
	\dimen0=\hsize \advance\dimen0 -\@IndentWidth
	\par
	\vbox to 0pt{\moveright\dimen0\box0\vss}%
	\vskip -\parskip
	\vskip -\baselineskip
	\def\par{\@hangcarrypar}
	\prevgraf=0%
	\hangafter=-#1
	\hangindent=-#2\relax
}
\makeatother

LaTeXのwrapfigureと黒魔術

図版の配置には,wrapfig.styによるwrapfigure環境を使っているのだが,たまに上手く行かないことがある。一番困るのは,図版はとっくに終わって,テキストの回り込み(短くなる部分)も終わっているのに,次の段落で,またもテキストが短くなってしまう現象だ。

前回これが発生したときは,wrapfigure環境の直後が垂直モードで,おそらくはそれが原因。そして \leavevmode を入れることで解決した。しかし,今回はそれとは違う。

原因は分からないものの,wrapfigureが行っている \parshape 関係の処理を強制的にリセットすれば何とかなるはず。検索したところ,同じ症状の人がいるようで,それを参考に以下のコードを挿入。

\makeatletter
\@@par \ifnum\@@parshape=\z@ \let\WF@pspars\@empty \fi % reset `parshape'
\global\advance\c@WF@wrappedlines-\prevgraf \prevgraf\z@
\ifnum\c@WF@wrappedlines< \tw@ \WF@finale \fi
\makeatother

要するに,wrapfigureの内部マクロに直接アクセスしているわけで,いささか黒魔術的ではあるが,仕方ない。

Ghostscript 9.07をソースからビルド(Mac)

[修正版]

とある事情(Asymptote関係)で,Ghostscripの9.14以前のバージョンをインストールすることにした。Ghostscript/GhostPDL Old Releasesにいろいろあるが,./configure で文句を言われなかった 9.07 を入れることに。適当な所にダウンロードして解凍し,中に入って,./configure, make, make install で終了。詳しくは,

tar xvzf ghostscript-9.07.tar.gz
cd ghostscript-9.07
LDFLAGS="-L/usr/lib" ./configure --disable-compile-inits --prefix=/usr/local/gs907
make
make install

[修正]ここで,ポイントは --disable-compile-inits なるオプション。最初はこれを付けなかったのだが,どうもこれがないと,Resource以下が作られないようだ。 LDFLAGS="-L/usr/lib" はシステムのライブラリーを先に探せ,というもの。prefixがデフォルトの /usr/local 以外なので,付けてみた。MacPortsなどのライブラリーと混同させないためにはこれがあると良いという。オフィシャルのインストールガイドを見て,追加してみた。[/修正]

これで分かるように,/usr/local/gs907 以下にインストールした。このバージョンのgsを使うときは,/usr/local/gs907/bin にパスの優先権を与えるようにしなくてはならない。

実は,これだけではフォント関係のファイル群が足りない。それは別途用意する必要がある。ちょっとインチキなのだが,以前Homebrewで入れていた(今はもうリンクが切れている)9.07の残骸があったので,そこからフォント関係のResourceをコピーして代用することにした。
[修正]ここも直した。Resource以下があるので,TeXLive2016付属の cjk-gs-integrate スクリプトにより,フォント関係をインストールできる。具体的には,このgsにパスを通したあとで,

sudo cjk-gs-integrate --link-texmf --force

とすればよい。[/修正]

asymptote 2.16 + ghostscript 9.07 で,texcomman=”platex” として3次元データ込のPDFが作成されることを確認。これが目標だったのだ。TeXLive2016に移行したとき,Homebrewでgsを最新版にしたのだが,古いものがなくなってしまって,ちょっと困っていたのだった。これで以前の環境に戻れると思う。

ようこそ、の後で画面が真っ暗

Windowsの話。久しぶりにWindowsを起動しようとしたら、「ようこそ」というログイン画面でパスワードを入れた後、画面が真っ暗になって、マウス・カーソルだけが見えるという状態。ううむ、これは初めてだ。というか、前回Windows使ったのは、Sublime Textの設定とかやってたときで、特段変わったことはしてないと思うのだが。

とにかく、何とかせねば。Macの方で検索。「Windows7 ようこそ 真っ暗」で検索すると、出るわ出るわ、笑っちゃうくらい同じ症状の人が居る。もっとも、症状は同じでも、解決策は一つではないようだ。

とりあえず、システムの復元というのを試みた。セーフモードで起動。これは成功。スタートメニューから順に掘っていって、システムの復元にたどり着く。最新で2017/01/10だったが、そこまで戻ることに。時間掛かったが、無事に復旧したようだ。良かった良かった。

しかしである。パソコン1台だと、こういうときどうしようもないな。あ、そうか、セーフモード+ネット、という選択肢もあったか。それが上手く起動すればだが。