Top > OOoBasic > Writer > TableofContents

*目次 [#f4bc2985]

目次はテキストコンテンツとして com.sun.star.text.ContentIndex サービスを利用します。

#contents

**目次の挿入 [#h923f769]

com.sun.star.text.ContentIndex サービスをインスタンス化してコンテンツとして挿入します。挿入後に update しないと灰色のフィールドのみが表示された状態になります。

 Sub toc_1
   oDoc = ThisComponent
   oText = oDoc.getText()
   oEnd = oText.getEnd()
   oIndex = oDoc.createInstance("com.sun.star.text.ContentIndex")
   oIndex.CreateFromOutline = True
   oText.insertTextContent(oEnd,oIndex,False)
   
   oIndex.update()
 End Sub

**目次の更新 [#ha4b2e60]

''update'' メソッドを呼び出します。

**目次の取得 [#ub1f0ebc]

ドキュメントに既存の目次があるときには DocumentIndexes プロパティから取得します。取得したコンテナオブジェクトには目次以外にも索引なども含まれるため、個別にサービス名を調べます。目次オブジェクトのサービス名は com.sun.star.text.ContentIndex です。

 Sub toc_4
   oDoc = ThisComponent
   oIndexes = oDoc.getDocumentIndexes()
   For i = 0 To oIndexes.getCount() -1
      oIndex = oIndexes.getByIndex(i)
      If oIndex.ServiceName = "com.sun.star.text.ContentIndex" Then
        '...
      End If
   Next i
 End Sub
**目次エントリマーク [#ya39954a]

目次に項目を追加するときのエントリマークの挿入は、テキスト範囲に com.sun.star.text.ContentIndexMark サービスを挿入する形で設定します。マークのアンカーのテキスト範囲がエントリになります。以下の例では選択範囲にエントリマークを設定します。

 Sub toc_5
   oDoc = ThisComponent
   oIndexes = oDoc.getDocumentIndexes()
   oIndex = oIndexes.getByName("Table of Contents1")
   oText = oDoc.getText()
 
   oSelection = oDoc.getCurrentSelection()
   If oSelection.Count = 1 Then
     oEntry = oDoc.createInstance("com.sun.star.text.ContentIndexMark")
     oRange = oSelection.getByIndex(0)
     oText.insertTextContent(oRange,oEntry,True)
   End If
   oIndex.update()
 End Sub

エントリマークの項目を目次に表示したいときには ''CreateFromMarks'' プロパティを true に設定します。
**プロパティ一覧 [#p4f2872f]
|プロパティ|型||
|BackColor|long|背景色|
|BackGraphicFilter|string|背景画像フィルター名|
|BackGraphicLocation|.style.GraphicLocation|背景画像配置|
|BackGraphicURL|string|背景画像 URL|
|BackTransparent|boolean|背景の透過|
|ContentSection|.text.XTextSection|コンテンツ部分のセクションオブジェクト|
|CreateFromChapter|boolean|チャプタをコンテンツに|
|CreateFromLevelParagraphStyles|boolean|段落スタイルからレベル作成|
|CreateFromMarks|boolean|コンテンツマークから作成|
|CreateFromOutline|boolean|アウトラインから作成|
|DocumentIndexMarks|[].text.XDocumentIndexMark|コンテンツエントリーマーク|
|HeaderSection|.text.XTextSection|目次ヘッダ部分のセクションオブジェクト|
|IsProtected|boolean|保護する|
|IsRelativeTabstops|boolean|相対タブストップを利用|
|Level|short|レベル|
|LevelFormat|.container.XIndexReplace|レベルごとのフォーマットスタイル|
|LevelParagraphStyles|.container.XIndexReplace|レベルごとの段落フォーマット|
|Name|string|目次オブジェクト名|
|ParaStyleHeading|string|目次ヘッダスタイル名|
|ParaStyleLevel1|string|項目スタイル名|
|ParaStyleLevel10|string||
|ParaStyleLevel2|string||
|ParaStyleLevel3|string||
|ParaStyleLevel4|string||
|ParaStyleLevel5|string||
|ParaStyleLevel6|string||
|ParaStyleLevel7|string||
|ParaStyleLevel8|string||
|ParaStyleLevel9|string||
|TextColumns|.text.XTextColumns|列区切り列|
|Title|string|目次タイトル|

** その他のスタイルから [#w134f784]
その他のスタイルが指定された段落から目次の項目を追加します。まず、CreateFromLevelParagraphStyles プロパティを True にします。その後、追加したい段落のスタイル名を次のようにして追加します。

 Sub toc_5
  oDoc = ThisComponent
  oText = oDoc.getText()
  oEnd = oText.getEnd()
  oIndex = oDoc.createInstance("com.sun.star.text.ContentIndex")
  oIndex.CreateFromOutline = True
  oIndex.CreateFromLevelParagraphStyles = True
  ' Heading a スタイルを追加
  oLevelParaStyles = oIndex.LevelParagraphStyles
  oLevelParaStyles.replaceByIndex(1, Array("Heading a"))
  
  oText.insertTextContent(oEnd,oIndex,False)
  
  oIndex.update()
 End Sub


** 項目の形式 [#me2ce9da]
各目次項目は LevelFormat プロパティからアクセスできるコンテナで管理されています。項目は各レベルに所属しており、このコンテナではレベルがインデックスとなっています。

ダイアログで目次の項目を編集するときと同じ順序で項目を指定していきます。各値は []com.sun.star.beans.PropertyValue です。
項目は二つの要素で構成されており、一つは TokenType でその項目の種類を表します。もうひとつの CharacterStyleName ではスタイル名を指定します。

TokenType 項目の種類は com.sun.star.text.DocumentIndexLevelFormat サービスの説明に書かれています。

|名前|説明|h
|TokenEntryNumber|章、セクション番号など|
|TokenEntryText|見出しのテキスト|
|TokenTabStop|タブ|
|TokenPageNumber|ページ番号|
|TokenText|テキスト|
|TokenHyperlinkStart|ハイパーリンク開始|
|TokenHyperlinkEnd|ハイパーリンク終了|
|TokenChapterInfo|章情報。表や図などの目次用。|
|TokenBibliographyDataField|参考文献データフィールド名|

TokenType が TokenTabStop のときには追加で次の項目を指定します。

|名前|説明|h
|TabStopRightAligned|タブで右揃え|
|TabStopFillCharacter|タブとして埋める文字|
|WithTab|True のときタブを挿入|

TokenType が TokenEntryText のときには Text 項目で挿入するテキストを指定します。

デフォルトの項目は次のような構成になっています。

 '章番号 項目名 タブ(文字"."、右揃え) ページ番号
 
 aFormat = Array( _
   Array(mkPropertyValue("TokenType", "TokenEntryNumber"), _
         mkPropertyValue("CharacterStyleName", "")), _
   Array(mkPropertyValue("TokenType", "TokenEntryText"), _
         mkPropertyValue("CharacterStyleName", "")), _
   Array(mkPropertyValue("TokenType", "TokenTabStop"), _
         mkPropertyValue("TabStopRightAligned", True), _
         mkPropertyValue("TabStopFillCharacter", "."), _
         mkPropertyValue("WithTab", True), _
         mkPropertyValue("CharacterStyleName", "")), _
   Array(mkPropertyValue("TokenType", "TokenPageNumber"), _
         mkPropertyValue("CharacterStyleName", "")) _
 )
 
 Function mkPropertyValue(sName, vValue) As com.sun.star.beans.PropertyValue
   v = CreateUnoStruct("com.sun.star.beasn.PropertyValue")
   v.Name = sName
   v.Value = vValue
   mkPropertyValue = v
 End Function

例えば、ハイパーリンクをページ番号の部分に設定するなら、TokenPageNumber の項目を TokenHyperlinkStart と TokenHyperlinkEnd で囲みます。

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes