主にInDesignによる新聞組版Tips中心です。Mac使いですが業務はWin多め。Win DTP Tipsを増やしたい

【Illustrator】【スクリプト】【Windows】保存バージョン・保存オプションその他を調べる、一覧をテキストに書き出す

* (2026.1.26)「ファイルプレビュー用に許可されたフォントを埋め込む」保存オプションは、ESTK(Illustrator JavaScript)に非対応です
* (2026.1.23)起動Illustratorバージョンをv28→v29(2025)に修正しました


Geminiさんに書いてもらいました、vbsドロップレットです。嗚呼、堕落の始まり(今さら)

この辺を一気に調べて、メッセージウインドウ or テキスト形式でデスクトップに保存します。

ドキュメント1枚(単)版の場合、まずメッセージで表示してからテキスト保存します


v29.3から搭載された「ファイルプレビュー用に許可されたフォントを埋め込む」についてはAdobe JavaScript(Extend Script)に関数非搭載な可能性が高いため、Illustratorの作成バージョンを記載するぐらいしかないとGeminiさんは言っております。


  • Windows 10,11(vbs)ドロップレット形式
  • メモ帳にペーストし、「エンコードANSI」で.txt保存→ 拡張子を.vbsに変更して下さい
  • Illustrator aiIllustrator EPS対応
  • Illustratorインストール必須(cc以前は動作保障できません)
  • Illustratorが起動・ドキュメントを開きます ※最後の「テキスト書き出し」後まで閉じないで下さい
  • ESTKで調べた後、vbsに引き渡しています
  • 記述内は「Illustrator v.29」で開く指定をしていますが、場合によって上位バージョンで開いたりもします(原因不明)
  • あまりにも古い保存バージョンの場合、動作を保障しません

