Отображение диакритических знаков в списке - PullRequest
0 голосов
/ 02 ноября 2019

Я написал небольшую программу в MS Word VBA, которая предназначена для отображения комбинаций обычных символов с несколькими диакритическими знаками в списке. Программа хранит каждую комбинацию, составляющую один символ, в массиве, содержащем несколько под-массивов. Обычные символы, а также объединяющие диакритические знаки (например, акцентная могила на à) сохраняются с помощью их числового значения, в данном случае «0300». Когда я активирую список через ярлык набора (CTRL + SPACE), метод UserForm_activate() проходит по массиву, объединяет содержимое каждого массива с помощью метода ChrW("&H" & arrayofArrays(i)(1)) & ... до последнего символа и добавляет его в список.

Большинство шрифтов имеют проблемы с отображением этих символов, например, TNR:

Calibri фактически отображает их лучше, но не может отображать диакритические знаки "запятая над" и "острый"тональная метка рядом (как и должно быть). Вместо этого они явно мешают друг другу

См. Например, c , который должен выглядеть примерно так: c̓ ́

Calibri имеет эту проблему, даже когдавставка символа в документ, а не только при отображении его в списке. Хотя Times New Roman правильно вставляет каждую комбинацию.

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

Мой код:

Файл: formBetacode

Option Explicit

Private Sub UserForm_Activate()
    Dim i As Integer
    For i = 0 To 37
    Select Case UBound(betaArrayofArrays(i)) - LBound(betaArrayofArrays(i)) + 1
        Case 2
            lbResults.AddItem ChrW("&H" & betaArrayofArrays(i)(1)) 'adding the match to results
        Case 3
            lbResults.AddItem ChrW("&H" & betaArrayofArrays(i)(1)) & ChrW("&H" & betaArrayofArrays(i)(2))
        Case 4
            lbResults.AddItem ChrW("&H" & betaArrayofArrays(i)(1)) & ChrW("&H" & betaArrayofArrays(i)(2)) & ChrW("&H" & betaArrayofArrays(i)(3))
        Case 5
            lbResults.AddItem ChrW("&H" & betaArrayofArrays(i)(1)) & ChrW("&H" & betaArrayofArrays(i)(2)) & ChrW("&H" & betaArrayofArrays(i)(3)) & ChrW("&H" & betaArrayofArrays(i)(4))
        Case 6
            lbResults.AddItem ChrW("&H" & betaArrayofArrays(i)(1)) & ChrW("&H" & betaArrayofArrays(i)(2)) & ChrW("&H" & betaArrayofArrays(i)(3)) & ChrW("&H" & betaArrayofArrays(i)(4)) & ChrW("&H" & betaArrayofArrays(i)(5))
        Case Else
            MsgBox "Error"
        End Select
    Next i
End Sub

Файл: AutoExecuteобычный модуль (первая строка в массиве всегда содержит последовательность, с которой должен быть объединен символ (например, a: становится ä, o1? / становится œ̣́ и т. д. четвертым)

Option Explicit

Dim theApp As New InitClassModule
Public betaArrayofArrays(37) As Variant

'------------------------------------Initialization-------------------------
Sub AutoExec()
    Set theApp.app = Word.Application
End Sub

Sub AutoOpen()
    Set theApp.app = Word.Application
End Sub

'Add keybinding to this document Shorcut: CTRL+Space
Sub AddKeyBinding()
        With Application
        .CustomizationContext = ThisDocument
        .KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyControl, wdKeySpacebar), _
        KeyCategory:=wdKeyCategoryCommand, _
        Command:="showForm"
    End With
End Sub

 'sub for launching the form
Sub showForm()
    formBetacode.Show
End Sub


'-----------------------------FillingTheBetacodeArrayOfArrays------------------
Sub initBetaArrayofArrays()

