1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Wordの文献目録カスタマイズ備忘録

Posted at

はじめに

Wordの文献管理は便利だが参考文献の書式が独特の場合,最後に形式をそろえて全部書き換えないといけない(APAやIEEEなど有名どころはデフォルトで入っている).このフォーマットはどうやらWordのソフトウェア上では変更でいないようなので,設定ファイルを自作する必要がある.

設定ファイルの作成法はlearn.microsoft.comで公開されているがそのままコピペしてもなぜか動かなかった.

このリポジトリはその設定ファイルを作成するためのメモである.IEEEのテンプレートを参考に探り探り作成したものであり間違いがあるかもしれない.ちなみにWordにもともとあるテンプレートは多言語に対応しておりかなり内容が煩雑でわかりにくい.本メモはWordのデフォルトのテンプレートを極限まで削ったものとほぼ一致するといえる.

文献リストのソースファイル

文献リストに登録するとSources.xmlに登録される.この文献リストXMLに対してXSLファイルを適用することで文献リストの表示を表示している.Xpathが必要なときは以下の構造を参考にするとよい.

保存場所

Windows11のoffice365の場合は以下にあった.

C:\Users\[usename]\AppData\Roaming\Microsoft\Bibliography\Sources.xml

違う環境の場合は.Wordの
参考資料 > 資料文献の管理 > 参照
でどこに保存されているかわかる.
Microsoft\Bibliography\Sources.xmlはPC上にいくつか存在するようなのでWordの参照からPathを確認するのが確実.

構造

構造は以下のような感じ.タグの中身はofficeの日本語設定で表示されている名称.
新たな種類の文献について定義する場合は文献を登録してSources.xmlを確認するのが手っ取り早い.(元のファイルは改行が入っておらずかなり読みにくい)

Sources.xml
<?xml version="1.0"?>
<b:Sources SelectedStyle="" xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography">
    <b:Source>
        <b:Tag>執筆者年</b:Tag>
        <b:SourceType>JournalArticle</b:SourceType>
        <b:Guid>{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}</b:Guid>
        <b:Title>タイトル</b:Title>
        <b:JournalName>ジャーナルの名前</b:JournalName>
        <b:Year></b:Year>
        <b:Pages>ページ</b:Pages>
        <b:Volume></b:Volume>
        <b:Issue></b:Issue>
        <b:Author>
            <b:Author>
                <b:NameList>
                    <b:Person>
                        <b:Last>執筆者姓1</b:Last>
                        <b:Middle>執筆者中1</b:Middle>
                        <b:First>執筆者名1</b:First>
                    </b:Person>
                    <b:Person>
                        <b:Last>執筆者姓2</b:Last>
                        <b:Middle>執筆者中2</b:Middle>
                        <b:First>執筆者名2</b:First>
                    </b:Person>
                </b:NameList>
            </b:Author>
            <b:Editor>
                <b:NameList>
                    <b:Person>
                        <b:Last>編集者姓1</b:Last>
                        <b:Middle>編集者中1</b:Middle>
                        <b:First>編集者名1</b:First>
                    </b:Person>
                    <b:Person>
                        <b:Last>編集者姓2</b:Last>
                        <b:Middle>編集者中2</b:Middle>
                        <b:First>編集者名2</b:First>
                    </b:Person>
                </b:NameList>
            </b:Editor>
        </b:Author>
        <b:City>市区町村</b:City>
        <b:Month></b:Month>
        <b:Day></b:Day>
        <b:Publisher>発行元</b:Publisher>
        <b:ShortTitle>タイトルの略称</b:ShortTitle>
        <b:StandardNumber>標準番号</b:StandardNumber>
        <b:Comments>コメント</b:Comments>
        <b:Medium>媒体</b:Medium>
        <b:YearAccessed>アクセスした年</b:YearAccessed>
        <b:MonthAccessed>アクセスした月</b:MonthAccessed>
        <b:DayAccessed>アクセスした日</b:DayAccessed>
        <b:DOI>DOI</b:DOI>
    </b:Source>
