File failed to load: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/extensions/TeX/AmsMath.js

2019年12月2日月曜日

VS Code で LaTeX の執筆環境を整える

Sublime Text の台頭から始まった第2次エディタ戦争も Visual Studio Code (以下 VS Code)に収束した感があるので,学生さんにも LaTeX な原稿を VS Code で執筆することをお勧めしています.
しかし,なんか微妙なビルド環境になっていることが多いので,お勧めのパターンをメモしておきます.

※ TeX一式と VS Code がインストールされていることが前提です.TeXについては TeX Live をネットワーク経由でインストールするのがお勧めです.ミラーサーバーの引きが悪いと一向に作業がすすまないことがあるので,その時は中断してやり直すか,上記ページの説明をよく読んだ方がいいです.

LaTeX Workshop を入れる

インストール

LaTeX 原稿のビルドやプレビュー,入力補完などを行うための Extension
を入れます.VS Code をインストールした状態であれば上のリンク先で Install のボタンをクリックすればインストールできると思います.

ビルドの設定

LaTeX Workshop は色々な手順・方法でのビルドに対応しています.
文書ごとに設定ファイル latexmkrc (先頭にドットは付かない・拡張子もつかない)を作成し,Latexmk でビルドする方法をお勧めします.
ホームディレクリに .latexmkrc (先頭にドットが付く) を置いて全ての文書でもその設定を使うやり方もありますが,お勧めしません.
余分な dvipdfmx の呼び出しが避けられなくなるので ptex2pdf を使うのもお勧めしません.
この方法のメリットは
  • BiBTeX を使っている場合(普通はそうしたほうが良いです),効率が良く正しい手順は面倒で間違いやすいが,Latexmk にお任せすればうまくやってくれる
  • 日本語の文書は大抵の場合 pLaTeX でコンパイルする必要がある.
    しかし,pLaTeX のベースは古く,国際会議などのテンプレートに対応できない場合があるので,英語の原稿は pdfLaTeX でビルドするほうが無難である.
    したがってビルド手順は文書ごとに保持するほうが簡単
  • たとえ VS Code を使うのをやめても Latexmk で簡単にビルドできる.
    (Latexmk は20年以上持続的に開発されており,LaTeXの処理系と同程度には将来も使えることが期待できます.エディタはこの20年で3回は乗り換えたので…)
  • 他の人に渡してもビルドが簡単
    (TeX のディストリビューションをインストールすればほとんどの場合 Latexmk は入っています)
ことです.

エディタのビルド設定(settings.json)

まず,LaTeX Workshop がLatexmkを呼んでくれるように下記の内容を settings.json に追記します.settings.json の編集方法はちょいちょい変わっていますが,2019年12月時点ではこの辺の情報が正しいです.

{
// 他の設定の続きに以下の設定を追記,追記の際,区切りのカンマ(,)が必要な場合もあるので注意
"latex-workshop.latex.tools": [
{
"command": "latexmk",
"args": [],
"name": "latexmk"
}
],
"latex-workshop.latex.recipes": [
{
"name": "toolchain",
"tools": [
"latexmk"
]
}
]
}
view raw settings.json hosted with ❤ by GitHub

各文書ごとのビルド設定(latexmkrc)

VS Code を使う場合は各文書ごとにフォルダを一つ作るのがおすすめです.
推敲の履歴を残したい場合は hoge_old.tex などを作るのではなく Git を使いましょう.

フォルダの直下にlatexmkrcという名前のファイルを作成します.
日本語の文書の場合は
#!/usr/bin/perl
$latex = 'platex %O -src-specials -shell-escape -interaction=nonstopmode -synctex=1 -kanji=utf8 %S';
$bibtex = 'pbibtex %O %B -kanji=utf8';
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3; # use dvipdfmx
view raw latexmkrc hosted with ❤ by GitHub
英語の文書の場合は
#!/usr/bin/perl
$pdflatex = 'pdflatex -synctex=1 -src-specials -shell-escape -interaction=nonstopmode -halt-on-error -file-line-error %O %S';
$bibtex = 'bibtex %O %B';
$pdf_mode = 1;
view raw latexmkrc hosted with ❤ by GitHub
のようにすると良いです.