AppleScript版も書かせてみたいのですが(書けるのか?GeminiMac版CS6以上のチェック環境を持たないので、もし次回アップできたら、お暇な方は動作チェックヨロシコです。

Illustrator不要版も作れますが、ロクな情報を引き出せず役に立たないのでボツにしました。


目次

* CheckAiOptions_単
※ドキュメント1枚版(最初にメッセージとして表示)

* CheckAiOptions_複
複数ドキュメント対応(メッセージなし)


CheckAiOptions_単

Option Explicit

Dim objArgs, i, appRef, fso, shell
Set objArgs = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")

' 1. ファイルチェック
If objArgs.Count = 0 Then
    MsgBox "Illustratorファイルをドロップしてください。", vbExclamation, "使い方"
    WScript.Quit
End If

' 2. Illustratorの取得
On Error Resume Next
Set appRef = GetObject(, "Illustrator.Application")
If Err.Number <> 0 Then
    Err.Clear
    Set appRef = CreateObject("Illustrator.Application.29") ' 2025
End If
If Err.Number <> 0 Then
    Err.Clear
    Set appRef = CreateObject("Illustrator.Application")
End If
On Error GoTo 0

If appRef Is Nothing Then
    MsgBox "Illustratorを起動できませんでした。", vbCritical
    WScript.Quit
End If

' ★警告を一時的に抑制(JavaScript経由で確実に実行)
appRef.DoJavaScript "app.userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS;"

' 3. ファイル処理
For i = 0 To objArgs.Count - 1
    ProcessFile objArgs(i)
Next

' ★警告設定を元に戻す
appRef.DoJavaScript "app.userInteractionLevel = UserInteractionLevel.DISPLAYALERTS;"

Sub ProcessFile(filePath)
    Dim docRef, msg, jsCode, detailedInfo, btnSelect, desktopPath, logFile, ts
    
    ' ファイルを開く
    On Error Resume Next
    Set docRef = appRef.Open(filePath)
    If Err.Number <> 0 Then
        MsgBox "ファイルを開けませんでした: " & filePath, vbCritical
        Exit Sub
    End If
    On Error GoTo 0
    
    ' 4. JavaScriptを注入して情報を取得
    jsCode = "function analyzeDoc(){" & _
             "  var d = app.activeDocument;" & _
             "  var o = new IllustratorSaveOptions();" & _
             "  var info = [];" & _
             "  var getProp = function(p){ try{ return p(); }catch(e){ return '取得失敗'; } };" & _
             "  /* バージョン情報の取得 */" & _
             "  var getCreator = function(){" & _
             "    try {" & _
             "      var xmp = d.XMPString;" & _
             "      var reg = /<xmp:CreatorTool>(.*?)<\/xmp:CreatorTool>/;" & _
             "      var match = xmp.match(reg);" & _
             "      return match ? match[1].replace('Adobe Illustrator ', '') : '不明';" & _
             "    } catch(e) { return '不明'; }" & _
             "  };" & _
             "  var getCompat = function(){" & _
             "    try { return o.compatibility.toString().replace('Compatibility.ILLUSTRATOR', 'AI '); } catch(e) { return '不明'; }" & _
             "  };" & _
             "  /* 情報の蓄積 */" & _
             "  info.push('作成バージョン: ' + getCreator());" & _
             "  info.push('保存形式形式: ' + getCompat());" & _
             "  info.push('カラーモード: ' + getProp(function(){ return (d.documentColorSpace == DocumentColorSpace.CMYK) ? 'CMYK' : 'RGB'; }));" & _
             "  info.push('ラスタライズ効果: ' + getProp(function(){ return d.rasterEffectSettings.resolution + ' ppi'; }));" & _
             "  info.push('配置・埋込画像数: ' + getProp(function(){ return d.placedItems.length + d.rasterItems.length; }) + ' 個');" & _
             "  info.push('--------------------------------');" & _
             "  info.push('■保存設定');" & _
             "  info.push('PDF互換ファイル作成: ' + getProp(function(){ return o.pdfCompatible ? 'ON' : 'OFF'; }));" & _
             "  info.push('圧縮を使用: ' + getProp(function(){ return o.compressed ? 'ON' : 'OFF'; }));" & _
             "  info.push('ICCプロファイルを埋め込み: ' + getProp(function(){ return o.embedICCProfile ? 'ON' : 'OFF'; }));" & _
             "  info.push('配置した画像を含む: ' + getProp(function(){ return o.embedLinkedFiles ? 'ON' : 'OFF'; }));" & _
             "  info.push('フォントサブセット: ' + getProp(function(){ return o.fontSubsetThreshold + '%'; }));" & _
             "  var eFonts = ('embedFonts' in o) ? (o.embedFonts ? 'ON' : 'OFF') : 'このスクリプトは非対応です';" & _
             "  info.push('ファイルプレビュー用フォントの埋込: ' + eFonts);" & _
             "  return info.join('\n');" & _
             "}" & _
             "analyzeDoc();"

    detailedInfo = appRef.DoJavaScript(jsCode)

    ' 5. メッセージの組み立て
    msg = "【AIファイル内部解析結果】" & vbCrLf & _
          "ファイル名: " & docRef.Name & vbCrLf & _
          "--------------------------------" & vbCrLf & _
          detailedInfo & vbCrLf & vbCrLf & _
          "この結果をテキストファイルとしてデスクトップに保存しますか?"

    ' 6. Confirm (はい/いいえ) の表示
    btnSelect = MsgBox(msg, 4 + 32 + 256, "解析完了 - v29.3対応")
    
    ' 「はい」が押された場合のみ保存処理
    If btnSelect = 6 Then
        desktopPath = shell.SpecialFolders("Desktop")
        logFile = desktopPath & "\Illustrator解析結果.txt"
        
        Set ts = fso.OpenTextFile(logFile, 8, True)
        ts.WriteLine "================================"
        ts.WriteLine "解析日時: " & Now
        ts.WriteLine "ファイルパス: " & filePath
        ts.WriteLine "--------------------------------"
        ts.WriteLine detailedInfo
        ts.WriteLine "================================" & vbCrLf
        ts.Close
        
        shell.Run "notepad.exe " & logFile
    End If
    
    ' 保存せずに閉じる
    docRef.Close 2 
End Sub

CheckAiOptions_複

Option Explicit

Dim objArgs, i, appRef, fso, shell, logContent
Set objArgs = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")

If objArgs.Count = 0 Then
    MsgBox "Illustratorファイルをドロップしてください。", vbExclamation, "使い方"
    WScript.Quit
End If

' Illustrator取得
On Error Resume Next
Set appRef = GetObject(, "Illustrator.Application")
If Err.Number <> 0 Then
    Err.Clear
    Set appRef = CreateObject("Illustrator.Application.29")
End If
If Err.Number <> 0 Then
    Err.Clear
    Set appRef = CreateObject("Illustrator.Application")
End If
On Error GoTo 0

' 警告抑制
appRef.DoJavaScript "app.userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS;"

' ヘッダー設定(「作成Ver」と「保存形式Ver」を分離)
logContent = "解析日時" & vbTab & "ファイル名" & vbTab & "作成Ver" & vbTab & "保存形式Ver" & vbTab & "カラーモード" & vbTab & "ラスタライズ効果" & vbTab & "配置画像数" & vbTab & "PDF互換" & vbTab & "圧縮" & vbTab & "ICC埋込" & vbTab & "画像埋込" & vbTab & "フォントサブセット" & vbTab & "ファイルプレビュー用フォントの埋込(v29.3~)" & vbCrLf

For i = 0 To objArgs.Count - 1
    Dim path: path = objArgs(i)
    If fso.FolderExists(path) Then
        ProcessFolder path
    ElseIf fso.FileExists(path) Then
        If LCase(fso.GetExtensionName(path)) = "ai" Then
            ProcessFile path
        End If
    End If
Next

' 警告設定を戻す
appRef.DoJavaScript "app.userInteractionLevel = UserInteractionLevel.DISPLAYALERTS;"

' 結果の保存
If logContent <> "" Then
    Dim btnSelect, desktopPath, logFile, ts
    btnSelect = MsgBox("解析完了しました。保存しますか?", 4 + 32, "処理完了")
    If btnSelect = 6 Then
        desktopPath = shell.SpecialFolders("Desktop")
        logFile = desktopPath & "\Illustrator解析結果.txt"
        Set ts = fso.OpenTextFile(logFile, 2, True)
        ts.Write logContent
        ts.Close
        shell.Run "notepad.exe " & logFile
    End If
End If

Sub ProcessFolder(folderPath)
    Dim folder, file
    Set folder = fso.GetFolder(folderPath)
    For Each file In folder.Files
        If LCase(fso.GetExtensionName(file.Path)) = "ai" Then
            ProcessFile file.Path
        End If
    Next
End Sub

Sub ProcessFile(filePath)
    Dim docRef, jsCode, resultText
    
    On Error Resume Next
    Set docRef = appRef.Open(filePath)
    If Err.Number <> 0 Then Exit Sub
    On Error GoTo 0
    
    ' JavaScriptで詳細解析
    jsCode = "function analyze(){" & _
             "  var d = app.activeDocument;" & _
             "  var o = new IllustratorSaveOptions();" & _
             "  var info = [];" & _
             "  var getProp = function(p){ try{ return p(); }catch(e){ return '取得失敗'; } };" & _
             "  /* 1. 作成バージョン (CreatorTool) */" & _
             "  var getCreator = function(){" & _
             "    try {" & _
             "      var xmp = d.XMPString;" & _
             "      var reg = /<xmp:CreatorTool>(.*?)<\/xmp:CreatorTool>/;" & _
             "      var match = xmp.match(reg);" & _
             "      return match ? match[1].replace('Adobe Illustrator ', '') : '不明';" & _
             "    } catch(e) { return '取得エラー'; }" & _
             "  };" & _
             "  /* 2. 保存形式バージョン (Compatibility) */" & _
             "  var getCompat = function(){" & _
             "    try {" & _
             "      return o.compatibility.toString().replace('Compatibility.ILLUSTRATOR', 'AI ');" & _
             "    } catch(e) { return '不明'; }" & _
             "  };" & _
             "  info.push(getCreator());" & _
             "  info.push(getCompat());" & _
             "  info.push(getProp(function(){ return (d.documentColorSpace == DocumentColorSpace.CMYK) ? 'CMYK' : 'RGB'; }));" & _
             "  info.push(getProp(function(){ return d.rasterEffectSettings.resolution + ' ppi'; }));" & _
             "  info.push(getProp(function(){ return d.placedItems.length + d.rasterItems.length; }));" & _
             "  info.push(getProp(function(){ return o.pdfCompatible ? 'ON' : 'OFF'; }));" & _
             "  info.push(getProp(function(){ return o.compressed ? 'ON' : 'OFF'; }));" & _
             "  info.push(getProp(function(){ return o.embedICCProfile ? 'ON' : 'OFF'; }));" & _
             "  info.push(getProp(function(){ return o.embedLinkedFiles ? 'ON' : 'OFF'; }));" & _
             "  info.push(getProp(function(){ return o.fontSubsetThreshold + '%'; }));" & _
             "  var eFonts = ('embedFonts' in o) ? (o.embedFonts ? 'ON' : 'OFF') : 'このスクリプトは非対応です';" & _
             "  info.push(eFonts);" & _
             "  return info.join('\t');" & _
             "}" & _
             "analyze();"

    resultText = appRef.DoJavaScript(jsCode)
    logContent = logContent & Now & vbTab & fso.GetFileName(filePath) & vbTab & resultText & vbCrLf
    
    docRef.Close 2 
End Sub

テキスト保存結果

テキスト書き出し後、Illustratorドキュメントは自動で閉じます。

環境にないフォントのプレビュー、追加、または置換 helpx.adobe.com

【備忘録】【WIndows】Direct Folder version別挙動

Problem 3.8 4.0 4.1 4.1.2 4.2 4.3.4 4.3.5
Alternative path
(shift+click)
× ×
Desktop dispatches bad bad bad bad bad good good
OS起動前の
Recent記憶
× × × × ×
Quick Operattion ×
"Favorite"
Response
good good good good good good bad
〈New!〉
snippet
"Pro only"
× × × × ×
etc

現在の感触では、v4.3.4が一番安定(Win 11 24H2)

【1bit TIFF】【Windows】IrfanView(画像ビューワ)

「いるふぁん・びゅーわ」と読みます。1990年代からWindowsユーザーに愛される、古典画像編集ビューワです。

Adobe Bridgeがあるから、特に用はないか」と、今までコイツを見くびっていました… なんと、

1bit TIFFが見れるじゃないか!!!!

1bit TIFFとは

www.ddc.co.jp

デザイナーさんや制作会社の方にはまっっったく関係のないお話かもしれませんが。

某Bitとか、高額ツール買わないと見れないと思ってたんだよぅぅ Photoshopピクセル上限を超えるため不可


中小印刷会社に勤めていると、入稿データの整理から組版・面付け・下版チェック・最終RIP出力(1bit TIFF)までの多能工化を要求されます。

私は基本凡ミスが非常に多い人間でして、人の3倍5倍チェックをしないと普通並みに仕事ができません。チェックツールとかスクリプトとか使っている理由の半分は、そのせいです。

注意したらできる、というのは、基本の脳構造がしっかりしてる人間の台詞。注意してもできないから困っとるんじゃ!!

しかしRIP出力以降の1bit TIFFだけは今まで確認のしようがなく、運任せ!という感じで、いつまでも凡ミスを繰り返していました。

EQUIOSはRIPと同時に確認用の軽量PDFを作ることができますが、下版1bit TIFFとは所詮別データなわけですよ。PDFにはついてないアクセサリ等がアッチにはついてたとか、確認用PDF見ても無駄です。

確認する術がないから防げなくね? と思ってたんですが、できるんじゃないですかぁぁぁ

IrfanViewで閲覧・拡大表示した、Y版の網点
同僚たち曰く「うん、大昔から知ってた」「当然知ってると思ってたから言わなかった」

………教えろよ!!! 八つ当たり


というわけで、以前「私が手放せないツール」シリーズで「あまり使っていないものたち」に分類してしまったこの方を、昇格させることにします!ぱんぱかぱーーーん chocomarine.hatenablog.com ※これから直します

公式(E) www.irfanview.com 窓の杜 forest.watch.impress.co.jp 日本語化モジュール www.irfanview.net 使い方など(so-zou.jp) so-zou.jp IrfanViewを使いこなそう! www.wanichan.com


他に、こういうツールってありますかね?

ニッチ過ぎるのか、探しても見つからないんですよ。

【InDesign】【スクリプト】続:配置後のテキストの整形

(2025.10.9)記述の拙いところを直しました
(2025.10.5)検索置換「約物前後の不要なスペースを削除」の検索対象から、半角カンマドットを除外しました(英文中にある為)
(2025.10.3 11:40)セコく、細かいところをちょこちょこ直しています(警告メッセージの挿入とか、検索置換正規表現の細かいミスなど)


こちらの続きと言いますか、補足と言いますか。

私は「和文仕事たるもの、まず何もかも全角に!とにかく和文大前提の行程!」と、最初に全て全角変換してからスタートさせるのですが、横組み和文界隈には「英文は、入力された半角のまま」ベースがお好みとかいう話も耳にしまして。ふぅん。そういうものですか。でも私はそもそも、入稿テキストの全半角入力分けなどこれっぽっちも信用してないんですけどね? そりゃそうでしょ
では半角ベースで作りましょうかと。※欧文メインの意味ではありません

目次 * InDesign上でテキストを整形
(欧文半角スタート)横組み

* チェック項目ハイライトを消去
(上記スクリプト専用)


InDesign上でテキストを整形

(欧文半角スタート)横組み ※処理範囲に「ストーリー」を選ぶ場合、必ず最初にフレーム選択状態で実行して下さい。テキスト選択状態でもボタンを押せますが、置換項目がすっ飛ぶ可能性があります。

//DESCRIPTION:英数半角ベース・英数字1桁を全角(らーど)

// エラー処理-------------------------------------
alert ("できるだけ【InDesign起動直後】に処理して下さい");
if (app.documents.length == 0) 
{alert("ドキュメントが開かれていません"); exit();}
else {
    var mySel = app.activeDocument.selection;
    if (mySel.length > 1)
    {alert ("処理は選択1つだけで実行して下さい"); exit();}
    else {
        if (mySel.length == 0)
        {alert("何も選択されていません"); exit();}
        else {
            if(! mySel[0].hasOwnProperty("texts"))
            {alert ("テキストフレームではありません"); exit();}
            else {
                if (mySel[0].contents == 0)
                {alert ("テキストが入っていません"); exit();}
                else {
                    
app.doScript (mainA, ScriptLanguage.JAVASCRIPT, null, UndoModes.FAST_ENTIRE_SCRIPT);

// 処理--------------------------------------------------------------------------------
function mainA()
{
    // ダイアログの作成
    var myDialog = app.dialogs.add({name: "処理範囲を指定"});
    var myObject;
    with (myDialog.dialogColumns.add())
    {with (dialogRows.add())
        {with (dialogColumns.add())
            {staticTexts.add({staticLabel: "検索範囲:"});
                }
            var myRangeButtons = radiobuttonGroups.add();
            with (myRangeButtons)
            {radiobuttonControls.add({staticLabel: "選択範囲", checkedState: true});
                radiobuttonControls.add({staticLabel: "ストーリー"});
                //radiobuttonControls.add({staticLabel: "ドキュメント"});
                }
            }
        }
    var myResult = myDialog.show();
    
    if (myResult == true)
    {switch (myRangeButtons.selectedButton)
        {
            case 0:
            myObject = app.selection[0];
            break;
            case 1:
            myObject = app.selection[0].parentStory;
            break;
            case 2:
            myObject = app.documents.item(0);
            break;}
        performReplacement(myObject);
        } else
    { alert ("中断します\r\r次のメッセージで「No」を選んで、終了して下さい"); exit(); }
    }

function performReplacement(scope)
{
    // (文字種変換)半角カタカナ→全角カタカナ
    app.findTransliteratePreferences.findCharacterType = FindChangeTransliterateCharacterTypes.HALF_WIDTH_KATAKANA;
    app.changeTransliteratePreferences.changeCharacterType = FindChangeTransliterateCharacterTypes.FULL_WIDTH_KATAKANA;
    app.selection[0].parentStory.changeTransliterate();
    
    // (文字種変換)全角英数字→半角英数字
    // 半角と全角を逆転させたい場合、末尾10桁の数字を入れ替えて下さい
    app.findTransliteratePreferences.findCharacterType = 1179023186;
    app.changeTransliteratePreferences.changeCharacterType = 1179154258;
    app.selection[0].parentStory.changeTransliterate();
    /* memo
       findCharacterType = FindChangeTransliterateCharacterTypes.HALF_WIDTH_KATAKANA;
       HALF_WIDTH_KATAKANA; // 1179154251
       FULL_WIDTH_KATAKANA; // 1179023179
       FULL_WIDTH_HIRAGANA; 1179023176
       HALF_WIDTH_ROMAN_SYMBOLS; 1179154258
       FULL_WIDTH_ROMAN_SYMBOLS; 1179023186
       others,
       WESTERN_ARABIC_DIGITS, ARABIC_INDIC_DIGITS, FARSI_DIGITS
       memo ------------------------------------------------------------------------ */
    
    // 検索設定をクリア
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    // 検索置換処理(後読み可)
    var myTextReplacements =
    [
    { find: "[\u00a0]", change: "[\u0020]" }, // ノンブレークスペース→半角スペース
    { find: "\u000C", change: "\\r" }, // 改ページ→改行
    { find: "\u2028", change: "" }, // 不正な行分割→削除
    { find: "[\u223C\u223E\u3030\uFF5E]", change: "\u301C" }, // 不正な波ダッシュを統一
    { find: "ー", change: "ー" }, // 半角音引き→全角
    { find: "。", change: "。" }, // 半角句点→全角
    { find: "、", change: "、" }, // 半角読点→全角
    //{ find: "(?<=[0-90-9]),(?=[0-90-9])", change: "," }, // 前後数字のカンマ→半角
    //{ find: "(?<=[0-90-9]).(?=[0-90-9])", change: "\." }, // 前後数字のドット→半角
    { find: "[\u00B7\u2022\u2219\u22C5\uFF65]", change: "・" }, // 不正な中黒を統一
    { find: "[「﹁]", change: "「" }, // 半角及び、縦組み用括弧類
    { find: "[」﹂]", change: "」" }, // 同
    { find: "[\\(︵]", change: "(" }, // 同
    { find: "[\\)︶]", change: ")" }, // 同
    { find: "[\\{︷]", change: "{" }, // 同
    { find: "[}︸]", change: "}" }, // 同
    { find: "\\[", change: "[" }, // 同
    { find: "]", change: "]" }, // 単体で閉じだけ入ってるとリテラル扱い?
    { find: "︹", change: "〔" }, // 縦組み用括弧類
    { find: "︺", change: "〕" }, // 同
    { find: "︻", change: "【" }, // 同
    { find: "︼", change: "】" }, // 同
    { find: "[︽]", change: "《" }, // 同
    { find: "[︾]", change: "》" }, // 同
    { find: "[\uFF1C<︿]", change: "〈" }, // 縦組み及び不当記号を山カッコへ(起こし)
    { find: "[\uFF1E>﹀]", change: "〉" }, // 同(閉じ)
    { find: "﹃", change: "『" }, // 縦組み用括弧類
    { find: "﹄", change: "』" }, // 同
    { find: "︗", change: "〓" }, // 同
    { find: "︘", change: "〓" }, // 同
    { find: "[︐]", change: "," }, // 縦組み用カンマ
    { find: "︑", change: "、" }, // 縦組み用読点
    { find: "︒", change: "。" }, // 縦組み用句点
    { find: "[\u000B\u0001-\u0007]", change: "" }, // 不正なハイフン類を削除
    //{ find: "▶", change: "▼" }, // ▶を縦組み用に下向きへ
    { find: "[\u301d\uff02]", change: "\u201c" }, // ののカギ(起こし)
    { find: "[\u301f\u201e]", change: "\u201d" }, // 同上(閉じ)
    { find: "(?<!\\.)\\.{3}(?!\\.)", change: "…" }, //ピリオド3つ→三点リーダー
    { find: "(?<!\\.)\\.{2}(?!\\.)", change: "‥" }, //ピリオド2つ→二点リーダー
    //{ find: "(?<=[0-90-9])\\.(?=[0-90-9])", change: "・" }, // 数字の小数点ドット→中黒
    //{ find: " ", change: " " }, // 半角スペース→全角
    { find: "(?<!\\r)[\u0020\u3000\t]+(?=\\r)", change: "" }, // 行末スペース類を削除
    { find: "\\s+\\Z", change: "" }, // 文末のスペースタブ類を削除
    { find: "\\A\\s+",  change: "" }, // 文頭のスペースタブ類を削除
    { find: "\\r+\\Z", change: "" }, // story末の改行を削除
    { find: "[\u3000\u0020](?=[,.,・.、。「」『』【】《》〝〟“”〔〕{}〈〉[]()@])", change: "" }, // 約物前後の不要なスペースを削除
    { find: "(?<=[・,.,.、。「」『』【】《》〝〟“”〔〕{}〈〉[]()])[\u3000\u0020@]+", change: "" }, // 約物前後の不要なスペースを削除
    { find: "(^「)", change: "\u3000$1" }, // 行頭に起こしカギ括弧ある場合、スペース1w下げ
    { find: "^[\u0020\u3000]+?", change: "\u3000" }, // 行頭の半角スペース(複数)→全角スペース
    { find: "(?<![!-\~«»‹›]);(?![!-\~«»‹›]+)", change: ";" }, // 和文中のセミコロンを全角
    { find: "(?<![!-\~«»‹›]):(?![!-\~«»‹›]+)", change: ":" }, // 和文中のコロンを全角
    ];
    
    // Grep置換
    for (var i = 0; i < myTextReplacements.length; i++)
    {
        var myPair = myTextReplacements[i];
        app.findGrepPreferences.findWhat = myPair.find;
        app.changeGrepPreferences.changeTo = myPair.change;
        scope.changeGrep();
        }
    
    // 半角1桁数字→全角数字-------------------------------------------
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    
    app.findGrepPreferences.findWhat = "(?<![\\.,0-9])[0-9](?![\\.,0-9])|";
    var foundItems = scope.findGrep();
    if (foundItems.length > 0)
    {
        app.scriptPreferences.enableRedraw = false;
        // 高速化のため、描画を一時停止
        
        // テキストが変更されてもインデックスがズレないよう、逆順ループ
        for (var j = foundItems.length - 1; j >= 0; j--)
        {
            var foundText = foundItems[j];
            var startIndex = foundText.index;
            var endIndex = foundText.index + foundText.length;
            var storyContent = scope.contents;
            
            // 前の文字・後ろの文字のチェック
            var charBefore = startIndex > 0 ? storyContent.substring(startIndex - 1, startIndex) : '';
            var charAfter = endIndex < storyContent.length ? storyContent.substring(endIndex, endIndex + 1) : '';
            // 前の文字が全角数字ではない AND 後ろの文字が全角数字ではない または、行の先頭/末尾であること
            var isPrecedingNonFullWidthNumeric = (startIndex === 0 || !isFullWidthNumeric(charBefore));
            var isFollowingNonFullWidthNumeric = (endIndex === storyContent.length || !isFullWidthNumeric(charAfter));
            if (isPrecedingNonFullWidthNumeric && isFollowingNonFullWidthNumeric)
            {
                var originalText = foundText.contents;
                var halfWidthText = convertFullWidthToHalfWidth(originalText);
                foundText.contents = halfWidthText;
                }
            }
        
        app.scriptPreferences.enableRedraw = true;
        // 描画を再開
        // 検索設定をクリア
        app.findGrepPreferences = NothingEnum.nothing;
        app.changeGrepPreferences = NothingEnum.nothing;
        }
    
    function convertFullWidthToHalfWidth(str) // 実行関数
    // 半角数字のみを対象
    {return str.replace(/[0-9]/g, function(s)
        {return String.fromCharCode(s.charCodeAt(0) + 0xFEE0); });
        } // convertFullWidthToHalfWidth(str)の閉じ
    function isFullWidthNumeric(myChar)
    {
        if (myChar.length === 0) return false;
        var myCode = myChar.charCodeAt(0);
        return (myCode >= 0x0030 && myCode <= 0x0039);
        }
    }
}

var myConfirm = confirm ("YES=継続(チェック用ハイライトへ進む)\rNO=中断(キャンセル)\r\r背景カラーやレイヤーカラーによっては、視認しづらい場合があります");
if (! myConfirm)
{alert("処理を中断しました"); exit();}
else{
    var myDoc = app.activeDocument;
    var mySel = myDoc.selection;
    var myTextPrefs = myDoc.textPreferences; // 環境設定→ 組版→ ハイライト表示オプション
    myTextPrefs.highlightSubstitutedFonts = true;//代替フォント= ON
    myTextPrefs.highlightSubstitutedGlyphs = false; // 代替字形OFF(このスクリプトで条件テキストに記す=トーフ)
    myTextPrefs.highlightKinsoku = false; // 組版→禁則OFF
    myTextPrefs.highlightCustomSpacing = false; // 組版→カスタマイズされた〜OFF
    myTextPrefs.highlightHjViolations = false; // 組版→H&J違反OFF
    myTextPrefs.highlightKeeps = false; // 組版→H&J違反保持OFF
    
    if (myDoc.conditions.item("スペース類")!=null)
    myDoc.conditions.item("スペース類").remove();
    myDoc.conditions.add ({ name: "スペース類", indicatorColor: [255,0,0], indicatorMethod: ConditionIndicatorMethod.useHighlight }); // 赤
    if (myDoc.conditions.item("要チェック")!=null) 
    myDoc.conditions.item("要チェック").remove();
    myDoc.conditions.add ({ name: "要チェック", indicatorColor: [120,255,100], indicatorMethod: ConditionIndicatorMethod.useHighlight }); // うす緑
    if (myDoc.conditions.item("行頭の1w")!=null) 
    myDoc.conditions.item("行頭の1w").remove();
    myDoc.conditions.add ({ name: "行頭の1w", indicatorColor: [250,180,0], indicatorMethod: ConditionIndicatorMethod.useHighlight }); // オレンジ
    if (myDoc.conditions.item("数字1桁")!=null) 
    myDoc.conditions.item("数字1桁").remove();
    myDoc.conditions.add ({ name: "数字1桁", indicatorColor: [150,215,245], indicatorMethod: ConditionIndicatorMethod.useHighlight }); // 水色
    /* memo
       [255,0.0] レッド
       [250,180,0] オレンジ
       [120,255,100] うす緑
       [250,0,220] どピンク(レッドと区別しにくい)
       [255,200,240] 淡ピンク
       [150,215,245] 水色
       [185,230,250] 更に淡い水色
       [190,190,250] 淡い紫
       */
    var myTextReplacements = 
    [
    {find: "[\u0020\u108A\u180E\u2000-\u2009\u200A\u200B\u202F\u205F\u3000\t]", change: "スペース類"},
    // \u00A(No-Break Space)は入れないように
    /*  memo
       ゛゜(濁点半濁点)≪≫«»<>\u2E83-\u2FDF(CJK部首補助)ー〓?!.,
       \u02D7(修飾マイナス半角)\u2010-\u2015\u201C\u201D(ダブルクォート)\u2043(ハイフン型ビュレット)\u2212(マイナス)
       \u23AF\u23E4\u2500-\u2501\u2574\u2576\u2578\u257A\u257C\u257E\u268A(マイナス類色々)
       \u2E3A\u2E3B\u29FF\u2796\u4E28\uFE31\uFE32\uFE58\uFE63\uFF0D\uFF70\u05BE(マイナス類色々)
       \u201C\u201D\u301D-\u301F(ノノかぎ類)〝〞〟
       */
    {find: "[!-\~«»‹›<>゛゜\u2E83-\u2FDFー\u02D7\u2010-\u2015\u2043\u2212\uFE31\uFF0D\u23AF\u23E4\u2500-\u2501\u2574\u2576\u2578\u257A\u257C\u257E\u268A\u2E3A\u2E3B\u29FF\u2796\u4E28\uFE31\uFE32\uFE58\uFE63\uFF0D\uFF70\u05BE〓\u201C\u201D\u301D-\u301F]", change: "要チェック"},
    {find: "^[^\u3000\u0020]", change: "行頭の1w"},
    {find: "(?<![.,0-90-9])[0-90-9](?![.,0-90-9])", change: "数字1桁"}, // 半角1桁は「要チェック」に入れた
    ];
    for (var k = 0; k < myTextReplacements.length; k++)
    {
        app.findGrepPreferences =null; // Grep検索・初期化
        app.changeGrepPreferences = null; // Grep置換・初期化
        var myPair = myTextReplacements[k];
        var myStory = mySel[0].parentStory;
        app.findGrepPreferences.findWhat = myPair.find;
        app.changeGrepPreferences.appliedConditions = [myPair.change];
        myStory.changeGrep();
        }
    // スクリーンモード:標準
    myDoc.layoutWindows[0].screenMode = ScreenModeOptions.previewOff;
    // 条件テキストインジケーター「表示」
    myDoc.conditionalTextPreferences.showConditionIndicators = ConditionIndicatorMode.SHOW_INDICATORS;
    // 検索設定をクリア
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    
    alert ("スクリーンモード〈標準〉にしました\rハイライト箇所を確認・修正して下さい(2025.10.9 らーで閣下)");
    }
}
}
}
}

doScriptが入っていますが、機能していません()そのうち見直します。

もし全角にしたい欧文記号がある場合、

{ find: "(?<![!-\~«»‹›]):(?![!-\~«»‹›]+)", change: ":" },

の行を複製し、:(半角)(全角)の箇所を書き換えて下さい。この行は、全角にしたい記号の数だけ作る必要があります。いや纏めて指定もできるんだけど、取り敢えず作ったり検証したりが面倒で←

これがあるから私は半角ベースを嫌っているのですが、どちらがベターかは欧文の量次第。しばらく運用すると、自分の業務にどちらが効率良いか分かってくるだろうと。

私がひと言いたいのは、

「ハイライトのかかった文字、ちゃんとよく見てね!」

チェック重要。ということで、チェック後に鬱陶しい()ハイライトを消すスクリプトで、今回は〆。

チェックを甘く見た者は、チェックに泣く。


チェック項目ハイライトを消去

※上記スクリプト専用

//DESCRIPTION:欧文中心向けチェック項目を削除(らーど)
// 2025.10.2

if (app.documents.length == 0)
{ alert ("ドキュメントが開かれていません");
    exit(); }
else {
    var myDoc = app.activeDocument; 
    var mySel = myDoc.selection;
    app.doScript (mainA, ScriptLanguage.JAVASCRIPT, null, UndoModes.FAST_ENTIRE_SCRIPT);
    
    // 処理--------------------------------------------------------------------------------
    function mainA()
    {
        if (myDoc.conditions.item("スペース類")!=null)
        myDoc.conditions.item("スペース類").remove();
        if (myDoc.conditions.item("要チェック")!=null) 
        myDoc.conditions.item("要チェック").remove();
        if (myDoc.conditions.item("行頭の1w")!=null) 
        myDoc.conditions.item("行頭の1w").remove();
        if (myDoc.conditions.item("数字1桁")!=null) 
        myDoc.conditions.item("数字1桁").remove();
        }
    }

【InDesign】【スクリプト】複数選択フレーム内のテキスト(or image)を削除

前回の流れで、自分だけでひっそり使ってたシリーズ。

これも、自分で書いて十数年常用してるやつです。即効性を重視しているので、エラーメッセージは極力省いています。

(2025.10.21 11:00)下記のエラーを修正
(2025.10.21 10:00)errorになるdoScriptの位置を修正、「メトリクス解除」はif入れて直すまでお預け
(2025.9.19 18:30)カーニングを和文等幅へ戻す、を追加
(2025.9.19 10:30)「文字スタイルなし」のエラーを修正
(2025.9.19 9:50)テキストの方に、「文字スタイルなし」追加(ついでに間違い訂正)
(2025.9.19 9:30)プロポーショナルメトリクス解除を入れ忘れてた


目次

* 複数選択フレームのテキストを削除

* 複数選択フレームのimageを消去

複数選択フレームのテキストを削除

フレームを残し、中のテキストだけを削除します。グループ非対応(再帰処理が面倒だった)←

何も選択されていないか、グループ・画像・図形等が混在していた時はエラーメッセージを出してスルーします。

//DESCRIPTION:選択されたフレームのテキストを削除(グループ非対応)(らーで閣下)
// 2015.9.4
// 2025.10.21更新
app.doScript(Main, ScriptLanguage.JAVASCRIPT, null, UndoModes.FAST_ENTIRE_SCRIPT);
function Main()
{
    var myDoc = app.activeDocument;
    var mySel = myDoc.selection;
    if (mySel == 0)
    {
        alert ("何も選択されていません");
        exit();
        } else
    {
        for (var i=0; i<mySel.length; i++)
        if (mySel[i].constructor.name != "TextFrame")
        {
            alert ("画像・図形・グループ)はスルーして、次を処理します");
            continue;
            }
        else
        {
            if (mySel[i].contents.length != 0)
            {
                mySel[i].parentStory.remove();
                mySel[i].parentStory.trailingAki = -1; // 前アキを自動
                mySel[i].parentStory.leadingAki = -1; // 後アキを自動
                mySel[i].parentStory.appliedCharacterStyle = myDoc.characterStyles[0]; // 文字スタイルを「なし」に
                mySel[i].parentStory.otfProportionalMetrics = false; // プロポーショナルメトリクス解除
                for (var j=0; j<mySel[0].texts.length; j++)
                if(mySel[i].texts[j].kerningMethod = "メトリクス" || "オプティカル")
                {
                    mySel[i].texts[j].kerningMethod = "和文等幅";
                    } else {
                        continue;
                        }
                    }
                }
            }
        
        }

ショートカットにaltdeleteを当てています。

機能エリア→スクリプト

ついでに、よくありがちな見逃しを追加。

  • 文字前・後のアキを自動に戻す
  • プロポーショナルメトリクスを解除
  • カーニングを和文等幅に戻す(?)
  • 文字スタイルを「なし」

これ、うっかり気付かず作業進めてしまうんですよね。
考えれば考えるほど「上付き・下付きも」「分割禁止」「打消し線や下線…ルビも」「ならいっそ段落スタイルオーバーライドを消去で」など欲望がどんどん膨らんでいくのですが、どうしよう(キリがない)オーバーライド消去って面倒というか、遅くなりそうだし


複数選択フレームのimageを消去

フレームを残して配置imageだけをdeleteします。グループ非対応。

何も選択されていないか、グループ・オブジェクトロックが混在していた時のみ、エラーメッセージを出したうえでスルーします。

//DESCRIPTION:選択フレームの画像を消去(らーで閣下)
// 2015.9.4
// 2025.10.21

    app.doScript (Main, ScriptLanguage.JAVASCRIPT, null, UndoModes.FAST_ENTIRE_SCRIPT);
    function Main()
{
var myDoc = app.activeDocument;
var mySel = myDoc.selection;
if (mySel.length == 0)
{
    alert ("何も選択されていません");
    exit();
    }
else
{
        for ( i=0; i<mySel.length; i++)
        if (mySel[i].constructor.name == "Group")
        {
            alert ("グループオブジェクトはスルーします");
            continue;
            }
        else if
        (mySel[i].constructor.name == "TextFrame")
        { continue; }
        else if
        (mySel[i].constructor.name == "GraphicLine")
        { continue; }
        else if
        (mySel[i].locked == true)
        { alert ("ロックオブジェクトはスルーします");
        continue; }
        else
        {
            if (mySel[i].graphics.length != null)
            {
                mySel[i].graphics[0].remove();
                }
            else 
            { continue; }
            }
        }
    }

ショートカットにShiftaltdeleteを当てています。

古代に書いたものなのでやけに回りくどく、冗長。恥ずかしい。

基本、自分が使いたいのはこういう単純で地味なものばかり(銘柄専用のパッケージ&書き出しとかも作りますが、これも地味)。自分の作業がベーシック組版で地味だからでしょうか、、

グループ対応(再帰処理)は、その気になったら書いてみます(期待できない)。

【InDesign】【スクリプト】パネル数値をデフォルトに戻す

あれです、スタイル・カラーパネル類の設定を選択 or 編集すると、踏んだまま=それを初期値とするAdobeの仕様に対応するスクリプト。これにショートカットを割り当て、何らか編集の度にダンダン!と押すわけです。

運用自体はもう十数年やっているので、この内容で特に問題はない筈。

実に単純な記述です。

//DESCRIPTION:style・color・Lineパネルの値をデフォルトに戻す(らーで閣下)

var myDoc = app.activeDocument;

// 基本段落・文字スタイルなし
myDoc.textDefaults.appliedCharacterStyle = myDoc.characterStyles[0];
myDoc.textDefaults.appliedParagraphStyle = myDoc.paragraphStyles[0];

// オブジェクトスタイルを全て「基本」(オプションメニュー)
var ItemDflts = myDoc.pageItemDefaults;
ItemDflts.appliedTextObjectStyle = myDoc.objectStyles[2]; // 基本
ItemDflts.appliedGraphicObjectStyle = myDoc.objectStyles[1]; // 基本
ItemDflts.appliedGridObjectStyle = myDoc.objectStyles[3]; // 基本

// カラーパネル
ItemDflts.strokeColor = "None";
ItemDflts.fillColor = "None";
// 線パネル
ItemDflts.strokeType = "ベタ";
ItemDflts.strokeWeight= "0mm";

意外とこれだけでこと足りる感じ。一部パネルは描画が更新されず、一見動作していないように見える(カラー、スウォッチ)かもしれませんが、パネルを一旦畳み・再表示させると更新されます。

私はショートカットにshiftctrlenterを割り当て、一日中ズダンズダン押しています。Macshiftcmdreturn

このキー、うっかりスカると悪夢のクイックアクセス(旧クイック適用)を呼び起こしてしまうので、ショートカットキー設定でアレを殺しています。昔ほど重くないので、今や然程鬱陶しくありませんが

クイックアクセス・ショートカット(ctrl+enter)
グラデーションや表セル関係はやや面倒そうで、当時の私の手には余りました。そのうち気が向いたら、頭を捻るかもしれません。


文字・段落パネルの設定も、この調子で直すことはできるんですが… あれの汎用的な初期値を決めるって、できないと思いません?

自分仕様(銘柄別)を作ることはできますが、そもそも別に必要がない(ちゃんと挙動を理解・注意している)し、そういうのは顧客に使ってもらいたい。

でも他人って、人から勧められたものを素直に使ってくれる事って少ないですよね。

【秀丸】【マクロ】組版用テキスト整形

前回InDesign用を発表したので、今度は【秀丸エディター】用です。 hide.maruo.co.jp

まあやっていることは殆ど正規表現置換だけなので、他のエディターでやる時の参考にもなるかと思います。※プログラム上の常ですが、状況によりエスケープ\が存在することに留意

こちらにも書いていますが、秀丸の試用版は期間制限なく全機能を使うことができるので、ぜひぜひこの高性能をお試しあれ。※当然と言っちゃアレですが、AIちゃんは秀丸マクロを書いてくれません。しょんぼり。

(2025.9.17.9:30)ギャーーーー、ライブラリチェックのelse閉じがひとつ抜けてました。修正済み
(2025.9.17 PM)ダーシ類の検索パターンに変な不当記号が混入していたのを削除)コピペミスっぽい