</b:Sources>

XSLファイルの概要

文献の設定ファイルは XSL (Extensible Stylesheet Language)で記述する.設定ファイルを書くにあたってどうしても必要なものだけまとめる.まったく専門ではないため参考程度に.

変数定義

<xsl:variable name="VarName">
    <xsl:value-of select="value or function or Xpath"/>
</xsl:variable>

変数の利用

<xsl:value-of select="$VarName"/>

textの出力

<xsl:text>text</xsl:text>

条件分岐

条件はorやandでつなげることができる.

<xsl:choose>
    <xsl:when test="$VarName = '1' ">
        <xsl:value-of select="$valueName"/>
    </xsl:when>
    <xsl:when test="$VarName = '2' or $VarName = '3' ">
        <xsl:text>text</xsl:text>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="xPath"/>
    </xsl:otherwise>
</xsl:choose>

テンプレート

matchかnameが必ず必要.

<!-- 要素を指定して定義 -->
<xsl:template match="/">
   <!-- テンプレートの内容を記述 -->
</xsl:template>

<!-- 呼び出し -->
<xsl:apply-templates select="/"/>
<!-- 名前を指定して定義 -->
<xsl:template name="template_name">
   <!-- テンプレートの内容を記述 -->
</xsl:template>

<!-- 呼び出し -->
<xsl:call-template name="template_name"/>

ループ

<xsl:for-each select="Xpath">
    <!-- 処理 -->
</xsl:for-each>

文字の装飾

<!-- イタリック -->
<i>italic</i>
<!-- ボールド -->
<b>bold</b>
<!-- 上付き文字 -->
<sup>upper</sup>
<!-- 下付き文字 -->
<sub>lower</sub>
<!-- 下線 -->
<u>underline</u>

設定ファイルの作成

保存場所

Windows11のoffice365の場合は以下に保存.

C:\Users\[usename]\AppData\Roaming\Microsoft\Bibliography\Style\[template_name].xsl

前述のとおり,保存場所は環境によって違いそうなので,
違う環境の場合は.Wordの参考資料 > 資料文献の管理 > 参照で調べてその中のStyleに保存する.

編集が必要な要素

構造の一部を取り出したものを載せる.構造を少しでも変えるとエラーがでるので,最後に示す全体のサンプルコードを編集して作成するのが良い.ちなみにエラーがあるとWordに読み込まれず エラーも表示されない

バージョン情報

管理用, Wordでの表示には関係ない

<xsl:when test="b:Version">
    <xsl:text>2024.07.03</xsl:text>
</xsl:when>

Wordでの表示用, 参考資料>スタイルの下に表示される(下図 第10版)

<xsl:when test="b:XslVersion">
    <xsl:text>1</xsl:text>
</xsl:when>

スタイル名

スタイル一覧で表示される,スタイル名(下図 Original Sample)

<xsl:when test="b:StyleNameLocalized">
    <xsl:text>OriginalTemplate</xsl:text>
</xsl:when>

1.png

必要項目名

文献追加時(下図)に表示する項目名.ここに登録するとすべての文献情報フィールドを表示しなくても表示された状態になる.必要な譲歩のみ表示すると便利.

フィールド名がわからない場合は文献追加を行ってSources.xmlに登録してそれを確認するのが手っ取り早い

<xsl:when test="b:GetImportantFields">
	<b:ImportantFields>
        <xsl:variable name="SourceType">
            <xsl:value-of select="b:GetImportantFields/b:SourceType"/>
        </xsl:variable>
		<xsl:choose>
			<xsl:when test="$SourceType = 'JournalArticle'"> 
                <b:ImportantField>
                    <xsl:text>b:Author/b:Author/b:NameList</xsl:text>
                </b:ImportantField>
                <b:ImportantField>
                    <xsl:text>b:Title</xsl:text>
                </b:ImportantField>
                <b:ImportantField>
                    <xsl:text>b:JournalName</xsl:text>
                </b:ImportantField>
                <b:ImportantField>
                    <xsl:text>b:Year</xsl:text>
                </b:ImportantField>
                <b:ImportantField>
                    <xsl:text>b:Pages</xsl:text>
                </b:ImportantField>
            </xsl:when>
        </xsl:choose>
    </b:ImportantFields>
