拡張機能の多いVS Codeで最もお世話になっているのが、ルールベース校正システムのTextlintプラグインです。文頭の字下げや括弧の閉じ忘れ、文中に残ってしまうASCII(半角)の記号の探索、全幅フォントの統一などを一括して確認してくれますので重宝している人は多いでしょう。文脈まで読んでくれる人間の校正とは質の異なるものですが、タイプしたらすぐにチェックしてくれるプログラムには、また別の良さがあります。
- textlintで日本語の文章をチェックする(開発者のサイト)
- vscode-textlint(VS Code用プラグイン)

スクリーンショットはTextlintが動作しているところです。novel-writerのハイライトのためにちょっと見にくいかもしれませんが、赤い下線がある部分がルールに則っていない部分です。文頭の空白がなかったり、「私」で統一できていなかったり、閉じカッコの前に句点(。)があったり「母をが」のような編集ミスが残っていたりしますが、こんな問題を書きながら修正できます。プログラムに任せてしまってもいいですが、私は手で治すことの方が多いかな。、Textlintプラグインはエラー相当の警告しかしてくれないで、そこだけ後でどうにかしようかなと思っているところです。
Texlintで最もお世話になっているのは、日本翻訳連盟(JTF)スタイルガイドを元にしたtextlint-rule-preset-JTF-styleです。
このルールは実に細かくよくできています(かつて勤務していた印刷会社のいたテキストデータ入稿スタイルに似てます)。特に記号の全半角チェックやアルファベット前後の空白を探してくれるのはありがたい。「です、ます」「だ、である」の統一など素晴らしいですね。
もちろん小説を書くときはこのルールは使いません。算用数字と漢数字の使い分けなどもオフにして使っています。細かく分割されたパラメーターはこのようにオフにして使えます。
"preset-jtf-style": {
"1.1.1.本文": false,
"2.1.9.アルファベット": false,
"4.2.9.ダッシュ(-)": false,
"2.1.8.算用数字": false,
"2.2.2.算用数字と漢数字の使い分け": false
},
小説のフォーマットに使っているのはtextlint-rule-general-novel-style-jaです。行頭の空白を用いた字下げや鉤括弧の閉じ伏せ、「……」の複数付け、閉じ括弧前の「、。」禁止、アラビア数字の抑制など、日本語の小説のフォーマットでよく使われるルールが定義されています。すべてのルールをオンにする必要もないので、普段は以下の設定で使っています。
"general-novel-style-ja": {
// 行頭文字のチェックをしない
"chars_leading_paragraph": false,
// アラビア数字の最大桁数はチェックしない
"max_arabic_numeral_digits": false
}
常用しているルールはあと二つ。自作の正規表現ルールを導入できるtextlint-rule-prhと、形態素解析のパターンをもとにルールを作ることができるtextlint-rule-morpheme-matchです。どちらも自分のノウハウを蓄積できるルールです。
textlint-rule-prhの正規表現ルールでは、検索置換を用いて「フォルダー」と「フォルダ」などの用法統一や「目を向いた」のような誤字の修正、「流。」「な買った」のような変換ミスの修正が行えます。正規表現の先読み・後読みも使えるので「フォルダー」を「フォルダ」に統一できるのはいいとして、「フォルダ」を「フォルダー」に検索置換すると、もともと「フォルダー」と書いてあった部分が「フォルダーー」になってしまうようなミスも防ぐことができます。また、コメントをつけられるので「マジックテープ」と「面ファスナー」のように、固有名詞と一般名詞があるような時に教えてくれるようなルールを書くことも可能です。
- expected: 目を剥$1
patterns: /目を向(く|いた)/
prh: 「目を剥く」の誤入力の可能性があります
- expected: フォルダー
patterns: /フォルダ(?!ー)/
# (?!)は否定先読み。「フォルダ」の後ろに「ー」が続かない場合
# だけを検索して「フォルダー」に置換します
- expected: センチメートル
patterns: /センチ(?!メートル)/
- expected: プラットフォーム
patterns: プラットホーム
- expected: ると$1
patterns: /ルト([、。])/
# 登録商標
- expected: 宅配便
pattern: 宅急便
prh: 宅急便はヤマト運輸の登録商標です
- expected: 面ファスナー
pattern: マジックテープ
prh: マジックテープはクラレの登録商標です
#人名
- expected: 齋藤
pattern: /(斉|斎|齊)藤/
最近は、「私」と「わたし」の統一にも使うようになりました。
- expected: 私
patterns: /(?<!(明け|言い|受け|取り|売り|手|投げ|はし|橋|引き|ひき|前))わたし/
prh-rulesはいつも使うものと作品ごとに変わるものがあるので、グローバルとプロジェクトごとのローカル辞書を作って適用しています。複数のルールセットが使える仕様なのはありがたいですね。
"prh": {
"rulePaths" :[
"./dict/prh-rule.yml", #統一ルール(シンボリックリンク)
"./dict/prh-local-rule.yml" #プロジェクトのローカルルール
]
},
そして最後に、形態素解析を使うtextlint-rule-morpheme-matchです。推敲を重ねていると元の字を消し忘れて「話を聞いたのでに行くことにした」や「話を聞いたのでが行くことにした」「名詞をは使う」「敵が取り囲むんでいる」「参加しする」のようなミスが残ることがあります。「をは」はともかくとして「でに」や「でが」、「むんでいる」のようなケースをすべて網羅したルールを作るのはちょっと大変です。動詞の基本形に「んでいる」が続くケースは「うんでいる」「くんでいる」「すんでいる」「ぬんでいる」「ふんでいる」「ゆんでいる」だけ? じゃあ形容詞は? 助動詞は? と言うことになってしまいますが、形態素解析していればエラーを検出できます。
//サ変動詞タイプミスの可能性
//「参加しする」
{
message: 'サ変動詞の$1$2は、タイプミスの可能性があります',
tokens: [
{
"pos": "名詞",
"pos_detail_1": "サ変接続",
"_capture": "$1"
},
{
"surface_form": "しする",
"pos": "動詞",
"pos_detail_1": "自立",
"_capture": "$2"
},
]
},
私はこんなルールを30個ぐらい作って、ルールベース校正を行っています。完全ではありませんが、誤字脱字は減りますね。
辞書の設定はtextlint-settings-for-fictionで公開しています。導入が少し面倒なので、もう少し簡単に導入できるようになったら、ドキュメントを整備したいものですね。