目次

* 半角全角変換ライブラリをダウンロード
※半角/全角変換 v1.02

* (ライブラリを)インストール

* テキスト整形マクロ(縦組み用)

※英数字2桁を半角

* テキスト整形マクロ(横組み用)
※英数字2桁以上を半角

* memo


半角全角変換ライブラリ

デフォルトの変換ライブラリHmFilter.hmfは、マクロ運用時にヴ\uFF73 + \uFF9Eピ\uFF8B + \uFF9Fなどの半角濁点・半濁点を、そのまま2字ずつの全角ウ゛\u30A6 + \u309Cヒ゜\u30D2 + \u309Bへと変換してしまいます。

日本語組版では、そのまま1文字として存在する\u30F4、ピ\u30D4などへ変換(置換)すべきです。通常のメニュー操作では、ちゃんと変換できるのですが…

半角字形(カタカナ・約物類)

基本ライブラリ「HmFilter」を使った、半角→全角マクロ

基底(親)文字と濁点・半濁点が分かれている状態

これを実現するライブラリを、秀丸ライブラリからダウンロード・インストールします。

半角/全角変換 v1.02(HanZenCov.hmf)


インストール

解凍した*.hmfを、Hidemaru.exeと同じ階層にコピー

選択し(無印=32bit、hmf64=64bit)

