在word中实现代码的语法高亮

来源:互联网 发布:推广电脑软件赚钱 编辑:程序博客网 时间:2024/05/19 07:28

       有时写文档时需要将代码粘贴到word中,但直接粘贴到word中的代码虽能保持换行与缩进等格式,但在一般代码编辑工具中的关键字高亮功能却无法实现,即粘贴到word中的代码不在具有丰富的色彩。使用一款免费软件——notepad++即可实现将关键字高亮的代码粘贴到word中。

       首先用notepad++打开源代码文件。notepad++能识别C/C++、Java、matlab等多种语言的源代码。选中要粘贴的代码(如果该代码文件中的所有内容均需要粘贴,则无需选中文字)。然后在选择 插件->NppExport->Copy HTML to clipboard。

然后在word中粘贴即可。

此外,关键字的颜色也可以根据自己的需求在notepad++中进行设置,设置方法:菜单->格式->语言格式设置

--------------------------------

也可以参考侯捷《word排版艺术》中的vba脚本

由于是代码,所以推荐中文使用宋体(注释中),而英文使用等宽字体(courier new)。


-------------------------------------

最近我经常在word 里面写东西,发现程序代码拷贝到word 里面就没有了在代码编辑器里面的那种语法高亮的效果,感觉不爽。于是我上网搜了搜,发现目前在word 中实现语法高亮的方法主要是通过安装一个插件。由于我先天的对插件比较反感,所以自己动手,使用word 等office 软件都支持的VBA (Visual BAsic For Application) 写了一个语法高亮的宏。

这个宏的功能比较简单,就是利用得到文档中选中部分的代码,然后分词,判断该词的类别,然后着色。我现在使用的分词方法是VBA 提供的,大部分情况下和我们预期的比较一致。但是在某些情况下,比如连续的分隔符,这种分词方法会和C 语言分析器的分词结果不同的。

这个宏除了可以语法着色,还可以为代码标注行号。(听说侯捷在《word 排版艺术》一书中也有一个为代码添加行号的宏。不知道他的宏和我的宏是否雷同。如有雷同,纯属巧合:)


 'script to high light code In document

Private Function isKeyword(w) As Boolean

    
Dim keys As New Collection

    
With keys

        .Add 
" if": .Add "else": .Add "switch": .Add "case": .Add "default": .Add "break"

        .Add 
"goto": .Add "return": .Add "for": .Add "while": .Add "do": .Add "continue"

        .Add 
"typedef": .Add "sizeof": .Add "NULL": .Add "new": .Add "delete": .Add "throw"

        .Add 
"try": .Add "catch": .Add "namespace": .Add "operator": .Add "this": .Add "const_cast"

        .Add 
"static_cast": .Add "dynamic_cast": .Add "reinterpret_cast": .Add "true"

        .Add 
"false": .Add "null": .Add "using": .Add "typeid": .Add "and": .Add "and_eq"

        .Add 
"bitand": .Add "bitor": .Add "compl": .Add "not": .Add "not_eq": .Add "or"

        .Add 
"or_eq": .Add "xor": .Add "xor_eq"

    
End With

    isKeyword 
= isSpecial(w, keys)

End Function

Private Function isSpecial(ByVal w As String, ByRef col As Collection) As Boolean

    
For Each i In col

        
If w = i Then

            isSpecial 
= True

            
Exit Function

        
End If

    
Next

    isspeical 
= False

End Function

Private Function isOperator(w) As Boolean

    
Dim ops As New Collection

    
With ops

        .Add 
"+": .Add "-": .Add "*": .Add "/": .Add "&": .Add "^": .Add ";"

        .Add 
"%": .Add "#": .Add "!": .Add ":": .Add ",": .Add "."

        .Add 
"||": .Add "&&": .Add "|": .Add "=": .Add "++": .Add "--"

        .Add 
