📝

Typstの文章をtextlintで校正する

2024/12/23に公開

はじめに

Typstは、書籍や論文の執筆、プレゼンテーションやポスターの作成など、さまざまな文章の作成に利用できます。これらの組版の際には、文章の構造や表現のスタイルを統一することが重要です。しかし、人間が常に文章スタイルの統一に気を配るのは難しく、こうした運用は表記揺れの原因になり得ます。そこで、この記事ではtextlintの静的解析によるTypstの文章の校正について紹介いたします。

https://typst.app/

textlintとは

textlintはMarkdownなどのテキスト向けの静的解析ツールです。ESLintの影響を強く受けており、自然言語の校正の難しさを拡張可能なルールによって解決しようとしている点が特徴です。

https://textlint.github.io/

textlintは解析対象のソースコードをフォーマットに対応するparserによってパースし、抽象構文木(AST)を生成します。そして、抽象構文木の各ノードについてルールを検証し、違反があれば警告します。

ソースコードのフォーマットに対応するparserを提供するものをプラグイン、ノードに対しての検証の実装をルールと呼びます。

textlint-plugin-typst

textlintはデフォルトではTypstの文章ファイル.typをサポートしていません。そこで、TypstのソースコードをtextlintのASTに変換し、textlintでTypstの文章を校正するためのプラグインであるtextlint-plugin-typstを作成しました。

https://www.npmjs.com/package/textlint-plugin-typst

https://github.com/textlint/textlint-plugin-typst

校正の流れ

ここでは実際にtextlintでTypstの文章ファイルを校正する手順を紹介します。

textlintの環境構築

まず、textlintはNode.js製のCLIツールのため、Node.jsが必要です。公式のダウンロードの案内を以下に示します。

https://nodejs.org/en/download

次に、textlintのインストールとセットアップを行います。詳細は以下の公式ドキュメントを参照してください。

https://textlint.github.io/docs/getting-started.html

Typstの文章ファイルを管理しているディレクトリに、Node.jsのプロジェクトのメタデータを管理するファイルであるpackage.jsonと、textlintの設定ファイルである.textlintrc.jsonを作成できたら、次に進みましょう。

最後に、textlintでTypstの文章ファイル.typを扱うためのプラグインを導入します。

npm install --save-dev textlint-plugin-typst

依存関係にtextlint-plugin-typstを追加した後、textlintの設定ファイルの、pluginstypstを追加してください。

.textlintrc.json
{
  "plugins": {
    "typst": true
  },
  "filters": {},
  "rules": {}
}

校正設定の整備

校正ルールは個別に導入できますが、textlintには特定のテーマに沿ってルールをまとめたプリセットというものがあります。日本語向けのプリセットがいくつか提供されているため、最初はこちらの利用を推奨します。

https://github.com/textlint-ja/textlint-rule-preset-ja-technical-writing

https://github.com/textlint-ja/textlint-rule-preset-JTF-style

https://github.com/textlint-ja/textlint-rule-preset-japanese

ここでは一例として、日本語の技術文書向けのルールプリセットであるtextlint-rule-preset-ja-technical-writingの導入を紹介します。

https://www.npmjs.com/package/textlint-rule-preset-ja-technical-writing

依存関係にtextlint-rule-preset-ja-technical-writingを追加した後、textlintの設定ファイルの、rulespreset-ja-technical-writingを追加してください。

npm install --save-dev textlint-rule-preset-ja-technical-writing
.textlintrc.json
{
  "plugins": {
    "typst": true
  },
  "filters": {},
  "rules": {
    "preset-ja-technical-writing": true
  }
}

さらに、特定の箇所で意図的にルールを破りたい場合を考慮して、コメントで指定した範囲のルールの適用を無効化するフィルターのtextlint-filter-rule-commentsの導入を推奨します。

https://www.npmjs.com/package/textlint-filter-rule-comments

依存関係にtextlint-filter-rule-commentsを追加した後、textlintの設定ファイルの、filterscommentsを追加してください。

npm install --save-dev textlint-filter-rule-comments
.textlintrc.json
{
  "plugins": {
    "typst": true
  },
  "filters": {
    "comments": true
  },
  "rules": {
    "preset-ja-technical-writing": true
  }
}

静的解析の実行

以下のTypstの文章を校正する例を紹介します。

main.typ
= textlint for Typst

== sentence-length

あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお。

== max-comma

組版処理システムの例としては、Tex (LaTeX), SATySFi, Typst, Twight, SILEなどがあります。

== max-ten

これは、これは、これは、これは、これはだめ。

== max-kanji-continuous-len

