niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(Pandoc) Wordのカスタムプロパティを使う

Pandoc Advent Calendar 2019

この記事は Pandoc Advent Calendar 2019 7日目の記事です。

なお、Pandoc Advent Calendar 2019 のリンクはこちらです。

adventar.org

まだまだ空きがありますので、皆様、是非ご参加ください1

YAMLで定義した項目がWordのカスタムプロパティに追加される機能は今年、2019年に入ってからの機能追加です。

まだまだ知られていないかもしれないので、良い機会なので簡単にまとめておきます。

さて、本題。

Pandoc でWord形式のファイル(以下、docxと書きます)を出力する際 、YAMLで書いたメタデータのトップレベルに書いたもので、かつ docx の(Office Open XMLで定義されている)メタデータでないものはカスタムプロパティとして追加されます。これは、PowerPointやODT形式でも同様ですが、対応する項目名が異なります。詳しくはこの記事下部からのリンク先で確認してください。

docx の場合、メタデータとなる情報はtitle, author, keywords, subject, category, description です 2abstract, lang もそうだと書かれていますが、abstractはユーザー設定の方にのみ現れ、lang はプロパティに現れない代わりに文書の言語設定が変更されます。たとえば lang: ja-JP を設定すると、英文であっても日本語としてみなされ、フォントも日本語のものが適用されます。

これ以外の項目はカスタムプロパティとなります。

さて、実際に試してみましょう。

今回の記事の作成時にはR MarkdownからWord文書を作成していますが、Markdownからでも同じ結果を得られます。ただし、tocは別途与える必要があるので、以下のように追加で与えてください。

pandoc" -f markdown -t docx rep.md -o rep.docx --toc

YAML部分に下記のように書いてみます。このうち、author, keywords は複数項目が指定可能です。

---
title: タイトル
author: 
  - 著者1
  - 著者2
date: "2019/12/07"
keywords: 
  - きー
  - わーど
subject: さぶじぇくと
#lang: ja-JP # コメントアウトを外すと日本語に設定されたドキュメントになりますが、調査不足により保留。
category: カテゴリ
description: せつめい
abstract: あぶすと
output: # 以下は R Markdown用の記述
  word_document:
    toc: true
    keep_md: true
---

まず、現在の Pandoc のデフォルトの挙動として、title, author, date, abstract は表紙に表示されます。それぞれ、表題, Author, 日付, Abstract のスタイルが適用されます。

f:id:niszet:20191207192815p:plain

今回は toc を有効にしているため、目次が表示されています。

Wordのツールバーの「ファイル」を押し、「情報」のページに出てくる、「プロパティ」をクリックすると「詳細プロパティ」なるボタン?が表示されますのでそれをクリックしてください。そうすると、このように先のYAMLで指定した値が入っていることが確認できるはずです。

f:id:niszet:20191207192956p:plain

カスタムプロパティはこの右にある「ユーザー設定」のタブで確認できます。

f:id:niszet:20191207193106p:plain

ここではR Markdownから作成したので output もプロパティとして入っていますね。

これらの情報は、エクスプローラー上でWordファイルを右クリックして表示するプロパティからも確認できてしまいます。便利ですが、不用意に情報を入れておくと問題になるかもしれないので、注意してください。私の知る限りではこれらをプロパティに登録しないようにする方法はないと思います。

これらのプロパティはユーザ定義のものも含めて、フィールドコードのDocPropertyを使って参照できます。 Wordのテンプレート(reference-docに指定するファイル)にあらかじめ仕込んでおいたり、Pandocのrawの記法を使って埋め込むことも可能です。たとえば以下のようにして日付、dateを埋め込むことが可能です。ダミーの文字列xxxxは実際には表示されませんが、正しそうな値を入れるか取っておいた方が良いかもです。これも要検証で、使用の際には自己責任でお願いします。

<w:p>
  <w:r>
    <w:fldChar w:fldCharType="begin"/>
  </w:r>
  <w:r>
    <w:instrText>DOCPROPERTY  date  \* MERGEFORMAT</w:instrText>
  </w:r>
  <w:r>
    <w:fldChar w:fldCharType="separate"/>
  </w:r>
  <w:r>
    <w:t>xxxx</w:t>
  </w:r>
  <w:r>
    <w:fldChar w:fldCharType="end"/>
  </w:r>
</w:p>

ドキュメントのプロパティを埋め込むことで、生成時以降に更新された場合でもその更新された値に追従できるというメリットがあります。デメリットにもなりますが…。

なお、関連するIssueはこちら、

github.com

関連するCommitはこちら

github.com

です。

なお、この記事の情報、各フォーマットで対応しているプロパティの表は

github.com

にもあります。


  1. 年明けてからでもよければ、空きの日に埋めていきますが…。

  2. リンク先ではこれについて言及されていないのですが、実際にファイルの概要にいるので、Wordの既定のプロパティであると判断しています。他の項目とあわせて要確認です。調査が間に合わなかったのです…。