如何在Word中排出漂亮的代码

引言

学数学和计算机,当然还是用LaTeX排版技术文章更方便。但有时候还是迫不得已需要用Word写作,另外Word其实也有Word的好处,比如细节上的修改要比LaTeX方便。

从Matlab高亮代码复制到Word,中文会乱码开始,我就很想研究下如何在Word中展示漂亮的代码。今年寒假利用Vim,有些突破,10月3日的时候又有了比较大的进展,自己设计了一款Vim的代码高亮配色方案,然后利用Vim的:TOhtml命令生成html文件,再用浏览器打开html文件,复制里面的代码到Word,就能保留原始的高亮效果了。

其实本质就是制作一份html文件,复制到Word时会保留其源格式。很多代码编辑器或者IDE都有提供制作html文件的功能,比如CodeBlocks(File -> Export -> As HTML...)。后来我发现Notepad++才是最方便的工具。然后结合看Oeasy的Word教学视频,对底纹等排版知识有了更深的了解,加上一点VBA的功底,目前能比较高效的进行Word的代码排版工作了。

本打算VBA钻研的更深入些,把整个流程做的更加智能、自动化后再分享心得。不过该方法其实目前也比较完善成熟了,故提前完成了这篇博客并分享。

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

1  工欲善其事,必先利其器

我用的是微软OFFICE2013版的Word。2007、2010的操作也差不多。用其它Word版本或WPS的读者自己看着办。

辅助工具只有一个:Notepad++

2  基本操作

  1. 用Notepad++直接编辑代码文件,注意文件后缀,比如.cpp是C++程序,.m是Matlab,写对后缀表示的文件类型,才有对应的语法高亮效果。
  2. 选中需要的代码块(或者不选,默认对全文操作),使用“插件 -> NppExport”,具体见下图
  3. 然后直接粘贴到Word就行了。

读者可能要吐槽了:哈?这么简单?那尼玛的说那么多废话干嘛?

基本操作确实这么简单,不过希望读者能明白其中的道理,“Copy HTML to clipboard”是把当前文本以html格式复制到剪切板,所以再把剪切板的内容复制到Word,就不同于以往的纯文本复制,而是相当于在网页上把一段带有格式的文本复制到Word。这也正是我所说的Notepad++是最方便的工具的原因——Notepad++提供工具,省略了很多中间操作。有兴趣的读者可以试试里面的"Export to HTML",就更能明白我要表达的含义了。

明白原理干嘛?因为有些读者可能并不喜欢Notepad++的高亮效果,那么只要你用的编辑器也能转换出html文件,那也可以在Word中排出一模一样的效果。这就是授人与鱼不如授人于与渔。

3  更上一层楼: 行号与灰色背景

很多读者或许并不能满足这种效果。我们看计算机书籍经常会看到代码都有灰色背景,有时候还需要标明行号。

为了以后从Word把代码复制出来方便,行号和代码在内容上应该分开。故我的处理方法是插入一个一行两列的表格。第一列写行号,第二列放代码。自己进行一些行号右对齐等的微调后,效果如下:

那灰色背景呢?这个东西专业排版术语叫“底纹”,读者自己百度学习下就会了,很简单。不过注意底纹也有分很多类:文字底纹、段落底纹、单元格底纹、表格底纹。所以往往有人修改底纹,发现没用改不掉,然后就满口骂Word,Word就冤枉的又躺抢了。其实原因很可能是你改了段落底纹,可是那个东西本来是文字底纹。。。

Tips:

  1. 将行号的数字颜色改成背景色就能“隐藏行号”了,需要的时候再调回黑色。
  2. 注意表格线框是可以隐藏的。
  3. 有时候代码排版的比较紧凑,行间距较小会导致下划线"_"没掉了,这时可以试试用“Consolas”字体。
  4. 如果以后需要从Word复制代码,放到表格第二列的左上角,鼠标变成一个黑色箭头时,就能单击全选代码文本进行复制了。行号对源代码不会有任何的干扰。
  5. 注意代码不要过长,长度超过一行时,可能会带来一些不便。
  6. 如果发现空格并没有与字母等宽(如下图所示),则是半全角字符的bug作祟。在“文件 -> 选项 -> 高级”的“布局选项”去掉“区分半角字符和全角字符”的选项即可。                
        

4  更加智能与自动化

从此终于能排出漂亮的代码了。不过......这个操作也太麻烦了吧!我写一个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

这里我写了两个宏,一个是输入连续数字的宏,读者调用一下玩玩就知道什么功能了。另一个是对代码表格进行一些处理的宏,选中那个一行两列的表格,读者跑跑我的宏就知道效果了。(这两个宏的配置会比较个性化,读者可以根据自己的喜好来开发。)

代码的最终形式如下

以上也展示了我平时使用Word写作的习惯。我整理的东西其实更多的是在电脑平台上阅读,而不是打印出来看。所以习惯用“网页视图”而不是A4纸大小的“页面视图”,这样也更方便排更长的单行代码。打开“视图”的“导航窗格”,能详细的了解到这个文档的内容架构与章节间的方便跳转。然后“批注”功能我完全当作一个“个人备注”工具来使用了,对文档的一些地方经常可以补充一些我喜欢说的“废话”。

正式发布文档的时候,建议关闭批注功能,转成pdf来发布。这样能保证排版格式不会乱,如果按Word发布,不同人的软件版本不同、配置不同,会有不一样的视图效果,可能你觉得很美,到了别人那却变得很丑。

另外注意另存为pdf时,要设置下面的选项,pdf文档才会带有书签:(设置一次就行了,以后默认都是上次的配置)

5  扩展阅读

关于VBA编程的一个细节