情報処理学会は、電気学会、照明学会、応用物理学会、映像情報メディア学会および電子情報通信学会とともに電気系6学会の1つに数えられる存在です。

== arabic-kanji-numbers

Fibonacci数列の十番目の項は55です。

1時的なファイルは`/tmp`に保存されます。

== no-mix-dearu-desumasu

今日はいい天気ですね。今日はいい天気である。

== no-mixed-period

これは問題ないです。

「これはセリフ」

english only

これは句点がありません

== no-double-negative-ja

それが事件の発端だったといえなくもない。

確かにそういった懸念はない事はない。

== no-dropping-the-ra

お刺身を食べれない。

== no-doubled-conjunctive-particle-ga

今日は早朝から出発したが、定刻には間に合わなかったが、無事会場に到着した。

== no-doubled-conjunction

かな漢字変換により漢字が多用される傾向がある。しかし漢字の多用が読みにくさをもたらす側面は否定できない。しかし、平仮名が多い文は間延びした印象を与える恐れもある。

== no-doubled-joshi

私は彼は好きだ。

== no-nfd

ホ゜ケット エンシ゛ン。

== no-exclamation-question-mark

技術文書では、感嘆符、疑問符は基本的には使用しないでください!

== no-hankaku-kana

半角カタカナを使用しないでください。

== no-weak-phrase

この表現には問題があるかもしれないです。

== no-successive-word

これは問題ない文章です。

これはは問題ある文章です。

これは問題あるある文章です。

== no-abusage

ウインドウ幅が可変すると、レイアウトが崩れる。

今朝起きた事件に法律を適応する。

== no-redundant-expression

これは省略することが可能です。

== ja-unnatural-alphabet

リイr−ス。

== no-unmatched-pair

これは(秘密)です。

textlintで静的解析をするには、textlint [options] [file|dir|glob*]を実行します。ただし、node_modules/で管理されているパッケージを実行するにはnpx <command>とする必要があるため、実際には以下のようなコマンドを実行します。

npx textlint main.typ

textlintを実行すると、以下のような解析結果が得られます。

/path/to/main.typ
    5:39  error    Line 5 sentence length(106) exceeds the maximum sentence length of 100.
Over 6 characters                                         ja-technical-writing/sentence-length
    9:51  error    This sentence exceeds the maximum count of comma. Maximum is 3                                                  ja-technical-writing/max-comma
   13:16  error    一つの文で"、"を4つ以上使用しています                                                                           ja-technical-writing/max-ten
   17:39  error    漢字が7つ以上連続しています: 電子情報通信学会                                                                   ja-technical-writing/max-kanji-continuous-len
   21:13  ✓ error  十番目 => 10番目
数量を表現し、数を数えられるものは算用数字を使用します。任意の数に置き換えても通用する語句がこれに該当します。  ja-technical-writing/arabic-kanji-numbers
   23:1   ✓ error  1時的 => 一時的
慣用的表現、熟語、概数、固有名詞、副詞など、漢数字を使用することが一般的な語句では漢数字を使います。            ja-technical-writing/arabic-kanji-numbers
   27:19  error    本文: "ですます"調 でなければなりません
=> "ですます"調 であるべき箇所に、次の "である"調 の箇所があります: "である。"
Total:
である  : 1
ですます: 12
                                  ja-technical-writing/no-mix-dearu-desumasu
   37:11  error    文末が"。"で終わっていません。                                                                                  ja-technical-writing/ja-no-mixed-period
   41:18  error    二重否定: 〜なくもない                                                                                          ja-technical-writing/no-double-negative-ja
   43:15  error    一文に二回以上利用されている助詞 "は" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- "は"
- "は"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
                    ja-technical-writing/no-doubled-joshi
   43:16  error    二重否定: 〜ないことはない                                                                                      ja-technical-writing/no-double-negative-ja
   47:7   error    ら抜き言葉を使用しています。                                                                                    ja-technical-writing/no-dropping-the-ra
   51:12  error    文中に逆接の接続助詞 "が" が二回以上使われています。                                                            ja-technical-writing/no-doubled-conjunctive-particle-ga
   55:20  error    一文に二回以上利用されている助詞 "が" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- "が"
- "が"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
                    ja-technical-writing/no-doubled-joshi
   55:53  error    同じ接続詞(しかし)が連続して使われています。                                                                  ja-technical-writing/no-doubled-conjunction
   59:4   error    一文に二回以上利用されている助詞 "は" がみつかりました。

次の助詞が連続しているため、文を読みにくくしています。

- "は"
- "は"