PC→ Windows(C:)→ Program Files→ Hidemaru ※64bit版

※田楽.dllの赤い囲みは無視して下さい

秀丸メニュー)動作環境→ 編集→ 変換→ 変換モジュール→ 追加 から、Program Filesに入れたHanZenConv.hmf(64)を探して登録、使用する変換機能にチェック→ OK

半角/全角変換


縦組み用

question "■InDesignたて整形■\n\n
実行しますか?(2025.9.16)";

if(result){
    begingroupundo; // アンドゥの設定

    if(version < 852)
    {message "秀丸エディタ Ver.8.52 以上を使用してください。";
    endmacro;
    }
if((platform & 0x80000)) #platform = 64;
// 全角半角変換モジュールのチェック
if(#platform == 64) //64ビット版
{
    $HanZenFilter = "HanZenConv.hmf64";
} else {
    $HanZenFilter = "HanZenConv.hmf"; //32ビット版
    }
    if(filter($HanZenFilter, "HanZenConv", "0110000", "ABC") != "ABC")
{ message "HanZenConv.hmf がロードされていません。\n\n
    公式よりダウンロードし、\n
    1)秀丸本体と同じディレィトリにコピー\n
    2)動作環境(上級者向け設定)→ 編集→ 変換→\n
    3)変換モジュール「追加」→ HanZenConv.hmfを指定\n\n
    して下さい(32・64bitを間違えないで下さい)";
