UNIX環境で論文執筆する場合のtips

僕が論文とか文書作成する際によく使うツール群と、それぞれのオススメポイントと使う際のtipsのまとめます。ちなみに環境としてはUNIXライクなCUI上での作業を想定してます。

#　使用ツール

+ TeX
+ vim
+ git

# TeX

TeXでやるメリットとしては

+ 図表、節、参考文献の番号振りが自動
+ 数式書くのが楽
+ 色んな設定ウィンドウといったりきたりしなくていい

とか色々あります。TeXに触れたことがなければ[LaTeX入門](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80)を参考に。あとCloudLaTeXなら環境設定しなくてもブラウザ上で出来るしクラウド上にデータ保存できます。でも本記事ではこの話はしません。
ここではTeXの基礎的なことでなく論文で使えるtipsの話をします。

## ファイル分割

論文はおおかた数十頁と長い文書になると思います。数ページ程度なら1ファイルで書いても問題無いでしょうか、数百、数千行という文量になると収集がつかなくなります。そのため章ごとにファイルを分けるのがオススメです。例えば以下のようなファイル構成だとします。

+ thesis.tex (親ファイル)
+ intro.tex （1章　はじめに）
+ related_work.tex (2章　関連研究)
+ ...

このとき親ファイルの中身をこんな感じにします。

```thesis.tex
\include{intro}
\include{related_work}
...
```

`\include{}`というのはファイルを呼び出して改ページする関数です。thesis.texの`include{intro}`の位置にそのままintro.texのソースコードを代入するというイメージです。似たような関数に`input{}`がありますが、これはファイルを呼び出すだけで改ページはしません。そのため表ファイルとしてCSVファイルなどを呼ぶのに使えます。

## Makefile

Makefileを同ディレクトリにおいてシェル上で`$make`と叩けばコンパイルしてくれる便利な奴です。ファイル構成はこんな感じだとします。

