1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Texでの参照/引用エラーを起こさないために

Posted at

WHY

Texで論文を書くとあるあるなのが参照/引用エラーですよね?
スクリーンショット 2020-01-12 17.45.07.png

論文提出したあとにこれを見つけるととても恥ずかしいです///

そもそも参照/引用エラーって言ってますけど、これ警告レベルなので、ビルドの時に途中で止めてくれないんですよね。
僕はこれエラーレベルでいいと思うんですけど...

そこで、今回はCIで参照/引用エラーを検出してSlackで通知してくれるようにしましょう。

WHAT

今回はCIにはGitHub Actionsを使って、エラーのチェックをしたいと思います。

What is CI / Github Actions?

CI(Continuous Integration)は、細かい頻度でビルドとテストを繰り返し行うことで、コードの品質を保つために用いられます。
CIサービスはCircleCIやTravisなどが有名ですが、昨年GitHubが提供するGitHub Actionsが一般公開されたので今回はこちらを用います。

HOW

前提条件

エンジニアたるもの論文のソースコードもバージョン管理していると思いますが、今回は、git/GitHubで管理されている前提であるとします。

そして、Texのコンパイルにはlatexmkを使いましょう。
platex main && pbibtex main && platex main && dvipdfmx main
とかやってもいいんですが、もっと簡単にlatexmkを使うと、コンパイルが楽になります。
それと、build/に中間/生成ファイルが配置されるのでプロジェクトをきれいに保てます。
一度設定すれば、 latexmk mainだけでコンパイルできますよ。

その設定は、以下のようなファイルをtexプロジェクトに追加するだけ。

.latexmkrc
# !/usr/bin/env perl
# file          .latexmkrc

## latex commands
$latex            = 'pdflatex -synctex=1 -halt-on-error';
$latex_silent     = 'pdflatex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;

## pdf mode
$pdf_mode         = 3; # 0: none, 1: pdflatex, 2: ps2pdf, 3: dvipdfmx

## output directory
$aux_dir          = "build/";
$out_dir          = "build/";

CIの設定

まず、https://slack.com/apps/A0F7XDUAZ-incoming-webhooks からSlackのIncomingWebHooksのURLを取得し、GitHubのリポジトリの設定からSecretsにそのURLを登録しましょう。
スクリーンショット 2020-01-12 17.23.34.png

そして、以下のファイルをコミットしてプッシュしましょう。

.github/workflows/main.yml
name: compile tex

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: paperist/alpine-texlive-ja:latest
      volumes: 
        - .:/workdir
    steps:
      - uses: actions/checkout@v1
        with:
          fetch-depth: 1
      - name: compile 
        run: |
          latexmk main
      - name: check warning
        run: |
          ! grep -e "LaTeX Warning: Reference" -e "LaTeX Warning: Citation" build/main.log
          status=$?
          exit $status
      # ここのコメントアウトを外すと、生成したpdfをArtifactにアップロードしてくれる。(Artifactは上限があるのでおすすめしない。)
      # - uses: actions/upload-artifact@master
      #   with:
      #     name: main.pdf
      #     path: build/main.pdf

      - uses: 8398a7/action-slack@v2
        with:
          status: ${{ job.status }}
          author_name: Github Actions
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: failure()

そうすると、こんなかんじでCIが走ります。
スクリーンショット 2020-01-12 17.26.34.png

今回は、ビルドが失敗した時のみSlackに通知するようにしたので、失敗するとこんなかんじのメッセージが届きます。
スクリーンショット_2020-01-12_17_27_40.png

Conclusion

これでTexのビルドエラーや、参照/引用エラーを含めてエラー時にSlackに通知されるようにできました。
論文執筆はいっつもギリギリで作業してると思うので、エラーチェックの仕組みを作って細かい頻度で修正を加えられると精神的にも安心して執筆できると思います。

卒論や修論、学会論文などの執筆の手助けになれば幸いです。

FYI しくみの説明

コンパイル環境

GitHub Actions の実行環境にはDockerが選択できます。
日本語Texをコンパイルできる環境が https://hub.docker.com/r/paperist/alpine-texlive-ja で提供されているのでこちらを用います。

参照/引用エラーのチェック

参照/引用の警告は、以下の警告になります。

  • LaTeX Warning: Reference {label} on page {page} undefined on input line {line}.
  • LaTeX Warning: Citation {label} on page {page} undefined on input line {line}.

そして、コンパイル時のログがbuild/main.logに吐かれるので、このログファイルに上の警告が含まれるかをチェックすることで、参照/引用エラーを見つけることができます。

! grep -e "LaTeX Warning: Reference" -e "LaTeX Warning: Citation" build/main.log
status=$?
exit $status

grep は見つからなかった時にエラーコードで終了するので、それを反転し終了することで、参照/引用エラー時にCIが失敗するようにしています。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?