</xsl:when>

2.png

文献の種別は以下の通り,資料種類のWordでの表示名と設定ファイルでの名前の対応表

日本語 コード
書籍 'Book'
書籍のセクション 'BookSection'
ジャーナルの記事 'JournalArticle'
新聞記事 'ArticleInAPeriodical'
会議議事録 'ConferenceProceedings'
論文/レポート 'Report'
Web サイト 'InternetSite'
Wbe サイト上の文書 'DocumentFromInternetSite'
電子情報 'ElectronicSource'
芸術 'Art'
録音物 'SoundRecording'
公演 'Performance'
録画物 'Film'
インタビュー 'Interview'
特許情報 'Patent'
訴訟情報 'Case'
その他 'Misc

文中引用の設定

まずは,文中引用の作成方法の定義を行う.ここについては基本的には変更不要

<xsl:template name="Citation">
    <html>
        <body>
        <xsl:for-each select="b:Citation/b:Source">
            <xsl:call-template name="formatCitation"/>
        </xsl:for-each>
        </body>
    </html>
</xsl:template>

文中引用における表示方法は<xsl:template name ="formatCitation">の中に定義する.単純化したものが以下.文献の種類ごとに分ける場合は<xsl:choose>を使って表示を切り替えるとよい.

<xsl:template name="formatCitation">
    <xsl:text>(</xsl:text>
    <xsl:value-of select="b:RefOrder"/>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="b:Year"/>
    <xsl:text>)</xsl:text>
</xsl:template>

上の設定で以下の様になる

3.png

文献一覧の設定

まずは,文献一覧の作成方法の定義を行う.ここについては基本的には変更不要

<xsl:template name="Bibliography">
    <html>
        <body>
            <xsl:element name="table">
                <xsl:attribute name="width">
                    <xsl:value-of select="'100%'"/>
                </xsl:attribute>
                <xsl:for-each select ="b:Bibliography/b:Source">
                    <xsl:sort select="b:RefOrder" order="ascending" data-type="number"/>
                <xsl:element name="tr">
                        <xsl:call-template name="formatBibliography"/>
                </xsl:element>
                </xsl:for-each>
            </xsl:element>
        </body>
    </html>
</xsl:template>

文献一覧における表示方法は<xsl:template name ="formatBibliography">の中に定義する.単純化したものが以下.文献の種類ごとに分ける場合は<xsl:choose>を使って表示を切り替える.

<xsl:template name ="formatBibliography">
    <xsl:value-of select="b:RefOrder"/> 
    <xsl:text>. </xsl:text>
    <xsl:value-of select="b:Author/b:Author/b:NameList/b:Person" />
    <xsl:text>, </xsl:text>
    <xsl:value-of select="b:Title"/>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="b:JournalName"/>
    <xsl:text>, </xsl:text>
    <xsl:value-of select="b:Year"/>
    <xsl:text>. </xsl:text>
</xsl:template>

上の設定で以下の様になる

4.png

フィールドによって特殊な表示方法をしたい場合は以下の様に変数を定義してその中で文字列の結合などを行うとよい

<!-- ページ番号の表示法 p.を付けたりpp.を付けたりする -->
<xsl:variable name ="pages_for_bib">
    <xsl:variable name ="initValueOfPages">
    <xsl:value-of select="b:Pages"/>
    </xsl:variable>
    <xsl:choose>
    <xsl:when test="contains($initValueOfPages, '-')">
        <xsl:value-of select="concat('pp.',$initValueOfPages)"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="concat('p.',$initValueOfPages)"/>
    </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<!-- ページ番号の表示 -->