スペルチェッカーを入れる

スペルチェッカーにかけていない原稿を人に見せるのは時間の無駄なのでやめましょう.
簡単にインストールできるのは Code Spell Checker だと思います.
機能的にはOSのスペルチェック機能を使う Spell Right が優秀だと思いますが,Windows ではOS側の設定が面倒です.Macだと簡単かもしれません.

2018年2月10日土曜日

英語論文執筆のために arXiv からの例文検索サービスを作った話

arXiv の論文から例文を検索する Hyper Collocation というサービスを公開しました.

以下はあまり整理されていない製作の記録です.

英語論文執筆用の例文検索サービス

英語での論文執筆の際に,専門用語を含む例文や言い回しのパターンを知りたいことが多々あります.有用なサービスとしては


がありますが,

  • データがライフサイエンス系の論文に限られている(ライフサイエンス辞書)
  • ソートの基準が頻度順ではないため典型的な例文が上位にこない
  • ストップワードに近い頻出語を検索した際の
    • 検索が重い(Springer Exemplar)
    • 表示可能な検索結果が偏る(ライフサイエンス辞書)

という不満点があったので,並行して個人的な資料から検索を行うプログラムを作って使っていました.

しかし,個人的に収集した英語論文ではやはりデータベースが小さく,例文検索エンジンとしてはいまいちだなーと思っていました.

arXiv Bulk Data Access

何がきっかけだったか忘れましたが,去年の年末あたりに arXiv が Bulk Data Access という全論文のデータを一括ダウンロードできるサービスを提供していることに気が付きました.

データの公開は Amazon S3 で  Requester Pays Buckets として行われており,700GBくらいのデータなので,全部ダウンロードすると8000円くらいかかります(多分それくらい請求されていたと思います).
これをダウンロードして例文検索エンジンを作れば冬休みの間楽しめそうだなと思ったので,今回の冬休みのPCと人間の空き時間をこの課題に投入することにしました.ちなみにダウンロード可能なデータには
  • PDF
  • LaTeXソース+図表のファイルのアーカイブ
の二種類がありますが,PDFよりも精度の良い文章の抽出が可能なのでLaTeXの方をダウンロードしました.

コーパスへの変換

ダウンロードしてきたデータはLaTeXのソースを含んだアーカイブなので,まずこれを展開して文章を抽出し,コーパスとして出力するプログラムを書く必要があります.LaTeXからプレーンテキストへの変換方法にはざっと調べた感じ
といった選択肢がありましたが,もとのデータ量がそこそこ多く,ヘッダ,図表,参考文献リスト,箇条書きなどの,そもそもコーパスに入れたくない情報はカットしておきたかったので,構文解析後のAST(抽象構文木)にフィルターを掛けられる Pandoc で変換を行うことにしました.

Pythonで書いたスクリプトですべてのファイルを処理し,得られたテキストデータのコーパスのサイズは約24GBでした.

FM-index に基づく検索エンジンの作成

検索のたびに24GBを普通に総当たりすると耐え難い速度になりますので,
検索用のインデックスを作成する必要があります.

10年ほど前に小規模なデータで同じことをやった時には接尾辞配列を使ったのですが,ざっくり元データの5倍程度のサイズのインデックスが必要で,24GBのコーパスを使うと100GB以上のインデックスをメモリ上に置くことになります.SSD上にインデックスを置くことも考えたのですが,雑な実装では耐え難い遅さだったので,データ構造の改善を考えることにしました.
本筋とは全く関係ないですが,このあたりまでは新年なので普段使わない言語を使おうと思い,C言語なみのパフォーマンスが出せそうな言語という基準で Go言語を使って書いていました.しかしWindows環境で32GB以上のメモリを使えないという仕様にげんなりしたので,やめにしました.代替として Rust を使おうかとも思ったのですが,残り時間が心もとなかったので,久しぶりにC++で書くことにしました.C++11以降の C++ は以前とはまるで別言語のようで,新しい言語を学ぶのと同程度に楽しかったです.
データ構造についての話にもどります.圧縮接尾辞配列を使えば元のデータよりも小さいインデックスで検索が可能という話を小耳に挟んでいたので,これについて勉強することにしました.このあたりの話題については,ネット上にわかりやすい資料がたくさんあって助かりました.

