md2docx icon indicating copy to clipboard operation
md2docx copied to clipboard

Convert markdown to docx

md2docx

convert markdown to docx

markdownファイルをwordのdocxに変換するスクリプトです。

  • PowerShellスクリプトなのでWindows限定です。
  • 動作確認はOffice 2010でのみ行っています。
  • 確認出来ているのは、Windows 7 + PowerShell V3です。

使い方

バッチファイル化してあるので、そちらを使用します。 コマンドプロンプトより、以下のように入力します。

> md2docx.cmd file.md

拡張子が docx に変更された、 file.docx が同じディレクトリに出来ているはずです。

もしくは、引数に何も指定しなければ、markdown file の入力を促すプロンプトが表示されるので、そこにエクスプローラなどから markdownファイルをドラッグアンドドロップしてEnterでもよいです。

対応記述形式

markdownといっても、現在対応している記述はまだまだ少ないです。 また、word独自対応するためにmarkdownにおけるコメントを使用している部分があります。

見出し

# 見出し 1
## 見出し 2
### 見出し 3
#### 見出し 4

それぞれ、wordのスタイル [見出し 1] 〜 [見出し 4]に対応しています。

表題、副題

#<!--%title--> 表題
#<!--%subtitle--> 副題

それぞれ、wordのスタイル [表題]、[副題]に対応しています。

リスト

* リスト 1
* リスト 2
  * リスト2-1
* リスト 3

1. リスト 1
2. リスト 2
3. リスト 3

4. リスト 1
3. リスト 2
8. リスト 3
  <!--% end of list -->
  9. リスト 4
1. リスト 5

通常のリストと、番号付きリストです。 インデントをつけると、生成されるword文書もインデントされます。 番号付きリストの番号は、0~9であればなんでも良いです。通常は 自動的に前行の番号の続きになります。 <!--% end of list--> を入れると、次のリストは1から開始されます。

画像

![代替テキスト](imgfolder/img.jpg)
![代替テキスト](imgfolder/img.jpg)<!--%200x100-->
![代替テキスト](imgfolder/img.jpg)<!--%300x-->
![代替テキスト](imgfolder/img.jpg)<!--%x200-->

画像の場所は、markdownファイルのある場所からの相対パスで記述します。 また、後ろに上記のように画像のサイズを指定することが可能です。 画像のサイズは縦横比固定なので、両方指定しても恐らくどちらか無視されます。 なので、片方だけ指定することも可能です。

テーブル

| 列1     | 列2     | 列3     |
| てすと1 | てすと2 | てすと3 |

行頭、行後の「|」も必須です。

改ページ

<!--%[改ページ]-->
<!--%[PageBreak]-->

改ページを挿入します。

改セクション

<!--%[改セクション]-->
<!--%[SectionBreak]-->

セクション区切りを挿入します。 セクション区切りは、「次のページから開始」になります。

他のセクション区切りを使用したい場合は、インラインマクロ を使用して、以下のように記述出来ます。

<!--!$selection.InsertBreak($CONST.wdSectionBreakContinuous)-->

セクション区切り(現在の位置から開始)

インラインマクロ

右寄せ文章<!--!$selection.ParagraphFormat.Alignment = $CONST.wdAlignParagraphRight-->

<!--! word マクロ --> でwordマクロ(PowerShell記述)が実行出来ます。

該当文章のみにマクロを指定したい場合に便利です。 この場合、「右寄せ文章」が右寄せになります。

提供されるwordのCOMオブジェクトは、以下の通りです。

$word      : Word オブジェクト
$doc       : Word Document オブジェクト
$selection : Word Selection オブジェクト

また、wordで使用出来る定数は、$CONST.定数名でアクセス出来ます。(まだアクセス出来る定数は少ない・・・)

複数行マクロ

<!--!
  # Style change
  $doc.Styles.Item("表題").Font.NameFarEast = "MS P明朝"
  $doc.Styles.Item("表題").Font.Size = 20
  $doc.Styles.Item("表題").Font.Bold = $true

  $doc.Styles.Item("見出し 1").Font.NameFarEast = "MS P明朝"
  $doc.Styles.Item("見出し 1").Font.Size = 16
  $doc.Styles.Item("見出し 1").Font.Bold = $true
  $doc.Styles.Item("見出し 1").AutomaticallyUpdate = $true

  # Page setup
  $doc.PageSetup.TopMargin = $word.MillimetersToPoints(25)
  $doc.PageSetup.BottomMargin = $word.MillimetersToPoints(20)
  $doc.PageSetup.LeftMargin = $word.MillimetersToPoints(20)
  $doc.PageSetup.RightMargin = $word.MillimetersToPoints(15)

  # Image size change
  $doc.InlineShapes | % {
    if ($_.Height -gt 200 ) {
      $_.LockAspectRatio = $CONST.msoTrue; $_.Height = 200
    }
  }
-->

<!--!で始めて、-->で終わる、この記述内はすべてPowerShellとして実行されます。 インラインマクロと同様、$word$doc$selectionが使用出来ます。

<!--!と、-->はそれぞれ、単独で行頭に記述されている必要があります。

このように、結局書式の設定部分は、wordマクロをガリガリ書くことになります・・・。 その代わり、wordマクロを(PowerShellにて)記述出来るので、その気になればなんでも出来る!はずです。

TODO

  • 目次
  • 引用
  • 処理速度アップ