'-----------------------LATIN-----------------------
'----A
    betaArrayofArrays(0) = Array("a", "0061")
    betaArrayofArrays(1) = Array("a:~/", "0061", "0308", "0303", "0301")
    betaArrayofArrays(2) = Array("a|-/", "0061", "030A", "0304", "0301")
    betaArrayofArrays(3) = Array("a-~/", "0061", "0304", "0303", "0301")
    betaArrayofArrays(4) = Array("a:-/", "0061", "0308", "0304", "0301")
    betaArrayofArrays(5) = Array("a@", "0061", "032F")
    betaArrayofArrays(6) = Array("a3-", "01E3")
'----C
    betaArrayofArrays(7) = Array("c)/", "0063", "0313", "0341")
'----E
    betaArrayofArrays(8) = Array("e@", "0065", "032F")
    betaArrayofArrays(9) = Array("e?/", "0065", "0323", "0301")
    betaArrayofArrays(10) = Array("e?-/", "0065", "0323", "0304", "0301")
    betaArrayofArrays(11) = Array("e(/", "0065", "031C", "0301")
    betaArrayofArrays(12) = Array("e(-", "0065", "031C", "0304")
    betaArrayofArrays(13) = Array("e(-/", "0065", "031C", "0304", "0301")
    betaArrayofArrays(14) = Array("e1", "01DD")
    betaArrayofArrays(15) = Array("e1/", "01DD", "0301")
    betaArrayofArrays(16) = Array("e1~", "01DD", "0303")
    betaArrayofArrays(17) = Array("e1~/", "01DD", "0303", "0301")
    betaArrayofArrays(18) = Array("e1-~", "01DD", "0304", "0303")
    betaArrayofArrays(19) = Array("e1-/", "01DD", "0304", "0301")
'----G
    betaArrayofArrays(20) = Array("g)/", "0067", "0313", "0341")
'----O
    betaArrayofArrays(21) = Array("o1-~/", "0153", "0304", "0303", "0301")
    betaArrayofArrays(22) = Array("o1?", "0153", "0323")
    betaArrayofArrays(23) = Array("o1(", "0153", "031C")
    betaArrayofArrays(24) = Array("o1?/", "0153", "0323", "0301")
    betaArrayofArrays(25) = Array("o1?~", "0153", "0323", "0303")
    betaArrayofArrays(26) = Array("o1?-", "0153", "0323", "0304")
    betaArrayofArrays(27) = Array("o1?-/", "0153", "0323", "0304", "0301")
    betaArrayofArrays(28) = Array("o1?-~", "0153", "0323", "0304", "0303")
    betaArrayofArrays(29) = Array("o1?~/", "0153", "0323", "0303", "0301")
    betaArrayofArrays(30) = Array("o1?-~/", "0153", "0323", "0304", "0303", "0301")
    betaArrayofArrays(31) = Array("o1(/", "0153", "031C", "0301")
    betaArrayofArrays(32) = Array("o1(~", "0153", "031C", "0303")
    betaArrayofArrays(33) = Array("o1(-", "0153", "031C", "0304")
    betaArrayofArrays(34) = Array("o1(-~", "0153", "031C", "0304", "0303")
    betaArrayofArrays(35) = Array("o1(-/", "0153", "031C", "0304", "0301")
    betaArrayofArrays(36) = Array("o1(~/", "0153", "031C", "0303", "0301")
    betaArrayofArrays(37) = Array("o1(-~/", "0153", "031C", "0304", "0303", "0301")
End Sub

Файл:InitClassModule

модуль класса явно

Option Explicit

Public WithEvents app As Word.Application

'Initializing the betaCollection when the document gets opened
Private Sub app_DocumentOpen(ByVal Doc As Document)
    initBetaArrayofArrays
    AddKeyBinding
End Sub

'Initializing the betaCollection when a new document gets created
Private Sub app_NewDocument(ByVal Doc As Document)
    initBetaArrayofArrays
    AddKeyBinding
End Sub
...