一通り調べて勉強した結果,今現在では FM-index というのを使うのがベストで実装としては Succinct Data Structure Library を使うのが楽ちんという結論に達しました.
WSL由来のiostreamの実装が4GB以上のファイルを読むと死ぬ問題など,色々と大きいデータに絡む問題がこの後も続きましたが,24GBのコーパスを5GB程度のインデックスに圧縮でき,スニペット200個を1秒程度で返せる速さになったので,この辺で満足してつぎの段階に進むことにしました.

Crow + Vue.js によるWebフロントエンド

Webブラウザから検索を行えるようにしたかったので,まず,軽量なC++用のフレームワークである Crow を利用し,REST API の形で検索を提供するアプリケーションサーバーを実装しました.Crowは今どきのC++の機能を活用した使いやすいフレームワークで,Python における Flask と同じような簡単さで書くことができます.

適当なテンプレートエンジンを持ってきてC++のアプリケーションサーバーに HTTP/HTTPS アクセスを受けさせようかとも思いましたが,

  • 静的なファイルを扱うのが面倒
  • SSL対応も面倒
  • 通信圧縮とかも面倒
  • リダイレクトとかしたくなった時も面倒
と,やっぱり普通のWebサーバーを立てておき,検索APIへのアクセスだけリバースプロキシでアプリケーションサーバに転送するのが妥当に思われたので,そうすることにしました.

Viewの部分には最近流行っていて使うのが簡単そうな Vue.js を使うことにしました.
5年ほど前に一度 AngularJS を使った時にも使いやすさに感動しましたが,Vue.js の方がすんなり使えたような気がします.とはいえ,どちらのフレームワークについても大したことをやらなかったので,明確な差を感じる部分はなかったです.

Vue.jsで作ったフロントエンドを含む静的なコンテンツの提供とリバースプロキシを行うための Webサーバーが必要ですので,ここには nginx を使うことにしました.
いつも Apache ばかりで nginx は初めて使いましたが,やっぱり設定ファイルが簡単なのはいいことですね.

Amazon Web Service へのデプロイ

C++で書かれたアプリケーションサーバーには約10GB (順方向と逆方向のインデックス5GB×2)のメモリが必要です.また,起動時に10GBのデータをHDDなりSSDなりから読み込む必要があるので,普段使いのPCで使うたびに起動するには起動時間が長すぎ,常駐させるにはメモリを食いすぎるという微妙な状況になってしまいました.

というわけで,検索エンジンをサーバーで走らせようと思い立ち,話にはよく聞くもののまともに使ったことがなかった Amazon Web Service (AWS) の EC2 を使ってみることにしました.
スペックを眺めてみたところ r4.large というインスタンスが必要最小限のスペックを持つようだったのでこのインスタンスを作成してデプロイしました.設定も簡単で速く,世間でAWSがもてはやされている理由の一端を体感できたように思います.

サービス公開

というわけで,快適な例文検索環境を手に入れることに成功したのですが,EC2 のr4.large インスタンスには月々1万円程度の維持費がかかり,個人的に使うにはちょっと基礎代謝が大きすぎるサービスになってしまいました.

個人所蔵の論文集をコーパスとしていた当時は,検索エンジンが合法かどうか議論されているような時代だったので,サービスの公開はあまり考えませんでしたが,
現時点では検索結果としてarXivにリンクする形でスニペットを表示することは問題ないようです.そこで,サービスを公開して大人数で有効活用することで元を取ることにしましたという次第です.

