﻿RC_Config 自然言語仕様

【この文書の目的】
この自然言語仕様に従い、Windowsのデスクトップ版Wordで動くVBAの標準モジュールを作成する。対象モジュール名はこの文書の先頭に示す。関数名、引数の順序、辞書キーを変更しない。変数宣言を必須にし、手動で標準モジュールへ貼り付ける形式で作成する。属性行やThisDocument用のイベントは不要。
他モジュールの公開処理を呼び出す部分は、その処理の存在を前提とする。同じ公開関数を各モジュールへ重複実装しない。不明な会社書式は確認してから記入し、勝手に推測しない。

【ツール全体の契約】
・旧規程と新規程を読み取り専用で解析し、新欄が左、旧欄が右の編集可能なWord表を別ファイルへ保存する。入力を上書きしない。
・外部AI、外部通信、追加ソフト、外部テンプレートを実行時に使わない。Wordの標準オブジェクトと、遅延バインディングによるScripting.Dictionary、Scripting.FileSystemObject、VBScript.RegExpを使う。追加の参照設定を要求しない。
・通常の成功時はdocxだけを出力する。確認レポート、対応表TSV、手動対応を読み込んで再生成する機能は作らない。RC_Reportモジュールも作らない。
・issuesは処理中だけの内部診断。致命的な失敗時の画面表示と実行失敗TXTは残す。RC_Testsを明示実行した場合のテストTXTは別扱い。
・フォントや余白の変更は本文の変更とみなさない。原文の数字、否定語、句読点、空白、タブを言い換えたり削除したりしない。照合専用の正規化を原文や下線位置へ適用しない。
・Office、Wordのマクロ設定、OSのセキュリティ設定は変更しない。自分が開いた入力や作成した文書だけを閉じる。

【共通データ構造】
以下のキーは大文字小文字を含めて統一する。辞書中のオブジェクトはオブジェクトとして格納・差し替えし、文字列化しない。存在しない片側ノードは空文字ではなくNothingとする。Collectionの添字と文字位置は1始まり。

1. 解析文書：sourceは入力パスまたは識別文字列、titleは文書名、articlesは条ノードのCollection、historyは末尾履歴ノードのCollection、extrasは条に属さない保全ノードのCollection。
2. ノード：id、kind、prefix、gap、body、raw、heading、line、children。
  idは解析順ID。条はA001等、項はA001.P001等、号はA001.P001.I001等、履歴はH001等、未知段落はUに元段落番号を続ける。
  kindはarticle、paragraph、item、history、unknownのいずれか。prefixは元の番号文字列、gapは番号と本文の間の元の空白等、bodyは番号を除く本文、rawはprefix・gap・bodyをそのまま連結したもの。headingは条の直前の括弧見出し、lineは元入力の段落位置、childrenは子ノードのCollection。
  条ノード自身のbodyは空文字。その条の先頭本文は第1項ノードP001へ入れる。P001のprefixには元の第n条の番号を入れ、項番号「1」を新たに補わない。条ノードのrawは元番号とgapだけとなる。条にはheadingLineも加え、見出しの元段落位置を記録する。
3. 対応ペア：newとoldは新旧ノードまたはNothing、scoreはDoubleの類似度、statusはauto、review、new、deletedのいずれか、childrenは子対応ペアのCollection。
4. 内部診断：kind、location、reason、rawの4文字列を持つ辞書をissuesのCollectionへ追加する。利用者向けの確認レポートへ書き出さない。
5. 差分結果：newとoldは各側の下線区間Collection、fallbackは長文の代替計算を使ったBoolean。区間はstartという1始まり文字位置とlengthという文字数を持つ辞書。改行や空白を含む原文字列上の位置を使う。
6. 出力行：newTextとoldText、newHeadingとoldHeading、newHeadingBlankとoldHeadingBlank、newPrefixとoldPrefix、newArticleとoldArticle、newNoteとoldNote、historyGap、newSpansとoldSpans。
  TextとNoteは文字列。HeadingとPrefixは文字数のLong。HeadingBlank、Article、historyGapはBoolean。Spansは上記の下線区間Collection。初期値は文字列が空、文字数が0、BooleanがFalse、Collectionは空。