endmacro;
}
// ここから処理 ////////////////////
// 半角ドット2-3連→ 三点リーダー
replaceallfast "[\\.]{2,3}", "\u2026", regular;

selectall;
    filter "HanZenConv.hmf" , "HanZenConv" , "1011101"; // カタカナ以外全て
    filter "HanZenConv.hmf" , "HanZenConv" , "1000011"; // カタカナのみ
escape;
gofiletop;
//------------------------------
if (code == 0x0d){
    delete;
    }
// UTF-16サロゲートペア文字をゲタに(まだ非対応)
//  replaceallfast "[\u010000-\u10FFFF]" , "〓\\1〓" , regular;

// 不正な\u00A0を処理
replaceallfast "\u00A0" , "\u0020" , regular;

// 不正なスペース類を全角スペース
replaceallfast "[\u200B]" , "\u3000" , regular;

// 不正なハイフン類を削除
replaceallfast "[\u000B\u0001-\u0007]" , "" , regular;

// トーフ(置き換えられた字形等)をゲタに
//replaceallfast "[\uFFFD\uFFFC]" , "〓" , regular;

// 改ページを改行に
replaceallfast "\u000C" , "\n" , regular;

// 不正な改行(行分割)を削除
replaceallfast "[\u2028]" , "" , regular;

