TeX文書のコンパイル
手石 版
編集中のTeX文書を保存してコンパイルし、pdfで表示します。
// タイプセット.js
// 2013/10/21
// platex と dvipdfmx はパスが通っている必要があります。
// 拡張子のチェック
var sary = document.Name.split( "." );
if ( ( sary.length <= 1 ) || ( sary.pop() != "tex" ) ){ Alert( ".texではありません。" ); Quit(); }
document.Save();
var pathdoc = document.FullName;
var jobname = changeExt( document.Name, "" );
// 最後にpdfファイルを開くタイミングを当該ファイルの有無で判断しているので、
// 古いpdfファイルは削除する。ついでにその他のファイルも……。
var SFso = new ActiveXObject( "Scripting.FileSystemObject" );
var ary = new Array( "pdf", "aux", "dvi", "log", "TMP" );
for ( var i in ary ){
var file_delete = changeExt( pathdoc, ary[ i ] );
if ( SFso.FileExists( file_delete ) ){ SFso.DeleteFile( file_delete ) }
}
var menu = CreatePopupMenu();
menu.Add( "A4縦置き", 41, meMenuChecked );
menu.Add( "A4横置き", 42, 0 );
menu.Add( "区切り", 0, meMenuSeparator );
menu.Add( "B5縦置き", 51, 0 );
menu.Add( "B5横置き", 52, 0 );
menu.Add( "区切り", 0, meMenuSeparator );
menu.Add( "キャンセル", 99, 0 );
//var r = menu.Track( mePosMouse )
var r = menu.Track( 0 );
var op_p = "";
var op_l = "";
switch ( r ){
case 41:
break;
case 42:
op_l = " -l";
break;
case 51:
op_p = " -p b5";
break;
case 52:
op_l = " -l";
op_p = " -p b5";
break;
case 99:
Quit();
default:
}
var stdout_log = changeExt( pathdoc, "TMP" );
var cmd_cd = 'cmd /c cd /d "' + document.Path + '"';
var cmd_p = 'platex -jobname="' + jobname + '" "' + pathdoc + '" >>"' + stdout_log + '" 2>&1';
var cmd_d = 'dvipdfmx -v' + op_l + op_p + ' "' + changeExt( pathdoc, "" ) + '" >>"' + stdout_log + '" 2>&1';
var cmd_echo1 = 'echo.>"' + stdout_log + '"';
var cmd_echo2 = 'echo.>>"' + stdout_log + '"';
var cmd_echo1line = 'echo ---------->"' + stdout_log + '"';
var cmd_echo2line = 'echo ---------->>"' + stdout_log + '"';
var cmd_ary = [
cmd_cd
, cmd_echo1line
, cmd_p
, cmd_echo2, cmd_echo2, cmd_echo2line
, cmd_d
]
var WshShell = new ActiveXObject( "WScript.Shell" );
var windowStyle = { HIDE: 0, NORMALFOCUS: 1 };
// 処理が終わるまで次へ進まないようブロック(第3引数を”true”)。
WshShell.Run( cmd_ary.join( " & " ), windowStyle.NORMALFOCUS, true );
// pdfファイルを関連付けで開く。
var pathpdf = changeExt( pathdoc, "pdf" );
var trymax = 3;
for ( var tryCount = 0; tryCount < trymax; tryCount++){
if ( SFso.FileExists( pathpdf ) ){
WshShell.Run( 'cmd /c "' + pathpdf + '"', windowStyle.NORMALFOCUS, false );
break;
}else{
Sleep( 500 );
}
}
if ( tryCount >= trymax ){
Alert( "pdfファイルが見つかりませんでした。" );
openFile( stdout_log );
};
SFso = null;
WshShell = null;
function openFile( fullname ){
var i = fileIndex( fullname );
if ( i == -1 ){
if ( fileExists( fullname ) ){
Editor.NewFile();
Editor.OpenFile( fullname );
}else{
Alert( ".TMPがみつかりません!" );
return -1;
}
}else{
Editor.Documents.Item( i ).Activate();
}
return i;
function fileIndex( fullname ){
for ( var i = Editor.Documents.Count-1; i>=0; i-- ){
if ( Editor.Documents.Item( i ).FullName == fullname ){ return i }
}
return -1;
}
}
function fileExists( filename ){
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var result = objFso.FileExists( filename );
objFso = null;
return result;
}
function changeExt( filename, ext ){
var s = filename.split( "\\" );
var f = s.pop().split( "." );
if ( f.length >= 2 ){
f.pop();
if ( ext.length > 0 ){ f.push( ext ) }
}else{
if ( ext.length > 0 ){ f.push( ext ) }
}
s.push( f.join( "." ) );
return s.join( "\\" );
}
isari 版 (2023/07)
手石さんの版を元に、TeX処理系と受け入れる拡張子、PDF表示ソフトをカスタムできるようにしました。オプションの値を変更してお好みの設定にしてください。手石版で指定できた用紙サイズなどはTeX側のクラスオプションで行うものとします。
更新履歴
- 2020/10/16
- 初版公開
- 2023/07/16
- escキーでキャンセルができていなかったのと、キャンセルされても補助ファイルを削除してしまっていたのを修正。
#title = "TeXコンパイル改"
// 2020/10/16 - 2023/07/16
// ------------ オプション ------------
// 受け入れる拡張子
var exts = [ "tex", "bib", "txt" ];
// TeX処理系
// キーをポップアップメニューに表示したい文字列、値をシェルに渡す文字列として適宜追加・編集してください。各処理系にはパスが通っている必要があります。
var engines = { "pLaTeX": "ptex2pdf -l -ot -kanji=utf8", "upLaTeX": "ptex2pdf -u -l -ot", "LuaLaTeX": "lualatex", "XeLaTeX": "xelatex" };
// syncTeXオプション
var synctex = "-synctex=1";
// シェルの表示オプション
// 1にするとシェルのウィンドウが立ち上がり出力を表示、0にすると非表示になります。他にも10までの整数が指定できます。詳細は[WSHのドキュメント](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364421(v=msdn.10))を参照してください。
var windowStyle = 1;
// PDFビューワー
// 実行ファイルの場所をフルパス、バックスラッシュ2つ区切りで指定してください。必ず外側をシングル、内側をダブルのクオーテーションで囲みます。nullにすると規定のプログラムで開きます。
var pdfViewer = '"C:\\Program Files\\SumatraPDF\\SumatraPDF.exe"';
// ------------------------------------
// 拡張子のチェック
var sary = document.Name.split( "." );
if ( ( sary.length <= 1 ) || ( exts.indexOf( sary.pop() ) == -1 ) ){
Alert( "TeX文書ではありません。" );
Quit();
}
// 手動で保存したければ次の行をコメントアウト
document.Save();
var filename = document.Name;
var path = document.Path;
var filepath = document.FullName;
var menu = CreatePopupMenu();
var keys = Object.keys( engines );
keys.forEach( function( key, index ) {
menu.Add( key, index + 1 );
} );
menu.Add( "キャンセル", 0 );
// マウスポインタの位置にポップアップを表示したければTrack( mePosMouse )に
var r = menu.Track( 0 );
var key = "", engine = "";
if ( r !== 0 && r <= keys.length ){
key = keys[r - 1];
engine = engines[key];
}else if ( r === 0 ){
Quit();
}else{
Alert( "指定が正しくありません。" );
Quit();
}
// 古いpdfファイルと補助ファイルの削除
var SFso = new ActiveXObject( "Scripting.FileSystemObject" );
var ary = new Array( "pdf", "aux", "dvi", "log", "TMP" );
for ( var i in ary ){
var file_delete = changeExt( filepath, ary[ i ] );
if ( SFso.FileExists( file_delete ) ){ SFso.DeleteFile( file_delete ) }
}
var typeset = engine + " " + synctex + " " + filename;
var WshShell = new ActiveXObject( "WScript.Shell" );
WshShell.CurrentDirectory = path;
WshShell.Run( typeset, windowStyle, true );
// pdfファイルを開く
var pdfpath = changeExt( filepath, "pdf" );
var openpdf = pdfViewer ? pdfViewer + " " + pdfpath : pdfpath;
var trymax = 3;
for ( var tryCount = 0; tryCount < trymax; tryCount++){
if ( SFso.FileExists( pdfpath ) ){
WshShell.Run( openpdf );
break;
}else{
Sleep( 500 );
}
}
if ( tryCount >= trymax ){
Alert( "pdfファイルが見つかりませんでした。" );
var log = changeExt( filepath, "log" );
if ( SFso.FileExists( log ) ){
editor.OpenFile( log, meOpenAllowNewWindow );
}
};
SFso = null;
WshShell = null;
function changeExt( filename, ext ){
var s = filename.split( "\\" );
var f = s.pop().split( "." );
if ( f.length >= 2 ){
f.pop();
if ( ext.length > 0 ){ f.push( ext ) }
}else{
if ( ext.length > 0 ){ f.push( ext ) }
}
s.push( f.join( "." ) );
return s.join( "\\" );
}
スポンサーリンク