【モジュール間の公開処理】
RC_Configは設定定数、RC_Color、RC_Navy、RC_HeaderFill、RC_Regex、RC_TrimSpace、RC_MatchText、RC_NumberKeyを提供する。
RC_ParseはRC_Dict、RC_Node、RC_ParseText、RC_ReadDocument、RC_ParseLines、RC_NodeText、RC_AddIssueを提供する。
RC_MatchはRC_Similarity、RC_MatchScore、RC_NewPair、RC_Align、RC_PairChangedを提供する。
RC_CharDiffはRC_Diff、RC_AddSpanを提供する。
RC_OutputはRC_OutputDocumentを提供する。
RC_MainはCreateComparisonTable、RC_ShowOutput、RC_RunFiles、RC_UniqueBase、RC_WriteTextを提供する。
RC_Testsは任意の開発用RC_TestAllを提供する。通常の入口からテストを実行しない。
主な呼出し：MainがParseで旧・新を読み、Matchへ新articles・旧articles・issues・locationの順で渡し、Outputへpairs・新解析文書・旧解析文書・issuesの順で渡す。OutputがCharDiffを呼び、各処理がConfigとParseの共通処理を使う。

【他モジュールを呼ぶ際の引数契約】
次の一覧は呼出し互換性のために示す。この文書の対象以外のモジュールの実装を重複して作らない。
RC_Main
・CreateComparisonTable：公開。引数はなし。戻り値なし。
・RC_ShowOutput：公開。引数はoutput（String、値渡し）。戻り値なし。
・RC_RunFiles：公開。引数はoldPath（String、値渡し）、newPath（String、値渡し）、outputFolder（String、値渡し）。戻り値はString。
・RC_UniqueBase：公開。引数はfolder（String、値渡し）、stem（String、値渡し）。戻り値はString。
・RC_WriteText：公開。引数はpath（String、値渡し）、text（String、値渡し）。戻り値なし。
RC_Config
・RC_Color：公開。引数はhexRGB（String、値渡し）。戻り値はLong。
・RC_Navy：公開。引数はなし。戻り値はLong。
・RC_HeaderFill：公開。引数はなし。戻り値はLong。
・RC_Regex：公開。引数はpattern（String、値渡し）。戻り値はObject。
・RC_TrimSpace：公開。引数はtext（String、値渡し）。戻り値はString。
・RC_MatchText：公開。引数はtext（String、値渡し）。戻り値はString。
・RC_NumberKey：公開。引数はprefix（String、値渡し）。戻り値はString。
RC_Parse
・RC_Dict：公開。引数はなし。戻り値はObject。
・RC_Node：公開。引数はnodeId（String、値渡し）、kind（String、値渡し）、prefix（String、値渡し）、gap（String、値渡し）、body（String、値渡し）、line（Long、値渡し）。戻り値はObject。
・RC_ParseText：公開。引数はtext（String、値渡し）、source（String、値渡し）、issues（Collection、値渡し）。戻り値はObject。
・RC_ReadDocument：公開。引数はpath（String、値渡し）、issues（Collection、値渡し）。戻り値はObject。
・RC_ParseLines：公開。引数はlines（Variant、値渡し）、source（String、値渡し）、issues（Collection、値渡し）。戻り値はObject。
・RC_NodeText：公開。引数はn（Object、値渡し）、includePrefix（Boolean、値渡し、省略可能・既定値False）。戻り値はString。
・RC_AddIssue：公開。引数はissues（Collection、値渡し）、kind（String、値渡し）、location（String、値渡し）、reason（String、値渡し）、raw（String、値渡し）。戻り値なし。
RC_Match
・RC_Similarity：公開。引数はleftText（String、値渡し）、rightText（String、値渡し）。戻り値はDouble。
・RC_MatchScore：公開。引数はnn（Object、値渡し）、oo（Object、値渡し）、ni（Long、値渡し）、oi（Long、値渡し）、nc（Long、値渡し）、oc（Long、値渡し）。戻り値はDouble。
・RC_NewPair：公開。引数はnn（Object、値渡し）、oo（Object、値渡し）、score（Double、値渡し）、status（String、値渡し）。戻り値はObject。
・RC_Align：公開。引数はnews（Collection、値渡し）、olds（Collection、値渡し）、issues（Collection、値渡し）、location（String、値渡し）。戻り値はCollection。
・RC_PairChanged：公開。引数はpair（Object、値渡し）。戻り値はBoolean。
RC_CharDiff
・RC_Diff：公開。引数はnews（String、値渡し）、olds（String、値渡し）。戻り値はObject。
・RC_AddSpan：公開。引数はspans（Collection、値渡し）、first（Long、値渡し）、length（Long、値渡し）。戻り値なし。
RC_Output
・RC_OutputDocument：公開。引数はpairs（Collection、値渡し）、newDoc（Object、値渡し）、oldDoc（Object、値渡し）、issues（Collection、値渡し）。戻り値はDocument。
RC_Tests
・RC_TestAll：公開。引数はoutputFolder（String、値渡し）。戻り値はString。

