国产系统下WPS公文排版插件(四)–页码设置
本来想说剩下的东西不多了,一次性搞定,后来发现如果要完整的一个系列,还有不少东西的,可能实际用处不大就是了。
把页码拎出来还有一个重要原因,页码太难了。让AI写都写不出来,用宏录制都跑不起来。但是公文有标准,页码可被精确计算,各应用场景都统一适用,所以,他有被详细分析的必要,对照标准深入分析,实测成功后会发现,他其实也挺简单的。
如果说页边距设为34.58还能看到分享,页码真的就是全网找不到一个详细的分析,AI写不出来的原因大抵如此吧。我这是全网独一份分析能逻辑自洽的。
一、页码的设置
1.设置默认的页码
2.再单独设置偶数页的页码,覆盖掉1的设置奇偶页不同的逻辑
3.最后比如公函的页码设置,把首页去掉,首页不同的逻辑
二、页码的格式
1.本质是一个文本框,放在页脚里的的文本框,文本框的内容就是页码,页码与文本框0边距,因此理论上文本框的位置决定了页码的位置
2.先放置固定格式“— X —”,然后把X替换为实际页码
3.页码的空一字对齐,直接在页码与文本框的左右边距增加一个三号字缩进即16磅
4.左右边距的不同,文本框与页边距对齐
5.格式设置的顺序会影响具体的位置,比如理论上需要先设置页码的字体大小,否则字体变化会有误差,虽然也就1-2mm不大的样子。
三、具体实现
到具体的实现这里我就很纠结了,我是先对设置辅助“装订线”感兴趣,已经实现了才反过来搞一整套的插件的,按照我的逻辑,直接参照装订线设置就好了,方法如上所述,计算结果可与实际测量相印证,把文本框放在绝对位置,粗暴。但是呢,通过自己录制的宏和wps官方的智能公文助手的设置,都是采用相对页面的位置,简单,所以前文页面设置提到的页脚的设置就有必要,但是确实不理解官方的设置逻辑,结果是一样的,按我自己的来。这里也以录制宏的设置为参考。
这里也更正下前面的页脚设置,前面是按照四号字体约4.94mm进行计算,实际页码文本框是6.6mm高度,那么页边距应该设置为28-6.6/2=24.7mm。官方设置为18.5,两者相差6.2,刚好与一个段落的差衔接起来。
function 添加页码(){Application.ActiveWindow.ActivePane.View.SeekView =10;let section = Application.ActiveDocument.Sections.Item(1);let footerPrimary = section.Footers.Item(1);let shape1 = footerPrimary.Shapes.AddTextbox(1, 0, 0, 144, 144, footerPrimary.Range);let footerEven = section.Footers.Item(3);let shape2 = footerEven.Shapes.AddTextbox(1, 0, 0, 144, 144, footerEven.Range);let yejiao=obj=>{obj.WrapFormat.Type = 3;let text = obj.TextFrame.TextRange;text.Text = "— X —";Application.ActiveDocument.Fields.Add(text.Characters.Item(3), 33, "", false);(obj1=>{obj1.Size = 14;obj1.SizeBi = 14;obj1.Name= "宋体";})(text.Font);obj.Fill.Visible =0;obj.Line.Visible = 0;obj.TextFrame.AutoSize = 1;obj.TextFrame.WordWrap = 0;obj.TextFrame.MarginLeft = 16;obj.TextFrame.MarginRight = 16;obj.TextFrame.MarginTop = 0;obj.TextFrame.MarginBottom = 0;obj.RelativeHorizontalPosition =0;obj.RelativeVerticalPosition =2;obj.Top = 0;}yejiao(shape1);yejiao(shape2);footerPrimary.PageNumbers.NumberStyle = 0;footerEven.PageNumbers.NumberStyle = 0;Application.ActiveWindow.ActivePane.View.SeekView = 0;}
函页码设置就简单了,只要在最后面加上一句话完事了。
function 公函页码(){Application.ActiveWindow.ActivePane.View.SeekView =10;let section = Application.ActiveDocument.Sections.Item(1);let footerPrimary = section.Footers.Item(1);let shape1 = footerPrimary.Shapes.AddTextbox(1, 0, 0, 144, 144, footerPrimary.Range);let footerEven = section.Footers.Item(3);let shape2 = footerEven.Shapes.AddTextbox(1, 0, 0, 144, 144, footerEven.Range);let yejiao=obj=>{obj.WrapFormat.Type = 3;let text = obj.TextFrame.TextRange;text.Text = "— X —";Application.ActiveDocument.Fields.Add(text.Characters.Item(3), 33, "", false);(obj1=>{obj1.Size = 14;obj1.SizeBi = 14;obj1.Name= "宋体";})(text.Font);obj.Fill.Visible =0;obj.Line.Visible = 0;obj.TextFrame.AutoSize = 1;obj.TextFrame.WordWrap = 0;obj.TextFrame.MarginLeft = 16;obj.TextFrame.MarginRight = 16;obj.TextFrame.MarginTop = 0;obj.TextFrame.MarginBottom = 0;obj.RelativeHorizontalPosition =0;obj.RelativeVerticalPosition =2;obj.Top = 0;}yejiao(shape1);yejiao(shape2);footerPrimary.PageNumbers.NumberStyle = 0;footerEven.PageNumbers.NumberStyle = 0;Application.ActiveWindow.ActivePane.View.SeekView = 0;//函页码设置Application.ActiveDocument.PageSetup.DifferentFirstPageHeaderFooter = -1;}
四、注意事项
1.以上只对第一节设置页码,如果有多节,只有第一节没有效果。公文正文一般没那么多节,正常情况下也够用了,懒得再折腾。
2.页码中间的空格国标没有特别说明,应该默认为中文空格,如果是手工操作设置页码,前后字符阿拉伯数字,所以一般会是英文空格。很有意思的是,wps的智能公文助手设置的是小四号宋体字的中文空格~他的设置确实复杂多了。
3.更正一个错误,页边距设置不能直接简单的设置左、右边距,应该先将页面设置为“对称页边距”,真的是活到老学到老,我多年的疑问终于有了解答。wps官方公文助手也是错误的,全网所有公文教程没有一个提到这个。多年的强迫症终于瞬间治愈了,28,26没差多少,甚至都不一定有打印机误差的多,但是,绝对会必死强迫症,终于通透了。
function 页边距设置() {let doc = Application.ActiveDocument;// 1. 页面设置:页边距 (上3.7cm, 下3.5cm, 左2.8cm, 右2.6cm)// WPS中1厘米约等于28.35磅//这里采用GB/T 33476.2-2016的设置上3.7cm, 下3.5cm, 左2.8cm, 右2.6cmlet pageSetup = doc.PageSetup;pageSetup.MirrorMargins=-1;//对称页边距pageSetup.TopMargin = 34.58 * 2.834645669;pageSetup.BottomMargin = 32.58 * 2.8346456695;pageSetup.LeftMargin = 28 * 2.834645669;//内边距pageSetup.RightMargin = 26 * 2.834645669;//外边距// 设置页眉页脚距离边界pageSetup.HeaderDistance = 15 * 2.834645669;pageSetup.FooterDistance = 24.7 * 2.834645669;}
夜雨聆风