我有许多在Unicode前时代制作的文档,包含各种语言的转录,每种语言都有自己的字体。 我创建了一个宏,用另一个字符(从多个旧的转录字体转换为unicode字体)替换文档中的每个字符。 (有关其中一种字体的宏,请参见下面的代码)
出于某种原因,宏保留了某些字符的格式(在我的情况下,大多数是斜体),而不是其他字符。这留下了许多单词,其中一些字母用斜体字表示,而其他字母则不用,例如。
al-Malik al-Mu ǧāhidḫuṭ ba
丢失格式的字符都是带有变音符号的字符,但并非所有带有变音符号的字符都会丢失其格式(例如,示例中的ḫ)。 并非所有保留其格式的字符在原始字体中都具有与unicode字体相同的代码点(例如,示例中的ḫ在原始字体中具有unicode编号U + 23,在unicode字体中具有U + 1E2B)。 / p>
您是否知道为什么要为某些字符保留格式,而不是为其他字符保留格式?或者我如何解决这个问题?
或者,我可以在程序中添加另一个宏,将所有包含至少一个斜体字母的单词格式化为斜体(但如何做到这是另一个问题:MS Word macro to correct partially formatted words)。
inn()
答案 0 :(得分:2)
首先,作为建议,如果将数组设置为: -
,则可以使用较小的代码库Dim ValueMap(270) As String
Dim AryTemp() As String
ValueMap(0) = "&H30|&H30"
For i = 0 To 270
AryTemp = Split(ValueMap(i),"|")
'AryTemp(0) = The Old
'AryTemp(1) = The New
Next
关于你的问题的答案。我不知道如何阻止它丢失斜体,我怀疑这可能是由于它通过样式而不是格式设置为斜体,反之亦然,但这种深度的调查不适合这种环境(Q& A)我不这么认为。
至于解决方案,有很多方法可以满足您的需求,正如您在other question中解决的那样,我不认为这可以通过一揽子方式完成(即没有办法在执行查找和替换后,不保留信息,将所有斜体设置为斜体。所以它必须在交换字符时完成,这意味着它只能在一次性能影响的时候进行一次查找和替换。
在下面的例子中,我也使用了上面描述的较短阵列方法。
Public Sub Sample()
Dim BlnWasItalic As Boolean
Dim AryValueMap(270) As String
Dim AryTemp() As String
Dim LngLocation As Long
Dim LngValueID As Long
Dim WdDoc As Word.Document
Dim WdFnd As Word.Find
Dim WdRng As Word.Range
Dim WdSlct As Word.Selection
AryValueMap(0) = "&H30|&H30"
AryValueMap(1) = "&H31|&H31"
'...
AryValueMap(269) = "&H2C|H2C"
AryValueMap(270) = "&H9|&H9"
Set WdDoc = ThisDocument
For Each WdRng In WdDoc.StoryRanges
For LngValueID = 0 To 270
WdRng.Select
Set WdSlct = Selection
WdSlct.SetRange 0, 0
Set WdFnd = WdSlct.Find
'Clear any previous find settings
If LngValueID = 0 Then
WdFnd.ClearAllFuzzyOptions
WdFnd.ClearFormatting
WdFnd.ClearHitHighlight
.Font.Name = "AO Times New Roman"
End If
AryTemp = Split(AryValueMap(LngValueID), "|")
'Look for any italic character
Do Until Not WdFnd.Execute(FindText:=ChrW(AryTemp(0)), MatchCase:=True, _
MatchWholeWord:=False, MatchWildcards:=False, _
MatchSoundsLike:=False, MatchAllWordForms:=False, _
Forward:=True, Wrap:=wdFindStop, Format:=True, _
ReplaceWith:="", Replace:=wdReplaceNone, _
MatchKashida:=False, MatchDiacritics:=False, _
MatchAlefHamza:=False, MatchControl:=False)
'Take note if it was italic
BlnWasItalic = WdSlct.Font.Italic
'Make the replacement
WdSlct = ChrW(AryTemp(1))
'Remember the location (in case there are due to be more than
'one change in one word
LngLocation = WdSlct.End
'Expand the selection to the whole word
WdSlct.Expand wdWord
'Set the font
WdSlct.Font.Name = "Arial Unicode MS"
'Set the word to be italic if it was meant to be
WdSlct.Font.Italic = BlnWasItalic
'Move past the word
WdSlct.SetRange LngLocation, LngLocation
Loop
Set WdFnd = Nothing
Set WdSlct = Nothing
DoEvents
Next
DoEvents
Next
Set WdDoc = Nothing
End Sub
(此代码未经测试并形成以示例解决方案)
答案 1 :(得分:0)
您可以尝试关闭自动更正功能,因为它可以替换某些字符。
在Word中,字符具有段落样式和字符样式,因此您可以尝试查看这些:
<div id="myModal1" class="modal hide" role="dialog">