Typstの文章をtextlintで校正する
はじめに
Typstは、書籍や論文の執筆、プレゼンテーションやポスターの作成など、さまざまな文章の作成に利用できます。これらの組版の際には、文章の構造や表現のスタイルを統一することが重要です。しかし、人間が常に文章スタイルの統一に気を配るのは難しく、こうした運用は表記揺れの原因になり得ます。そこで、この記事ではtextlintの静的解析によるTypstの文章の校正について紹介いたします。
textlintとは
textlintはMarkdownなどのテキスト向けの静的解析ツールです。ESLintの影響を強く受けており、自然言語の校正の難しさを拡張可能なルールによって解決しようとしている点が特徴です。
textlintは解析対象のソースコードをフォーマットに対応するparserによってパースし、抽象構文木(AST)を生成します。そして、抽象構文木の各ノードについてルールを検証し、違反があれば警告します。
ソースコードのフォーマットに対応するparserを提供するものをプラグイン、ノードに対しての検証の実装をルールと呼びます。
textlint-plugin-typst
textlintはデフォルトではTypstの文章ファイル.typ
をサポートしていません。そこで、TypstのソースコードをtextlintのASTに変換し、textlintでTypstの文章を校正するためのプラグインであるtextlint-plugin-typstを作成しました。
校正の流れ
ここでは実際にtextlintでTypstの文章ファイルを校正する手順を紹介します。
textlintの環境構築
まず、textlintはNode.js製のCLIツールのため、Node.jsが必要です。公式のダウンロードの案内を以下に示します。
次に、textlintのインストールとセットアップを行います。詳細は以下の公式ドキュメントを参照してください。
Typstの文章ファイルを管理しているディレクトリに、Node.jsのプロジェクトのメタデータを管理するファイルであるpackage.json
と、textlintの設定ファイルである.textlintrc.json
を作成できたら、次に進みましょう。
最後に、textlintでTypstの文章ファイル.typ
を扱うためのプラグインを導入します。
npm install --save-dev textlint-plugin-typst
依存関係にtextlint-plugin-typstを追加した後、textlintの設定ファイルの、plugins
にtypst
を追加してください。
{
"plugins": {
"typst": true
},
"filters": {},
"rules": {}
}
校正設定の整備
校正ルールは個別に導入できますが、textlintには特定のテーマに沿ってルールをまとめたプリセットというものがあります。日本語向けのプリセットがいくつか提供されているため、最初はこちらの利用を推奨します。
ここでは一例として、日本語の技術文書向けのルールプリセットであるtextlint-rule-preset-ja-technical-writingの導入を紹介します。
依存関係にtextlint-rule-preset-ja-technical-writingを追加した後、textlintの設定ファイルの、rules
にpreset-ja-technical-writing
を追加してください。
npm install --save-dev textlint-rule-preset-ja-technical-writing
{
"plugins": {
"typst": true
},
"filters": {},
"rules": {
"preset-ja-technical-writing": true
}
}
さらに、特定の箇所で意図的にルールを破りたい場合を考慮して、コメントで指定した範囲のルールの適用を無効化するフィルターのtextlint-filter-rule-commentsの導入を推奨します。
依存関係にtextlint-filter-rule-commentsを追加した後、textlintの設定ファイルの、filters
にcomments
を追加してください。
npm install --save-dev textlint-filter-rule-comments
{
"plugins": {
"typst": true
},
"filters": {
"comments": true
},
"rules": {
"preset-ja-technical-writing": true
}
}
静的解析の実行
以下のTypstの文章を校正する例を紹介します。
= 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を使用します。
== 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の活用法については有志によって様々な情報が共有されています。適宜ご参照ください。
おわりに
textlintの静的解析によるTypstの文章の校正についてを紹介しました。この記事がどなたかの参考になれば幸いです。
また、textlint-plugin-typstはまだ発展途上のプロジェクトです。機能の改善提案やバグがありましたら、IssueやPull Requestをお気軽にお寄せください。
Discussion