Вставьте ссылку на номер страницы в Microsoft Publisher 2010

Я новичок в MS Publisher 2010 и пытаюсь добавить "динамическую" ссылку на определенную страницу. В идеале визуализированный текст должен выглядеть примерно так:

...see the example on page XXX

Я хотел бы, чтобы часть XXX визуализировала номер страницы, на которую я ссылаюсь. Я видел, что вы можете размещать закладки в документе и создавать гиперссылки на эти закладки, но пока мне не удавалось визуализировать номер страницы, связанный с закладкой.

Чтобы сделать еще один пример, я хотел бы эквивалент этого выражения латекса:

...see the example on page~\pageref{reference-to-XXX}

Можно ли получить этот эффект в Publisher 2010, возможно, с помощью сценария VB? Спасибо за помощь!

1 ответ

Решение

http://answers.microsoft.com/en-us/office/forum/office_2007-office_other/how-do-i-hyperlink-specific-text-within-the-same/598cfd98-6217-4eac-9ac9-969477c46401?auth=1

"Это довольно просто с Pub 2007. Просто вставьте> закладку и перетащите этот значок туда, куда вы хотите перейти по ссылке. Затем выберите текст> вставить гиперссылку> место в этом документе и выберите закладку, которую вы только что создали. Единственный раз У меня были проблемы, если страница недостаточно длинна под закладкой... и есть обходные пути. http://office.microsoft.com/en-us/publisher-help/create-a-hyperlink-HP010203490.aspx DavidF"

Дайте мне знать, если это поможет или вам по какой-то причине нужно сделать это в VBA

Редактировать: довольно просто написать макрос для обновления ссылок на страницы, но ссылки на закладки, похоже, плохо поддерживаются объектной моделью, если я что-то не заметил. Мое решение состоит из двух частей.

Прежде всего, ссылки, которые должны быть обновлены, распознаются по их отображаемому тексту, начинающемуся со страницы (LIKE "page *"). Макрос обновления просто распознает эти ссылки и изменяет их отображаемый текст на страницу X. Однако это не работает для ссылок на закладки, которые в объектной модели ведут себя как ссылки на страницы, за исключением того, что идентификатор страницы, на который они ссылаются, не существует, Я потратил довольно много времени, пытаясь выяснить, какие могут быть отношения между этой несуществующей гиперссылкой и закладкой, но безрезультатно. Вместо этого я создал обходной путь, в котором вы вручную связываете гиперссылку и закладку с объектом тега (создавая тег для закладки со значением несуществующего идентификатора страницы гиперссылки).

Инструкция по обычным ссылкам на страницы

  1. Создайте гиперссылку на страницу. Текст должен начинаться с "страницы" (в противном случае RefreshReferenceLinks необходимо редактировать)

  2. Запустите C_RefreshReferenceLinks, чтобы обновить, чтобы убедиться, что это работает

Инструкции для ссылок на закладки (обходные пути тегов)

  1. Создать закладку (Вставить -> Закладка)

  2. Создать гиперссылку на закладку

  3. Выберите гиперссылку и запустите A_GetPageIdOfHyperlink

  4. Выберите закладку и запустите B_TagBookmarkWithPageId

  5. Запустите C_RefreshReferenceLinks, чтобы обновить, чтобы убедиться, что это работает

Вы можете скачать мой пример проекта, содержащий пример содержимого, инструкции и макросы ниже, здесь: http://www.filedropper.com/showdownload.php/pageandbookmarklinks (возможно, он выдаст вам предупреждение безопасности, поскольку содержит макросы)

Полный источник

Public Const tagName = "BookmarkPageId"

Sub A_GetPageIdOfHyperlink()
    Dim oHyperlink As Hyperlink
    Set oHyperlink = ActiveDocument.Selection.TextRange.Hyperlinks(1)
    CopyText oHyperlink.pageId
    MsgBox oHyperlink.pageId & " copied to clipboard as text"
End Sub

