2014-02-01

LaTeX 関係のバッチファイルなどなどなど。

ようやく卒論を一通り書き終えました。
教授からは OK をもらえましたので、大まかなところは終了。
ただ、助教から細かいところの訂正を指示されると思うので、それが終わってようやく終了と言えるのですけどね(笑)

そんで今回の投稿は、論文作成のために作ったバッチファイル (コマンドプロンプトで動く奴) なんかを紹介しようかなと。

先日の投稿でも少し語りましたが、私にはポリシーがあります。
  • 環境に依存しないスタイル (超重要)
  • Dropbox 上に TeX ファイルを保存して、複数端末から弄れるようにしておきたい。 使用するすべての端末で設定を弄るのは面倒なので、pLaTeX2e 環境はインストールしたままで使えるように。
  • テキストエディタは好きなものを使いたい
  • WinShell, TeXstudio, Texmaker, TeXworks, LyX とか色々と統合環境があるらしいです。どれも使ったことないけど、なんとなく気に入りません。

とまぁ、これだけですけどw

【 2015/07/10 追記 】
ファイルの準備を簡単にするために、OneDrive に必要なファイル一式をアップロードしました。よろしければご利用下さい。



【 2016/01/03 追記 】
GitHub に移動しました。これまでのスクリプトと大筋は同じですが、完全には同じではないです。
ついでに Mac、Linux (未検証) のスクリプトを追加してあります。




環境構築について。
Windows 上の LaTeX 環境構築はあべのりさんの「TeX インストーラ 3」で行っています。
DL して、解凍して、ひたすら進めていけば、時間はかかりますけど、必要なものはほぼすべて入れてくれます。
大変素晴らしい TeX 環境構築ソフトですので、非常にオススメ。



● コンパイル

コマンドプロンプトからコマンドを打てばできますが、繰り返しやることですし、毎回手打ちは非常に面倒なので、バッチファイルを使います。
下の囲みをコピーして、適当なテキストエディタに貼り付け、コンパイルしたい TeX ファイルと同じフォルダに保存してあげてください。
ファイル名は「(コンパイルしたい TeX のファイル名).cmd」で。(拡張子は bat でも OK。お好きな方で。)
@echo off

:: ======================================================= ::
:: TeX コンパイル用バッチファイル (cmd-platex-dvipdfmx.cmd)
:: Copyright (C) 2014 tag. All rights reserved.
:: http://karat5i.blogspot.jp/
::
:: 注意:
:: このバッチファイルのファイル名を TeX のソースファイル名と同じにしてください。
:: ======================================================= ::

:: コマンドプロンプトの文字と背景の色
color f8

:: バッチファイルのディレクトリに移動
cd "%~dp0"

:: TeX ファイルの文字置換
:: for /r %%i in (*.tex) do (
:: call Replace.cmd "%%i"
:: )

:: バッチファイルのファイルネームの取得
set "FILENAME=%~n0"

:: AUX ファイルの削除
:: rm "%FILENAME%.aux"

:: pLaTeX の実行
platex "%FILENAME%.tex"
platex "%FILENAME%.tex"
platex "%FILENAME%.tex"

:: Adobe Reader を閉じる (PDF ファイルが開かれていると dvipdfmx の出力ができないため)
:: taskkill /im AcroRD32.exe /f /t
:: Adobe Acrobat の終了
:: taskkill /im Acrobat.exe /f /t

:: dvipdfmx の実行 (2行目のコマンドはフォントマップ指定時用)
dvipdfmx "%FILENAME%.dvi"
:: dvipdfmx -f font.map "%FILENAME%.dvi"

:: PDF ファイルを開く
:: "%FILENAME%.pdf"

:: バッチファイル実行後に一時停止
:: pause > nul

簡単にバッチファイルの説明を。
一応、必要最低限のことは既にコメントとしてバッチファイル内に書いてあります。

コマンドプロンプト上でのコマンドは、大文字と小文字を区別しませんので、わかりやすい方に統一しておけば OK。

まず、知ってほしいのが REM コマンド。
REM コマンドは「コメント文」を書くためのコマンド。そのため処理には一切影響がありません。
コメントを書くため以外の使い方としては、飛ばしたい処理の頭に "REM" とつけることでその処理を飛ばすことができます。

可読性の面から、:: (コロン×2) にコメント文の記述方法を変えました。GOTO 文のラベルの記法の応用ですが、機能としては REM コマンドとほとんど違いはありません。

では、上から必要そうなところだけ説明していきます。

@echo off
ECHO コマンド。文字列や変数を表示できます。"ECHO OFF"とすると、以降のコマンドのが非表示になります。
また、頭の "@" はこの ECHO OFF の標準出力への出力を OFF にするものです。
バッチファイルのためのおまじないだと思ってつけておいて下さい。

cd "%~dp0"
CD (Change directory) コマンド。指定したディレクトリ (フォルダ) に移動します。今回は "%~dp0" に移動しています。
"%~dp0" は、"%0" で 0 番目の引数 (つまりバッチファイルのフルパス) から、"~" (チルダ) で両端を囲むダブルクオートを取り除き、"d" でドライブレターを残し、更に "p" でパスを残す、つまり、バッチファイルのあるフォルダまでのパスを示しています。

set "FILENAME=%~n0"
SET コマンドで、変数 FILENAME に %~n0 の内容を代入しています。
"%~n0" は、0番目の引数 (%0) のファイル名 (n) を取得し、両端のダブルクオートを外す (~) という意味です。バッチファイルのファイル名を取得しているだけです。
変数を使うときには両端を % で囲って使います。

