在Word中排出漂亮的代码
在Word中展示漂亮的代码,其实本质就是制作一份html文件,复制到Word时会保留其源格式。很多代码编辑器或者IDE都有提供制作html文件的功能,比如CodeBlocks(File -> Export -> As HTML…)。后来我发现Notepad++才是最方便的工具。
Notepad++操作
- 用Notepad++直接编辑代码文件,注意文件后缀,比如.cpp是C++程序,.m是Matlab,写对后缀表示的文件类型,才有对应的语法高亮效果。
- 选中需要的代码块(或者不选,默认对全文操作),使用“插件 -> NppExport”,选择“Copy HTML to clipboard”。
- 然后直接粘贴到Word就行了。
“Copy HTML to clipboard”是把当前文本以html格式复制到剪切板,所以再把剪切板的内容复制到Word,就不同于以往的纯文本复制,而是相当于在网页上把一段带有格式的文本复制到Word。这也正是我所说的Notepad++是最方便的工具的原因——Notepad++提供工具,省略了很多中间操作。有兴趣的读者可以试试里面的"Export to HTML",就更能明白我要表达的含义了。
更上一层楼: 行号与灰色背景
很多读者或许并不能满足这种效果。我们看计算机书籍经常会看到代码都有灰色背景,有时候还需要标明行号。
为了以后从Word把代码复制出来方便,行号和代码在内容上应该分开。故我的处理方法是插入一个一行两列的表格。第一列写行号,第二列放代码。自己进行一些行号右对齐等的微调后即可。
那灰色背景呢?这个东西专业排版术语叫“底纹”,读者自己百度学习下就会了,很简单。不过注意底纹也有分很多类:文字底纹、段落底纹、单元格底纹、表格底纹。所以往往有人修改底纹,发现没用改不掉,然后就满口骂Word,Word就冤枉的又躺枪了。其实原因很可能是你改了段落底纹,可是那个东西本来是文字底纹。。。
Tips:
- 将行号的数字颜色改成背景色就能“隐藏行号”了,需要的时候再调回黑色。
- 注意表格线框是可以隐藏的。
- 有时候代码排版的比较紧凑,行间距较小会导致下划线"_“没掉了,这时可以试试用“Consolas”字体。
- 如果以后需要从Word复制代码,放到表格第二列的左上角,鼠标变成一个黑色箭头时,就能单击全选代码文本进行复制了。行号对源代码不会有任何的干扰。
- 注意代码不要过长,长度超过一行时,可能会带来一些不便。
- 如果发现空格并没有与字母等宽(如下图所示),则是半全角字符的bug作祟。在“文件 -> 选项 -> 高级”的“布局选项”去掉
更加智能与自动化
从此终于能排出漂亮的代码了。不过……这个操作也太麻烦了吧!我写一个200行的代码还要自己输行号?!
哈哈,不用担心,你忘了我们的职业是“程序猿”了吗?office套件提供了VBA,让用户可以写程序、宏来辅助完成办公操作。VBA使用最广泛的当属Excel了。这里,我也写两个宏来自动化Word的一些操作。不了解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