niszetの日記

細かい情報を載せていくブログ

(Pandoc) テンプレートにあるスタイルの件の補足

一体何が正しいのでしょうか…。

以前こんな記事を書いたのですが、reference.docxをあらかじめ作っておく場合と-t docx でファイルを出力した場合とで、実際にはどの程度の差があるのかを見ておきます。

niszet.hatenablog.com

あらかじめ、適当な入力ファイル(空でも良い)から -t docx -o test.docx で test.docx という名前でファイルを保存しておきます。Rのofficerパッケージでスタイルを確認できるのでこれを使います。結果はdata.frameになっているので、dplyrパッケージで差分を確認できます。

> library(officer)
> library(magrittr)
> officer::read_docx("test.docx") %>% officer::styles_info()
   style_type             style_id             style_name is_custom is_default
1   paragraph               Normal                 Normal     FALSE       TRUE
2   paragraph             BodyText              Body Text     FALSE      FALSE
3   paragraph       FirstParagraph        First Paragraph      TRUE      FALSE
4   paragraph              Compact                Compact      TRUE      FALSE
5   paragraph                Title                  Title     FALSE      FALSE
6   paragraph             Subtitle               Subtitle     FALSE      FALSE
7   paragraph               Author                 Author      TRUE      FALSE
8   paragraph                 Date                   Date     FALSE      FALSE
9   paragraph             Abstract               Abstract      TRUE      FALSE
10  paragraph         Bibliography           Bibliography     FALSE      FALSE
11  paragraph             Heading1              Heading 1     FALSE      FALSE
12  paragraph             Heading2              Heading 2     FALSE      FALSE
13  paragraph             Heading3              Heading 3     FALSE      FALSE
14  paragraph             Heading4              Heading 4     FALSE      FALSE
15  paragraph             Heading5              Heading 5     FALSE      FALSE
16  paragraph             Heading6              Heading 6     FALSE      FALSE
17  paragraph             Heading7              Heading 7     FALSE      FALSE
18  paragraph             Heading8              Heading 8     FALSE      FALSE
19  paragraph             Heading9              Heading 9     FALSE      FALSE
20  paragraph            BlockText             Block Text     FALSE      FALSE
21  paragraph         FootnoteText          Footnote Text     FALSE      FALSE
22  character DefaultParagraphFont Default Paragraph Font     FALSE       TRUE
23      table                Table                  Table     FALSE       TRUE
24  paragraph       DefinitionTerm        Definition Term      TRUE      FALSE
25  paragraph           Definition             Definition      TRUE      FALSE
26  paragraph              Caption                Caption     FALSE      FALSE
27  paragraph         TableCaption          Table Caption      TRUE      FALSE
28  paragraph         ImageCaption          Image Caption      TRUE      FALSE
29  paragraph               Figure                 Figure      TRUE      FALSE
30  paragraph      CaptionedFigure       Captioned Figure      TRUE      FALSE
31  character         BodyTextChar         Body Text Char      TRUE      FALSE
32  character         VerbatimChar          Verbatim Char      TRUE      FALSE
33  character    FootnoteReference     Footnote Reference     FALSE      FALSE
34  character            Hyperlink              Hyperlink     FALSE      FALSE
35  paragraph           TOCHeading            TOC Heading     FALSE      FALSE
36  paragraph           SourceCode            Source Code      TRUE      FALSE
37  character           KeywordTok             KeywordTok      TRUE      FALSE
38  character          DataTypeTok            DataTypeTok      TRUE      FALSE
39  character            DecValTok              DecValTok      TRUE      FALSE
40  character             BaseNTok               BaseNTok      TRUE      FALSE
41  character             FloatTok               FloatTok      TRUE      FALSE
42  character          ConstantTok            ConstantTok      TRUE      FALSE
43  character              CharTok                CharTok      TRUE      FALSE
44  character       SpecialCharTok         SpecialCharTok      TRUE      FALSE
45  character            StringTok              StringTok      TRUE      FALSE
46  character    VerbatimStringTok      VerbatimStringTok      TRUE      FALSE
47  character     SpecialStringTok       SpecialStringTok      TRUE      FALSE
48  character            ImportTok              ImportTok      TRUE      FALSE
49  character           CommentTok             CommentTok      TRUE      FALSE
50  character     DocumentationTok       DocumentationTok      TRUE      FALSE
51  character        AnnotationTok          AnnotationTok      TRUE      FALSE
52  character        CommentVarTok          CommentVarTok      TRUE      FALSE
53  character             OtherTok               OtherTok      TRUE      FALSE
54  character          FunctionTok            FunctionTok      TRUE      FALSE
55  character          VariableTok            VariableTok      TRUE      FALSE
56  character       ControlFlowTok         ControlFlowTok      TRUE      FALSE
57  character          OperatorTok            OperatorTok      TRUE      FALSE
58  character           BuiltInTok             BuiltInTok      TRUE      FALSE
59  character         ExtensionTok           ExtensionTok      TRUE      FALSE
60  character      PreprocessorTok        PreprocessorTok      TRUE      FALSE
61  character         AttributeTok           AttributeTok      TRUE      FALSE
62  character      RegionMarkerTok        RegionMarkerTok      TRUE      FALSE
63  character       InformationTok         InformationTok      TRUE      FALSE
64  character           WarningTok             WarningTok      TRUE      FALSE
65  character             AlertTok               AlertTok      TRUE      FALSE
66  character             ErrorTok               ErrorTok      TRUE      FALSE
67  character            NormalTok              NormalTok      TRUE      FALSE

