原文: https://blog.csdn.net/bruce_shan/article/details/73302756

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

学数学和计算机,当然还是用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的代码排版工作了。

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

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文档中都能调用。)
  1. Sub 设置代码表格()
  2. ' author: code4101
  3. ' 设置代码表格 宏
  4. '
  5. '
  6. ' 背景色为morning的配色方案,RGB为(229,229,229)
  7. With Selection.Tables(1)
  8. With .Shading
  9. .Texture = wdTextureNone
  10. .ForegroundPatternColor = wdColorAutomatic
  11. .BackgroundPatternColor = 15066597
  12. End With
  13. .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
  14. .Borders(wdBorderRight).LineStyle = wdLineStyleNone
  15. .Borders(wdBorderTop).LineStyle = wdLineStyleNone
  16. .Borders(wdBorderBottom).LineStyle = wdLineStyleNone
  17. .Borders(wdBorderVertical).LineStyle = wdLineStyleNone
  18. .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
  19. .Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
  20. .Borders.Shadow = False
  21. .AutoFitBehavior (wdAutoFitContent)  '自动调整大小
  22. End With
  23. With Options
  24. .DefaultBorderLineStyle = wdLineStyleSingle
  25. .DefaultBorderLineWidth = wdLineWidth050pt
  26. .DefaultBorderColor = wdColorAutomatic
  27. End With
  28. ' 段落无首行缩进,行间距为固定值12磅
  29. With Selection.ParagraphFormat
  30. .LeftIndent = CentimetersToPoints(0)
  31. .RightIndent = CentimetersToPoints(0)
  32. .SpaceBefore = 0
  33. .SpaceBeforeAuto = False
  34. .SpaceAfter = 0
  35. .SpaceAfterAuto = False
  36. .LineSpacingRule = wdLineSpaceExactly
  37. .LineSpacing = 12
  38. .KeepWithNext = False
  39. .KeepTogether = False
  40. .PageBreakBefore = False
  41. .NoLineNumber = False
  42. .Hyphenation = True
  43. .FirstLineIndent = CentimetersToPoints(0)
  44. .OutlineLevel = wdOutlineLevelBodyText
  45. .CharacterUnitLeftIndent = 0
  46. .CharacterUnitRightIndent = 0
  47. .CharacterUnitFirstLineIndent = 0
  48. .LineUnitBefore = 0
  49. .LineUnitAfter = 0
  50. .MirrorIndents = False
  51. .TextboxTightWrap = wdTightNone
  52. .AutoAdjustRightIndent = True
  53. .DisableLineHeightGrid = False
  54. .FarEastLineBreakControl = True
  55. .WordWrap = True
  56. .HangingPunctuation = True
  57. .HalfWidthPunctuationOnTopOfLine = False
  58. .AddSpaceBetweenFarEastAndAlpha = True
  59. .AddSpaceBetweenFarEastAndDigit = True
  60. .BaseLineAlignment = wdBaselineAlignAuto
  61. End With
  62. ' 清除原有的段落底纹
  63. Selection.ParagraphFormat.Shading.BackgroundPatternColor = wdColorAutomatic
  64. End Sub
  65. Sub 输入连续数字()
  66. ' author: code4101
  67. 行数 = InputBox("请输入代码终止行数", "输入行数", "50")
  68. For i = 1 To 行数 - 1
  69. Selection.TypeText Text:=i
  70. Selection.TypeParagraph
  71. Next
  72. Selection.TypeText Text:=行数
  73. 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,能让排出的代码格式更加整齐统一。