"'": .Add """"

    
End With

    isOperator 
= isSpecial(w, ops)

End Function

Private Function isType(ByVal w As StringAs Boolean

    
Dim types As New Collection

    
With types

        .Add 
"void": .Add "struct": .Add "union": .Add "enum": .Add "char": .Add "short": .Add "int"

        .Add 
"long": .Add "double": .Add "float": .Add "signed": .Add "unsigned": .Add "const": .Add "static"

        .Add 
"extern": .Add "auto": .Add "register": .Add "volatile": .Add "bool": .Add "class": .Add " private"

        .Add 
"protected": .Add "public": .Add "friend": .Add "inlIne": .Add "template": .Add "virtual"

        .Add 
"asm": .Add "explicit": .Add "typename"

    
End With

    isType 
= isSpecial(w, types)

End Function

Sub SyntaxHighlight()

    
Dim wordCount As Integer

    
Dim d As Integer

    
' set the style of selection

    Selection.Style 
= "ccode"
    

    d 
= 0

    wordCount 
= Selection.Words.Count

    Selection.StartOf wdWord

    
While d < wordCount

        d 
= d + Selection.MoveRight(wdWord, 1, wdExtend)

        w 
= Selection.Text

        
If isKeyword(Trim(w)) = True Then

            Selection.Font.Color 
= wdColorBlue

        
ElseIf isType(Trim(w)) = True Then

            Selection.Font.Color 
= wdColorDarkRed

            Selection.Font.Bold 
= True

        
ElseIf isOperator(Trim(w)) = True Then

            Selection.Font.Color 
= wdColorBrown

        
ElseIf Trim(w) = "//" Then

            
'lIne comment

            Selection.MoveEnd wdLine, 
1

            commentWords 
= Selection.Words.Count

            d 
= d + commentWords

            Selection.Font.Color 
= wdColorGreen

            Selection.MoveStart wdWord, commentWords

         
ElseIf Trim(w) = "/*" Then

            
'block comment

            
While Selection.Characters.Last <> "/"

                Selection.MoveLeft wdCharacter, 
1, wdExtend

                Selection.MoveEndUntil (
"*")

                Selection.MoveRight wdCharacter, 
2, wdExtend

            
Wend

            commentWords 
= Selection.Words.Count

            d 
= d + commentWords

            Selection.Font.Color 
= wdColorGreen

            Selection.MoveStart wdWord, commentWords

        
End If

        
'move the start of selection to next word

        Selection.MoveStart wdWord

    
Wend

    
' prepare For set lIne number

    Selection.MoveLeft wdWord, wordCount, wdExtend

    SetLIneNumber

End Sub

Private Sub SetLIneNumber()

    
Dim lines As Integer

    lines 
= Selection.Paragraphs.Count

    Selection.StartOf wdParagraph

    
For l = 1 To lines

        lIneNum 
= l & " "

        
If l < 10 Then

            lIneNum 
= lIneNum & " "

        
End If

        Selection.Text 
= lIneNum

        Selection.Font.Bold 
= False

        Selection.Font.Color 
= wdColorAutomatic

        p 
= Selection.MoveDown(wdLine, 1, wdMove)

        Selection.StartOf wdLine

    
Next l

End Sub

 


下面是我给出的使用说明,原文没给出使用说明。

使用方法:
1) 首先为当前文档新定义一个样式,命名为"ccode",专门用来对c代码进行格式化。由于是代码,所以推荐中文使用宋体(注释中),而英文使用等宽字体(courier new)。建立样式的步骤:在word2003中,“格式” → “新样式”

2)将上面的vba代码拷贝到文档中,步骤:在word2003中,“工具” → “宏” → ”VB编辑器“ → ”Normal工程“ → ”Microsoft Word 对象“ ,双击 ”thisDocument"对象,将上面的代码拷贝到新开的窗口中。

当然你也可以把ccode样式和highlight脚本保存到normal模板中,这样以后你再写代码的时候就可以直接用了,不用自己再辛苦定义这些了。

3)选定代码文本,然后执行highlight脚本: “格式” → “宏” → “宏”, 选择SyntaxHighlight宏,然后执行就可以了。

如果想定制语法高亮,那么修改上面的脚本就是了。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 6岁儿童不爱睡觉怎么办 初生儿嗓子哑了怎么办 6岁儿童睡眠不好怎么办 8岁儿童睡眠不好怎么办 1个月婴儿睡眠少怎么办 三岁宝宝心跳快怎么办 宝宝右心房稍大怎么办 胎儿右心房偏大怎么办 胎心监测波动小怎么办 怀孕6个月不想要了怎么办 高敏肌钙蛋白t高怎么办 龟头沟槽里长疙瘩怎么办 肝郁气滞的体质怎么办 手指甲长在肉里怎么办 甲床与指甲脱离怎么办 指甲往肉里面长怎么办 指甲和肉分离是怎么办 大脚趾指甲空了怎么办 脚趾甲长在肉里怎么办 脚趾甲又厚又硬怎么办 小孩子咳嗽有痰怎么办%3f 支气扩张咳血怎么办小 背部第8块脊椎疼怎么办 坐时间长了背疼怎么办 新生儿总哭怎么办吐奶 婴儿吃饱了还哭怎么办 宝宝喉咙哭哑了怎么办 婴儿哭哑了嗓子怎么办 婴儿胖子哭哑了怎么办 孩子声音哭哑了怎么办 喝咖啡手抖心慌怎么办 累了就心慌发抖怎么办 经常头晕心慌胸闷乏力怎么办 在末地迷路了怎么办 在森林里迷路了怎么办 电热宝充电不热怎么办 保温壶按钮坏了怎么办 热水壶盖子坏了怎么办 充电暖宝宝不热怎么办 刚怀孕孕酮低该怎么办 小三怀孕了该怎么办