Sub B_TagBookmarkWithPageId()
    Dim oShape As Shape
    Set oShape = ActiveDocument.Selection.ShapeRange(1)

    If IsBookmark(oShape) Then
        If TagExists(oShape.Tags, tagName) Then
            oShape.Tags(tagName).Delete
        End If

        Dim txt As String
        txt = Trim(GetClipBoardText())
        Debug.Print "Ssdsd:" & txt

        Dim newTag As Tag
        Set newTag = oShape.Tags.Add(tagName, txt)

        MsgBox "Tagged as " & tagName & " = '" & txt & "'"
    Else
        MsgBox "Not a bookmark"
    End If


End Sub


Sub C_RefreshReferenceLinks()
    Dim oPage As Page
    Dim oShape As Shape

     For Each oPage In ActiveDocument.Pages
        For Each oShape In oPage.Shapes
          RefreshInShape oShape
        Next oShape
    Next oPage

    For Each oPage In ActiveDocument.MasterPages
        For Each oShape In oPage.Shapes
          RefreshInShape oShape
        Next oShape
    Next oPage

    For Each oShape In ActiveDocument.ScratchArea.Shapes
        RefreshInShape oShape
    Next oShape

End Sub

Function RefreshInShape(oShape As Shape)
    Dim cHyperlinks As Hyperlinks
    Dim oHyperlink As Hyperlink

    If oShape.HasTextFrame = False Then Exit Function

    Set cHyperlinks = oShape.TextFrame.TextRange.Hyperlinks

    For i = 1 To cHyperlinks.Count

        Set oHyperlink = cHyperlinks(i)

        If oHyperlink.TargetType = pbHlinkTargetTypePageID Then

            If oHyperlink.TextToDisplay Like "page *" Then
                oHyperlink.TextToDisplay = "page " & GetPageNumberByPageId(oHyperlink.pageId)
            End If

        End If

    Next i
End Function

Function GetPageNumberByPageId(pageId)
    Dim oPage As Page
    Dim oShape As Shape
    Dim oTag As Tag

    For Each oPage In ActiveDocument.Pages

        If CLng(oPage.pageId) = CLng(pageId) Then
            GetPageNumberByPageId = oPage.PageNumber
            Exit Function
        End If

    Next oPage

    For Each oPage In ActiveDocument.Pages
        For Each oShape In oPage.Shapes
            If TagExists(oShape.Tags, tagName) Then
                Set oTag = oShape.Tags(tagName)
                If CStr(oTag.Value) = CStr(pageId) Then
                    GetPageNumberByPageId = oPage.PageNumber
                    Exit Function
                End If
            End If
        Next oShape
    Next oPage

    GetPageNumberByPageId = "[ERROR]"

End Function


Function IsBookmark(oShape As Shape)
    IsBookmark = False
    If oShape.Type = pbWebHTMLFragment And oShape.AutoShapeType = msoShapeMixed Then
        IsBookmark = True
    End If
End Function

Function TagExists(collection As Tags, itemName As String) As Boolean
    TagExists = False
    Dim oTag As Tag
    For Each oTag In collection
        If oTag.Name = itemName Then
        TagExists = True
        Exit For
        End If
    Next oTag
End Function

Function GetParentOfType(obj As Object, sTypeName As String)
    Do Until TypeName(GetParentOfType) = "Page"
        Set GetParentOfType = obj.Parent
    Loop
End Function


Sub CopyText(Text As String)
    'VBA Macro using late binding to copy text to clipboard.
    'By Justin Kay, 8/15/2014
    'Thanks to http://akihitoyamashiro.com/en/VBA/LateBindingDataObject.htm
    Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    MSForms_DataObject.SetText Text
    MSForms_DataObject.PutInClipboard
    Set MSForms_DataObject = Nothing
End Sub

Function GetClipBoardText() As String
   Set DataObj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

   On Error GoTo Whoa

   '~~> Get data from the clipboard.
   DataObj.GetFromClipboard

   '~~> Get clipboard contents
   GetClipBoardText = DataObj.GetText(1)


   Exit Function
Whoa:
   GetClipBoardText = ""
End Function
Другие вопросы по тегам