こちらはマニュアルのとおりにテンプレートを生成した場合のテンプレートに含まれるスタイルの一覧。

> officer::read_docx("custom-reference.docx") %>% officer::styles_info()
   style_type             style_id             style_name is_custom is_default
1   paragraph               Normal                 Normal     FALSE       TRUE
2   paragraph             BodyText              Body Text     FALSE      FALSE
3   paragraph       FirstParagraph        First Paragraph      TRUE      FALSE
4   paragraph              Compact                Compact      TRUE      FALSE
5   paragraph                Title                  Title     FALSE      FALSE
6   paragraph             Subtitle               Subtitle     FALSE      FALSE
7   paragraph               Author                 Author      TRUE      FALSE
8   paragraph                 Date                   Date     FALSE      FALSE
9   paragraph             Abstract               Abstract      TRUE      FALSE
10  paragraph         Bibliography           Bibliography     FALSE      FALSE
11  paragraph             Heading1              Heading 1     FALSE      FALSE
12  paragraph             Heading2              Heading 2     FALSE      FALSE
13  paragraph             Heading3              Heading 3     FALSE      FALSE
14  paragraph             Heading4              Heading 4     FALSE      FALSE
15  paragraph             Heading5              Heading 5     FALSE      FALSE
16  paragraph             Heading6              Heading 6     FALSE      FALSE
17  paragraph             Heading7              Heading 7     FALSE      FALSE
18  paragraph             Heading8              Heading 8     FALSE      FALSE
19  paragraph             Heading9              Heading 9     FALSE      FALSE
20  paragraph            BlockText             Block Text     FALSE      FALSE
21  paragraph         FootnoteText          Footnote Text     FALSE      FALSE
22  character DefaultParagraphFont Default Paragraph Font     FALSE       TRUE
23      table                Table                  Table     FALSE       TRUE
24  paragraph       DefinitionTerm        Definition Term      TRUE      FALSE
25  paragraph           Definition             Definition      TRUE      FALSE
26  paragraph              Caption                Caption     FALSE      FALSE
27  paragraph         TableCaption          Table Caption      TRUE      FALSE
28  paragraph         ImageCaption          Image Caption      TRUE      FALSE
29  paragraph               Figure                 Figure      TRUE      FALSE
30  paragraph      CaptionedFigure       Captioned Figure      TRUE      FALSE
31  character         BodyTextChar         Body Text Char      TRUE      FALSE
32  character         VerbatimChar          Verbatim Char      TRUE      FALSE
33  character    FootnoteReference     Footnote Reference     FALSE      FALSE
34  character            Hyperlink              Hyperlink     FALSE      FALSE
35  paragraph           TOCHeading            TOC Heading     FALSE      FALSE

