Вставьте ссылку на номер страницы в 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 ответ
"Это довольно просто с Pub 2007. Просто вставьте> закладку и перетащите этот значок туда, куда вы хотите перейти по ссылке. Затем выберите текст> вставить гиперссылку> место в этом документе и выберите закладку, которую вы только что создали. Единственный раз У меня были проблемы, если страница недостаточно длинна под закладкой... и есть обходные пути. http://office.microsoft.com/en-us/publisher-help/create-a-hyperlink-HP010203490.aspx DavidF"
Дайте мне знать, если это поможет или вам по какой-то причине нужно сделать это в VBA
Редактировать: довольно просто написать макрос для обновления ссылок на страницы, но ссылки на закладки, похоже, плохо поддерживаются объектной моделью, если я что-то не заметил. Мое решение состоит из двух частей.
Прежде всего, ссылки, которые должны быть обновлены, распознаются по их отображаемому тексту, начинающемуся со страницы (LIKE "page *"). Макрос обновления просто распознает эти ссылки и изменяет их отображаемый текст на страницу X. Однако это не работает для ссылок на закладки, которые в объектной модели ведут себя как ссылки на страницы, за исключением того, что идентификатор страницы, на который они ссылаются, не существует, Я потратил довольно много времени, пытаясь выяснить, какие могут быть отношения между этой несуществующей гиперссылкой и закладкой, но безрезультатно. Вместо этого я создал обходной путь, в котором вы вручную связываете гиперссылку и закладку с объектом тега (создавая тег для закладки со значением несуществующего идентификатора страницы гиперссылки).
Инструкция по обычным ссылкам на страницы
Создайте гиперссылку на страницу. Текст должен начинаться с "страницы" (в противном случае RefreshReferenceLinks необходимо редактировать)
Запустите C_RefreshReferenceLinks, чтобы обновить, чтобы убедиться, что это работает
Инструкции для ссылок на закладки (обходные пути тегов)
Создать закладку (Вставить -> Закладка)
Создать гиперссылку на закладку
Выберите гиперссылку и запустите A_GetPageIdOfHyperlink
Выберите закладку и запустите B_TagBookmarkWithPageId
Запустите 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