【共通の境界条件】
自動採番、複雑な表、画像、脚注、本文外の図形、変更履歴の解釈は全面対応しない。内部診断と入力原本を保全するが、抽出できないものを架空の条文へ変換しない。
分割・統合の意味を自動で確定しない。残った原文を新設・削除として保全する。一般的な1対多分割の検出を保証しない。条の順序逆転を見やすく示す改善も別課題であり、この再構築で勝手に照合方式を変えない。
この文書は現行処理を再実装するための仕様。AIが生成したVBAのコンパイル・動作・原文保全は、Wordで別途確認する。

【このモジュールの入口・引数・戻り値】
・RC_Color：公開。引数はhexRGB（String、値渡し）。戻り値はLong。
・RC_Navy：公開。引数はなし。戻り値はLong。
・RC_HeaderFill：公開。引数はなし。戻り値はLong。
・RC_Regex：公開。引数はpattern（String、値渡し）。戻り値はObject。
・RC_TrimSpace：公開。引数はtext（String、値渡し）。戻り値はString。
・RC_MatchText：公開。引数はtext（String、値渡し）。戻り値はString。
・RC_NumberKey：公開。引数はprefix（String、値渡し）。戻り値はString。

【担当範囲】
会社別書式を9区画へまとめ、解析・照合・差分の計算設定を別区画へ置く。実際にWordへ書式を適用する処理はRC_Outputが担当する。

【会社ごとの書式調整：指定値を記入する欄】
次の一覧は名称、型、用途を定義する。会社別の値はすべて未記入とする。指定された会社の書式・見本を基に決め、未指定の値を勝手に埋めない。数値の単位も守る。LongのWord列挙値は対応するWord列挙定数で指定する。色はRGB順の6桁文字列。共通値へ連動させる場合は、どの設定を参照するかを明示する。

1. 用紙・余白
・RC_PAPER_SIZE（Long）：用紙サイズ。指定値：［未記入］
・RC_ORIENTATION（Long）：用紙の向き。指定値：［未記入］
・RC_MARGIN_MM（Single）：四辺余白の共通基準mm。指定値：［未記入］
・RC_TOP_MARGIN_MM（Single）：上余白mm。指定値：［未記入］
・RC_BOTTOM_MARGIN_MM（Single）：下余白mm。指定値：［未記入］
・RC_LEFT_MARGIN_MM（Single）：左余白mm。指定値：［未記入］
・RC_RIGHT_MARGIN_MM（Single）：右余白mm。指定値：［未記入］
・RC_FOOTER_MM（Single）：下端からフッターまでmm。指定値：［未記入］

2. 表の幅・セル余白
・RC_COLUMN_MM（Single）：両列幅の共通基準mm。指定値：［未記入］
・RC_NEW_COLUMN_MM（Single）：左の新欄幅mm。指定値：［未記入］
・RC_OLD_COLUMN_MM（Single）：右の旧欄幅mm。指定値：［未記入］
・RC_CELL_MARGIN_MM（Single）：セル左右余白mm。指定値：［未記入］
・RC_CELL_TOP_MM（Single）：セル上余白mm。指定値：［未記入］
・RC_CELL_BOTTOM_MM（Single）：セル下余白mm。指定値：［未記入］
・RC_TABLE_ALIGN（Long）：表全体の左右配置。指定値：［未記入］
・RC_REPEAT_HEADER（Boolean）：列見出しを各ページで繰り返すか。指定値：［未記入］
・RC_ALLOW_ROW_BREAK（Boolean）：本文行をページまたぎ可能にするか。指定値：［未記入］

3. 基本字体・色
・RC_BODY_FONT（String）：本文の字体。指定値：［未記入］
・RC_HEADING_FONT（String）：見出しと条番号の字体。指定値：［未記入］
・RC_BODY_SIZE（Single）：本文サイズpt。指定値：［未記入］
・RC_BODY_BOLD（Boolean）：本文の太字。指定値：［未記入］
・RC_BODY_COLOR（String）：本文色RGB。指定値：［未記入］
・RC_ACCENT_COLOR（String）：強調色RGB。指定値：［未記入］
・RC_BODY_ALIGN（Long）：本文段落の配置。指定値：［未記入］