<xsl:value-of select="$pages_for_bib"/>

XSLファイルのサンプル

最小限の構成

上で定義したものを実際に使う場合は以下のようになる.前述したようにエラーあるとWordに読み込まれず エラーも表示されない のでいったん以下のファイルを作成して動くことを確認してから編集を始めたほうが良い(どこかにログが残っているのだろうか?).編集するときは定期的に動作を確認しながら編集を進めないとどこに問題があるか 全く わからない.Wordを再起動すると新しいXSLファイルが読み込まれる.再起動しないと更新されないので注意.

OriginalTemplate.xsl
<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet   version="1.0"
                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                  xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
                  xmlns:t="http://www.microsoft.com/temp">

	<xsl:output method="html" encoding="us-ascii"/>

	<xsl:template match="/">
		<xsl:call-template name="Start"/>
	</xsl:template>

   <!-- Word起動時に動く部分? -->
	<xsl:template name="Start">
		<xsl:choose>
         <!-- バージョン情報 -->
			<xsl:when test="b:Version">
				<xsl:text>2024.01.01</xsl:text>
			</xsl:when>
         
         <!-- スタイルのプルダウンに表示されるバージョン情報 -->
			<xsl:when test="b:XslVersion">
				<xsl:text>1</xsl:text>
			</xsl:when>

         <!-- スタイルのプルダウンに表示されるテンプレート名 -->
         <xsl:when test="b:StyleNameLocalized">
            <xsl:text>OriginalTemplateLight</xsl:text>
         </xsl:when>


   <!-- #######################################################################
                    入力フィードでの必要情報の設定
        ####################################################################### -->

         <xsl:when test="b:GetImportantFields">
				<b:ImportantFields>
               <xsl:variable name="SourceType">
                  <xsl:value-of select="b:GetImportantFields/b:SourceType"/>
               </xsl:variable>
					<xsl:choose>
						<xsl:when test="$SourceType = 'JournalArticle'"> 
                     <b:ImportantField>
                        <xsl:text>b:Author/b:Author/b:NameList</xsl:text>
                     </b:ImportantField>
                     <b:ImportantField>
                        <xsl:text>b:Title</xsl:text>
                     </b:ImportantField>
                     <b:ImportantField>
                        <xsl:text>b:JournalName</xsl:text>
                     </b:ImportantField>
                     <b:ImportantField>
                        <xsl:text>b:Year</xsl:text>
                     </b:ImportantField>
                     <b:ImportantField>
                        <xsl:text>b:Pages</xsl:text>
                     </b:ImportantField>
						</xsl:when>
					</xsl:choose>
				</b:ImportantFields>
			</xsl:when>

         <!-- 文献一覧の設定の読み込み -->
			<xsl:when test="b:Bibliography">
				<xsl:call-template name="Bibliography"/>
			</xsl:when> 

         <!-- 引用の設定の読み込み -->
			<xsl:when test="b:Citation">
				<xsl:call-template name="Citation"/>
         	</xsl:when>
		</xsl:choose>
	</xsl:template>

   <!-- データを入力したときに動く部分 -->
	<xsl:template name ="Entry">
		<xsl:call-template name="Start"/>
	</xsl:template>


   <!-- #######################################################################
                                   引用の設定
        ####################################################################### -->

   <!-- 引用のフォーマットになにを使うかなどを設定(基本変更不要) -->
   <xsl:template name="Citation">
      <html>
         <body>
            <xsl:for-each select="b:Citation/b:Source">
               <xsl:call-template name="formatCitation"/>
            </xsl:for-each>
         </body>
      </html>
   </xsl:template>

   <!-- ここが引用の表示法 -->
   <xsl:template name="formatCitation">
      <xsl:text>(</xsl:text>
      <xsl:value-of select="b:RefOrder"/>
      <xsl:text>, </xsl:text>
      <xsl:value-of select="b:Year"/>
      <xsl:text>)</xsl:text>
   </xsl:template>

   <!-- #######################################################################
                                   文献一覧の設定
        ####################################################################### -->

   <!-- 一覧のフォーマットになにを使うかなどを設定(基本変更不要) -->
   <xsl:template name="Bibliography">
      <html>
			<body>
				<xsl:element name="table">
					<xsl:attribute name="width">
						<xsl:value-of select="'100%'"/>
					</xsl:attribute>
					<xsl:for-each select ="b:Bibliography/b:Source">
						<xsl:sort select="b:RefOrder" order="ascending" data-type="number"/>
                  <xsl:element name="tr">
						   <xsl:call-template name="formatBibliography"/>
                  </xsl:element>
					</xsl:for-each>
				</xsl:element>
         </body>
      </html>
   </xsl:template>

   <!-- ここが文献ごとの表示設定 -->
	<xsl:template name ="formatBibliography">
      <xsl:value-of select="b:RefOrder"/> 
      <xsl:text>. </xsl:text>
      <xsl:value-of select="b:Author/b:Author/b:NameList/b:Person" />
      <xsl:text>, </xsl:text>
      <xsl:value-of select="b:Title"/>
      <xsl:text>, </xsl:text>
      <xsl:value-of select="b:JournalName"/>
      <xsl:text>, </xsl:text>
      <xsl:value-of select="b:Year"/>
      <xsl:text>. </xsl:text>
	</xsl:template>

