时间: 2019.10.28
缘起: 课程报告大多为word版,日常写代码还是习惯使用DevC++
,然而直接在word复制代码,格式实在陋。
教程现状: 网上不少教程,大部分介绍的都是使用Notepad++来完成。不想换编辑器,因而探索了下,最终找到了使用DevC++实现代码高亮复制入word的方法。
本质: 保存为.rtf
或.html
等带格式的文件,然后复制,在Word中粘贴。
文章目录
0. 前言
不少实践课程都要求写word版的报告,有无代码高亮,美观程度还是有很大差别的。下图以示对比:
图上为直接复制c++代码;图下为带高亮复制代码。可以明显看到在美观度上,两者有着不小的差距,尤其是阅读代码时。相信作为报告上交,后者会更容易加分。
1. 高亮复制原理
绝大多数代码编辑器,从中直接复制代码只包含文本,不包含格式信息。因而需要将其剪切为 富文本.rtf
或是 网页.html
,再复制入word,则可以保留高亮。
2. 网上现有方法
在撰写我的报告时,搜寻了不少 c++代码高亮复制入word 等关键词。得到的绝大部分解决方案如下:
- 使用
notepad++
直接Copy RTF/HTML to clipboard
(最多推荐) - 使用
Eclipse
去掉勾选启用折叠
(较少推荐,未验证) - 部分版本
VS
直接复制可以(有说VS2013可以,未验证)
然而。。用习惯了DevC++,不想为了这再换IDE。更重要的是,总觉得这一点DevC++应该也可以实现,因而仔细找了找,终于发现了解决方案!
3.使用DevC++保留代码高亮
步骤:
- 在DevC++中,点选
文件 -> 导出 -> 到RTF / 到HTML
- 打开导出的文件,复制文字
- 打开word,粘贴。即可看到带高亮的代码被粘贴于word。
其实就是围绕着高亮本质,找到保留成 .rtf
或是 .html
的方法即可。
注意: DevC++默认的字体是 Console,直接保留为富文本或网页文件时,其中的中文注释可能出现乱码。此时可以修改DevC++编辑器字体为中文字体,再重复上述步骤,即可解决问题。(工具 -> 编辑器选项 -> 显示 ->字体
)
4.进一步美化
粘贴完之后,可能发觉略显单调。此时可以采取一些进阶操作,来进一步的美化。
4.1 增加底纹
选中代码,对段落增加底纹,推荐 灰色,背景1,深色5%
4.2 增加边框
4.3 增加行号
关于行号,为了使其不影响之后代码的复制。因而可以使用 1行2列
的一个表格,将代码行与代码分开存放。
5. 利用 宏
实现操作自动化
在Word中粘贴代码,绝不会只有1次。这时我们可以使用VBA宏,来自动化一些重复性操作。比如,设置底纹和表格格式、敲打行号等。
Alt + F11可以进入VBA,然后在“Normal -> 模块”,右键选择“插入模块”,然后把我下面的代码复制到“模块1”并保存。(Normal是Word打开时会自动载入的一个模板文件,把宏放在这里,可以保证在任意一个Word文档中都能调用。)
Sub 设置代码表格()
' author: code4101
' 设置代码表格 宏
' 背景色为morning的配色方案,RGB为(229,229,229)
With Selection.Tables(1)
With .Shading
.Texture = wdTextureNone
.ForegroundPatternColor = wdColorAutomatic
.BackgroundPatternColor = 15066597
End With
.Borders(wdBorderLeft).LineStyle = wdLineStyleNone
.Borders(wdBorderRight).LineStyle = wdLineStyleNone
.Borders(wdBorderTop).LineStyle = wdLineStyleNone
.Borders(wdBorderBottom).LineStyle = wdLineStyleNone
.Borders(wdBorderVertical).LineStyle = wdLineStyleNone
.Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
.Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
.Borders.Shadow = False
.AutoFitBehavior (wdAutoFitContent) '自动调整大小
End With
With Options
.DefaultBorderLineStyle = wdLineStyleSingle
.DefaultBorderLineWidth = wdLineWidth050pt
.DefaultBorderColor = wdColorAutomatic
End With
' 段落无首行缩进,行间距为固定值12磅
With Selection.ParagraphFormat
.LeftIndent = CentimetersToPoints(0)
.RightIndent = CentimetersToPoints(0)
.SpaceBefore = 0
.SpaceBeforeAuto = False
.SpaceAfter = 0
.SpaceAfterAuto = False
.LineSpacingRule = wdLineSpaceExactly
.LineSpacing = 12
.KeepWithNext = False
.KeepTogether = False
.PageBreakBefore = False
.NoLineNumber = False
.Hyphenation = True
.FirstLineIndent = CentimetersToPoints(0)
.OutlineLevel = wdOutlineLevelBodyText
.CharacterUnitLeftIndent = 0
.CharacterUnitRightIndent = 0
.CharacterUnitFirstLineIndent = 0
.LineUnitBefore = 0
.LineUnitAfter = 0
.MirrorIndents = False
.TextboxTightWrap = wdTightNone
.AutoAdjustRightIndent = True
.DisableLineHeightGrid = False
.FarEastLineBreakControl = True
.WordWrap = True
.HangingPunctuation = True
.HalfWidthPunctuationOnTopOfLine = False
.AddSpaceBetweenFarEastAndAlpha = True
.AddSpaceBetweenFarEastAndDigit = True
.BaseLineAlignment = wdBaselineAlignAuto
End With
' 清除原有的段落底纹
Selection.ParagraphFormat.Shading.BackgroundPatternColor=wdColorAutomatic
End Sub
Sub 输入连续数字()
' author: code4101
行数 = InputBox("请输入代码终止行数", "输入行数", "50")
For i = 1 To 行数 - 1
Selection.TypeText Text:=i
Selection.TypeParagraph
Next
Selection.TypeText Text:=行数
End Sub
这里找了两个宏,一个是输入连续数字的宏。另一个是对代码表格进行一些处理的宏(可以解决底纹等问题),选中那个一行两列的表格,读者跑跑我的宏就知道效果了。(这两个宏的配置会比较个性化,读者可以根据自己的喜好来开发。)
此处宏代码转自:如何在Word中排出漂亮的代码
6. 最终效果
这是刚完成的一份实验报告,可以看到,相较于无高亮代码,整篇Word的格式还是美观了不少。
*尾声
1. 小感
虽然网上的很多资源不是直接针对DevC++的,但还是从notepad++中借鉴了保留为含格式文本的思想。可见,多查资料,尤其是多查有效的资料,对于学习是一定有帮助的。然而,现在互联网上的博客,质量还是少了点,或者说真正去探索一个源问题的少了点。大多数都是先搜现成答案,搜到则复制到自己博客下做个备忘,搜不到就放那儿,也不去探索了。。个人想法。
2. 致谢
本文写作中,参看了不少博文与资料,以下对主要参看的做一些罗列,排序不分先后:
3. 本文不足
- 源代码为Console等字体导出为富文本或网页文本,出现中文乱码的原因还是没想明白。。先暂时将编辑器字体更换为中文字体来解决,还不是很懂里面原因。
- 步骤略繁琐了些,对比notepad++可以直接将带格式文本复制进入剪贴板。
4. 声明
本文为原创文章,转载务必注明出处。