+ thesis.tex 親ファイル
+ images/*.pdf 画像ファイル
+ Makefile

実際に使ってるMakefileはこんなです。

```Makefile
FILENAME  = thesis # 親ファイル名
TEX       = $(FILENAME).tex
PDF       = $(FILENAME).pdf
UNAME     = ${shell uname}

all:
	make tex
	make preview
xbb: # 画像ファイル（pdf）のxbbファイルを作る
ifeq ($(UNAME),Darwin)
	extractbb images/*.pdf
endif
clean: # 不要なファイルの削除
	rm *.aux *.dvi *.idx *.ilg *.ind *.log *.out *.toc *~
tex: # コンパイル
	ptex2pdf -l -ot -kanji=utf8 $(TEX)
preview: # PDF 表示
#for Linux
ifeq ($(UNAME),Linux)
	evince $(PDF)
endif
# for MacOSX
ifeq ($(UNAME),Darwin)
	open $(PDF)
endif
```

例えば`$make clean`というコマンドをシェル上で叩くと`clean:`の処理、`$make`で`all:`の処理を行います。他にシェルでやりたい処理があればMakefileを改造するのもアリです。最終的にPDFで出力するため画像もPDF形式にしておくとコンパイルが早いですし、作図システム上でPDF出力すればベクター方式で保存されるはずなので論文上でもキレイな仕上がりになります。

## setcounter

例えば論文作成途中で3章だけ出力したいとき、

```thesis.tex
\setcounter{section}{2}
\section{hoge}
```

でhogeという章の番号が3からはじまります。`\setcounter`について詳しくは[ここ](http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/006.html)を見て下さい。

## マクロ

くわしくは[LaTeX入門/LaTeXマクロの作成](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2FLaTeX%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE%E4%BD%9C%E6%88%90)から。僕の場合は便利な機能を作るというよりは頻繁に使う部分をマクロ化して省略するという使い方です。例えば長い数式で繰り返し使う部分をマクロにしてしまうこと。それから添削で修正した点を赤くする（これは自分のいる研究室特有のシステムですが）ということをよくやるのでこれも短くすむようにしてます。

`\newcommand{\red}{\textcolor{red}}`

これで`\red{hogehoge}`というように囲むことで赤文字にできます。ちなみに`\textcolor`を使うのには`\usepackage{color}`でパッケージを読み込んでおく必要があります。

## おまけ

[redpen](http://redpen.cc/)という自動文書精査ツールがあります。誤字や文法チェックをしてくれるすごい奴です。ただ僕の場合、大体添削とかで指摘されるのは「意味がわかりにくい」「不要な部分がある」とかツールでは分からないようなところが多いので結局使ってません……。
あと文字数制限がある文書を作成するときは簡単なpythonスクリプト作って確認したりしてました。Wordだったらすぐ確認できますが……。
それから句読点を「、。」から「，．」にするのはこんなシェルを使ってます。

```maru2ten.sh
#!/bin/sh
# $ sh maru2ten.sh (ファイル名)
cat $1 | sed 's/。/．/g' | sed 's/、/，/g' > tmp
mv tmp $1
rm -f tmp
```

これも文字入力の設定変えればいい話ですが……。

# Vim

CUI上でやるならvimかemacsが楽です。が、emacsは知見が全く無いので特に言うことはないです。このようなエディタを使うメリットとしては

+ 文字列置換、検索、削除、貼り付けなどが数キーの操作で出来る
+ 繰り返しの処理が楽（例えば「5p」で5回貼り付け、「d5w」で5単語削除）

とかでしょうか、vim使ったこと無い人はvimインストールして`$ vimtutor`を起動してチュートリアルを一通りやってみましょう。慣れると大分早くなると思います。ただ日本語入力は面倒かもしれません。挿入モードになるときに自動的に入力切替する方法とかもあるっぽいですが、アルファベット入力する場合も結構あるのでそこはそんなに工夫してません。

## 行末の空白を消す

`:%s/ *$//`

これでできます。一応説明すると、' *$'が正規表現で「空白を行末まで繰り返してる文字列」という意味で、それを全て空の文字列に置換してます。

## 矩形選択

ノーマルモードのとき「Ctrl + V」でヴィジュアルモードの矩形選択モードになります。矩形選択した部分を削除する、という使い方もありますし、選択してから「Shift + i」し文字入力、「Esc」で複数行に同時書き込みができます。「Shift」と同時押しするキーを「a」「p」などにしても同様に複数行で同じ処理を行うことができます。

## クリップボードからの貼り付け

webページとかPDFとかvim外からコピーしてくるときにそのまま貼り付けるとインデントがズレる場合があります。その時は`:set paste`で貼り付けモードにしてから貼るといい感じになります。

# git

メリットとしては

+ クラウド上に論文データの保存が可能
+ いつ、どのファイルを修正したか？という差分が全て保存される
+ 結果として無駄なファイルが少なく済むし、データが飛ぶこともまずない

とかです。使わない手はない。CloudLaTeX使えばクラウド上への保存が出来ますが、差分の記録をとるためにはgitが必要でしょう。

## bitbucket

gitというとgithubが有名ですが論文ならbitbucketがオススメです。なぜなら非公開リポジトリを使いやすいからです。bitbucketだとアクセスできる人数が5人以下の非公開リポジトリなら作り放題です。論文は基本的に管理する自分一人が見れれば良いのでこれで十分でしょう。githubにもアカデミックプランがあり、加入すれば5つ非公開リポジトリが使えるようになりますが、アカデミックプランへの申し込みはメールを送る必要があり、承認に時間がかかります。（2週間とか？）githubでは公開できるようなもの、bitbucketでは非公開のものを置くという使い方が良いかなと思います。

## alias

gitconfig中で以下のように書くと、シェルコマンドの短縮ができます

```~/.gitconfig
[alias] 
	aa = add -A
	co = checkout 
	cm = commit -m 
	st = status
	br = branch
```

## grep

もともとシェルにgrepコマンドがありますが、「git grep」でローカルリポジトリ内の文字列検索が楽にできます。

# おわりに

正直どのツールにしても自分が使いこなせてるとは言い切れないですし、初歩的な内容ですが、この辺のツールは自分で色々設定を変えれて楽しいしオススメです。便利情報があればコメントして頂けると嬉しいです。