名前: 平成太郎 日時: 2005-04-08 08:50:46 IPアドレス: 219.105.251.*
青空文庫作品をTeXの縦組編集するとき手間なのが、ルビ、傍点、踊り字と 会話体混合のときの\\入力です。 今日は朝から晴れていた。\\ 「おはよう」 私の方はこれらの作業をエディタのマクロで一括作業しています。そのマクロ の内容です。こちらも昨夜旧来と変更しました。ちょっと長いですが。 七十歳近くなってこんなことするのは疲れます(^_^;) ------------------------------- main() { int i, cnt, cnt2, tolf, cnt0; char *p, *p2; char *gtbl = "ガギグゲゴザジズゼゾダヂヅデドバビブベボヴ\ がぎぐげござじずぜぞだぢづでどばびぶべぼパピプペポぱぴぷぺぽ"; DispOff2(); Top(); while(Tcode() > 0) { Right(); if(Col2 > 1 && Tcode() == 1) // 行末の次が空行以外なら \\ を付加 { Right(); if(Tcode() > 1) { Left(); PutStr("\\\\"); } else { while(Tcode() == 1) Right(); Left(); } } else if(Code() == 0x8163) // … { // ……を \DOTS へ変換 Right(); if(Code() == 0x8163) // … { Left(); Del(); // 削除 Del(); // 削除 PutStr("\\DOTS "); } else Left(); } else if(Code() == 0x8148 || Code() == 0x8149) // !? { // !と?の後ろの全角スペースをとる Right(); if(Code() == 0x8140) // 全角スペース Del(); // 削除 else Left(); } if(Col2() == 1 && Code() == 0x8140) // 行頭のスペース文字 { // 論理行頭のスペース文字を改行へ変換 Del(); // 削除 Ret(); } else if(Code() == 0x8173) // 《 { // ルビ変換 Del(); // 《 を削除 for(cnt = 0; Code() != 0x8174 && Tcode() > 1; cnt++) // 》 Right(); if(Tcode() < 2) // NG continue; Del(); // 》を削除 for(i = 0; i < cnt; i++) // ルビを削除 Bs(); Left(); cnt2 = 0; tolf = 0; while(Tcode() == 5 && !(Code() >= 0x829f && Code() <= 0x82f1) // かな && !(Code() >= 0x8340 && Code() <= 0x8396)) // カタカナ { Del(); cnt2++; tolf = 0; if(Cecp() == 0) break; tolf = 1; Left(); } if(tolf) { // 疲労|困憊《こんぱい》→疲労\mrubi{困憊==こんぱい} if(Code() == 0x8162) // |なら削除 { // 区切り付きルビ変換(|をとる) Select(2); Right(); Delete(); } else Right(); } PutStr("\\mrubi{"); for(i = 0; i < cnt2; i++) // 本文を復活 { PopChr(); Right(); } PutStr("==}"); Left(); for(i = 0; i < cnt; i++) // ルビを復活 PopChr(); } else if(Code() == 0x81a6) // ※ { // ※[#「※」は「白へん+樂」、24-15]《てきれき》 // →\PMO{}「白へん+樂」 Right(); if(Code() == 0x816d) // [ { Right(); if(Code() == 0x8194) // # { Right(); if(Code() == 0x8175) // 「 { Del(); while(Code() != 0x8175 && Tcode() > 1) // 「 Del(); if(Tcode() < 2) // NG continue; while(Code() != 0x81a6 && Tcode() > 1) // ※ Left(); if(Tcode() < 2) // NG continue; while(Code() != 0x8175 && Tcode() > 1) // 「 Del(); if(Tcode() < 2) // NG continue; PutStr("\\PMO{}"); while(Code() != 0x8174 && Tcode() > 1) // 》 Right(); if(Tcode() < 2) // NG continue; while(Code() != 0x8176 && Tcode() > 1) // 」 { Del(); Left(); } } } } } else if(Code() == 0x816d) // [ { // 傍点変換 Right(); if(Code() == 0x8194) // # { // はじめ[#「はじめ」に傍点]→\bou{はじめ} cnt0 = cnt2 = -1; for(cnt = 0; Code() != 0x816e && Tcode() > 1; cnt++) { // ]まで Right(); if(Code() == 0x8175) //「 cnt2 = 0; else if(Code() == 0x8176) // 」 cnt0 = cnt2; if(cnt2 >= 0) cnt2++; } if(Tcode() < 2) // NG continue; Left(); // ]の1文字前の 点 をチェック if(cnt0 != -1 && cnt2 != -1 && Code() == 0x935f) // 点 { Right(); Right(); for(i = 0; i < cnt + 2; i++) // 本文を復活 Bs(); PutStr("}"); for(i = 0; i < cnt0; i++) // 本文を復活 Left(); PutStr("\\bou{"); } } } else if(Code() == 0x815e) // / { // 踊り字変換 Right(); if(Code() == 0x815f) // \ { // かん/\ →かん\ajKunoji Left(); Del(); Del(); Left(); Left(); p = Strchr(gtbl, Code()); Right(); Right(); if(p) // 涙がぼろ →ぼろ\ajDKunoji 【濁音】 { p2 = Strchr(gtbl, 0x8370); // パ if(p >= p2) PutStr("\\ajDKunoji "); // 涙がぽろ/\ →ぽろ\ajDKunoji 【鼻音】 else PutStr("\\ajDKunoji "); } else PutStr("\\ajKunoji "); } else if(Code() == 0x818d) // ″ { Right(); if(Code() == 0x815f) // \ { // ザク/″\ →ザク\ajDKunoji ところ/″\ →ところ\ajDKunoji Right(); Bs(); Bs(); Bs(); PutStr("\\ajDKunoji "); } } } } Top(); DispOn(); }
この書き込みへの返事: