学校でLaTeXの入門が始まりました。ただ、コンパイルの手順も多くてめんどくさいです。そこで、LaTeX入門で使えそうな機能を実装することにしました。
機能
今回作成した機能は
- .texから.pdfへの一括変換(tex2pdf )
- ファイル保存時の自動コンパイル&ビューの更新(texlivebuild)
の2つです。
どちらもシェルスクリプト(bash)で作成しました。
使用時の動画を貼っておきます。
詳しい説明は下に載せます。
環境
学校で利用するUNIXシステムを想定しています。(おそらくCentOS)
そのため、別途でソフトウェアをインストールする必要のないような構成にしました。
主に必要となるソフトウェア(コマンド)は以下の通りです。
- platex(.texから.dviへの変換)
- dvipdfmx(.dviから.pdfへの変換)
- evince(PDFビューワー)
ダウンロード&セットアップ
こちらからファイルをダウンロードできます。
ここではセットアップの方法を2通り書いておきます。
※学校のUNIXシステム環境を想定しています。一般には~/bin
をパスの通るフォルダに置き換えてください。
Gitを使わない方法
- 上記のリンクからZIPファイルをダウンロード
- 解凍
- フォルダ名をbinに変更
- ユーザーフォルダに移動(/home/<group>/<username>/)
UNIX端末のターミナルにて、
cd ~/bin chmod +x tex2pdf texlivebuild
「Gitって何?」という人にはとっつきやすい方法ですが、手順が多いです。
ということで以下を推奨します。
Gitを使う方法
UNIX端末のターミナルにて、
git clone https://github.com/88IO/cmd-extension ~/bin cd ~/bin chmod +x tex2pdf texlivebuild
… 終わり(コピペ可)
これで1つ目と同じ操作になります。
解説
作ったシェルスクリプトはどのディレクトリからでも使える必要があります。
そこで学校で使うUNIXシステムの環境変数を調べたところ、$PATHに~/binが登録されていました。($PATHに登録されたフォルダ内のファイルはどのディレクトリからでもアクセスできます。)
chmod +x <filename>
実行権限を付与しないとコマンドを入力しても「許可がありません」と表示されるだけで実行できないので注意です。
基本的に上の2通りのいずれかを行えば、tex2pdfとtexlivebuildの2つのコマンドが使えるようになったと思います。
次はこれらのコマンドの使い方・動作説明です。
tex2pdf と texlivebuild の使い方
tex2pdf
PDF化したいTEXファイルを引数に取って実行します。
tex2pdf <basename>.tex
これだけで<basename>.pdfが出力されます。また、evince PDFビューワーが自動で起動し、PDFファイルがプレビューされます。
ただし、一度に複数のファイルの変換には対応していません。(対応は可能ですけど、簡易的なものなので…)
texlivebuild
引数に指定したファイルの更新を監視し、更新されたときにtex2pdfを実行します。
texlivebuild <basename>.tex
お気づきの方も多いと思いますが、実行するコマンドの部分を変更することで他のファイル形式への拡張も可能です。
こちらも上と同様で、一度に複数のファイルの監視には対応していません。(以下同文)
tex2pdf と texlivebuild の動作説明
tex2pdf
#!/bin/bash # "$1"は1つめの引数 # 引数でとったファイルが存在するか if [ ! -f $1 ]; then echo Please input File, not Directory. exit fi # ファイルの拡張子が.texであるかどうか if [ ${1#*.} != "tex" ]; then echo Please input TeX file. exit fi # ファイル名の設定 texfile=$1 basename=${texfile%.*} dvifile=${basename}.dvi pdffile=${basename}.pdf # .tex -> .dvi platex $texfile # .dviが存在するなら(エラーがなければ) # .dvi -> .pdf if [ -f $dvifile ]; then dvipdfmx $dvifile fi # .pdfが存在する かつ evinceで.pdfを開いていなければ if [ -f $pdffile ] && [ -z "$(ps aux | grep "[evince] $pdffile")" ]; then # エラーは表示させない(コンパイルのメッセージのみにするため) # ビューワーを起動 evince $pdffile >> /dev/null 2>&1 & fi
結局のところ、.texをコンパイルするときに使う2つのコマンドを合わせているだけです。単純でしょ。
texlivebuild
#!/bin/bash # 引数でとったファイルが存在するかどうか if [ ! -f $1 ]; then echo Please input File, not Directory. exit fi # 監視するファイルの更新日時を保存 last=$(ls --full-time $1 | awk '{print $6"-"$7}') while true do # 1秒ごとにループ sleep 1 # 新たにファイルの更新日時を保存 current=$(ls --full-time $1 | awk '{print $6"-"$7}') # 前の更新日時との変更があれば if [ $last != $current ]; then # .tex -> .pdf & open tex2pdf $1 # 更新日時を更新 last=$current fi done
先程も書きましたが、tex2pdf $1
の部分を書き換えるだけで拡張できます。
PDFビューワーについて
学校のUNIXシステム環境ではPDFファイルをプレビューできるソフトウェアが(おおまかに)3つありました。
- Adobe Acrobat Reader(acroread)
- Evince
- Firefox
この中で唯一EvinceのみがPDFファイルの更新に合わせてビューを更新する機能を持ちます。(acroreadは[Ctrl + R]、Firefoxは[F5]を押す必要がある。)
また、Evince以外はコマンドラインで同一ファイルを開くと別タブに表示されるため、同じタブ内でのビューの更新は難しいです。(特にシェルスクリプトだけだと。)
今回は既存のシステム(ソフトウェア)を用いて実装することが絶対条件だったので、acroreadは使わずEvinceを採用しました。(標準で入っててよかった…)
補足
質問等はコメントしていただければ答える予定ですが、「これのせいで〜」に関しては対応しきれるか分からないということはご承知ください。(よっぽどないけど。)
コメント