279
207

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Markdownを日本の伝統的な雰囲気のあるWordファイルに変換するCLIツール「md2docx」を作った

279
Posted at

image.png

はじめに

エンジニアであっても、要件定義書や設計書、テスト仕様書、運用手順書など様々な文章を求められることはよくありますよね。
そういった時にMarkdownのようなプレーンテキストで書きたいと心の底から思いますし、AI時代にはプレーンテキストの方がマッチしているでしょう。

が!!!しかし!
実際に求められるのってほぼ100%、Word用の.docxじゃないですか???

僕はエンジニアリングマネージャーなので、お客さんと頻繁に会話する機会がありますが、いつもいつもWordファイルを求められます。

pandocなど、MarkdownをWord形式に変換するためのツールはいくつかありますが、いつもこんなことに悩みます。

  • 見出しの調整がうまくいかない
  • フォントが変
  • インデントが調整できない
  • 表・画像が綺麗に貼れない
  • 箇条書きのスタイルがおかしい
  • 図表番号がつかない(!!!!!!!)

上の5つはまぁスタイル調整済みテンプレWordファイルを用意しておくなど、すればギリ対応できるんですが、「図表番号」はマジで多分どのツールも適切に付与することができません!
(「表 1.1」のような番号を自動採番するやつ)

どっちにしろ手動で色々調整する必要はあるんですが、それは表紙をつけるとかそのくらいで済ませたく、「採番」のような1個でも表を増やしたら後続が全部ずれちゃうようなのはやっぱり自動でやりたいです。

が、そんなツールはないんですよねぇ〜〜〜
あったら嬉しいっすよね〜〜〜

実は、できるんです。

そう、md2docxならね。

md2docxとは

md2docx(コマンド名: mdd)は、MarkdownファイルをWord(.docx)に変換するCLIツールです。Rustで書いてます。

普通の変換ツールとの一番の違いは、日本語のビジネス文書を作ることに特化していること。游明朝・游ゴシックがデフォルトで入り、見出しの自動採番、表・画像の図表番号の自動付与、インデント制御まで、TOML設定ファイル1つで全部コントロールできます。

インストール

Rust 1.70以上が必要です。
今後インストーラーも用意するつもりですが、今は一旦リポジトリを直接クローンしてインストールしてください…

cargo install --path .

これで$HOME/.cargo/bin/mddにバイナリが入ります。PATHが通っていなければ、~/.zshrcなどに以下を追加してください。

export PATH="$HOME/.cargo/bin:$PATH"

使い方

基本はこれだけです!

mdd document.md

入力ファイルと同じ名前で.docxが生成されます。めっちゃシンプルに利用できます。

出力先を指定したい場合や、設定ファイルを使いたい場合はオプションを付けます。

# 出力先を指定
mdd document.md -o output.docx

# 設定ファイルを指定
mdd document.md -c mdd.toml

# 両方指定
mdd document.md -o output.docx -c mdd.toml

オプション一覧はこちら。

オプション 説明
-o, --output 出力先を指定。省略すると入力ファイル名の拡張子を.docxに変えたものになる
-c, --config 設定ファイル(TOML)を指定。省略するとデフォルト設定が使われる
-h, --help ヘルプを表示。--helpなら設定ファイルの書式も出る
-V, --version バージョンを確認

設定ファイル

TOML形式でフォントやサイズ、インデント、箇条書きの記号をカスタマイズできます。すべての項目は省略可能で、書かなかった項目にはデフォルト値が入ります。

[fonts]
body_ja    = "游明朝"        # 本文の日本語フォント
body_en    = "Century"       # 本文の英語フォント
heading_ja = "游ゴシック"    # 見出しの日本語フォント
heading_en = "Century"       # 見出しの英語フォント

[sizes]                       # 単位: pt
body     = 10.5               # 本文
heading1 = 14.0               # 見出し1
heading2 = 12.0               # 見出し2
heading3 = 11.0               # 見出し3
heading4 = 11.0               # 見出し4

[indent]                      # 単位: twip (1twip = 1/20pt)
body_left       = 210         # 本文の左インデント(≒全角1文字分)
body_first_line = 210         # 本文の字下げ
body_right      = 210         # 本文の右インデント
body_left_chars = 100         # 本文の左インデント(文字数×100)
heading4_left    = 709        # 見出し4の左インデント
heading4_hanging = 709        # 見出し4のぶら下げインデント

[bullet]
level0 = "●"                # 箇条書きレベル0
level1 = "■"                # 箇条書きレベル1
level2 = "▲"                # 箇条書きレベル2

対応するMarkdown要素

対応している要素の一覧です。

要素 記法 変換時の処理
見出し # H1#### H4 自動採番付き(1, 1.1, 1.1.1, (1), (1))
段落 通常のテキスト 字下げ・余白をtwip単位で制御
箇条書き - item ネスト対応、行頭文字カスタマイズ可
番号付きリスト 1. item ネスト対応、開始番号指定可
GFM形式 自動で「表1」「表2」と採番
画像 ![alt](path) 自動で「図1」「図2」と採番、形式自動変換
コードブロック ``` Courier New / MS ゴシック、9pt
水平線 --- 空段落に変換
太字 **text** 対応
斜体 *text* 対応
インラインコード `code` 「」で囲んで表示
リンク [text](url) ハイパーリンク化、アンカーリンクにも対応

普段使うMarkdown要素はだいたい網羅しています!

おわりに

Markdownで書いて、コマンド一発で日本の伝統的な業務に利用されるビジネス文書っぽいWordファイルが出来上がる。自分が本当に欲しかったものを作りました!

まだまだ改善したいところはありますが、実務で使えるレベルにはなっていると思います。同じ悩みを持つ方がいたら、ぜひ使ってみてください。

279
207
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
279
207

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?