2004-08-07

「チュートリアル」にリンクをお願いしてみたけど、3週間たっても返事がないや。あはは。

英数・日本語間スペース調整

いわゆる半角英数字と全角日本語文字との間に、スペースを入れたいと思うこともあるわけです。普段は面倒だからしないけど、たとえば「マクロ入門」のページではそのようになっています。標準の機能として、[英数字と全角文字との間に空白を開ける] というのがあるのですが([編集]-[変換])、これはちょっと挙動が単純すぎるのであまり使えません。そこで以下のようなマクロを使っています。

//## 英数・日本語間スペース調整
static void spacingonMain(TX *text)
{
    // 英数・日本語間にスペースを開ける(メイン処理ルーチン)
    txJumpFileTop(text);
    TXCHAR ccur, cprev;
    // これら文字の前にスペースは入れない(¥x1f, ¥x1eはTMLタグ)
    mchar szIgnoreEnd[] = "¥x1f¥x1e¥x0d ¥t¥"'‾/)]}<>|,.:;+-*@?!¥¥()「」『』【】[]〔〕《》@$!?・、。,.<> …◇◆□■●○◎☆★※§〜―−‐";
    // これら文字の後にスペースは入れない(¥x1f, ¥x1eはTMLタグ)
    mchar szIgnoreTop[] = "¥x1f¥x1e¥x0d ¥t¥"'‾/([{<>|:;+-*@¥¥()「」『』【】[]〔〕《》@$!?・、。,.<> …◇◆□■●○◎☆★※§〜―−‐";
    while (txRight(text)) {   // ファイル先頭にはスペースを入ることはないからこれでよい
        if (!txIsCurParaTop(text) && !txIsCurReturn(text)) {
            ccur = txGetChar(text);
            cprev = txGetPrevChar(text);
            if ((txchIsKanji(cprev) && !txchIsKanji(ccur)) || (!txchIsKanji(cprev) && txchIsKanji(ccur))) {
                if (!strichr(szIgnoreEnd, ccur) && !strichr(szIgnoreTop, cprev)) {
                    // 無視する文字に一致するものがない
                    txInsert(text, " ");
                }
            }
        }
    }
}

void spacingon(TX *text)
{
    txSetBusy(text);
    txSetUndispEx(text);
    if (text->fClip) {
        TX *text2 = textnew();
        if (text2) {
            txInsertTextSelect(text2, text);
            spacingonMain(text2);
            txSelectDelete(text);
            txInsertText(text, text2);
            textclose(text2);
        }
    } else {
        spacingonMain(text);
    }
    txSetDispEx(text);
    txSetUnbusy(text);
}

void spacing(TX *text)
{
    HDIALOG hd = dialog("英数・日本語間スペース調整");
    dialogCaption(hd, "英数・日本語間にスペースを挿入します。");
    if (dialogOpen(hd)) {
        spacingon(text);
        information("変換が終了しました。");
    }
}

spacing関数を実行して使います。

もう何年も前に書いたやつなので、よく見ると幼稚なところもあるかもしれませんが、とりあえず動いているのでそのまま使い続けています。