</xsl:stylesheet>

高度な設定を加えたものの例

著者を省略して表示するなどの高度な設定を加えたもの.上のファイルから<xsl:template name="formatCitation"><xsl:template name ="formatBibliography">を以下のように変更する.これの詳細の説明は省く,参考にすれば大体のテンプレートは作成可能なはず...

   <!-- formatCitation -->
   <xsl:template name="formatCitation">
      <xsl:variable name="SourceType">
         <xsl:value-of select="b:SourceType"/>
      </xsl:variable>
      <xsl:choose>
         <xsl:when test="$SourceType = 'JournalArticle'">
            <sup>
               <xsl:text>[</xsl:text>
               <xsl:value-of select="b:RefOrder"/>
               <xsl:text>]</xsl:text>
            </sup>
         </xsl:when>
         <xsl:otherwise>
            <b><sub>
               <xsl:text>(</xsl:text>
               <xsl:value-of select="b:RefOrder"/>
               <xsl:text>UndefinedDocType)</xsl:text>
            </sub></b>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>
   <!-- formatBibliography -->
	<xsl:template name ="formatBibliography">

      <xsl:variable name="SourceType">
			<xsl:value-of select="b:SourceType"/>
		</xsl:variable>

      <!-- 著者の表示方法 -->
      <xsl:variable name ="authors_for_bib">
         <xsl:for-each select="b:Author/b:Author/b:NameList/b:Person">
            <xsl:variable name="last" select="b:Last"/>
            <xsl:variable name="firstInitial" select="substring(b:First, 1, 1)"/>
            <xsl:variable name="authorName" select="concat($firstInitial, '. ', $last)"/>
            <xsl:choose>
               <xsl:when test="position() = 1">
                  <xsl:value-of select="$authorName"/>
               </xsl:when>
               <xsl:when test="position() = last()">
                  <xsl:text> &amp; </xsl:text>
                  <xsl:value-of select="$authorName"/>
               </xsl:when>
               <xsl:otherwise>
                  <xsl:text>, </xsl:text>
                  <xsl:value-of select="$authorName"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:for-each>
      </xsl:variable>

      <!-- ページ番号の表示法 -->
      <xsl:variable name ="pages_for_bib">
         <xsl:variable name ="initValueOfPages">
            <xsl:value-of select="b:Pages"/>
         </xsl:variable>
         <xsl:choose>
            <xsl:when test="contains($initValueOfPages, '-')">
               <xsl:value-of select="concat('pp.',$initValueOfPages)"/>
            </xsl:when>
            <xsl:otherwise>
               <xsl:value-of select="concat('p.',$initValueOfPages)"/>
            </xsl:otherwise>
         </xsl:choose>
      </xsl:variable>

      <!-- volumeの表示法 -->
      <xsl:variable name ="volume_for_bib">
         <xsl:variable name ="volume_temp">
            <xsl:value-of select="b:Volume"/>
         </xsl:variable>
         <xsl:choose>
            <xsl:when test="b:Volume">
               <xsl:value-of select="concat('vol.',$volume_temp)"/>
            </xsl:when>
         </xsl:choose>
      </xsl:variable>

      <!-- Noの表示法 -->
      <xsl:variable name ="no_for_bib">
         <xsl:variable name ="no_temp">
            <xsl:value-of select="b:Issue"/>
         </xsl:variable>
         <xsl:choose>
            <xsl:when test="b:Issue">
               <xsl:value-of select="concat('no.',$no_temp)"/>
            </xsl:when>
         </xsl:choose>
      </xsl:variable>

      <!-- doiの表示法 -->
      <xsl:variable name ="doi_for_bib">
         <xsl:variable name ="doi_temp">
            <xsl:value-of select="b:DOI"/>
         </xsl:variable>
         <xsl:choose>
            <xsl:when test="b:DOI">
               <xsl:value-of select="concat('doi: ',$doi_temp)"/>
            </xsl:when>
         </xsl:choose>
      </xsl:variable>

      <!-- 文献番号の表示 -->
      <xsl:element name="td">
         <xsl:attribute name="valign"><!-- セルの上寄せ -->
            <xsl:value-of select="'top'"/>
         </xsl:attribute>
         <xsl:text>[</xsl:text>
         <xsl:value-of select="b:RefOrder"/> 
         <xsl:text>]  </xsl:text>
      </xsl:element>

      <!-- 文献情報の表示 -->
      <xsl:element name="td">
         <xsl:choose>
            <xsl:when test="$SourceType = 'JournalArticle'">
               <xsl:value-of select="$authors_for_bib" />
               <xsl:text>, </xsl:text>
               <xsl:value-of select="b:Title"/>
               <xsl:text>, </xsl:text>
               <i>
                  <xsl:value-of select="b:JournalName"/>
               </i>
               <xsl:text>, </xsl:text>
               <xsl:value-of select="$volume_for_bib"/>
               <xsl:text>, </xsl:text>
               <xsl:value-of select="$no_for_bib"/>
               <xsl:text>, </xsl:text>
               <xsl:value-of select="$pages_for_bib"/>
               <xsl:text>, </xsl:text>
               <b>
                  <xsl:value-of select="b:Year"/>
               </b>
               <xsl:text>, </xsl:text>
               <xsl:value-of select="$doi_for_bib"/>
               <xsl:text>.</xsl:text>
            </xsl:when>
            <xsl:otherwise>
               <xsl:attribute name="style">
                  <xsl:value-of select="'color: red;'"/><!-- 文字色変更 -->
               </xsl:attribute>
               <xsl:text>Format Undefined (</xsl:text>
                  <xsl:value-of select="$SourceType"/>
               <xsl:text>)</xsl:text>
            </xsl:otherwise>
         </xsl:choose>
      </xsl:element>
	</xsl:template>

上の設定で以下の様になる

5.png

この例ではJournalArticleのみを定義してありほかの種別ではエラーを表示するようにしてある.ほかの種別で同じフォーマットを用いる場合は,

<xsl:when test="$SourceType = 'JournalArticle'">の部分以下の様にを変更すればよい.

<xsl:when test="$SourceType = 'JournalArticle' or
                $SourceType = 'Book' or 
                $SourceType = 'ConferenceProceedings'">
1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?