上述VBA代码第11行的数字15066597读者有没觉得很奇怪?(229, 229, 229)是指RGB的三个颜色值,而15066597这个数其实就是229*(2^16 + 2^8 + 1),计算机基础比较好的想想就明白了~~VBA中很多“莫名其妙”的数值都是这个原理。

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

关于Word学习

推荐Oeasy的Word学习视频。另外侯捷的《Word排版艺术》也是本不错的书,里面有讲到侯老师自己排版代码的方法。话说我的写作风格有点像侯老师——很多废话。

如果上述两个宏使用的比较频繁,可以自定义菜单栏,把它们加入到选项卡里,参考这篇文章:Excel2013如何在选项卡中添加自定义宏按钮

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

代码格式化

随着编程水平的进步,发现以前写的代码排版有点乱或跟现在的风格不符怎么办?可以用Astyle,CodeBlocks自带这个插件,结合Astyle,能让排出的代码格式更加整齐统一。

时间: 2024-11-03 21:41:08

如何在Word中排出漂亮的代码的相关文章

如何在word中的第3+n页处插入页面并重新从1开始

在插入页码时有时可能会遇到这种情况: word的第一页是文档名称 第二页是目录 第三页才开始是正文,而我们希望看到页码从第三页开始才是第1页. 在第三页的开头,插入分隔符“下一页”,如果office2013,在页面布局中找插入分隔符“下一页”. 然后第三页的页码即可以从1开始,第一页的代码也可以同时是1. 如何在word中的第3+n页处插入页面并重新从1开始

如何在word中调整公式大小

在Word文档中某一行使用“Mathtype公式编辑器”输入数学公式后,往往公式所在行的行距明显变大,就好像公式把这一行和其它行给撑开了一样,非常不美观,使用改变行距的命令也不能解决问题.公式是以图片形式插入word文档的,可以使用缩放图片的形式来调整公式的大小.以下步骤教您如何在word中调整公式大小: 第一步 在文档中需要插入公式的地方用Mathtype公式编辑器插入需要的公式,可以参考下图 在文档中插入所需要的公式 第二步 文档中公式与文字相差太大,看起来很不协调,这时我们可以用鼠标点击插

如何在word中插入代码块

在word中,插入代码块,是比较烦的一件事. 1.打开http://www.planetb.ca/syntax-highlight-word网站 2.将你的代码复制进去,选择变成语言,点击“Show Highlighted” 3.复制格式化后的代码 4.打开word,插入选项卡-->对象(比较小,在公式按钮的左边隔壁)-->OpenDocment 文本 5.在新打开的空白文档中,复制代码块,调整缩进,保存文档,关闭文档 6.在文档中就可以看到漂亮的.格式化好的代码块了. 原文地址:https:

如何在word中插入代码

本文使用的是word2007,在网上查阅资料,可以使用如下方法: 1. 插入一个1行1列的表格,然后将代码写在里面,完成之后选中表格: 2. 将样式改为"HTML代码". 其实只是应用了word中的HTML样式,同时可以将表格的底纹改成"5%灰色". "HTML代码"可能比较难找,具体方法如下(以word2007为例): 1. 单击开始-样式: 2. 在样式中的"选项"中,选择"所有样式": 3. 应用&q

如何在OneNote2013中粘贴高亮的代码

有的时候想在OneNote粘贴代码,但是直接复制粘贴进去的代码没有高亮,下面有一个办法让自己的代码在OneNote里面更加完整美观. 工具/原料 Notepad++ word2013 OneNote2013 方法/步骤 第一步,将要粘贴进word的文档复制到Notepad++里,并保存文件,并注意文件的后缀名即代码类型. 第二步,选择Notepad++工具栏中的[插件]——>[NppExport] ——>[Copy all formats to clipboard]将文件内容以RTF的格式复制

如何在Word中优雅的插入Latex线性公式

写论文的小伙伴应该都有过这样的感受!普通二次公式的手动插入如果说是尚可忍受的话,那么做人工智能学习和物理研究的小伙伴在插入二项式定理和傅立叶公式的时候,如果是手动输入....我想不必多说了,下面我就来介绍下,如果配合Mathpix在word中优雅的输入基于Latex的线性公式. LaTeX 作为一款「史诗级」文章排版编译器,一直都有着优秀.高效的排版体验和简洁.一致的排版效果.但是 LaTeX 相对复杂的语法使用,让我们很多时候都需要花费大量时间在查阅 LaTeX 的参考文档上,才能得到我们想要

教你如何在word中像LaTex那样打出漂亮的数学公式

转载自: http://blog.csdn.net/ibingow/article/details/8613556 记得很久以前在word里打数学公式很痛苦,要用鼠标点啊点,效率奇低,包括像MathType那些工具.后来到了office 2007公式情况就不一样了,编辑器有了巨大的改进,适合我们喜欢用键盘的同学了.几乎所有的数学符号都对应一条命令,而且跟LaTex的命令很像,打起公式来一样.其实最开始我是乱按键盘发现公式编辑器这些功能的,然后凭感觉和经验发现了各种符号的输入方法.相比LaTex,

如何在word中快速切换单词中字母大小写

我们在word文档中输入单词时,有些时候我们输入的都是小写,但是我们又需要将首字母进行大写,如果慢慢选择第一个字母在输入大写,这样是很浪费时间的,因此我们可以选中想要更改大小写的英文字母或英文单词,按住"Shift"键,同时按下"F3"键,循环地按"F3"键,每次按"F3"键时英文单词的格式会在全部大写.首字母大写和全部小写格式之间进行切换.

如何在wp8 中调试cocos2dx c++ 代码

有的时候在win32上运行良好的cocos2dx程序移植到wp8的时候就出了问题,我们想把断点放到c++代码中,需要设置一下VS 2012 右击项目属性 把ui任务 设置为仅限本机 即可.