Pandoc Advent Calendar 2019
この記事は Pandoc Advent Calendar 2019 7日目の記事です。
なお、Pandoc Advent Calendar 2019 のリンクはこちらです。
まだまだ空きがありますので、皆様、是非ご参加ください1。
YAMLで定義した項目がWordのカスタムプロパティに追加される機能は今年、2019年に入ってからの機能追加です。
まだまだ知られていないかもしれないので、良い機会なので簡単にまとめておきます。
さて、本題。
Pandoc でWord形式のファイル(以下、docxと書きます)を出力する際 、YAMLで書いたメタデータのトップレベルに書いたもので、かつ docx の(Office Open XMLで定義されている)メタデータでないものはカスタムプロパティとして追加されます。これは、PowerPointやODT形式でも同様ですが、対応する項目名が異なります。詳しくはこの記事下部からのリンク先で確認してください。
docx の場合、メタデータとなる情報はtitle
, author
, keywords
, subject
, category
, description
です 2 。
abstract
, 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
のスタイルが適用されます。
今回は toc
を有効にしているため、目次が表示されています。
Wordのツールバーの「ファイル」を押し、「情報」のページに出てくる、「プロパティ」をクリックすると「詳細プロパティ」なるボタン?が表示されますのでそれをクリックしてください。そうすると、このように先のYAMLで指定した値が入っていることが確認できるはずです。
カスタムプロパティはこの右にある「ユーザー設定」のタブで確認できます。
ここでは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はこちら、
関連するCommitはこちら
です。
なお、この記事の情報、各フォーマットで対応しているプロパティの表は
にもあります。