同じ助詞を連続して利用しない、文の中で順番を入れ替える、文を分割するなどを検討してください。
                    ja-technical-writing/no-doubled-joshi
   63:2   ✓ error  Disallow to use NFD(well-known as UTF8-MAC 濁点): "ホ゜" => "ポ"                                                ja-technical-writing/no-nfd
   63:10  ✓ error  Disallow to use NFD(well-known as UTF8-MAC 濁点): "シ゛" => "ジ"                                                ja-technical-writing/no-nfd
   67:31  error    Disallow to use "!"                                                                                            ja-technical-writing/no-exclamation-question-mark
   71:3   ✓ error  Disallow to use 半角カタカナ: "カタカナ"                                                                            ja-technical-writing/no-hankaku-kana
   75:12  error    弱い表現: "かも" が使われています。                                                                             ja-technical-writing/ja-no-weak-phrase
   83:8   error    "ある" が連続して2回使われています。                                                                            ja-technical-writing/ja-no-successive-word
   87:8   error    「可変する」という使い方は適切ではありません。「可逆」と同じ使い方になります。
http://qiita.com/scivola/items/f02589968a4ca27bc52b                                  ja-technical-writing/ja-no-abusage
   89:11  ✓ error  "適用"の誤用である可能性があります。適応 => 適用                                                                ja-technical-writing/ja-no-abusage
   93:6   error    【dict1】 "することが可能です"は冗長な表現です。"することが"を省き簡潔な表現にすると文章が明瞭になります。
解説: https://github.com/textlint-ja/textlint-rule-ja-no-redundant-expression#dict1      ja-technical-writing/ja-no-redundant-expression
   97:3   error    不自然なアルファベットがあります: r                                                                             ja-technical-writing/ja-unnatural-alphabet
  101:5   error    Not found pair character for (.
                    
You should close this sentence with ).
This pair mark is called 丸括弧()                                                                         ja-technical-writing/no-unmatched-pair

✖ 27 problems (27 errors, 0 warnings)
✓ 6 fixable problems.
Try to run: $ textlint --fix [file]

ルールによっては自動修正が可能です。自動修正を適用するには、オプションとして--fixを追加します。

npx textlint --fix main.typ
/path/to/main.typ
  21:13  ✔   十番目 => 10番目
数量を表現し、数を数えられるものは算用数字を使用します。任意の数に置き換えても通用する語句がこれに該当します。  ja-technical-writing/arabic-kanji-numbers
  23:1   ✔   1時的 => 一時的
慣用的表現、熟語、概数、固有名詞、副詞など、漢数字を使用することが一般的な語句では漢数字を使います。            ja-technical-writing/arabic-kanji-numbers
  63:2   ✔   Disallow to use NFD(well-known as UTF8-MAC 濁点): "ホ゜" => "ポ"                                                ja-technical-writing/no-nfd
  63:10  ✔   Disallow to use NFD(well-known as UTF8-MAC 濁点): "シ゛" => "ジ"                                                ja-technical-writing/no-nfd
  71:3   ✔   Disallow to use 半角カタカナ: "カタカナ"                                                                            ja-technical-writing/no-hankaku-kana
  89:11  ✔   "適用"の誤用である可能性があります。適応 => 適用                                                                ja-technical-writing/ja-no-abusage

✔ Fixed 6 problems
✖ Remaining 3 problems

自動修正できない箇所は手動で修正しましょう。また、特定の箇所で意図的にルールを破りたい場合は、前述のtextlint-filter-rule-commentsを使用します。

main.typ
== max-comma

// textlint-disable ja-technical-writing/max-comma

組版処理システムの例としては、Tex (LaTeX), SATySFi, Typst, Twight, SILEなどがあります。

// textlint-enable

== max-kanji-continuous-len

/* textlint-disable ja-technical-writing/max-kanji-continuous-len */

情報処理学会は、電気学会、照明学会、応用物理学会、映像情報メディア学会および電子情報通信学会とともに電気系6学会の1つに数えられる存在です。

/* textlint-enable */

ルール違反の箇所が存在しない場合は、textlintの解析は正常終了します。

さらなるtextlintの活用法については有志によって様々な情報が共有されています。適宜ご参照ください。

https://zenn.dev/topics/textlint

おわりに

textlintの静的解析によるTypstの文章の校正についてを紹介しました。この記事がどなたかの参考になれば幸いです。

また、textlint-plugin-typstはまだ発展途上のプロジェクトです。機能の改善提案やバグがありましたら、IssueやPull Requestをお気軽にお寄せください。

https://github.com/textlint/textlint-plugin-typst

Discussion