【转】word排版宏的使用的更多相关文章

  1. 《Word排版艺术》读后感,兼谈LaTeX

    我有两年多的LaTeX使用经验,用它排实验报告.毕业论文和书籍(半本):Word的使用时间长一些,但真正用好也不过是近一两年的事.这两个软件我都 用得很熟,我想我可以一边谈谈读<Word排版艺术 ...

  2. 极简Word排版示例(以Word2013为例)

    文档标题 第一行写下文档的名字,居中,微软雅黑字体,三号 章节标题 每一章的标题单独一行,光标选中这行,设置为标题1 每一节的标题单独一行,光标选中这行,设置为标题2 全部章节标题设置完毕后,下一步 ...

  3. WORD自定义宏

    自定义快捷键 折叠所有标题 Word选项—自定义功能区—自定义键盘—不在功能区内的命令—ColllapseAllHeadings 展开所有标题 Word选项—自定义功能区—自定义键盘—不在功能区内的命 ...

  4. word排版论文小结

    毕业论文如何用WORD排版 本人折腾了一晚上看别人的百度经验,做个总结,方便后人看懂,其实特别简单 用WORD自动生成页码 第一种情况:从第一页或者从第二页开始设置页码 这种情况只要“插入-> ...

  5. 工具(1): 极简Word排版示例(Example by Word2013)

    文档标题 第一行写下文档的名字,居中,微软雅黑字体,三号 章节标题 每一章的标题单独一行,光标选中这行,设置为标题1 每一节的标题单独一行,光标选中这行,设置为标题2 全部章节标题设置完毕后,下一步 ...

  6. word使用宏 在文章中插入源代码进行排版

    1.宏的代码如下. Sub 设置代码表格() ' author: code4101 ' 设置代码表格 宏 ' ' ' 背景色为morning的配色方案,RGB为(229,229,229) ) With ...

  7. Word 录制宏解决粘贴网络上文字格式错乱

        本文将利用Word中的录制宏来解决 复制粘贴网络上文字格式错乱的问题.     本文宏代码取自 : 知乎 李文超,感谢他的提供. Technorati 标签: Word宏 格式修正     1 ...

  8. 使用 jquery.wordexport.js导出的Word排版

    js导出word文档所需要的两个插件: FileSaver.js jquery.wordexport.js 使用jquery.wordexport.js这个插件导出的word文档的排版方式: 编辑器打 ...

  9. Delphi 运行Word VBA 宏 删除软回车

    Sub 整理网页()'整理网页:删除软回车.删除空白段.使段落文字两端对齐Selection.WholeStory        Selection.Find.ClearFormatting    S ...

随机推荐

  1. php抓取一个页面的图片

    思路: 1.找到一个页面 2.正则过滤所有的img 3.正则过滤出所有的src的属性 4.获取链接信息,写入文件 file_get_contents(), file_put_contents() 5. ...

  2. elementUI 学习入门之 radio 单选框

    Radio 单选框 基础用法 选项默认可见,选项不宜过多,选项过多建议使用 select 选择器 使用 Radio 组件,需要设置 v-model 绑定变量,选中意味着变量的值为相应 Radio  l ...

  3. python3 爬虫教学之爬取链家二手房(最下面源码) //以更新源码

    前言 作为一只小白,刚进入Python爬虫领域,今天尝试一下爬取链家的二手房,之前已经爬取了房天下的了,看看链家有什么不同,马上开始. 一.分析观察爬取网站结构 这里以广州链家二手房为例:http:/ ...

  4. 使用webgl(three.js)创建3D机房,3D机房微模块详细介绍(升级版二)

    序: 上节课已经详细描述了普通机房的实现过程,文章地址(https://www.cnblogs.com/yeyunfei/p/10473021.html) 紧接着上节课的内容 我们这节可来详细讲解机房 ...

  5. ARP监测工具Arpwatch

    ARP监测工具Arpwatch   ARP协议是网络的基础协议.基于ARP协议的ARP攻击是局域网最为常见和有效的攻击方式.ARP攻击可以通过发送伪造的ARP包实施欺骗,实现各种中间人攻击.Arpwa ...

  6. 交叉编译iperf源代码

    <Iperf简介> Iperf 是一个网络性能测试工具.Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失. &l ...

  7. Vue 2.0学习(七)方法与事件

    基本用法 以监听一个按钮的点击事件为例,设计一个计数器,每次点击都加1: <div id = "app"> 点击次数:{{ counter }} <button ...

  8. eclipse 怎么 直接查看 文件所在位置 显示在文件管理器中。用浏览器浏览。

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha eclipse 怎么 直接查看 文件所在位置 显示在文件管理器中.用浏览器浏览.

  9. Codeforces 839D Winter is here(容斥原理)

    [题目链接] http://codeforces.com/contest/839/problem/D [题目大意] 给出一些数,求取出一些数,当他们的GCD大于0时,将数量乘GCD累加到答案上, 求累 ...

  10. ThinkPHP -- magic_quotes_gpc()引起的反斜杠问题

    magic_quotes_gpc()引起的反斜杠问题,通常是因为没有事先判断它的状态,而对字符串进行处理引起的.   (本文学习借鉴于hechunhua楼主) 一般提供的服务器空间默认PHP 指令 m ...