📄
卒論をLateXで書くあなたへ
LateXを急に書くことになったあなたへ。
卒論をLateXで書かなければならなくなった人、そして卒論の誤字脱字とか内容チェックを効率化したい人向けに
本記事を作成しました。
使用するツールについて
使用ツール名 | 役割 |
---|---|
Textlint | GPTを通すまでもないような文字の簡潔なチェック |
GPT-4o-mini | LLMからの文章チェックにより得られる内容の改善提案 |
GitHub Actions | 別ブランチからのPull Request作成時に上記2つの自動起動 |
GitHub Actionsを定義
GitHub Actionsがわからない人向けのざっくりした説明
GitHubに対するイベント(Push・PRなど)が発生したら
ymlファイルで定義した処理が自動的に実行されるもの。
GitHubに自動で以下の要件のプログラムを動かしてもらいましょう。
-
Textlintで簡単な文字の誤りのチェック
-
GPTに文章のチェックをさせる
どういうことをチェックさせるといいか
- 現在の内容における不足点
- より理解がしやすくなる方法の提案
- 追加すべき図表や視覚的要素の提案
- 誤字脱字の指摘
- (Optional)GPTにどのような追加をすればより良くなるかアドバイスをもらう
どういうアドバイスをもらえばいい?
- 事例やデータの引用の提案
- 足りないデータを補う参考URLや参考書籍などの紹介
- 全体の構成をより論理的にするための改善の提案
Actionsを書いていくぞ~!
llm-review.yml
name: GPT Checker
# Texファイルに変化があるPRのみ動作
on:
pull_request:
paths:
- "*.tex"
jobs:
# まずは軽い誤字脱字のチェック
linter:
name: linter
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true # SubModules管理しているものがあっても動くように
- uses: tsuyoshicho/action-textlint@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-revirew
level: warning
textlint_flags: "*.tex"
# もうちょいレベル高めの修正アドバイスをもらう
gpt-review:
needs: linter
runs-on: ubuntu-latest
steps:
- uses: anc95/ChatGPT-CodeReview@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# Optional
LANGUAGE: Japanese
MODEL: gpt-4o-mini
PROMPT: "LateX 文書をレビューし、どのように修正すればいいか指摘してください。\n\n$(cat check_list.txt)"
top_p: 1
temperature: 1
INCLUDE_PATTERNS: "*.tex"
# より内容を充実させるためのアドバイスをもらう
gpt-advice:
needs: gpt-review
runs-on: ubuntu-latest
steps:
- uses: anc95/ChatGPT-CodeReview@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# Optional
LANGUAGE: Japanese
MODEL: gpt-4o-mini
PROMPT: "LateX 文書をレビューし、以下の項目\n\n$(cat upgrade_list.txt)\n\n についてアドバイスをください。"
top_p: 1
temperature: 1
INCLUDE_PATTERNS: "*.tex"
必要なファイル
ファイル名 | 設置場所 | 役割 |
---|---|---|
llm-review.yml |
リポジトリ上の.github/workflows/ ディレクトリ |
PR作成時の Actions定義 |
check_list.txt |
リポジトリの ルートディレクトリ |
GPTに伝える チェック内容を書いておく |
upgrade_list.txt |
リポジトリの ルートディレクトリ |
GPTに伝える 内容を充実させる アドバイスの項目を 書いておく |
.textlintrc |
リポジトリの ルートディレクトリ |
Textlintが実行される時の 設定ファイル |
prh.yml |
リポジトリの ルートディレクトリ |
ルールベースの文字チェックと 置替え対象のデータの定義ファイル |
表の下2ファイルの設定例
{
"plugins": [
"latex2e"
],
"rules": {
"prh": {
"rulePaths": [
"./prh.yml"
]
},
"preset-ja-technical-writing": {
"sentence-length": {
"max": 100
},
"max-kanji-continuous-len": {
"max": 6,
"allow": [
"株式会社丸丸丸丸社",
"丸丸県立丸丸大学"
]
},
"no-mix-dearu-desumasu": {
"preferInHeader": "である",
"preferInBody": "である",
"preferInList": "である",
"strict": true
},
"ja-no-mixed-period": {
"periodMark": ".",
"allowPeriodMarks": [],
"allowEmojiAtEnd": false,
"forceAppendPeriod": true
},
"no-double-negative-ja": true,
"no-dropping-the-ra": true,
"no-doubled-conjunctive-particle-ga": true,
"no-doubled-conjunction": true,
"no-exclamation-question-mark": true,
"ja-no-weak-phrase": true,
"ja-no-successive-word": true,
"ja-no-abusage": true,
"ja-no-redundant-expression": true,
"no-unmatched-pair": true
},
"preset-japanese": true,
"ja-space-between-half-and-full-width": {
"space": "always"
},
"no-mixed-zenkaku-and-hankaku-alphabet": true,
"max-comma": {
"max": 4
},
"@textlint-rule/no-invalid-control-character": true,
"textlint-rule-spellcheck-tech-word": false
}
}
prh.yml
version: 1
rules:
- expected: ","
pattern:
- "、"
- ","
allow:
- "[0-9],[0-9]"
- expected: したがって
pattern: なので
- expected: ゆえに
pattern: なので
# こっちを採用
- expected: 多数
pattern: たくさん
# - expected: 複数
# pattern: たくさん
- expected: である
pattern: です
- expected: した
pattern: ました
- expected: する
pattern: します
終わりに
これをより良いものにしたい場合は、ご自身で自由に手を加えてください。
Texで色々しないといけないのは初心者には高いハードルで、まずそれに慣れるまで苦労するかもしれませんが、
文章チェック位はこれで自動化できます。
問題があるとすれば、この方法にはGPTのAPIを使う以上少しお金がかかりますが、4o-miniであればそれも比較的安く済むので、「LLMのAPIって使うの高そうで怖いな」という方も、これを気に使ってみてはどうでしょうか
Discussion