TeXclipでの経験に基づくと,広告でサーバー代が賄えることはあり得なさそうですが,公開することで得られる経験も色々とあったので,今回も元が取れた気分になるんじゃないかな~と期待しています.

感想

検索アルゴリズムやデータ構造にはプログラミングやコンピュータサイエンスのおもしろい要素が詰まっているので,たまに手をだすとおもしろいです.
あと,暫く見ないうちにC++がモダンな感じになっていてびっくりしました.つぎはEigenあたりを使いつつ勉強してみようかなという気になりました.

おまけ:名前の由来

冒頭の方でチラッと,今回公開した例文検索サービス以前から個人用のツールを作って使っていたことを書きました.サービス名の Hyper Collocation は10年ほど前から存在するこのツールから引き継いだものです.この名前は
  • 開発の初期段階で Hyper Estraier を参考にしたこと
  • 当時の先生に 新編 英和活用大辞典―英語を書くための38万例 を教えてもらい,
    大変役にたったことが開発のきっかけとなったこと
    (この辞書の表紙に THE KENKYUSHA DICTIONARY OF ENGLISH COLLOCATIONS と書いてあり,これを見て初めて collocation の概念を知りました.)
  • 当時は Web2.0 末期(DoCoMo2.0 がコケたころ)で,ハイパー**というネーミングが相当に使い古された感があったので,Hyper Collocation という名前をつけても名前被りの何かが出現する危険がなさそうに思われたこと
から適当に付けたような気がします.今となっては何もかも過去のことであり,当時のコードは一行も残っていませんが,多少の愛着があったので名前だけは残すことにしました.

参考文献

検索アルゴリズム

C++

2017年9月17日日曜日

ベクトル場の可視化



最近天気予報で見る風の可視化がかっこよかったので,真似して研究で使うベクトル場の可視化をやってみたところ,細部がわかりやすくていい感じでした.

汚いですがコードはMATLABのコードは以下のような感じです.
動画のベクトル場を生成するコードはすごく長いので,単純な円を描く流れにしてあります.コードの最初の部分でお好みのベクトル場を指定してみてください.