// 不正な中黒を30FBに(FF65は念のため)
replaceallfast "[\u00B7\u2022\u2219\u22C5\uFF65]" , "\u30FB" , regular;

// 不正な波ダッシュ(全角チルダetc)を301Cに
replaceallfast "[\u223C\u223E\u3030\uFF5E]" , "\u301C" , regular;

// 2桁英数を半角
replaceallfast "(?<![0-9,])[0-9]{2}(?![0-9,])" , "\\(0,ToHankaku)" , regular;

// 2点リーダ(2025)・不正な三点を2026に
replaceallfast "[\u2025\u22EF\uFE19\uFE30]" , "\u2026" , regular;

// 中黒2本以上を3点リーダに…
replaceallfast "\u30FB{2,}" , "\u2026" , regular;

// ZERO WIDTH NO-BREAK SPACE(幅の無い改行しない空白)及びBOMを削除
replaceallfast "[\uFFFE\uFEFF]" , "" , regular;

// 〝ののカギ〟(引用符)を標準に
replaceallfast "[\u301d\uff02]" , "\u201c" , regular;
replaceallfast "[\u301f\u201e]" , "\u201d" , regular;
// 不等記号(山カッコ)は保留

// ▶を縦書き用に下向き
replaceallfast "▶" , "▼" , regular;

// 縦書き専用カッコ類を正す-------
replaceallfast "︵" , "(" , regular;
replaceallfast "︶" , ")" , regular;
replaceallfast "︷" , "{" , regular;
replaceallfast "︸" , "}" , regular;
replaceallfast "︹" , "〔" , regular;
replaceallfast "︺" , "〕" , regular;
replaceallfast "︻" , "【" , regular;
replaceallfast "︼" , "】" , regular;
replaceallfast "︽" , "《" , regular;
replaceallfast "︾" , "》" , regular;
replaceallfast "︿" , "〈" , regular;
replaceallfast "﹀" , "〉" , regular;
replaceallfast "﹁" , "「" , regular;
replaceallfast "﹂" , "」" , regular;
replaceallfast "﹃" , "『" , regular;
replaceallfast "﹄" , "』" , regular;
replaceallfast "︗" , "〓" , regular; // FE17
replaceallfast "︘" , "〓" , regular; // FE18
//  replaceallfast "︐" , "," , regular;
replaceallfast "︑" , "、" , regular;
replaceallfast "︒" , "。" , regular;
//------------------------------
replaceallfast "[\u226A«]" , "《" , regular;// 大なり小なり
replaceallfast "[\u226B»]" , "》" , regular;

// 記号フォント専用丸数字を和文用文字に
replaceallfast "➊" , "❶" , regular;
replaceallfast "➋" , "❷" , regular;
replaceallfast "➌" , "❸" , regular;
replaceallfast "➍" , "❹" , regular;
replaceallfast "➎" , "❺" , regular;
replaceallfast "➏" , "❻" , regular;
replaceallfast "➐" , "❼" , regular;
replaceallfast "➑" , "❽" , regular;
replaceallfast "➒" , "❾" , regular;
replaceallfast "➓" , "❿" , regular;
replaceallfast "➀" , "①" , regular;
replaceallfast "➁" , "②" , regular;
replaceallfast "➂" , "③" , regular;
replaceallfast "➃" , "④" , regular;
replaceallfast "➄" , "⑤" , regular;
replaceallfast "➅" , "⑥" , regular;
replaceallfast "➆" , "⑦" , regular;
replaceallfast "➇" , "⑧" , regular;
replaceallfast "➈" , "⑨" , regular;
replaceallfast "➉" , "⑩" , regular;

// 「」 始めと閉じがどちらも「起こし」括弧であった場合、後ろを「閉じ」に
replaceallfast "(「[^「」\n]+)(「)" , "\\1」" , regular;