4. 表題・凡例
・RC_TITLE_PREFIX（String）：規程名の前に付ける表題文字。指定値：［未記入］
・RC_TITLE_SUFFIX（String）：規程名の後に付ける表題文字。指定値：［未記入］
・RC_TITLE_FONT（String）：表題の字体。指定値：［未記入］
・RC_TITLE_SIZE（Single）：表題サイズpt。指定値：［未記入］
・RC_TITLE_BOLD（Boolean）：表題の太字。指定値：［未記入］
・RC_TITLE_COLOR（String）：表題色RGB。指定値：［未記入］
・RC_TITLE_ALIGN（Long）：表題段落の配置。指定値：［未記入］
・RC_TITLE_AFTER_PT（Single）：表題後の余白pt。指定値：［未記入］
・RC_LEGEND_TEXT（String）：変更部分の凡例文。指定値：［未記入］
・RC_LEGEND_FONT（String）：凡例の字体。指定値：［未記入］
・RC_LEGEND_SIZE（Single）：凡例サイズpt。指定値：［未記入］
・RC_LEGEND_BOLD（Boolean）：凡例の太字。指定値：［未記入］
・RC_LEGEND_COLOR（String）：凡例色RGB。指定値：［未記入］
・RC_LEGEND_ALIGN（Long）：凡例の配置。指定値：［未記入］

5. 列見出し・条見出し・条番号
・RC_NEW_LABEL（String）：新列のラベル。指定値：［未記入］
・RC_OLD_LABEL（String）：旧列のラベル。指定値：［未記入］
・RC_HEADER_FONT（String）：列見出し字体。指定値：［未記入］
・RC_HEADER_SIZE（Single）：列見出しサイズpt。指定値：［未記入］
・RC_HEADER_BOLD（Boolean）：列見出しの太字。指定値：［未記入］
・RC_HEADER_COLOR（String）：列見出し色RGB。指定値：［未記入］
・RC_HEADER_FILL_COLOR（String）：列見出し背景色RGB。指定値：［未記入］
・RC_HEADER_ALIGN（Long）：列見出しの配置。指定値：［未記入］
・RC_HEADING_SIZE（Single）：条見出しと条番号のサイズpt。指定値：［未記入］
・RC_HEADING_BOLD（Boolean）：条見出しと条番号の太字。指定値：［未記入］
・RC_HEADING_COLOR（String）：条見出しと条番号の色RGB。指定値：［未記入］
・RC_HEADING_BEFORE_PT（Single）：条見出し前の余白pt。指定値：［未記入］

6. 行間・段落の空き
・RC_USE_LINE_GRID（Boolean）：行グリッドを使うか。指定値：［未記入］
・RC_GRID_PT（Single）：行グリッド間隔pt。指定値：［未記入］
・RC_BODY_BEFORE_PT（Single）：本文段落前余白pt。指定値：［未記入］
・RC_BODY_AFTER_PT（Single）：本文段落後余白pt。指定値：［未記入］
・RC_HISTORY_GAP_PT（Single）：本文と最新履歴の間の余白pt。指定値：［未記入］

7. 罫線
・RC_OUTER_BORDER（Boolean）：外枠罫線を引くか。指定値：［未記入］
・RC_CENTER_BORDER（Boolean）：中央縦罫線を引くか。指定値：［未記入］
・RC_HEADER_BORDER（Boolean）：列見出し直下の罫線を引くか。指定値：［未記入］
・RC_BODY_HORIZONTAL_BORDER（Boolean）：本文の横罫線を引くか。指定値：［未記入］
・RC_BORDER_STYLE（Long）：Wordの罫線種。指定値：［未記入］
・RC_BORDER_WIDTH（Long）：Wordの罫線幅列挙値。指定値：［未記入］
・RC_BORDER_COLOR（String）：罫線色RGB。指定値：［未記入］