% vector field
dxdt = @(x) [x(2);-x(1)];
% mesh
[GX,GY] = meshgrid(linspace(-2*pi,2*pi,100),linspace(-10,10,100));
% stream
DX = arrayfun(@(x,y) [1,0]*dxdt([x;y]),GX,GY);
DY = arrayfun(@(x,y) [0,1]*dxdt([x;y]),GX,GY);
[verts,averts] = streamslice(GX,GY,DX,DY,400);
iverts = interpstreamspeed(GX,GY,DX,DY,verts,1/60/3);
% visualize
v = VideoWriter('stream.m4v','MPEG-4');
v.FrameRate=60;
open(v)
nframe = 60*10-1;
seglen = 60;
offset =randi(seglen,numel(iverts),1)-1;
frames = cell(seglen,1);
for frame=1:seglen
fig = figure(6);
clf
fig.Position = [fig.Position(1:2),1024,768];
axes('Units', 'normalized', 'Position', [0 0 1 1])
set(fig,'Color',[0,0,0.2])
colormap([linspace(0,0,100);linspace(0,1,100);linspace(0.2,1,100)]')
hold on
for k=1:length(iverts)
xy = iverts{k};
C = mod((0:(size(xy,1)-1))-frame+offset(k),seglen)/(seglen-1);
C = exp(-(1-C)*1);
xy(end+1,:)=[0,NaN];
patch(xy(:,1)',xy(:,2)',[C,0],'EdgeColor','interp','LineWidth',0.5)
end
xlim([min(GX(:)),max(GX(:))])
ylim([min(GY(:)),max(GY(:))])
set(gca,'Color',[0,0,0.2])
drawnow
frames{frame}=getframe(gcf);
end
for frame=1:nframe
writeVideo(v,frames{mod(frame,seglen)+1})
end
close(v)

2016年11月18日金曜日

機械学習に関連する学会のクラスタリング

機械学習周辺の学会/論文誌が多くて関連性がよくわからなかったので,引用関係をもとに可視化してみました.マウス操作で拡大/スクロールしたり,マウスオーバーで関連エッジが強調表示されたりします.


全画面表示 / ソース

元データには Aminer が公開している Citation Network Dataset を使っています[1].
[1] Jie Tang, Jing Zhang, Limin Yao, Juanzi Li, Li Zhang, and Zhong Su.
  ArnetMiner: Extraction and Mining of Academic Social Networks.
  In Proceedings of SIGKDD'2008. pp.990-998.

ノードが各論文誌/講演会に対応しており,各ノードのサイズは被引用数を示しています.より具体的には,50件以上の引用/被引用の関係があるノード間にエッジを生成し,引用数に応じた引力と斥力に基づいた運動をシミュレーションすることで,クラスタを形成させています.

ICML(緑色のノード)などのいわゆる機械学習の学会は(近年のブームのせいか)同種内の引力よりも周辺分野からの引力が強いようで,面積が大きい緩いクラスタを形成しているようです.

機械学習の周辺ではコンピュータビジョン,言語処理,ニューラルネット,人工知能などが目立つクラスタを形成しており,データマイニングは機械学習と同様,面積が大きい緩いクラスタを形成しています.

自分の専門が制御理論なので,制御分野の論文誌である Automatica(赤色のノード) と機械学習のトップカンファレンスである ICML (緑色のノード)の近傍にある学会を抽出して可視化してみましたが,大本のデータが DBLP で,制御理論の分野の引用関係があまり収録されていないので,制御分野については寂しい感じになっています.
信号処理とロボットが制御分野の近くでクラスタを形成しており,これらとコンピュータビジョン・ニューラルネットが機械学習との間に位置しています.また,最適化や応用数学のクラスタが制御の近くにあるのもわりと納得です.

前述したデータセットの処理には python および NetworkX, ノードの配置に Gephi,可視化には D3.js を利用しています.これらの有用なソフトウェアを開発・公開されている方々に感謝します.

あと,超重いですがコンピュータ関連分野全体を可視化したものも置いておきます.
https://maruta.github.io/visnet-dml/full/

2016年3月10日木曜日

MATLABで関数型プログラミング入門

先日まで Northeastern University の Robust Systems Lab で訪問研究員をやっていました.その時に関数型プログラミング入門のチュートリアルを行ったのですが,わりと好評だったと思うので,スライドを日本語化したものを公開します.



いわゆる手続き型の言語にも関数型言語由来の機能が追加されるようになって久しく,研究のためのコーディングでもこれらの機能は有用です.しかし,これらの機能の使い道がピンとこないまま,あるいは存在に気づかないまま活用できずにいる学生が多いように感じています.

普通であれば「関数型プログラミングについて勉強しておいて」と学生に伝えれば済むのですが,典型的な関数型プログラミングの解説は典型的な学生に関数型プログラミングの有用性を理解させられるものではなく,学生にとっての体感的な学習コスパ(=有用性/学習コスト)が著しく低いために身につかないように思われます.僕の感覚では,「手続き型言語に追加されている関数型言語由来の機能でちょっと楽をしたい」程度の低いこころざしの範囲であれば,関数型プログラミングの学習コスパは極めて高く,これは適切な教材の不在によって生じている損失のように思われました.

というわけで,このチュートリアルを行うにあたっては,学生が興味を持ちそうな卑近な(日々の宿題を解くのに役立ちそうな)例題を選び,利便性の積極的なアピールを行うアプローチを試みています.大学生という聴衆に特化しているので役に立たない場合も多々あるかと思いますが,何かの参考になりましたら幸いです.



2016年1月7日木曜日

Atom で LaTeX on Windows (+ 最近のビルド環境)


新しい環境を求めて LaTeX の編集環境を Sublime Text 2に移行しましたが,Sublime Text 3 がいつまでもβ版だったりして停滞感があるところで Atom が流行してきたので,そっちに移行していました.

当初は完成度が低くて実用的ではなかったのですが,最近(2016年1月頃)は実用にギリギリ耐える気がしてきたので,設定や注意事項をメモしておきます.

TeXのインストール

多くの方のご尽力により,世界でも標準的な TeX Live をインストールすれば日本語でも不自由しないので,これを使っています.以下でも TeX Live で普通にインストールした環境を前提としています.

何かとTeX関連のバイナリにパスが通っていることを前提としているパッケージが多いので,

C:\texlive\2015\bin\win32

を環境変数Pathに追加してください.
(上記はTeX Live 2015を既定の設定でインストールしたときのパスですが,バージョンなどに合わせて適宜読み替えてください.)

Atomのインストール

Atomのホームページからインストールできます. 最近は標準的なインストールで日本語が問題なく使えます.ただ,後述しますがフォントの設定はした方がよいように思います.

シンタックスハイライティング

文法に応じて色付けするあれです
をインストールします.なお,Atomでのパッケージの検索とインストールは File メニューの Settings で設定のタブを開き,Install を選んで表示される画面から行うことができます.

Latexmkによる自動コンパイル

一応ビルド用のパッケージがあるのですが,日本語原稿と英語原稿で設定を切り替えたりするのが面倒なのと,TeXのエラーメッセージは機械可読性がいまいちで完全にエラーハンドリングできることを期待できないので,最近はエディタのパッケージでビルドを行うのではなくlatexmkで常時自動コンパイル状態にしています.

latexmkrcファイルの準備

文書ごとにフォルダを用意し,TeXのソースを格納しているフォルダに日本語の場合は以下のような latexmkrc ファイル(ファイル名の頭にドットはついていません)
#!/usr/bin/perl
$latex = 'platex %O -src-specials -shell-escape -interaction=nonstopmode -synctex=1 -kanji=utf8 %S';
$bibtex = 'pbibtex %O %B -kanji=utf8';
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3; # use dvipdfmx
view raw latexmkrc hosted with ❤ by GitHub
英語の場合は以下のような latexmkrc ファイル
#!/usr/bin/perl
$pdflatex = 'pdflatex -synctex=1 -src-specials -shell-escape -interaction=nonstopmode -halt-on-error -file-line-error %O %S';
$bibtex = 'bibtex %O %B';
$pdf_mode = 1;
view raw latexmkrc hosted with ❤ by GitHub
を配置して,TeXのソースを格納しているフォルダで開いたコマンドプロンプトで

latexmk -pvc

を実行しておけばTeXのソース(やbibファイルや図のファイル)が更新されるたびに自動でコンパイルしてくれます.自動でビューワーの起動も行うのですが,後述の Atom内PDFビューワーを使う場合は不要なので設定ファイル内のコメントのように exit か何かを指定しておくとよいと思います.ビューワーを起動しないでコンパイルだけするオプションは無いような気がします.

また,この場合TeXソースがあるフォルダまでCDするのは面倒なので

  • エクスプローラーでシフトキーを押しながら右クリックするとメニューに密かに「このフォルダでコマンドプロンプトを開く」という項目が増えているので,これを使う.
  • atom-terminal パッケージをインストールすると,atom 左側の tree-view でフォルダや右クリックした際に表示されるメニューに Open terminal at root が追加されるのでこれを使う.

などの方法を覚えておくと便利だと思います.

エラーの確認

エラーは.logファイルに出力されています.後述するPDFファイルのタブとともにAtomで開きっぱなしにしておいても順次更新されるので,僕は開きっぱなしにしています.なお,logファイルを色付けして表示するためには Grammar を LaTeX Log に設定する必要があります..log ファイルを開いた状態で右下に Plain Text と表示されているので,これをクリックすると Grammar を選択することができます..logの拡張子で自動的にGrammarを変えることも可能でしょうが,LaTeX以外でも.logの拡張子を持つファイルがあるので特に設定していません.

備考

ファイル名の頭にドットがついた .latexmkrc をホームフォルダ(WindowsではHOME環境変数で指定したフォルダか C:\Users\maruta とかになっていると思います)に配置すると latexmk はデフォルトでその設定を使ってくれますが,昔のTeXソースをコンパイルするときの設定を忘れたり英語原稿と日本語原稿で記述を変えたりするのが面倒なので,TeXの原稿ごとに設定ファイルを配置するこの形に落着きました.

Atom内でのPDFプレビュー(+SyncTeX)

実は大してメリットがない気もしますが,AtomのタブでPDFを開けるとなんかカッコいいです.
をインストールするとこれが実現でき,表示されたPDFをクリックした際に対応箇所のTeXソースに飛ぶSyncTeXを利用することができます.

日本語PDF問題

長らく標準では日本語のPDFが文字化けしていました.これに関してIssueがあったものの途中で止まっていたのですが,調べてみたところ解決できそうでしたのでお願いして直してもらいました.


バージョン 0.39.0 以降では日本語が利用可能です.Issueを作成された@yohasebeさんと開発者の@izuzakさんに感謝いたします.

PDFへのフォント埋め込み設定

Atom の pdf-view パッケージではフォントを埋め込んでいないPDFファイルの漢字には中国語フォントが適用されるようです.ひらがなに使われる日本語フォントとの組み合わせと相まって日本語の文書は大変見苦しくなりますので,何らかのフォントの埋め込みをお勧めします.
TeX Live のコマンドプロンプトで

kanji-config-updmap status

を入力して状況を確認し

kanji-config-updmap ipaex

などのコマンドで埋め込むフォントを選択することができます.

pdf-view の現状の課題

ここまで書いておいてなんですが,100ページくらいのPDFを開くと簡単に不具合を起こしたり,テキストが選択できなかったり検索がかからなかったりするのであまり使い勝手が良いわけではありません(2016年1月現在).今後の進化に期待です.

SumatraPDFでのPDFプレビュー(+SyncTeX)

Atomの外部でPDFをプレビューする場合,いわゆる Acrobat や Reader でPDFファイルを開くとPDFファイルがロックされてTeXのコンパイルができなくなるので,コンパイルのたびにビューワーを閉じないといけませんが,PDFファイルをロックしない SumatraPDF を使うと,PDFを開いたまま修正とコンパイルを行うことができます.SumatraPDFは
からダウンロード可能です.

またビューワー上でクリックした際にTeXソースの該当箇所に自動で移動する SyncTeX については,上述の latexmkrc 内での指定のような -inverse-search オプションを付けて起動するか,適当な(TeXで生成された)PDFを開いた状態でSumatraPDFの左上のアイコンをクリックして表示されるメニューから Settings → Options をクリックし,Set inverse search command-line の項目を

"C:\Users\maruta\AppData\Local\atom\bin\atom.cmd" "%f:%l"

のように設定してください.

atomの実行ファイルはユーザー毎のフォルダにインストールされているので,どの場合も実行ファイルのパス中に含まれる maruta を自分のユーザー名で置き換えることに注意してください.

スペルチェッカの設定

Atomには標準でスペルチェッカがついています.が,Windows の場合
  • Windows 標準のスペルチェッカが使われる
  • 言語はシステムの設定に準じる
という仕様になっているで,英語のスペルチェッカを使うためにはシステムの言語設定を英語に切り替えるしかありません.この辺の仕様については色々と議論があるので,
そのうち改善するような気もしますが,今のところAtomでLaTeXを使う上で最大の問題かもしれません.LaTeX編集中にスペルチェッカを有効にするためには
[File]-[Setting]でPackagesの画面を開き,spell-checkを検索します

そしてspell-checkパッケージの設定画面(Settings)に移動し,Grammarsの項に text.tex.latex を追加します.

フォントの設定

File メニューから Settings の画面を開き Font Family のところに CSS でフォントを指定する要領で書くことができます.僕の設定は

Consolas, メイリオ

です.カンマで区切って列挙すると最初のフォントに含まれない文字は次のフォントで表示される感じになるので,簡単に好きな英文フォントと和文フォントを組み合わせることができます.個人的には,ここの簡単さとフォントのレンダリングがWebブラウザ並みに綺麗という点が LaTeX 編集に Atom を使う最大のアドバンテージな気がします.

僕は日本語を書くときには等幅を妥協する派ですが,等幅フォントが好きな人はMiguフォントとかを使うと良いと思います.

覚えておくべき機能

スニペット Snippet

今どきのエディタの定番機能で,定型コードの入力を大幅に省力化できます.とりあえず language-latex パッケージをインストールした際にLaTeX用のスニペットが登録されているので,適当なTeXファイルを開いて[Alt]+[Shift]+[S]のショートカットを使うと一覧を見ることができます.

この一覧から使いたい項目を選択することもできますが,項目の上側に表示されているprefixを覚えておけば,通常の文と同様にprefixを入力し[TAB]を押すことでスニペットを使うことができます.

文脈によって(数式環境の中とか外とか)有効なスニペットが変わったりするので色々試してみてください.

使い方に慣れてきたらスニペットの自作をお勧めします.

マルチカーソル

これまた今どきのエディタでは定番の,複数のカーソルを使って複数の箇所を同時に編集する機能です.
  • [Ctrl]キーを押しながらクリックするとその位置にカーソルが増えます. 
  • 適当な文字列を選択した状態で[Ctrl]+[D]を入力すると,選択中の文字列を検索してその位置にカーソルが増えます.繰り返し[Ctrl]+[D]を入力することで順次検索&カーソルの追加が行われます. 
慣れるとすごく便利なのでぜひ使うように心がけてみてください.

LaTeXの編集作業の中では,表や数式をいじるときに使いどころが多いと思います.

便利なパッケージなど

アイコンの拡充

をインストールするとファイルのアイコンが豊富になります.TeXのファイルも専用のアイコンになり,ツリー表示やタブが少しわかりやすくなるのでインストールをお勧めします.

minimap

今どきのエディタによくあるカッコいいあれです.
標準では入っていないですが
をインストールすると使えるようになります.

ファイル名補完

LaTeXで図や写真・画像などを使う場合,ファイル名を入力するのが地味に面倒だったりしますが,
を使うと補完の候補にファイルやフォルダの名前が出現するようになります.

カレントディレクトリ配下のファイル名を入力したい場合「./」と入力を始めると候補が表示されます.

\cite, \ref の補完

参考文献や数式,図表の番号を参照する際に
を入れておくと自動で補完してくれて快適です.参考文献については .bib ファイルを読み込んでいるので,BibTeXを使っていない場合は機能しないと思います.

まとめ

Atomはオープンソースの申し子のようなエディタであり,これまでの急速な改善からみても,いまどきの定番エディタの地位を長く維持できるような気がします.

ただし LaTeX や Windows や日本語といった辺境領域への対応はまだまだ不安定だったり完成度が低い感じですので,これからさらに開発が盛り上がることを期待したいです.
自分でもちょいちょいと貢献できたらな~と考えています.

あと,個人的には SublimeText2でだいぶお世話になり,最近 Atom 版の開発が始まったLaTeXTools に期待しています.
いまのところ動かない機能が8割といった感じなので(2016年1月現在),頃合いをみて試してみたいと思います.


2015年12月25日金曜日

TeXclipで作成した数式を後で編集する方法

TeXclipで作成した数式を修正する必要があるとき,再度TeXのコードを入力するのが面倒だという要望を頻繁にお受けしますので,簡単な方法を以下で説明します.

TeXclipの画像には代替テキストとしてTeXのソースコードを指定しています.
したがって,普通にPowerPointにコピペした画像については,「図の書式設定」の「代替テキスト」のところからTeXのソースコードを回収することが可能です.

以下のスクリーンショットは PowerPoint 2016 のものですが,リボンインターフェースに変わる前のバージョン(2003くらい?)でも「図の書式設定」ダイアログで同様の情報を取得できたはずです.「図の書式設定」はバージョンによらず画像を右クリックすると表示されるコンテキストメニューから表示できると思います.


フォントや解像度の設定についてはお手数ですが手作業で復元してください.