ヒョンさんへ。
以下が[TeXコンパイル&プレビューマクロ]です。
------------------------------------------------------------------
// MMエディタ用[TeXコンパイル&プレビューマクロ]
// TeXComp.mam
// (C) y.miyazaki, 2000/09/16
#define MB_OK 0x00000000L
#define MB_YESNO 0x00000004L
#define MB_ICONQUESTION 0x00000020L
#define MB_ICONEXCLAMATION 0x00000030L
#define IDYES 6
#define SW_SHOW 5
#define WM_SYSCOMMAND 0x0112
#define SC_CLOSE 0xF060
#define SC_MAXIMIZE 0xF030
#define GENERIC_READ (0x80000000L)
#define OPEN_EXISTING 3
#define MenuSelect() PostMessage(Handle(), 0x100, 0x28, 0)
// 関数のプロトタイプ宣言
int Compile(int mode);
void Preview(void);
//
// Guishellのある場所をフルパスで指定して下さい。
char *gui = "c:\\ptex\\bin\\guishell.exe";
// Dvioutのある場所をフルパスで指定して下さい。
char *dvi = "c:\\ptex\\bin\\dviout.exe";
char appname[100], topic[100];
char dfname[300];
main()
{
int ans;
char *ms[5];
ms[0] = "現在のファイルをTeXで処理(&T)";
ms[1] = "TeX処理(変更有り時)とプレビュー(&V)";
ms[2] = "一回だけTeXで処理(&O)";
ms[3] = ""; // セパレータ
ms[4] = "終 了(&E)";
MenuSelect(); // メニューの一番上を選択表示する
ans = Menu(ms, 5); // メニューの表示
switch(ans)
{
case 0:
Compile(2);
break;
case 1:
Preview();
break;
case 2:
Compile(1);
break;
default:
break;
}
}
// コンパイル
// mode: 1:一回だけ処理, 2:複数処理, 3:Previewよりの
// 戻り値: 0:ERROR, 1:OK, 2:Previewよりでコンパイルなし
int Compile(int mode)
{
static char adname[300]; // アドバイスループで使う配列は static の必要がある
HWND hwnd;
HANDLE shFile, dhFile;
FILETIME sft, dft;
char *p, *p2, s[500], fname[300], efname[300];
int ret;
Save();
GetFileName(fname);
strcpy(dfname, fname);
p = strrchr(dfname, '.');
if(p == NULL || (Strcmpi(p+1, "tex") != 0 && Strcmpi(p+1, "dtx") != 0))
{
Message("このファイルの拡張子は tex ではありません。\n終了します。");
return 0;
}
if(p)
strcpy(p+1, "dvi");
else
strcat(dfname, ".dvi");
shFile = CreateFile(fname, GENERIC_READ, 0,
(void*)NULL, OPEN_EXISTING, 0, (HANDLE)NULL);
if(shFile != -1)
{ // .tex は存在するはず
GetFileTime(shFile, (void*)NULL, (void*)NULL, &sft);
CloseHandle(shFile);
}
dhFile = CreateFile(dfname, GENERIC_READ, 0,
(void*)NULL, OPEN_EXISTING, 0, (HANDLE)NULL);
if(dhFile != -1)
{ // .dvi は存在するなら
GetFileTime(dhFile, (void*)NULL, (void*)NULL, &dft);
CloseHandle(dhFile);
}
if(mode == 1 || mode == 2 ||
dhFile == -1 || CompareFileTime(&sft, &dft) > 0)
{ // .dviは 存在しがないか、更新されていないなら コンパイル
strcpy(appname, "guishell");
strcpy(topic, "guishell");
hwnd = FindWindow("guishell", 0);
if(hwnd == NULL)
{ // guishell を起動
WinExec(gui, SW_SHOW);
hwnd = FindWindow("guishell", 0);
}
if(DdeInitiate(appname, topic) == 0)
{
Message("GUISHELL/DDEサーバが応答しません。");
return 0;
}
adname[0] = '\0'; // Guishell よりの戻り値を得る配列
if(DdeAdvStart("Advise", adname, sizeof(adname)) == 0)
{ // アドバイスループ作成失敗
DdeTerminate();
SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); // guishellを閉じる
Message("アドバイスループ作成に失敗しました。");
return 0;
}
strcpy(s, fname);
if(mode == 1) // 1回だけ
strcat(s, " /ProcessOnce");
else
strcat(s, " /ProcessComplete");
DdeExecute(s);
while(adname[0] == '\0') // Guishellの終了を待つ
DdeAdvWait("Advise", 60000); // MAX 60秒待つ
DdeAdvStop("Advise");
DdeTerminate();
SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); // Guishellを閉じる
if(mode == 2)
SetFocus(Handle());
if(strcmp(adname, "OK") == 0) // コンパイルOK
ret = 1;
else if(strcmp(adname, "ERROR") == 0) // ERROR ならプレビューはしない
ret = 0;
else
{
if((p = strrchr(adname, ' ')) != 0) // 'e' + [Enter] が押された
{ // adname の形式 => "testlatex.tex 12"
strcpy(efname, fname);
if((p2 = strrchr(efname, '\\')) != 0)
{ // errorファイルが、現ファイルと異なるなら、そのファイルを開く
*p = '\0';
strcpy(p2+1, adname);
//if(Strcmpi(efname, fname) != 0)
{ // そのファイルを開く
Open(efname);
}
}
GoLine(Atoi(p+1)); // エラー行へジャンプ
GotoX(1);
}
}
}
else
{ // .dvi は更新されているなら
ret = 2;
}
return ret; // コンパイル OK = 1, NG = 0, NONE = 2
}
// プレビュー
void Preview(void)
{
int i;
char s[500];
if(Compile(3) == 0) // コンパイルERROR
return;
strcpy(appname, "dviout"); // プレビュー
strcpy(topic, "dviout");
hwnd = FindWindow("dviout", 0);
if(hwnd == NULL)
{ // dviout を起動
WinExec(dvi, SW_SHOW);
hwnd = FindWindow("dviout", 0);
}
for(i = 0; i <= 10; i++)
{ // MAX10回トライ
if(DdeInitiate(appname, topic) == 0)
{ // NG
if(i == 10)
{
Message("DVI/DDEサーバが応答しません。");
return;
}
Sleep(500); // 500ms
}
else // OK
break;
}
SendMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0); // 最大化
strcpy(s, "[WinNormal]");
DdeExecute(s);
strcpy(s, "[PageOpen(1)][FileOpen\(\""); // ページを指定
strcat(s, dfname);
strcat(s, "\"\)]");
DdeExecute(s);
DdeTerminate();
SetFocus(Handle());
SetForegroundWindow(hwnd);
}
------------------------------------------------------------------
ヒョンさんへ。
以下のマクロを使ってみてください。
百の位までの漢数字を半角の洋数字に変換します。
------------------------------------------------------------------
// 変換例:
// 三百二十七条 -> 327条
// 三百十七条 -> 317条
// 三百七条 -> 307条
// 百二十七条 -> 127条
main()
{
int saveIns;
int i, j, c, cp, ans, ans1, mode;
int doconv = 0;
int ishand; // 百
char *kp = "〇○◯一二三四五六七八九十";
char *k2p = "一二三四五六七八九";
char *np = "0123456789";
char *pp = "・.";
//-------------------------------------------------------------
// ここへ半角数字へ変換する漢数字の直後の漢字を指定して下さい
char *kep = "・.年月日百千万億兆円時秒分人回倍条";
//-------------------------------------------------------------
saveIns = Ins();
InsMode(0);
//DispOff2();
if(Block() == 1 || Block() == 2)
{ // 選択範囲の変換モード
mode = 1;
cp = Cecp();
GoBlok();
Select(0);
}
else
{ // テキスト全体の変換モード
mode = 0;
Top();
}
for(;;)
{ // ループ
if(mode == 1 && Cecp() >= cp) // 選択範囲時の終わりのチェック
break;
if(Tcode() == 0) // [EOF] のチェック
break;
if(KbHit() == 0x1b) // ESCが押された場合は終了
break;
if(Code() == 0x9553) // 百
{
ishand = 1;
PutChr(np[1]);
}
if((ans = StrChr(Code(), kp)) >= 0)
{ // 漢数字が見つかった
Right();
for(i = 0; StrChr(Code(), kp) >= 0; i++)
Right(); // 漢数字の次の位置まで移動
if(StrChr(Code(), kep) >= 0 || doconv == 2)
{ // 変換 OK なら
if(Code()==0x9553) // 百
{
Del();
ishand = 1;
}
else if(ishand == 1)
ishand = 2;
else
ishand = 0;
for(j = i; j >= 0; j--)
Left(); // 漢数字の開始位置まで戻る
doconv = 1; // 変換開始 = 1
for(j = i; j >= 0; j--)
{ // i は変換する漢数字の数
cp--;
if((ans = StrChr(Code(), kp)) < 0)
break; // これはあり得ないが一応チェック
if(ans < 3*2) // 〇○◯
PutChr(np[0]);
else if(ans == 12*2) // 十
{ // 漢数字 十 が見つかった
Left();
ans = StrChr(Code(), np);
Right();
if(ans < 0 || ishand == 2)
{
ishand = 0;
InsMode(1);
PutChr(np[1]);
InsMode(0);
}
Right();
if((ans = StrChr(Code(), k2p)) >= 0)
{
cp--;
Bs(); // この漢数字 十 はいらないので消す
Left();
if(ishand == 2)
PutChr(np[1]);
}
else
{
Left();
PutChr(np[0]);
}
}
else
{
if(ishand == 2)
{
ishand = 0;
Right();
c = Code();
Left();
if(c != 0x8f5c) // 十 以外なら
{
InsMode(1);
PutChr(np[0]);
InsMode(0);
}
}
int isone = 0;
if(i == 0 && Cecp() > 0)
{
Left();
if(StrChr(Code(), np) < 0)
isone = 1;
Right();
}
//PutChr(isone == 1 ? np[(ans-4)/2]+(0x824f-0x30): np[(ans-4)/2]);
PutChr(np[(ans-4)/2]);
}
}
}
}
else if(doconv && (ans = StrChr(Code(), pp)) >= 0)
{ // 漢数字の後の「・」か「.」は小数点
doconv = 2;
cp--;
PutChr('.');
}
else
{ // 次の位置へ
doconv = 0;
Right();
}
}
InsMode(saveIns);
//DispOn();
if(mode == 0)
Top();
}
------------------------------------------------------------------