TeX文書のコンパイル

提供: MeryWiki
移動先: 案内検索

編集中の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( "\\" );
}