TeXの表記揺れをCIで自動チェックする


TeXの表記揺れをCIで自動チェックする

背景

大学のプロジェクト学習という科目の講義で、プロジェクトの報告書を成果物として提出する必要があるため、TeXを用いて複数人で報告書を作成しています。

プロジェクト人数が30人を超え、報告書のページ数も100ページほどあるため、人力で表記揺れをチェックするのはすごく大変です。そのため、今回CIを用いて表記揺れチェックの作業を自動化してみました。

tl;dr

作ったもの: https://github.com/natmark/TeX-Textlint

環境

Mac OS X El Capitan 10.12.4
Node.js 6.9.1
npm 3.10.8

 システム構成

GitHubでTeXファイルを管理し、編集分をPushしてプルリクエストを作成する流れにしました。
プルリクエスト作成時にTravis CIのチェックを入れるようにしています。

ファイル構成

TeX-Textlint
├── .travis.yml    # travis CIの設定用ファイル
├── .textlintrc    # textlintの設定用ファイル
├── main.tex       # TeXファイル
├── package.json   # パッケージ管理用のファイル
└── prh.yml       # 文章チェック用のルールファイル

実装

.travis.yml
language: node_js
os: osx
node_js:
    -   "6"
before_script:
    -   npm install
script:
    -   npm run --silent textlint-check
cache:
    directories:
        -   node_modules

TravisCIの準備はこのあたりを参考にしてください

.textlintrc
{
    "rules" : {
        "prh": {
            "rulePaths": [
                "./prh.yml"  //ルールファイルのパス
            ]
        }
    }
}
package.json
{
  "name": "tex-textlint",
  "version": "1.0.0",
  "description": "TeX auto calibration using textlint + prh",
  "main": "index.js",
  "config": {
          "texpath": "main.tex" //チェック対象ファイルのパス
  },
  "scripts": {
    "textlint-check": "cp ${npm_package_config_texpath} output.txt && $(npm bin)/textlint output.txt && { rm output.txt ; exit 0 ; } || { rm output.txt ; exit 1 ; }",
    "textlint-fix": "cp ${npm_package_config_texpath} output.txt && $(npm bin)/textlint --fix output.txt && cp output.txt ${npm_package_config_texpath} && { rm
output.txt ; exit 0 ; } || { rm output.txt ; exit 1 ; }"
  },
  "author": "",
  "devDependencies": {
    "textlint": "^8.2.1",
    "textlint-rule-prh": "^4.0.1"
  }
}

npm(Node Package Manager)を用いて、プレーンテキストとMarkdownファイルのチェックが行えるtextlintと、textlintから校正補助ツールのprhを使用するためのプラグインであるtextlint-rule-prhをインポートしています。

TeXファイル

main.tex
\documentclass{article}

% 年度の指定
\thisYear{2017}

% プロジェクト名
\jProjectName{サンプルプロジェクト}

% 1.0.1
\subsection{開発体制}
今年度はアプリ班とサーバ班に分かれて開発を行った. また, 開発と並行してビジネスモデルを考案するビジネス班を設置した.

\bunseki{田中}

% 2.0
\section{役割設定}
% 2.1.1
\subsection{プロジェクトリーダーの役割}
プロジェクトリーダは, プロジェクトが円滑に進むように, スケジュールの作成やタスク管理等を行なう.
\bunseki{佐藤}

% 2.2.1
\subsection{アプリケーション開発班の役割}
アプリケーション班は, ios班とandroid班に分かれて作業を行った. 前期はiOS班はSwiftの勉強, Android班はKotlinの勉強をメインに行った.
\bunseki{高木}

% 2.2.2
\subsection{サーバ班の役割}
サーバ班はAPI設計の勉強及び、 Ruby on Railsの勉強をメインに行った。
\bunseki{山田}

% 2.2.3
\subsection{ビジネスモデル班の役割}
ビジネスモデル班では, 既存アプリの調査をメインに行った.
\bunseki{加藤}

上記のようなサンプルを用意しました。

ルールファイル

prh.yml
# prh version
version: 1
rules:
    # よくある表記揺れ
    - expected: "アプリケーション"
      patterns:
          - "アプリ(?!ケーション)" # 正規表現も使える

    - expected: "iOS"
      patterns:
          - "IOS"
          - "ios"

    - expected: "リーダー"
      patterns:
          - "リーダ(?!ー)" # 正規表現も使える

    # 句読点
    - expected: ","
      patterns:
          - "、"
          - ","

    - expected: "\\."
      pattern: "。"

YAMLでルールを記載します。
基本的には

  • expected に統一する文字
  • patterns に表記揺れしている文字セット

を記載すればOKです。

特殊なルール

- expected: "リーダー"
    patterns:
         - "リーダ"

みたいなルールは実行するたびにリーダリーダーに置換しようとするので、
リーダーーーーーーーーーーー(ry状態になってしまう。

正規表現が使えるので

- expected: "リーダー"
    patterns:
         - "リーダ(?!ー)" # 「リーダ」の後ろに伸ばし棒がなければ「リーダー」に置換

とする必要があります。

詳しいルールの例としては下記を参考にしてください。

プルリクエストを投げてみる

Detailsから、CIのチェック状況を確認できます。

もしエラーがあれば、上の画像のように、linter errorが表示され、Travisのビルドが通らないようになっています。

エラー部分を修正して、再度Pushを行なうと

ビルドが通るようになります。

自動チェックと自動校正

ローカル環境で自動チェックと自動校正ができます。

node.jsが必要なので、自分の環境になければ $brew install nodeを使用して、node.jsをインストールしてください。

$ cd TeX-Textlint # プロジェクトフォルダに移動
$ brew install node # node.jsが必要
$ npm install # ライブラリの導入

自動でチェックする場合

textlint-checkコマンドを使用することで, prh.ymlのルールに沿って自動チェックができます

$ npm run --silent textlint-check # 自動チェックする場合

自動で修正する場合

textlint-fixコマンドを使用することで, prh.ymlのルールに沿って自動校正ができます.

$ npm run --silent textlint-fix # 自動校正する場合

まとめ

TeXを複数人で書いている環境で、「うちはこうしてるよ!」というのがあればぜひ教えてください😊