プログラマがあまりやりたがらない作業のひとつとしてドキュメント作成がよく挙げられるかと思います。
〇〇仕様書とか〇〇設計書とか〇〇手順書などの作成作業ですね。
特に成果物がdocxやxlsxのようなプレーンテキストでない場合、次のような理由で気が滅入る方も多いのではないでしょうか。
Markdownでさくっと書いてそれっぽいものができれば、GitHubのWikiなどにぼちぼち書き溜めておいて最後にコンパイルするみたいなやり方ができるなぁとか、そうすればわざわざドキュメント専用リポジトリを作ったりする必要もないなぁとかモヤモヤしながらいろいろ調査・検討したので以下の4構成でまとめたいと思います。
PandocはHaskellで書かれたドキュメント変換ツールで、入力・出力ともに多彩なフォーマットに対応しているのが特徴です。
また、実行時に自作のフィルタをかませることが可能なので、独自の処理を施すこともできます。(例えば、特定文字列の一括置換など。)フィルタはRubyやPythonなどでも作成することができます。
詳細はUser's Guide(日本語版)を読んでいただくとして、以降ではこのPandocを使う前提で記述します。
ちなみにPandocのMarkdownには多少の方言(拡張)があり、例えば以下のようなかたちで文書のタイトル、著者、日付を付けることができたり、
また以下のように表のキャプションを付けることができたりします。
このあたりもUser's Guideに詳細が載っていますので是非ご一読を。
まずはドキュメントの形式にあまりこだわりのない依頼主のケース。
ある程度整形された資料で十分なのであれば、HTMLにしてしまうのはどうでしょう。
WordのスタイルをポチポチいじるよりはまだCSSを書いたほうがいい、という方もおられるのではないでしょうか。
--css (-c)
オプションで外部ファイルのCSSを指定できるため、一旦いい感じのCSSを作ってしまえば使い回しができます。
--self-contained
オプションを付けることにより、画像やスタイルシートなどはHTMLファイル内に埋め込まれるため、出力されたファイル単体で外部から参照していたコンテンツなども表示することができます。
入力:
出力:
そうは言ってもやっぱり「HTMLはちょっと...少なくともPDFは欲しい...」みたいな話にはなりそうなので、PDFを作ります。
PandocはPDF出力もサポートしていますが、LaTeXを経由するのでそれっぽい見た目になります。
プリアンブルは--include-in-header= (-H)
オプションを使って別ファイルで指定できるので、標準的な何かを作ってしまえばこれまた使い回すことができます。
また、--toc
オプションを付けると自動で目次も作成してくれます。
出力:
巨大な表などがあるとデフォルトでは見た目が残念で、TeX辛い勢的には整形が面倒だったりします。
TeX/LaTeXを書き慣れている人には、一旦TeXに変換した方がいろいろ融通が効いて良いかもしれません。
TeX辛い勢の最終手段としては上で作成したHTMLをブラウザで開いてPDFで保存という手も使えなくはないです。
(ブラウザで表示される通りの見た目でPDFに出力されるかどうかはブラウザ依存になってしまいますが。)
次に成果物としてMicrosoft Office文書を求められる依頼主のケース。
大体上のスライドに全部書かれているのですが、まとめると、以下でスタイル参照用のファイルを出力し、
reference.docxのスタイルをいじって自分用の書式を作成します。(reference.docxはスタイルだけが使用され、本文は無視されます。)
Pandocユーザーズガイド日本語版を翻訳した方のQiitaの記事より、使用できるスタイルは以下とのことです。
使用できるスタイルは以下の通り:【段落】 標準(Normal), Compact, 表題(Title), Authors, 日付(Date), Heading 1, Heading 2, Heading 3, Heading 4, Heading 5, Block Quote, Definition Term, Definition, 本文(Body Text), Table Caption, Image Caption; 【文字】 Default Paragraph Font, Body Text Char, Verbatim Char, Footnote Ref, Link.
以下のコマンドでreference.docxを参照しつつ、Markdownをdocxに変換できます。
出力:
docxなのでWordで開ける環境さえあればPDFへの変換も余裕ですね。
各種フォントサイズや色などはデフォルトでも充分使えそうな感じですが、それぞれお好みに調整すれば良いし、特に以下などは予めスタイルを設定しておくと良さそうな感じでした。
一方で以下のように痒いところに手が届かない部分もあります。
TableNormal
という標準スタイルが使われており事前にスタイルの編集ができない
TableNormal
というidを持ったスタイルが存在しない?上記のスライドにもありましたが、docxはXMLで構成されているため、構造がわかればWordを直接触らなくても加工することが可能です。先に挙げた「痒いところ」をなんとかできないかと以下のようなツールを作ってみました。
docxというgemがありますが、それを少し拡張して目的のアクション毎にタスク化したものです。
製作途中であり、業務の中で使ったこともないのですが、例えば以下のようなことができます。
ただのテキストではなく、Word上で自動でインクリメント、デクリメントされる番号を振ります。
キャプションに番号を振れたのはよいのですが、実際のところ本文からの相互参照とかもできないと今ひとつですね。
そのあたりもカバーしようと思うともっと複雑なことをする必要があります。
先述したTableNormal
ではなく、別のスタイルを一括で適用できます。
目次を作る、Heading 1の直前に改ページを入れる、などの機能も作ったのですが、これらはそれぞれ、Pandocでの変換時に--toc
オプションを付ける、Heading 1のスタイルに設定する、という作業で解決する話だったので無用の長物になりました。
とまぁ、結局痒いところに手が届くようになったかというと現状怪しい感じではありますが、こんな具合に属人的なタスクを減らしていくことができたらなぁと日々悶々としています。