8. 注記・下線
・RC_UNCHANGED_NOTE（String）：新欄の変更なし注記。指定値：［未記入］
・RC_OMITTED_NOTE（String）：旧欄の省略注記。指定値：［未記入］
・RC_NEW_NOTE（String）：新設時に反対欄へ置く注記。指定値：［未記入］
・RC_DELETED_NOTE（String）：削除時に反対欄へ置く注記。指定値：［未記入］
・RC_NOTE_ALIGN（Long）：番号のない注記の横配置。指定値：［未記入］
・RC_NOTE_TAB_ALIGN（Long）：番号付き注記のタブ揃え。指定値：［未記入］
・RC_NOTE_TAB_POSITION（Single）：セル内幅に対する注記タブ位置の割合。指定値：［未記入］
・RC_DIFF_UNDERLINE（Long）：Wordの変更部分の下線種。指定値：［未記入］

9. フッター
・RC_SHOW_FOOTER（Boolean）：規程名フッターを出すか。指定値：［未記入］
・RC_FOOTER_PREFIX（String）：フッター規程名の前の文字。指定値：［未記入］
・RC_FOOTER_SUFFIX（String）：フッター規程名の後の文字。指定値：［未記入］
・RC_FOOTER_FONT（String）：フッター字体。指定値：［未記入］
・RC_FOOTER_SIZE（Single）：フッターサイズpt。指定値：［未記入］
・RC_FOOTER_BOLD（Boolean）：フッターの太字。指定値：［未記入］
・RC_FOOTER_COLOR（String）：フッター色RGB。指定値：［未記入］
・RC_FOOTER_ALIGN（Long）：フッターの配置。指定値：［未記入］

【通常変更しない認識設定】
RC_ARTICLE_PATTERN：行頭に半角空白、全角空白、タブを許し、「第」、数字、「条」、必要なら「の数字」の枝番を認識する。数字は全半角を許し、番号内の空白等も許す。番号部分、番号後の空白・タブ、残りの本文の3群へ分ける。
RC_PARAGRAPH_PATTERN：行頭の空白等を含む全半角の数字を項番号とし、その後は1文字以上の半角空白・全角空白・タブが必要。番号、間隔、本文の3群へ分ける。
RC_ITEM_PATTERN：全半角の括弧で囲まれた全半角の数字を号番号とする。番号内部の空白等と番号後の空白等を許す。番号、間隔、本文の3群へ分ける。
RC_HEADING_PATTERN：全半角の括弧に囲まれた見出しだけの段落。括弧内は空ではなく、数字または閉じ括弧を含む号番号とは区別する。前後の空白等は許す。
RC_HISTORY_PATTERN：前空白等の後に平成・令和・昭和・大正・明治のいずれかで始まり、その後に実施・改定・改正・施行のいずれかを含む段落。
認識用の正規表現はVBScript.RegExpで動く形にする。番号・本文を抽出する3群の順序を変更しない。

【通常変更しない計算設定】
RC_ARTICLE_MINは0.69。RC_CHILD_MINは0.4。RC_CHILD_REMAINDER_REVIEWは0.72。RC_AMBIGUITY_MARGINは0.08。
RC_MAX_NODESは500（解析対象の非空段落数の上限）。RC_MAX_DIFF_CELLSは2000000（差分行列の判定上限）。RC_MERGE_COMMONは2（結合を許す共通部分の最大文字数）。RC_MERGE_WINDOWは24（結合後の局所区間の最大文字数）。
これらを会社の見た目を合わせるために変更しない。

【補助処理】
RC_Colorは入力が6文字で、すべて0〜9、A〜F、a〜fか確認する。違えば色指定が不正だと説明してエラーにする。先頭2桁、中間2桁、末尾2桁を16進の赤・緑・青へ変換し、Wordで使うRGB値を返す。
RC_NavyはRC_ACCENT_COLORをRC_Colorで変換して返す。RC_HeaderFillはRC_HEADER_FILL_COLORを同様に変換する。
RC_Regexは遅延バインディングでVBScript.RegExpを作り、指定のpatternを設定し、GlobalをFalseにして返す。
RC_TrimSpaceは文字列の両端だけから半角空白・全角空白・タブを除く。途中の空白や改行を勝手に消さない。
RC_MatchTextは照合専用。半角空白、全角空白、タブ、CRを除去する。数字、否定語、句読点、LF等のその他の文字は変更しない。大文字小文字変換や言い換えも行わない。
RC_NumberKeyはRC_MatchTextを適用し、全角数字0〜9を半角へ、全角の開き・閉じ括弧を半角へ変換する。原文とは別の識別用文字列を返す。

【確認例】
空の会社書式欄は記入が必要だと分かる状態を保つ。色が6桁でなければエラー。前後の空白を除いても本文中の空白は保持。照合で「許可する」と「許可しない」や「３」と「５」を同一にしない。