で、これだと差分が良くわからないので、dplyr::anti_join()を使って差分を出します。

library(dplyr)
> dplyr::anti_join(gendoc, refdoc)
Joining, by = c("style_type", "style_id", "style_name", "is_custom", "is_default")
   style_type          style_id        style_name is_custom is_default
1   paragraph        SourceCode       Source Code      TRUE      FALSE
2   character        KeywordTok        KeywordTok      TRUE      FALSE
3   character       DataTypeTok       DataTypeTok      TRUE      FALSE
4   character         DecValTok         DecValTok      TRUE      FALSE
5   character          BaseNTok          BaseNTok      TRUE      FALSE
6   character          FloatTok          FloatTok      TRUE      FALSE
7   character       ConstantTok       ConstantTok      TRUE      FALSE
8   character           CharTok           CharTok      TRUE      FALSE
9   character    SpecialCharTok    SpecialCharTok      TRUE      FALSE
10  character         StringTok         StringTok      TRUE      FALSE
11  character VerbatimStringTok VerbatimStringTok      TRUE      FALSE
12  character  SpecialStringTok  SpecialStringTok      TRUE      FALSE
13  character         ImportTok         ImportTok      TRUE      FALSE
14  character        CommentTok        CommentTok      TRUE      FALSE
15  character  DocumentationTok  DocumentationTok      TRUE      FALSE
16  character     AnnotationTok     AnnotationTok      TRUE      FALSE
17  character     CommentVarTok     CommentVarTok      TRUE      FALSE
18  character          OtherTok          OtherTok      TRUE      FALSE
19  character       FunctionTok       FunctionTok      TRUE      FALSE
20  character       VariableTok       VariableTok      TRUE      FALSE
21  character    ControlFlowTok    ControlFlowTok      TRUE      FALSE
22  character       OperatorTok       OperatorTok      TRUE      FALSE
23  character        BuiltInTok        BuiltInTok      TRUE      FALSE
24  character      ExtensionTok      ExtensionTok      TRUE      FALSE
25  character   PreprocessorTok   PreprocessorTok      TRUE      FALSE
26  character      AttributeTok      AttributeTok      TRUE      FALSE
27  character   RegionMarkerTok   RegionMarkerTok      TRUE      FALSE
28  character    InformationTok    InformationTok      TRUE      FALSE
29  character        WarningTok        WarningTok      TRUE      FALSE
30  character          AlertTok          AlertTok      TRUE      FALSE
31  character          ErrorTok          ErrorTok      TRUE      FALSE
32  character         NormalTok         NormalTok      TRUE      FALSE

となります。スタイル名がTok で終わるものはコードのハイライト用の文字スタイルになり、全部で31種類あります。

> dplyr::anti_join(gendoc, refdoc) %>% filter(str_detect(.$style_name, "Tok")) %>% count()
Joining, by = c("style_type", "style_id", "style_name", "is_custom", "is_default")
# A tibble: 1 x 1
      n
  <int>
1    31

残る1つは"Source Code"でこれは段落スタイル。これがテンプレートを生成した際に含まれないスタイルです。これはマニュアルにも載っていません。

さて、スタイル一覧はマニュアルに記載がありますが、このマニュアルにあってPandocのHaskellのコードからは読み取れなかったスタイルは以下の2つです。単に私の抜けかもしれないですが…。

  • Caption
  • Default Paragraph Font

また、ソースコードに記載があるが、-t docx を指定して生成したdocx、reference.docx に存在しないスタイルは下記の2つです。

  • CommentText
  • CommentReference

実際のスタイル名は" "で分かれていると思いますが、文字列としてコードにあるのはこちらでした。

この辺りは想定しているものと同じになっているのかがわからないので、discussで聞いてみようと思って1週間が経ちました。そろそろ聞きますね…。

2022/12/12 補足

結局聞いてないわこれ・・・。

気づいた点として、Default Paragraph Fontは文字スタイルなので、段落スタイルの Normal の文字スタイル分だと考えられます(styles.xmlを読めばわかりそう)また、CommentTextはWordにコメントを挿入したときに使うものかなと思いますが、それを追加してもPandocから出力されたファイルには存在しないのでよくわかりません・・・。