結果に git commit する

つよいエンジニアのブログ

【Mac向け】ソフトウェアエンジニアから見た卒論執筆環境

はじめに

先日、大学の卒業論文を書き終えました。
高専時代にも卒業論文を書いていますが、そのときからの成長は研究データの管理や執筆環境の運用レベルが上がったことくらいでした。
ソフトウェアエンジニアとして仕事をしていることが良くも悪くも卒業論文に影響した感じですね。
せっかくなのでその卒論執筆環境をブログにまとめておきます。

まとめ

最後まで読んで「なんだそれだけか」とならないように、先に何をやったかまとめておきます。

  • LaTeXとGitを使ってバージョン管理した
  • Dockerを使って環境構築を楽にした
  • 自動でタイプセットしてくれるようにした
  • Google ScholarBibTexを使って参考文献の管理を楽にした
  • 使い慣れているエディタを使った
  • CircleCIを使って論文を自動で配布するようにした(していない)

やったこと

それではここから、何をやったか説明していきます。

LaTeXとGitを使ってバージョン管理した

ソフトウェア開発にはバージョン管理は欠かせないものです。
論文の執筆にもバージョン管理を導入すると、過去の時点に戻すことができたり、共著であれば共同作業が簡単にできたりします。

そこで、Gitを使ってバージョン管理を行いました。
また、Gitを使ってバージョン管理をするにはテキストファイルが好ましいため、LaTeXで論文を書きました。
さらに、バックアップのためにGitHubなどにPushしておくと、もし作業中のファイルを失うことがあっても、最後にGitHubにPushした時点に復帰することができたりもします。

Dockerを使って環境構築を楽にした

ソフトウェア開発では、環境構築を楽にするために(もちろんそれだけではありませんが)Dockerがよく利用されます。
また、LaTeXの環境構築はいろいろインストールしないといけなくて結構大変なものです。

そこで、LaTeX環境がすでに整っているDockerイメージを利用することで環境構築の手間をほぼゼロにしました。
幸いなことに、そのようなDockerイメージを公開してくれている方がいるので、圧倒的感謝をしながらそれを利用させていただきました。
どのように利用したかは次節で話します。

github.com

自動でタイプセットしてくれるようにした

ソフトウェア開発では、開発を円滑に進めるために、ファイル保存をトリガーにコード整形やコンパイルなどの様々な処理が行われるように設定することがよくあります。
論文執筆でも、TeXファイルの保存をトリガーに自動でタイプセットを行い、PDFファイルを生成してくれるようにすると書いたものがすぐに見れてとても良いです。

そこで、ファイルの変更を監視して自動でタイプセットしてくれるlatexmkを利用しました。
latexmkは先程のDockerイメージに入っているのでそのまま利用できます。
また、タイプセットする前に句読点を変換(「、。」→「,.」)してくれるようにしました。
具体的には、

#!/usr/bin/env perl
$pdf_mode         = 3;
$latex            = 'ls *.tex chapters/*.tex | xargs sed -i "" -e "s/。/./g; s/、/,/g"; uplatex -halt-on-error';
$latex_silent     = 'uplatex -halt-on-error -interaction=batchmode';
$bibtex           = 'upbibtex';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';

というファイルを.latexmkrcという名前で保存し(chapters/とかのディレクトリ構成は僕の環境のものなので適宜変えてください)、

docker pull paperist/alpine-texlive-ja

を実行してDockerイメージをダウンロードしたあと(dockerコマンドは必要であればインストールしてください)、

version: "3"
services:
  tex:
    container_name: tex
    image: paperist/alpine-texlive-ja
    volumes:
      - ./:/workdir
    command: latexmk -pvc main.tex

というファイルをdocker-compose.ymlとして保存して、

docker-compose up

を実行するとmain.texというTeXファイルがタイプセットされ、PDFが出力されます。
実行したままにしておくとTeXファイルを変更して保存するたびにタイプセットとPDF生成が行われます。
Ctrl+Cを押すとそれを停止することができます。

Google ScholarBibTexを使って参考文献の管理を楽にした

ソフトウェア開発では、見通しを良くするためなどのためにファイルを分割したりすることがよくあります。
論文執筆でも、章ごとにファイルを分けたり、参考文献を別ファイルに分けたりすると、執筆が楽になります。

そこで、章ごとにファイルを分けてメインのTeXファイルから読み込むようにしました。
また、参考文献はBibTexを利用して別ファイルで管理し、体裁を自動で整えてくれるようにしました。

具体的には、introduction.texとかのファイルを

\begin{document}

	\input{chapters/introduction.tex}

\end{document}

のようにmain.texから読み込むようにして、章の内容はintroduction.texに書くようにしました。
また、main.bibというファイルに参考文献の情報を書いて、

\begin{document}

	\input{chapters/introduction.tex}

	\bibliography{main}
	\bibliographystyle{junsrt}

\end{document}

とすると自動的に体裁を整えた参考文献ページを作ってくれます。
どのように文献の情報を書けばいいかですが、Google Scholarというページで文献を検索し、検索結果の文献の下にあるダブルクオーテーションマークをクリックしてBibTexを選択して表示される情報をそのままコピペして、それを論文中で参照するだけでOKです。
例えばこんな感じのが表示されます。

@inproceedings{le2018persistence,
  title={Persistence fisher kernel: A riemannian manifold kernel for persistence diagrams},
  author={Le, Tam and Yamada, Makoto},
  booktitle={Advances in Neural Information Processing Systems},
  pages={10028--10039},
  year={2018}
}

使い慣れているエディタを使った

ソフトウェア開発では、開発者それぞれが使い慣れたエディタを使えるように、開発環境をエディタに依存しないようにすることがよくあります。
論文執筆でも、普段使い慣れたエディタにTeXの補完とかをしてくれるプラグインを入れて執筆したほうが楽になると思います。

といっても特にすることはなく、ここまで説明してきたことをやっていれば自然とどのエディタでも問題ないような環境になっているはずです。

CircleCIを使って論文を自動で配布するようにした(していない)

ソフトウェア開発では、開発した製品を自動的にテストしたり配布したりするように設定することがよくあります。
論文執筆でも、ある程度まで完成した論文を研究室の方々に見ていただくための配布を自動化できると嬉しいことがあるかもしれません。

そこで、CircleCIなどのCIツールをGitHubと連携し、masterブランチにマージされたときにPDFを生成して研究室のSlackなどに共有されるように自動化すると良いかもしれません(僕は執筆期間が短いのでやりませんでした)。
もし英語論文なのであれば、スペルチェックなどをCIで行うことも良いと思います。
僕がやっていないので具体的な方法は他のブログなどを見ていただければと思いますが、latexmkでタイプセットしてPDFファイルを生成し、そのファイルをSlack APIを使ってSlackに投稿するようにCIのジョブを組めばできると思います。

おわりに

今回は、ソフトウェアエンジニアとして働く中で学んだ概念を論文執筆にも応用する形で(こじつけながら)論文執筆環境を構築する方法を紹介しました。
大きくは、

  • 普段の環境を汚さない
  • 構築と運用が楽
  • 再利用性が高い

という3つの点を意識した感じになります。
皆さんの論文執筆に役に立てば幸いです。