スポンサーリンク

LaTeX入門で使えるシェルスクリプトを書いた

専門

学校でLaTeXの入門が始まりました。ただ、コンパイルの手順も多くてめんどくさいです。そこで、LaTeX入門で使えそうな機能を実装することにしました。

機能

今回作成した機能は

  • .texから.pdfへの一括変換(tex2pdf
  • ファイル保存時の自動コンパイル&ビューの更新(texlivebuild

の2つです。

どちらもシェルスクリプト(bash)で作成しました。

使用時の動画を貼っておきます。

TexのPDFライブプレビュー!?

詳しい説明は下に載せます。

環境

学校で利用するUNIXシステムを想定しています。(おそらくCentOS)

そのため、別途でソフトウェアをインストールする必要のないような構成にしました。

主に必要となるソフトウェア(コマンド)は以下の通りです。

  • platex(.texから.dviへの変換)
  • dvipdfmx(.dviから.pdfへの変換)
  • evince(PDFビューワー)

ダウンロード&セットアップ

こちらからファイルをダウンロードできます。

88IO/cmd-extension
Contribute to 88IO/cmd-extension development by creating an account on GitHub.

ここではセットアップの方法を2通り書いておきます。

※学校のUNIXシステム環境を想定しています。一般には~/binをパスの通るフォルダに置き換えてください。

Gitを使わない方法

  1. 上記のリンクからZIPファイルをダウンロード
  2. 解凍
  3. フォルダ名をbinに変更
  4. ユーザーフォルダに移動(/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に登録されたフォルダ内のファイルはどのディレクトリからでもアクセスできます。)

調べ方:echo $PATH
今回はこのディレクトリを使わせてもらいます。(バイナリファイルじゃないけど… )
また、~/.bashrcに関数として書き加える方法もありましたが、編集を間違えるとログイン等に影響が出る可能性があるため非推奨とします。
次に、ファイルの実行権限付与です。
以下のコマンドで付与できます。
chmod +x <filename>

実行権限を付与しないとコマンドを入力しても「許可がありません」と表示されるだけで実行できないので注意です。


基本的に上の2通りのいずれかを行えば、tex2pdftexlivebuildの2つのコマンドが使えるようになったと思います。

次はこれらのコマンドの使い方・動作説明です。

tex2pdf と texlivebuild の使い方

tex2pdf

PDF化したいTEXファイルを引数に取って実行します。

tex2pdf <basename>.tex

これだけで<basename>.pdfが出力されます。また、evince PDFビューワーが自動で起動し、PDFファイルがプレビューされます。

ただし、一度に複数のファイルの変換には対応していません。(対応は可能ですけど、簡易的なものなので…)

tex2pdf a.tex b.tex … 等

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の部分を書き換えるだけで拡張できます。

例:C言語用 gcc -o ${1#*.} $1

PDFビューワーについて

学校のUNIXシステム環境ではPDFファイルをプレビューできるソフトウェアが(おおまかに)3つありました。

  • Adobe Acrobat Reader(acroread)
  • Evince
  • Firefox

この中で唯一EvinceのみがPDFファイルの更新に合わせてビューを更新する機能を持ちます。(acroreadは[Ctrl + R]、Firefoxは[F5]を押す必要がある。)

また、Evince以外はコマンドラインで同一ファイルを開くと別タブに表示されるため、同じタブ内でのビューの更新は難しいです。(特にシェルスクリプトだけだと。)

今回は既存のシステム(ソフトウェア)を用いて実装することが絶対条件だったので、acroreadは使わずEvinceを採用しました。(標準で入っててよかった…)

補足

質問等はコメントしていただければ答える予定ですが、「これのせいで〜」に関しては対応しきれるか分からないということはご承知ください。(よっぽどないけど。)

コメント

タイトルとURLをコピーしました