// 「」 始めと閉じがどちらも「閉じ」括弧であった場合、前を「起こし」に
replaceallfast "(」)([^「」\n]+」)" , "「\\2" , regular;

// () 始めと閉じがどちらも「起こし」括弧であった場合、後ろを「閉じ」に
replaceallfast "(([^()\n]+)(()" , "\\1)" , regular;

// () 始めと閉じがどちらも「閉じ」括弧であった場合、前を「起こし」に
replaceallfast "())([^()\n]+))" , "(\\2" , regular;

// 句点後のスペース(改行代わり)を改行に
replaceallfast "(。)(\u3000+)(?=[^\n])" , "\\1\n\u3000\\3" , regular;

// 約物前後の余計なスペースを削除(数字は状況を特定しきれないので除外)
replaceallfast "(?<=[,.,.、。「」『』【】《》〝〟“”〔〕{}〈〉[]()])[\u3000\u0020@]+" , "" , regular;

replaceallfast "([^\u3000\u0020])([\u3000\u0020]+)([,.,.、。「」『』【】《》〝〟“”〔〕{}〈〉[]()@])" , "\\1\\3" , regular;

// httpを半角 // 丸パーレン除外版
replaceallfast "(?:https?|ftp)://[_.! ̄*¥’a-zA-Z0-9;/?:@&=+$,%#\u002D\uFF0D]+" , "\\(0,ToHankaku)" , regular;
// メアドを半角 // 
replaceallfast "[a-zA-Z0-9.!#$%&’*+=?^_`{|}〜\u2015\uFF0D]+[@@][.a-zA-Z0-9\u002D\uFF0D]+(?:[.a-zA-Z0-9\u002D\uFF0D]+)*" , "\\(0,ToHankaku)" , regular;

//------------------------------
// 桁区切り・小数点のドットカンマを中点・読点に(縦組み仕様)
replaceallfast "(?<=[0-90-9]).(?=[0-90-9])" , "・" , regular;
replaceallfast "(?<=[0-90-9]),(?=[0-90-9])" , "、" , regular;
//------------------------------
// 複数改行を1つに
replaceallfast "(\n)(\n)(\n+)" , "\\1\\2" , regular;

// 複数スペースを1つに
replaceallfast "[\u3000\u0020]{2,}" , "\u3000" , regular;

// 行末スペース類を全て削除
replaceallfast "(?!\n)[\u0020\u3000\u0009\u0008]+(?=\n)" , "" , regular;

// ダーシ類を全て一括U+2015に
replaceallfast "[\u226A\u226B\u02D7\u2010-\u2014\u2043\u2212\u23AF\u23E4\u2500-\u2501\u2574\u2576\u2578\u257A\u257C\u257E\u268A\u2E3A\u2E3B\u29FF\u2796\u4E28\uFE31\uFE32\uFE58\uFE63\uFF0D\uFF70\u05BE]" , "\u2015" , regular;

// line_endに改行あったら削除 /////
gofileend;
while(code == eof){
    beginsel;
    left;
    if(code == 0x0d){
        delete;
    }else{
        escape;
        break;
    }
}
gofiletop;
///////////////////////////////////////
// 要チェック箇所(行頭・)をハイライト
//  setcompatiblemode 0x0F;
setsearch "^.|[<>゛゜\u2E83-\u2FDFー〓?!.\u02D7\u2010-\u2015\u2043\u2212\u23AF\u23E4\u2500-\u2501\u2574\u2576\u2578\u257A\u257C\u257E\u268A\u2E3A\u2E3B\u29FF\u2796\u4E28\uFE31\uFE32\uFE58\uFE63\uFF0D\uFF70\u05BEa-zA-Z  ]|(?<=[、・.:\u30FB])[0-9]{2}|[0-9]{2}(?=[、・.:\u30FB])|(?<=^[0-90-9])・" , 0x6003810;
hilightfound 1;
// 0(OFF)1(ON)
gofiletop;

message "■処理を終了しました■3桁区切りなしver\n\n
・行頭1w下げ されているか\n
・箇条書き用行頭英数字、それに続くドット等(一部)\n
・東京03・06など「電話番号2桁」を全角に\n
・不要なスペース類、一部の英字(g・kg・km等、一部メアド、日本語の入ったhttp)\n
・必要なスペース・改行が削除されていないか\n\n
(2025.9.16)";
}
else{
message "処理を中止しました";
}
endgroupundo 1;
endmacro;

横組み用

//------------------------------
question "■InDesignよこ整形■\n\n
実行しますか?(2025.9.19)";
if(result){
    begingroupundo;

if(version < 852)
{message "秀丸エディタ Ver.8.52 以上を使用してください。";
    endmacro;
}
if((platform & 0x80000)) #platform = 64;
// 全角半角変換モジュールのチェック
if(#platform == 64) //64ビット版
{
    $HanZenFilter = "HanZenConv.hmf64";
} else {
    $HanZenFilter = "HanZenConv.hmf"; //32ビット版
}
if(filter($HanZenFilter, "HanZenConv", "0110000", "ABC") != "ABC")
{
    message "HanZenConv.hmf がロードされていません。\n\n
公式よりダウンロードし、\n
1)秀丸本体と同じディレィトリにコピー\n
2)動作環境(上級者向け設定)→ 編集→ 変換→\n
3)変換モジュール「追加」→ HanZenConv.hmfを指定\n\n
して下さい(32・64bitを間違えないで下さい)";
    endmacro;
}
// ここから処理-------------------    
// 半角ドット2-3連を三点リーダー
    replaceallfast "[\\.]{2,3}" , "\u2026" , regular;

selectall;
    filter "HanZenConv.hmf" , "HanZenConv" , "1011101"; // カタカナ以外全て
    filter "HanZenConv.hmf" , "HanZenConv" , "1000011"; // カタカナのみ
escape;
gofiletop;
if (code == 0x0d){
    delete;
    }
//------------------------------
// UTF-16サロゲートペア文字をゲタに(まだ非対応)
//  replaceallfast "[\u010000-\u10FFFF]" , "〓\\1〓" , regular;

// 不正な\u00A0を処理
replaceallfast "\u00A0" , "\u0020" , regular;

// 不正なスペース類を全角スペース
replaceallfast "[\u200B]" , "\u3000" , regular;

// 不正なハイフン類を削除
replaceallfast "[\u000B\u0001-\u0007]" , "" , regular;

// トーフ(置き換えられた字形等)をゲタに
//replaceallfast "[\uFFFD\uFFFC]" , "〓" , regular;

// 改ページを改行に
replaceallfast "\u000C" , "\n" , regular;

// 不正な改行(行分割)を削除
replaceallfast "[\u2028]" , "" , regular;

// 不正な中黒を30FBに(FF65は念のため)
replaceallfast "[\u00B7\u2022\u2219\u22C5\uFF65]" , "\u30FB" , regular;

// 不正な波ダッシュ(全角チルダetc)を301Cに
replaceallfast "[\u223C\u223E\u3030\uFF5E]" , "\u301C" , regular;

// 桁区切り・小数点のドットカンマをToHankakuに
replaceallfast "(?<=[0-9])[.,](?=[0-9])" , "\\(0,ToHankaku)" , regular;

// 2桁以上英数を半角
replaceallfast "[0-9\\.,,.]{2,}" , "\\(0,ToHankaku)" , regular;

// ドットカンマ前の「1個の」英数字を半角
replaceallfast "[0-9](?=[\\,.,.])" , "\\(0,ToHankaku)" , regular;
//------------------------------
// 2点リーダ(2025)・不正な三点を2026に
replaceallfast "[\u2025\u22EF\uFE19\uFE30]" , "\u2026" , regular;

// 中黒2本以上を3点リーダに…
replaceallfast "\u30FB{2,}" , "\u2026" , regular;

// ZERO WIDTH NO-BREAK SPACE(幅の無い改行しない空白)及びBOMを削除
replaceallfast "[\uFFFE\uFEFF]" , "" , regular;

// 〝ののカギ〟(引用符)を標準に
replaceallfast "[\u301d\uff02]" , "\u201c" , regular;
replaceallfast "[\u301f\u201e]" , "\u201d" , regular;
// 不等記号(山カッコ)は保留