rm "%FILENAME%.aux"
RM (Remove) コマンド。ファイルを削除するコマンドです。
今回は AUX ファイルを削除します。Algorithm パッケージを使ったときに、少しでもソースを間違えてコンパイルすると、途中で止まってしまうことがあったので、このコマンドを用意しておきました。
上のソースコードでは REM コマンドでコメントアウトしてあるので、必要なときに REM コマンドを外してあげてください。

platex "%FILENAME%.tex"
TeX ファイルをコンパイルします。説明不要でしょう。
3 回ある理由は、TeX のコンパイルは最低 3 回通すべきと言われているから。それは初めだけでいい気もするけど。
TeX のソース内で \ref や \cite を使ったときには 2 回は通した方がいいですね。

taskkill /im AcroRD32.exe /f /t
TASKKILL コマンド。タスクを殺すコマンド。dvipdfmx を実行した際に PDF ファイルが開かれていると、PDF ファイルが出力 (上書き) できないので、予め PDF ビューアを終了する目的。
オプションについてですが、 /im でプログラム名を指定してタスクを終了できます。普段 PDF ビューアとして Adobe Reader を使っているので "AcroRD32.exe" を指定しました。他のプログラムを使っている場合には、そのプログラムを起動して、タスクマネージャーから探して指定してください。
/f で強制終了、 /t で親プロセスに加えて子プロセスまで終了します。

dvipdfmx "%FILENAME%.dvi"
DVI ファイルを PDF ファイルに変換します。これも説明不要かと。

"%FILENAME%.pdf"
生成された PDF ファイルを開きます。それだけ。

pause > nul
PAUSE コマンド。入力待ちをするコマンド。これがないとコマンドプロンプトのウィンドウが勝手に閉じてしまうので、platex や dvipdfmx コマンドの出力結果を見たいときに REM を外して使えばよろしいのではないかと。
"> nul" は、「続行するには何かキーを押して下さい . . .」の表示をリダイレクト (>) で nul に送って消すだけ。特に深い意味はない。



● 文字列置換

理工系論文であれば、句読点は「、」「。」ではなく、「,」「.」を使うのが一般的なのではないかと。
でも、普段使いの PC の設定を「,」「.」にするのは今ひとつなので、文字列置換で済まします。

バッチファイルで文字列置換をするのは、個人的に難しそうだったので、Windows 標準の機能である VBS を使います。

下の枠内を "Replace.vbs" とでもして、テキストエディタを使って保存してください。
面倒なので、説明は省きますw VBS ではシングルクオートはコメント文を表します。
'Replace.vbs - 文字列置換スクリプト
'引数: <入力先ファイル> <出力先ファイル> <置換前の文字列> <置換後の文字列>
'Copyright (C) 2013 tag.

Option Explicit

Dim fso, targetFile, strData
Set fso = CreateObject("Scripting.FileSystemObject")

'ターゲットファイル読み込み
Set targetFile = fso.OpenTextFile(WScript.Arguments(0))
strData = targetFile.ReadAll
targetFile.Close

'テキスト変換
strData = replace(strData, WScript.Arguments(2), WScript.Arguments(3))

'ターゲットファイル書き込み
Set targetFile = fso.CreateTextFile(WScript.Arguments(1))
targetFile.Write(strData)
targetFile.Close

更にもう一つ。今度はバッチファイル。Replace.cmd としておきます。これも説明はパス。
@echo off

:: ======================================================= ::
:: 文字列置換バッチファイル (Replace.cmd)
:: Copyright (C) 2013 tag. All rights reserved.
:: http://karat5i.blogspot.jp/
::
:: Drag & Drop で使えます。
::
:: 要: Replace.vbs
:: ======================================================= ::

cd "%~dp0"

set VBSFilePath="Replace.vbs"

:start
if "%~1"=="" goto processend
if not "%~x1" == ".tex" goto next

:process
@echo "%~1" の文字列置換中…
:: 置換パターンの記述: CScript <特製文字列置換スクリプト> <入力ファイル> <出力ファイル> <置換前> <置換後>
CScript %VBSFilePath% "%~1" "%~1" "。" "."
CScript %VBSFilePath% "%~1" "%~1" "、" ","

:next
shift
goto start

:processend

で、Replace.vbs と Replace.cmd を同じフォルダに置いて、TeX のソースコードを Replace.cmd にドラッグアンドドロップしてください。
すると、句読点を「、」「。」から「,」「.」に置換してくれます。

もし、変換パターンを増やしたいときには、Replace.cmd の「置換パターンの記述」を参考にコマンドを増やしてあげてください。


さらに、「先ほどの TeX のコンパイルの実行と同時に文字列置換をしてしまいたい!」という横着者は、下のコマンドを組み込んで下さい。上のソースではコメントアウトしてありますので、コメントアウトを外してもらっても OK です。
:: TeX ファイルの文字置換
for /r %%i in (*.tex) do (
call Replace.cmd "%%i"
)



● フォントの埋め込み

個人的には PDF ファイルは環境に依存せずに読めるという状態があるべき姿だと考えているので、フォントを埋め込むことをオススメしています。
コンパイル用のバッチファイル内にある、下のコード (dvipdfmx の f オプション付き) を有効化してあげてください。
dvipdfmx -f font.map "%FILENAME%.dvi"
仕上げに、先日の投稿から、フォントマップファイルを作って、バッチファイルと同じフォルダに "font.map" という名前で置いてあげて下さい。



とまぁ、結構な分量になってしまいましたが、こんなところです。
お役立ていただければと。

0 件のコメント :

コメントを投稿