LaTeXという選択肢 - 仕様書を書くツール何使ってますか?

ITエンジニアとして仕様書や設計書を書くとき、多くの人はWordかMarkdownを選んでいると思います。どちらも良いツールで、実際に自分もよく使います。

ただ、もし今の書き心地に少しでも「もやっ」とした引っかかりがあるなら、選択肢として LaTeX も一度頭の片隅に置いてみてほしい、というのがこの記事の趣旨です。WordやMarkdownを否定したいわけではなく、「こういう道具もありますよ」というご紹介です。

こんな場面で困っていませんか

普段の業務で、こういう場面に覚えはないでしょうか。

Wordで差分確認がうまくいかない

バイナリ形式なので、Gitでdiffを取っても意味のある差分が出ない。変更履歴機能はあるけれど、複数人でレビューを回すとコメントと修正が入り乱れてややこしくなる、ということがあります。

Wordで共同編集がやりづらい

クラウド経由で同時編集はできるようになったものの、同じセクションをいじるとコンフリクトのような状態になったり、スタイルが微妙にズレたり。誰かがうっかり書式を壊すと、元に戻すのも一苦労です。

Markdownは書きやすいけど、納品時の見た目で悩む

書くことに集中したくてMarkdownを選んだのに、いざ納品用にPDF化してみると、ヘッダ・フッタや表紙、フォント、自社のフォーマットに合わせた見た目にするのがなかなか難しい。結局Wordに貼り直した、という話もよく聞きます。

これらは、それぞれのツールの「短所」というより「得意分野の違い」から来るものだと思います。そして、この3つのもやもやを同時に解消しやすいのがLaTeXです。

LaTeXというツールのかんたんな紹介

LaTeX(ラテフ、ラテック)は、もともと組版ソフトとして作られたTeXをベースに、より扱いやすく整備されたシステムです。出版物にも用いられるほどの品質で文書を整形してくれるのが特徴で、論文や書籍の分野では昔から定番として使われてきました。

エンジニア視点でうれしいポイントをいくつか挙げてみます。

ソースはプレーンテキスト

.texファイルは普通のテキストファイルなので、Gitで素直にバージョン管理できます。差分はもちろん行単位で見られますし、プルリクエストでのレビューもコードと同じ感覚で回せます。

見た目と中身を分離できる

Wordのように「書いた場所にスタイルが直接ぶら下がる」のではなく、構造(見出し、段落、箇条書きなど)と見た目(フォント、余白、色など)を分けて書けます。章立てには\section、\subsection などのコマンドが用意されていて、文書構造とレイアウトがきれいに分かれているので、中身を書くときは中身に集中できます。

スタイルを使い回せる

これが仕様書を書くエンジニアにとって、地味ですがかなり効く部分です。

スタイルファイル(.sty)で「自社ナイズド」を一度だけやればいい

LaTeXでは、文書の見た目やマクロを .sty というスタイルファイルに切り出せます。一度自社向けのテンプレートを作ってしまえば、あとは各仕様書の冒頭で

\usepackage{mycompany}

と書くだけで、同じ見た目・同じロゴ・同じ体裁が再利用できます。スタイルファイルを一度作ってしまえば、それを読み込むだけで、新しいtexファイルを作るたびに同じ処理を書く必要がなくなります。

補足:.styの正体は、LaTeXのマクロパッケージです。書き方は普通のLaTeXとほぼ同じで、拡張子を .tex から .sty に変えて、texファイルと同じディレクトリに置けば \usepackage で読み込めます。

「納品先によって見た目を変えたい」「案件Aではこのヘッダ、案件Bではあのヘッダ」という運用も、スタイルファイルを差し替えるだけで済みます。Markdown + CSS/テンプレートの組み合わせと考え方は近いのですが、LaTeXの場合は組版品質が最初から高いところがアドバンテージになりやすいです。

長い仕様書は分割して書ける

仕様書が100ページ、200ページと育ってくると、ひとつのファイルで抱え続けるのはしんどくなります。LaTeXでは main.tex のような親ファイルから、章ごとに分けた子ファイルを読み込む書き方が標準でサポートされています。

% main.tex
\documentclass{jsarticle}
\usepackage{mycompany}

\begin{document}
\input{chapters/overview}
\input{chapters/architecture}
\input{chapters/api-spec}
\input{chapters/appendix}
\end{document}

使うコマンドは主に \input\include の2つです。ざっくり言うと、\includeコマンドは\inputコマンドと異なり、コマンドの前後で改ページされる、という違いがあります。章ごとにページを分けたいなら \include、流れを途切れさせたくないところでは \input、という使い分けになります。

分割のうれしいところは実用面でも大きくて、\input行を適宜コメントアウトして部分的にタイプセットすれば、構文エラーの発見も容易になりますし、複数人で章を分担して作業するのもやりやすくなります。Gitで章ごとにブランチを切ってレビューする、といった運用とも相性が良いです。

仕上がりがきれい、というのは意外と効く

これは好みの話も入るのですが、LaTeXで出力したPDFは、行間・余白・字間・改ページ処理が整っていて、読んでいて疲れにくい文書になりやすいです。お客様に納品するドキュメントだと、この「読みやすさ」がそのまま信頼感につながることもあります。

もちろんWordでも丁寧に整えれば同等の仕上がりは作れますが、「放っておいてもそれなりに整う」のがLaTeXの強みです。

学習コストは、思っているほど高くないかもしれません

「LaTeXは難しそう」というイメージがあるのは事実だと思います。ただ、文書を書くだけなら、覚えることは意外と限られています。

  • \section{...} / \subsection{...} で見出し
  • itemize / enumerate で箇条書き
  • \textbf{...} で太字、\emph{...} で強調
  • \includegraphics{...} で画像挿入
  • tabularbooktabs で表

この辺りを押さえれば、Markdownの基本構文を覚えるのとあまり変わらない感覚で、ひと通りの仕様書は書けます。複雑な数式やレイアウトに踏み込まない限り、最初の山はそこまで高くありません。

環境構築が面倒であれば、OverleafCloud LaTeX といったブラウザで動くサービスもあります。Overleaf や Cloud LaTeX は環境構築が不要で、アカウント登録程度で即座に使い始められるので、「とりあえず触ってみる」にはぴったりです。

LaTeXを使うデメリット

フェアにデメリットも書いておきます。

  • 画像やレイアウトの微調整を直感的にやりたい人には向きません。 WYSIWYGではないので、「ここをもうちょっと右に」をマウスで動かす、ということはできません。
  • 非エンジニアの共同編集者がいる場合は障壁になります。 お客様や営業の方に直接編集してもらう文書なら、Wordのほうが素直です。
  • パッケージのバージョン管理やエラーメッセージに慣れが要ります。 ここはプログラミングの感覚に近いので、エンジニアならむしろ馴染みやすい部分かもしれません。

まとめ

LaTeXが万能だとは思っていません。Wordが向く文書、Markdownが向く文書、LaTeXが向く文書、それぞれあると思います。

ただ、

  • Gitで差分を取りながらレビューしたい
  • 自社フォーマットを一度作って使い回したい
  • 長期的にメンテナンスする仕様書を書いている
  • 納品PDFの見た目にこだわりたい

このあたりに当てはまるなら、LaTeXは現実的な選択肢になりえます。使う道具が増えることは、それだけで武器が増えることでもあります。気が向いたときに、Overleafでちょっと触ってみるくらいから始めてみると、新しい書き心地が見つかるかもしれません。