// 縦書き専用カッコ類を正す----------
replaceallfast "︵" , "(" , regular;
replaceallfast "︶" , ")" , regular;
replaceallfast "︷" , "{" , regular;
replaceallfast "︸" , "}" , regular;
replaceallfast "︹" , "〔" , regular;
replaceallfast "︺" , "〕" , regular;
replaceallfast "︻" , "【" , regular;
replaceallfast "︼" , "】" , regular;
replaceallfast "︽" , "《" , regular;
replaceallfast "︾" , "》" , regular;
replaceallfast "︿" , "〈" , regular;
replaceallfast "﹀" , "〉" , regular;
replaceallfast "﹁" , "「" , regular;
replaceallfast "﹂" , "」" , regular;
replaceallfast "﹃" , "『" , regular;
replaceallfast "﹄" , "』" , regular;
replaceallfast "︗" , "〓" , regular; // FE17
replaceallfast "︘" , "〓" , regular; // FE18
//  replaceallfast "︐" , "," , regular;
replaceallfast "︑" , "、" , regular;
replaceallfast "︒" , "。" , regular;
//------------------------------
replaceallfast "[\u226A«]" , "《" , regular;// 大なり小なり
replaceallfast "[\u226B»]" , "》" , regular;

// 記号フォント専用丸数字を和文用文字に
replaceallfast "➊" , "❶" , regular;
replaceallfast "➋" , "❷" , regular;
replaceallfast "➌" , "❸" , regular;
replaceallfast "➍" , "❹" , regular;
replaceallfast "➎" , "❺" , regular;
replaceallfast "➏" , "❻" , regular;
replaceallfast "➐" , "❼" , regular;
replaceallfast "➑" , "❽" , regular;
replaceallfast "➒" , "❾" , regular;
replaceallfast "➓" , "❿" , regular;
replaceallfast "➀" , "①" , regular;
replaceallfast "➁" , "②" , regular;
replaceallfast "➂" , "③" , regular;
replaceallfast "➃" , "④" , regular;
replaceallfast "➄" , "⑤" , regular;
replaceallfast "➅" , "⑥" , regular;
replaceallfast "➆" , "⑦" , regular;
replaceallfast "➇" , "⑧" , regular;
replaceallfast "➈" , "⑨" , regular;
replaceallfast "➉" , "⑩" , regular;

// 「」 始めと閉じがどちらも「起こし」括弧であった場合、後ろを「閉じ」に
replaceallfast "(「[^「」\n]+)(「)" , "\\1」" , regular;

// 「」 始めと閉じがどちらも「閉じ」括弧であった場合、前を「起こし」に
replaceallfast "(」)([^「」\n]+」)" , "「\\2" , regular;

// () 始めと閉じがどちらも「起こし」括弧であった場合、後ろを「閉じ」に
replaceallfast "(([^()\n]+)(()" , "\\1)" , regular;

// () 始めと閉じがどちらも「閉じ」括弧であった場合、前を「起こし」に
replaceallfast "())([^()\n]+))" , "(\\2" , regular;

// 句点後のスペース(改行代わり)を改行に
replaceallfast "(。)(\u3000+)(?=[^\n])" , "\\1\n\u3000\\3" , regular;

// 約物前後の余計なスペース絵を削除(数字は状況を特定しきれないので除外)
replaceallfast "(?<=[,.,.、。「」『』【】《》〝〟“”〔〕{}〈〉[]()])[\u3000\u0020]+" , "" , regular;
replaceallfast "([^\u3000\u0020])([\u3000\u0020]+)([,.,.、。「」『』【】《》〝〟“”〔〕{}〈〉[]()@])" , "\\1\\3" , regular;

// httpを半角 // 丸パーレン除外
replaceallfast "(?:https?|ftp)://[_.! ̄*¥’a-zA-Z0-9;/?:@&=+$,%#\u002D\uFF0D]+" , "\\(0,ToHankaku)" , regular;
// メールアドレスを半角 //
replaceallfast "[a-zA-Z0-9.!#$%&’*+=?^_`{|}〜\uFF0D]+[@@][.a-zA-Z0-9\uFF0D]+(?:[.a-zA-Z0-9\uFF0D]+)*" , "\\(0,ToHankaku)" , regular;

// g・kg・m・cm・mm・kmなど、単位を半角
replaceallfast "(?<=[0-90-9])[gm]|(?<=[0-90-9])kg|(?<=[0-90-9])mm|(?<=[0-90-9])cm|(?<=[0-90-9])km" , "\\(0,ToHankaku)" , regular;

// tel・fax・mailなどを半角
replaceallfast "(?<![a-zA-Za-zA-Z])TEL(?![a-zA-Za-zA-Z])|(?<![a-zA-Za-zA-Z])[tT]el(?![a-zA-Za-zA-Z])|(?<![a-zA-Za-zA-Z])FAX(?![a-zA-Za-zA-Z])|(?<![a-zA-Za-zA-Z])[fF]ax(?![a-zA-Za-zA-Z])|(?<![a-zA-Za-zA-Z])MAIL(?![a-zA-Za-zA-Z])|(?<![a-zA-Za-zA-Z])[mM]ail(?![a-zA-Za-zA-Z])" , "\\(0,ToHankaku)" , regular;

//------------------------------
// 複数改行を1つに
replaceallfast "\n{2,}" , "\n" , regular;

// 複数スペースを1つに
replaceallfast "[\u3000\u0020]{2,}" , "\u3000" , regular;

// 行末スペース類を全て削除
replaceallfast "(?!\n)[\u0020\u3000\u0009\u0008]+(?=\n)" , "" , regular;

// % 全角→半角(横組み用)
//  replaceallfast "%" , "%";

// ダーシ類を全て一括U+2015に
replaceallfast "[\u02D7\u2010-\u2015\u2043\u2212\u23AF\u23E4\u2500-\u2501\u2574\u2576\u2578\u257A\u257C\u257E\u268A\u2E3A\u2E3B\u29FF\u2796\u4E28\uFE31\uFE32\uFE58\uFE63\uFF70\u05BE]" , "\uFF0D" , regular;

// line_endに改行あったら削除 //////
gofileend;
while(code == eof)
{
    beginsel;
    left;
    if(code == 0x0d)
{
        delete;
    }else{
        escape;
        break;
    }
}
gofiletop;
//////////////////////////////////
// 要チェック箇所(行頭・)をハイライト
//  setcompatiblemode 0x0F;
    setsearch "^.|[\u226A«\u226B»<>゛゜\u2E83-\u2FDFー〓!?,.\u02D7\u2010-\u2015\u2043\u2212\u23AF\u23E4\u2500-\u2501\u2574\u2576\u2578\u257A\u257C\u257E\u268A\u2E3A\u2E3B\u29FF\u2796\u4E28\uFE31\uFE32\uFE58\uFE63\uFF0D\uFF70\u05BEa-zA-Z  ]|^[0-90-9][,.,.][0-90-9]+" , 0x6003810;
    hilightfound 1;
// 0(OFF)1(ON)
gofiletop;
//------------------------------
message "■処理を終了しました■\n\n

・行頭1w下げ されているか\n
・箇条書き用行頭英数字、それに続くドット等(一部)\n
・東京03・06など「電話番号2桁」を全角に\n
・不要なスペース類、一部の英字(g・kg・km等、一部メアド、日本語の入ったhttp)\n
・3桁区切りにカンマは必要か\n
・必要なスペース・改行が削除されていないか\n\n
(2025.9.16)";
}
else{
message "処理を中止しました";
}
endgroupundo 1; // アンドゥグループの閉じ
endmacro;

メモ

  • 要チェック項目に黄色いハイライトが付きます(検索置換・ドキュメント閉じると消去します)
  • 秀丸正規表現(Hmjre)と日本語の特性上、どうしても処理できない箇所が出ます。ハイライトを見ながら、個別修正して下さい
  • 保存は【UTF-16 or 8】を心掛けましょう
  • 秀丸の仕様上、マクロ上でUTF-16サロゲートペア非対応です(秀丸作業で表示は可)(2025.9.16)
  • 例外置換を見つけるため、別名保存後「WinMerge」等で差分チェックを行って下さい。特にカッコ類起こし・閉じの置換は注意が必要です(逆に言えば、これで顧客の入力ミスを発見できる)
  • 「htmlやメアドを半角に戻す」完全ではありません(作るのを面倒くさがっている)← 後からチェックして手動で直して下さい。やれるんですけどね…
  • 英文中のカンマ・ピリオドの後ろに半角スペースがない場合を処理したいのですが、後日考えます。

\Aや\Zが使えないのと、\sが改行を含んでしまうので、稚拙な書き方になってしまう箇所のあるのが口惜しい…

組版用の秀丸マクロって、実はreplaceallfast "[検索文字列]", "[置換文字列]" , regular;の一行さえ使えたら、殆どの事が可能です。マクロをわざわざ勉強しなくても、これならできますよね?

編集が激重になってきたため、マクロの登録は次へ。はてなマークダウン編集画面って重いよね…