分割TeX ファイルをdocmute を用いて単体/統合 コンパイルする

TeX を用いて卒論や修論などの膨大な文章を作成するとき，章や節ごとにファイルを適宜分けて作成する方が取り組みやすい．ここでは，その方法を **具体的に** 紹介していきたい．

>※ かなり初級者向けの構成になっています．だらだらとしたものとなっていることをご了承ください．
> 簡略版を書き直しました：[docmute で簡単にTeX を分割 - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/93e58d2f351f24fcf0ea)


# ○ はじめに
この記事の意義を補強する意味でも，1つの大きなファイルで作成するデメリットを挙げておく．以下のようなものだ．

* エラーが出た際に，修正箇所がどこか分からない．
* 逐次のコンパイルに大きな負荷がかかり時間がかかる．
* ファイルが壊れたらすべてが終わる．
* chapter などの構成を変更しづらい．

このようなデメリットは，ファイルを分割して作成することで解決することが出来るのだ．(もちろん，バックアップは重要！)

ここでは，`docmute.sty`を用いた分割ファイルの統合を考えてみる．

>`docmute.sty`は，以下から取得することが出来る．（TeXLive 2020には収録されていた）
>[https://ctan.org/tex-archive/macros/latex/contrib/docmute](https://ctan.org/tex-archive/macros/latex/contrib/docmute)

このパッケージを取り込まなくても， `\input` や `\include` をすれば子ファイルを読み込むことが出来るが，子ファイルを単独でコンパイルすることは出来ない．しかし，`docmute.sty` は子ファイルをコンパイルすることも可能になる．これは，担当教員に逐次見せる際にchapter ごとに出力することが出来て楽でもある．


# ○ 準備

具体例を用いながら使い方を解説していきたいので，それぞれのファイルについて説明しておく．

4つのtexファイル`title.tex`，`summary.tex`，`main.tex`，`reference.tex`を子ファイルとし，親ファイル`master.tex`によって統合することを考える．

各ファイルの概略を示す．

````TeX:master.texの外観
master.tex       ->全体を統合してコンパイルする．
  ├── title.tex       ->表紙を作る．
  ├── summary.tex     ->概要を作る．
  ├── main.tex        ->本文を作る．
  └── reference.tex   ->参考文献を作る．
````
この資料で示す`docmute.sty` の活用法は一例であり，やりやすいようにやり替えてもらった方が良いと思われる．

# ○ docmute パッケージの仕様

`docmute.sty` は， `\input` する子ファイルの `\begin{document}` から `\end{document}` の中のみを読み，プリアンブルを無視することのできるパッケージである．

したがって，編集中には必要だが完成版には必要のないパッケージを導入することも出来る．

# ○ プリアンブルの設定

プリアンブルにはさまざまなパッケージを読み込むことになるが，親ファイルと子ファイルで異なるパッケージを読み込ませていると統合できないことがある．したがって，自作のsty ファイルを作成しプリアンブルを簡略化しておくことで問題を回避することが出来る．

子ファイルが導入しているパッケージを親ファイルが包含していれば問題ないはずだが，一部，複数のstyファイルがケンカする場合があるので，同一のパッケージを導入しておいた方が良い．


以下のように自作sty ファイルを作成し，親ファイルと子ファイルの両方に同じパッケージを導入しておくと良い．このsty ファイルは，編集中のtex ファイルと同じディレクトリ(フォルダ)に入れておくか，LaTeX が分かるlocal に保存しておくとよい．~~（あまりよく分かっていないので，これはうまい言い訳です．下のリンクを参照してlocal に保存してください．）~~

>**【 自作sty ファイルのlocal への保存 】**
>自作sty ファイルは以下のlocal に保存し，mktexlsr でls-R を更新する．
>C:\texlive\texmf-local\tex\latex\local
>分からなければ，編集中のtex ファイルと同じフォルダに入れておけばよい．
>**参照：以下のサイトが分かりやすくて良かった**
>[styファイルを置く場所・置いた後にすること - 粗大メモ置き場](https://ossyaritoori.hatenablog.com/entry/2016/10/13/032502)


自作sty ファイルの中身は以下のようにすればよい．このsty ファイルには`master.tex`で必要なパッケージを取り込んでおく．
子ファイルのみに取り込みたいパッケージは生に取り込むか，子ファイル用のsty ファイルを作成するとよい．今回は，前者のように組んでいる．

```TeX:mypackage.sty
\usepackage[uplatex]{otf}	%uplatex のオプションの指定が必要
\usepackage[left=25mm,right=25mm,top=30mm,bottom=30mm]{geometry}
\usepackage{xparse}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}	%amsmath 依存
\usepackage{physics}	%amsmath, xparse 依存
\usepackage{graphicx}	%dvipdfmx ドライバ依存
\usepackage{xcolor}	%dvipdfmx ドライバ依存
\usepackage{array}
\usepackage{float}
\usepackage{hyperref}	%dvipdfmx ドライバ依存
\usepackage{pxjahyper}	%hyperref の日本語支援
% and more...
````

上のパッケージは，いま実際に自分で使用しているパッケージになっている．実際には，各々が使用するパッケージに変更してほしい．[^sty]
[^sty]: ちょっと昔のちょっと良くない感じのパッケージを並べていたような気がしたので変更しました．


sty ファイルは，texファイルの拡張子を.styに変更することによって得られる．
　**例：mypackage.tex  →  mypackage.sty**

この自作sty ファイルをtex ファイルのプリアンブルで `\usepackage{mypackage}` とすれば，`mypackage.sty`内のパッケージをすべて取り込むことが出来る．また，ここに自作コマンドを入れておいても良い．そのほか，ドキュメントクラスの設定変更を含ませておいても良い．**各ファイルで同じプリアンブルの内容はすべて自作sty ファイルにまとめてしまおう．**

# ○ 自作コマンド

自作のコマンドや自作の環境を用いる場合がある．これはプリアンブルに書くことが多いので，`mypackage.sty`内に入れておいても良いが，非常に多い場合には，分けておいた方が勝手が良いように思う．別のsty ファイルとして保存してしまおう．

`mycommand.sty`として，このsty ファイルの中に自作コマンドを書き入れる．これを`mypackage.sty`に　`\usepackage{mycommand}` で取り込めば良い．改めて，`mypackage.sty`を表すと以下のようになる．

````TeX:mypackage.sty
\usepackage[uplatex]{otf}	%uplatex のオプションの指定が必要
\usepackage[left=25mm,right=25mm,top=30mm,bottom=30mm]{geometry}
\usepackage{xparse}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}	%amsmath 依存
\usepackage{physics}	%amsmath, xparse 依存
\usepackage{graphicx}	%dvipdfmx ドライバ依存
\usepackage{xcolor}	%dvipdfmx ドライバ依存 / color パッケージを包含している
\usepackage{array}
\usepackage{float}
\usepackage{hyperref}	%dvipdfmx ドライバ依存
\usepackage{pxjahyper}	%hyperref の日本語支援
\usepackage{mycommand}    %%自作コマンド
% and more...
````

**自作コマンドのsty ファイルは，最後に取り込むことに注意する**
~~あまり多くの自作コマンドを作るのはオススメしない．物理系であれば`physics`でだいたいは対応できるだろう．~~

# ○ それぞれのファイルの具体例
具体的にどのように作成していくのか示していく．

## ■ 親ファイル (master.tex)


ここでの目標として以下の項目を挙げておく．


* 分割したファイルを統合する．
* 章ごとにページ番号を変更する．具体的には，

 + title：ページ番号なし
 + summary，目次：ローマン体のページ番号，i～
 + main：アラビック体のページ番号，1～
 + reference：ローマン体のページ番号，i～


以下に`master.tex`のコマンドラインを示す． `\input{}` の括弧内に子ファイルのファイル名(拡張子は除く)を入れる．

````TeX:master.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{docmute}
\usepackage{mypackage}
\mathtoolsset{showonlyrefs=true}

\begin{document}
    \input{title}       %%タイトル
  \thispagestyle{empty}
  \clearpage
  \restoregeometry
\pagenumbering{roman}
    \input{summary}     %%サマリー
  \tableofcontents
  \clearpage
\pagenumbering{arabic}
    \input{main}        %%メイン
    %%以下，\input{hoge}としていけば良い．
\clearpage
\pagenumbering{roman}
   \input{reference}   %%リファレンス
\end{document}
````
`main.tex`は，`main1.tex`，`main2.tex`......というように，chapter ごとに分けるなどして，編集すると良い．順番は， `\input` した順になる．

`main.tex`では，相互参照が子ファイルを渡って参照することが出来る．子ファイルをまたぐような相互参照は，参照が適切になっているか出力結果を確認することを薦める．

## ■ 子ファイル (title.tex)

一例として表紙のページのコマンドラインを記しておく．

<details><summary>title.tex の一例 (折りたたみ)</summary>
<div>

````TeX:title.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{mypackage}

\begin{document}
\newgeometry{top=80mm}
\begin{center}
\fontsize{30pt}{40pt}\selectfont{%% タイトル

\\}
\vspace{60mm}
\fontsize{15pt}{20pt}\selectfont{%% 所属

\\}
\vspace{10mm}
\fontsize{15pt}{20pt}\selectfont{%% 学籍番号

\\}
\vspace{10mm}
\fontsize{20pt}{40pt}\selectfont{%% 氏名

\\}
\vspace{15mm}
\fontsize{15pt}{20pt}\selectfont{%% 日付
\today
\\}
\end{center}
\end{document}
````
</div>
</details>
 `\maketitile` で表紙を作成する場合は，このファイルを `\input` せずに`master.tex`に入れればよい．

## ■ 子ファイル (summary/main/reference.tex)

これらのtex ファイルは独自にコンパイル可能である．chapter やsection の設定や目次の表示等は分割していない場合と同様の設定を行えばよい．

ここに`master.tex`のように子ファイルを `\input` させても，`master.tex`に反映される．

したがって，`main.tex`にも`docmute.sty`を取り込めば親ファイルとして，節や項ごとに子ファイル (`master.tex`にとっては孫ファイル) の作成が可能である．(入れ子が可能)


子ファイル単独でコンパイルした場合，chapter やsection は1から開始されるが，統合する際には連番となるので気にしなくても良い．

````TeX:hoge.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{mypackage}
\mathtoolsset{showonlyrefs=fault}
\usepackage[inline]{showlabels}

\begin{document}
\chapter{hogehoge}
\section{hoge}
hoge
% and more......
\end{document}
````

今回の例での良いところは，

* 分割ファイルも子ファイル単独でコンパイルすることが出来る．
* `showlabels.sty` を含むことで，編集中は相互参照のラベル名を表示させることが出来る．(子ファイルのみ取り込んでいる．)
* 式番号はすべて表示させている．(ただし，`master.tex`では相互参照している数式のみ表示させている．(`mathtools.sty`によるもの))

相互参照によるラベル付けは，それぞれの子ファイルをまたぐような場合，子ファイル単独でコンパイルしたときには有効ではないが，`master.tex`をコンパイルするときには有効になる．

## ■ `docmute.sty` を用いたTeX の例

上で示した形を改めて，卒論でそのまま使えるような形式で書いています．中に書いてある数式等の相互参照がどのようになるか試してみると面白いかもしれません．
適当にコピペして試してみてください．

<details><summary>`mypackage.sty` の一例 (折りたたみ)</summary>
<div>

```TeX:mypackage.sty
%%パッケージ%%
\usepackage[uplatex]{otf}	%uplatex のオプションの指定が必要
\usepackage[left=25mm,right=25mm,top=30mm,bottom=30mm]{geometry}
\usepackage{xparse}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}	%amsmath 依存
\usepackage{physics}	%amsmath, xparse 依存
\usepackage{graphicx}	%dvipdfmx ドライバ依存
\usepackage{xcolor}	%dvipdfmx ドライバ依存 / color パッケージを包含している
\usepackage{array}
\usepackage{float}
\usepackage{hyperref}	%dvipdfmx ドライバ依存
\usepackage{pxjahyper}	%hyperref の日本語支援
%%%
%%自前コマンド
\usepackage{mycommand}
%%%
\renewcommand{\bibname}{参考文献}
%%hyperrefの設定オプション%%
\hypersetup{
	colorlinks=true,
	linkcolor=red,
	urlcolor=cyan,
	%pdrborder={0 0 0}
}
%%%

```

</div>
</details>

<details><summary>`mycommand.sty` の一例 (折りたたみ)</summary>
<div>
ここでは，ベクトルを太字にするコマンドを定義している．

```TeX:mycommand.sty
%%自作コマンド
%数式モードで太文字にする
\def\ve#1{\mbox{\boldmath$#1$}}
```

</div>
</details>

<details><summary>`master.tex` の一例 (折りたたみ)</summary>
<div>

```TeX:master.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{docmute}
\usepackage{mypackage}
\mathtoolsset{showonlyrefs=true}	%%''true''or''fault''
\begin{document}
%%%%%%%タイトル%%%%%%%
\input{title}
\thispagestyle{empty}				%%ページ番号を空にする
\clearpage							%%新しいページの作成
\restoregeometry					%%余白の変更を元に戻す
%%
%%
%%%%%%要旨・目次%%%%%%
\pagenumbering{roman}			%%ページ番号をローマン体に
\input{summary}
\tableofcontents					%%目次の作成
\clearpage							%%新しいページの作成
%%
%%%%%序文・本文%%%%%%%
\pagenumbering{arabic}			%%ページ番号をアラビック体に
\input{main1}
\input{main2}
%%
\clearpage
%%%%%%謝辞，参考文献%%%%%%%%
\pagenumbering{roman}			%%ページ番号をローマン体に
\input{reference}
%%
\end{document}
```

</div>
</details>

<details><summary>`title.tex` の一例 (折りたたみ)</summary>
<div>

```TeX:title.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{mypackage}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\newgeometry{top=80mm}
\begin{center}
\fontsize{30pt}{40pt}\selectfont{%%タイトル
docmute の使い方
\\}
\vspace{60mm}
\fontsize{15pt}{20pt}\selectfont{%%所属
ほげほげ
\\}
\vspace{10mm}
\fontsize{15pt}{20pt}\selectfont{%%担当教員
担当教員：
\\}
\vspace{10mm}
\fontsize{15pt}{20pt}\selectfont{%%学籍番号
1234567890
\\}
\vspace{10mm}
\fontsize{20pt}{40pt}\selectfont{%%氏名
やらかしの貴公子
\\}
\vspace{15mm}
\fontsize{15pt}{20pt}\selectfont{%%日付
\today\\
}
\end{center}
\end{document}
```

</div>
</details>

<details><summary>`summary.tex` の一例 (折りたたみ)</summary>
<div>

```TeX:summary.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{mypackage}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\chapter*{Summary}
要約を書く．
\end{document}
```

</div>
</details>

<details><summary>`main1.tex` の一例 (折りたたみ)</summary>
<div>

```TeX:main1.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{mypackage}
\newgeometry{left=10mm,right=10mm,top=10mm,bottom=20mm}
\mathtoolsset{showonlyrefs=fault}	%%''true''or''fault''
\usepackage[inline]{showlabels}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\chapter{hogehoge1}
\section{ほげ}\label{hoge1}
ほげほげ
\begin{equation}\label{eq:velocity}
\ve{v}
	=\frac{d\ve{x}}{dt}
\end{equation}
\eqref{eq:velocity}は速度の定義である．

加速度の定義は，
\begin{equation}\label{eq:acceleration}
\ve{a}
	=\frac{d^2\ve{x}}{dt^2}
\end{equation}
である．
\end{document}
```

</div>
</details>

<details><summary>`main2.tex` の一例 (折りたたみ)</summary>
<div>

```TeX:main2.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{mypackage}
\newgeometry{left=10mm,right=10mm,top=10mm,bottom=20mm}
\mathtoolsset{showonlyrefs=fault}	%%''true''or''fault''
\usepackage[inline]{showlabels}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\chapter{hogehoge2}
\section{ほげふー}
\S \ref{hoge1}から，ほげほげ

ニュートンの運動方程式は，
\begin{equation}
m\ve{a}
	=F
\end{equation}
であり，ここで，$\ve{a}$は式(\ref{eq:acceleration})である．
\end{document}
```

</div>
</details>


<details><summary>`reference.tex` の一例 (折りたたみ)</summary>
<div>

```TeX:reference.tex
\documentclass[uplatex,11pt,a4paper,dvipdfmx]{jsreport}
\usepackage{mypackage}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\addcontentsline{toc}{chapter}{参考文献}
\begin{thebibliography}{99}		%%99まで参考文献を挙げられる
\item%%
やらかしの貴公子，『ほげほげ』，(2020)
\end{thebibliography}
\end{document}
```
</div>
</details>

# ○ 編集中の小ネタ

今回の方法では，分割している子ファイルのドキュメントクラスの設定を変更していても親ファイルには影響しない．それを利用してみる．

TeX のエディタでは，デスクトップの左右に編集画面(左)とPDF 出力結果(右)になっていることがある．このPDF が非常に見づらいことがある．別モニタ(サブディスプレイ)があればそれぞれに表示させることが出来るが，多くの学生はないことが多い．
そこで，子ファイルのドキュメントクラスの設定とプリアンブルを以下のようにしてみる．

````TeX:hoge.tex
\documentclass[uplatex,11pt,b5paper,dvipdfmx]{jsreport}
\usepackage{mypackage}    %%geometry.sty を取り込んでいる．
\newgeometry{left=10mm,right=10mm,top=20mm,bottom=25mm}
% and more.....
\begin{document}
\chapter{hogehoge}
\section{hogehoge}
% and more.....
\end{document}
````

`\newgeometry` は`geometry.sty` で設定されている余白設定を変更するコマンドになっている．

これによって，ディスプレイで見るPDF が良い感じのサイズで閲覧することが出来る．(スマホで閲覧するにもちょうど良かったりする．)
paper サイズやフォントサイズは適宜，使用するPC のディスプレイサイズにfix するとよい．

少し問題があるのは，図や表，長い数式がはみ出てしまうことである．この辺りは適宜対処してほしい．

数式は折り返して表示することのできるパッケージがあるらしいが，よく知らないので調べてほしい．(なかったらごめんなさい)

>追記：自分で調べてまとめて記事にしたので，以下を参照してほしい．
>[[自動改行]長い数式を折り返して表示させる3つの方法 - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/5d1bb5e50ffe53f8ba99)


# ○ 他の分割方法へのコメント
上での紹介以外にも探せばいくつか方法がある．（この記事にたどり着く前にいくつか触れているはずだ．それを紹介する．）

どちらが良いというものでもないが，好きな方を利用してもらえればと思う．

## ■ `docmute` を用いた別の方法
またプリアンブルの話だが，今回は自作のsty ファイルをパッケージを導入しているが，別のところを覗いてみると，プリアンブルで`\input` または`\include` することで導入している人もいる．（参考：[効率的な LaTeX ファイル分割術、のための docmute パッケージ - マクロツイーター](https://zrbabbler.hatenablog.com/entry/20150906/1441509908)）

`\usepackage` で取り込むか`\input` で取り込むかどちらが良いのかは分からないが，どちらでも同じ結果になる（と思われる）．これは個人の好みで決めてほしい．

個人的なプロジェクトの場合には，別のディレクトリにsty ファイルを置いても良いが，共同で編集する場合などは，同様のディレクトリにsty ファイルを置いておく方が良いだろう．その場合には`\input` を用いた方が有効的だ．

## ■ `subfiles` を用いた方法
上に示したような`docmute` を用いた方法のほかにも`subfiles` を用いた方法なども存在する．`subfiles` も`docmute` と同様にtex ファイルを分割し，子ファイル単体でコンパイルすることのできるパッケージである．

`subfiles` は親ファイルのプリアンブルを子ファイルにも取り込むことが出来るパッケージのようである．（参考：[分割した LaTeX ファイルを subfiles を使ってコンパイルする](https://qiita.com/sankichi92/items/1e113fcf6cc045eb64f7)）

今回紹介した自作sty ファイルを使った方法で`docmute`を用いれば，`subfiles`と同様のことが出来ているし，プリアンブルの設定を親ファイルと子ファイルで少し変えることが出来ることもメリットのように思う．（推敲時にはほしいけれど，完成時には必要のないパッケージ等を子ファイルに導入できる．）


# ○ さいごに

今期の卒論シーズンももう終わってしまった．しかし，この時期だからこそ，来年にLaTeX を利用して卒論を書く人にはこの記事は利用価値の高いものになっていると思っている．

さまざまなLaTeX のTips はQiita で多く掲載されているので，それを参照しながら自分のやりやすいように改変していってほしい．

この記事を読んでも分からないことがあると思う．(それは筆者の書き込み不足だと思うが．)だが，実際にLaTeX を動かしてみてほしい．少なくとも，いま掲載しているコマンドラインをそのまま打てば，動くはずである．実際に試してみてから悩んでほしい．

ふぁいと！

# 追記
- 2020/08/04 :
パッケージ関連の部分をすこし編集しました．