ARTICLE · 990666
数学文档的录入与编辑,数学图形的绘制与调整
数学文档的录入与编辑,数学图形的绘制与调整一、录入与编辑 (一)选择合适的输入法并用好“自定义短语” 我所使用的是系统自带微软拼音输入法,双拼。 (二)在自己的模板上新建文档 如果可能,学校数学组所有老师使用统一底层模板。 (三)键入时自动更正,录入即编辑完成 (四)使用VB一键字母斜体 二、画图与调整 一键修改字母标签
关注
重播 分享 赞
Sub 英文字母斜体并排除指定词()Dim doc As DocumentDim rng As RangeDim i As IntegerDim arrExcludes As VariantSet doc = ActiveDocument' 步骤1:将所有英文字母设为斜体Set rng = doc.ContentWith rng.Find.ClearFormatting.Replacement.ClearFormatting.Text = "[A-Za-z]".Replacement.Text = "^&".Replacement.Font.Italic = True.Forward = True.Wrap = wdFindContinue.Format = True.MatchWildcards = True.Execute Replace:=wdReplaceAllEnd With' 步骤2:将排除的词组改回正体arrExcludes = Array("(A)", "(B)", "(C)", "(D)", _"A卷", "B卷", "2B铅笔", _"sin", "cos", "tan", "Rt", "kg", "km", "min", "max", "cm", "》P", "kPa", "mL", "cm/s", "km/h")For i = LBound(arrExcludes) To UBound(arrExcludes)Set rng = doc.ContentWith rng.Find.ClearFormatting.Replacement.ClearFormatting.Text = arrExcludes(i).Replacement.Text = "^&".Replacement.Font.Italic = False.Forward = True.Wrap = wdFindContinue.Format = True.MatchCase = True.Execute Replace:=wdReplaceAllEnd WithNext iMsgBox "处理完成!", vbInformationEnd Sub
关注
重播 分享 赞
Option ExplicitSub 修复几何画板字母标签()Const TEMP_BOOKMARK As String = "GSP_TemporaryPicturePosition"Dim doc As DocumentDim sourceInline As InlineShapeDim canvas As ShapeDim item As ShapeDim finalInline As InlineShapeDim pastedInline As InlineShapeDim originalPosition As RangeDim returnRange As RangeDim pastedRange As RangeDim cursorPosition As RangeDim targetWidth As SingleDim oldWidth As SingleDim labelWidthCm As DoubleDim txt As StringDim warningMessage As StringDim errorMessage As StringDim anchorStart As LongDim pasteStart As LongDim labelCount As LongDim i As LongDim originalVerticalScroll As LongDim originalHorizontalScroll As LongDim scrollSaved As BooleanDim originalScreenUpdating As BooleanDim originalDisplayAlerts As WdAlertLevelDim displayAlertsSaved As BooleanOn Error GoTo ErrorHandlerSet doc = ActiveDocument'只允许选中一幅嵌入型图片If Selection.InlineShapes.count <> 1 ThenMsgBox "请先单独选中一幅从几何画板粘贴到 Word 的原始图片。", _vbInformationExit SubEnd IfSet sourceInline = Selection.InlineShapes(1)'保存运行前的界面状态originalScreenUpdating = Application.ScreenUpdatingoriginalDisplayAlerts = Application.DisplayAlertsdisplayAlertsSaved = TrueoriginalVerticalScroll = ActiveWindow.VerticalPercentScrolledoriginalHorizontalScroll = ActiveWindow.HorizontalPercentScrolledscrollSaved = TrueApplication.ScreenUpdating = False'记录图片原来的文字位置Set originalPosition = sourceInline.Range.DuplicateoriginalPosition.Collapse wdCollapseStartanchorStart = sourceInline.Range.Start'删除上次异常退出时可能留下的临时书签If doc.Bookmarks.Exists(TEMP_BOOKMARK) Thendoc.Bookmarks(TEMP_BOOKMARK).DeleteEnd Ifdoc.Bookmarks.Add Name:=TEMP_BOOKMARK, _Range:=originalPosition'嵌入型图片转为浮动图片,然后取消组合。'暂时关闭 Word 提示,由 Word 自动采用默认的“是”。sourceInline.ConvertToShape.SelectApplication.DisplayAlerts = wdAlertsNoneApplication.CommandBars.ExecuteMso "ObjectsUngroup"DoEventsApplication.DisplayAlerts = originalDisplayAlertsdisplayAlertsSaved = False'寻找取消组合后生成的绘图画布Set canvas = FindDrawingCanvas(doc, anchorStart)If canvas Is Nothing ThenwarningMessage = _"已经执行取消组合,但没有找到 Word 生成的绘图画布。" & _vbCrLf & vbCrLf & _"Word 可能没有完成图片转换,请撤销本次操作后重试。"GoTo FinishEnd If'处理画布内部的字母及带撇字母标签For i = 1 To canvas.CanvasItems.countSet item = canvas.CanvasItems(i)txt = GetCanvasItemText(item)labelWidthCm = GetLabelWidthCm(txt)If labelWidthCm > 0 ThenoldWidth = item.WidthtargetWidth = CentimetersToPoints(labelWidthCm)item.LockAspectRatio = msoFalse'不同版本的 Word 可能分别使用 TextFrame 或 TextFrame2On Error Resume NextWith item.TextFrame.WordWrap = True.MarginLeft = 0.MarginRight = 0.MarginTop = 0.MarginBottom = 0.TextRange.ParagraphFormat.Alignment = _wdAlignParagraphCenterEnd WithWith item.TextFrame2.WordWrap = msoTrue.MarginLeft = 0.MarginRight = 0.MarginTop = 0.MarginBottom = 0.TextRange.ParagraphFormat.Alignment = _msoAlignCenterEnd WithOn Error GoTo ErrorHandler'必须先打开文字换行,再设置宽度item.Width = targetWidth'宽度变化后保持标签中心不动item.IncrementLeft (oldWidth - item.Width) / 2labelCount = labelCount + 1End IfNext i'画布转换回嵌入型Set finalInline = canvas.ConvertToInlineShape'剪切处理后的图片finalInline.Range.Cut'剪切完成后重新读取书签,Word 会自动修正位置变化Set returnRange = doc.Bookmarks(TEMP_BOOKMARK).Range.DuplicatereturnRange.Collapse wdCollapseStart'记录准确的粘贴起点pasteStart = returnRange.Start'粘贴回原来的位置returnRange.Paste'Range.Paste 后,returnRange 不一定自动扩展。'嵌入型图片在 Word 中占一个字符,因此从粘贴点向后'读取一个字符,即可准确取得刚粘贴的图片。Set pastedRange = doc.Range( _Start:=pasteStart, _End:=pasteStart + 1)If pastedRange.InlineShapes.count > 0 ThenSet pastedInline = pastedRange.InlineShapes(1)'将光标放在图片后面Set cursorPosition = pastedInline.Range.DuplicatecursorPosition.Collapse wdCollapseEndElse'极少数 Word 版本不能立即返回 InlineShapes,'图片仍已正常粘贴,直接把光标放到其后即可。Set cursorPosition = doc.Range( _Start:=pasteStart + 1, _End:=pasteStart + 1)End IfIf labelCount = 0 ThenwarningMessage = "已经找到绘图画布,但没有识别到字母标签。"End IfFinish:'无论成功、未找到画布还是发生错误,都恢复界面状态On Error Resume NextIf Not doc Is Nothing ThenIf doc.Bookmarks.Exists(TEMP_BOOKMARK) Thendoc.Bookmarks(TEMP_BOOKMARK).DeleteEnd IfEnd IfIf Not cursorPosition Is Nothing ThencursorPosition.SelectEnd IfIf displayAlertsSaved ThenApplication.DisplayAlerts = originalDisplayAlertsEnd IfApplication.ScreenUpdating = originalScreenUpdatingDoEventsIf scrollSaved ThenActiveWindow.VerticalPercentScrolled = originalVerticalScrollActiveWindow.HorizontalPercentScrolled = originalHorizontalScrollEnd IfOn Error GoTo 0If Len(errorMessage) > 0 ThenMsgBox "宏运行时出现错误:" & vbCrLf & vbCrLf & _errorMessage, vbExclamationElseIf Len(warningMessage) > 0 ThenMsgBox warningMessage, vbExclamationEnd IfExit SubErrorHandler:errorMessage = Err.Number & ":" & Err.DescriptionResume FinishEnd SubPrivate Function FindDrawingCanvas( _ByVal doc As Document, _ByVal originalAnchorStart As Long) As ShapeDim shp As ShapeDim parentShape As ShapeDim i As LongDim currentDistance As LongDim nearestDistance As LongnearestDistance = 2147483647On Error Resume Next'优先从当前选区查找画布If Selection.ShapeRange.count > 0 ThenFor i = 1 To Selection.ShapeRange.countSet shp = NothingSet shp = Selection.ShapeRange(i)If Not shp Is Nothing ThenIf shp.Type = msoCanvas ThenSet FindDrawingCanvas = shpExit FunctionEnd IfSet parentShape = NothingSet parentShape = shp.ParentGroupIf Not parentShape Is Nothing ThenIf parentShape.Type = msoCanvas ThenSet FindDrawingCanvas = parentShapeExit FunctionEnd IfEnd IfEnd IfNext iEnd If'选区中未找到时,查找距离原图片位置最近的画布For Each shp In doc.ShapesIf shp.Type = msoCanvas ThencurrentDistance = Abs(shp.Anchor.Start - originalAnchorStart)If currentDistance < nearestDistance ThennearestDistance = currentDistanceSet FindDrawingCanvas = shpEnd IfEnd IfNext shpOn Error GoTo 0End FunctionPrivate Function GetCanvasItemText( _ByVal item As Shape) As StringDim s As StringOn Error Resume Nexts = item.TextFrame.TextRange.TextIf Len(CleanLabelText(s)) = 0 Thens = item.TextFrame2.TextRange.TextEnd IfOn Error GoTo 0GetCanvasItemText = CleanLabelText(s)End FunctionPrivate Function CleanLabelText( _ByVal s As String) As Strings = Replace(s, Chr(13), "")s = Replace(s, Chr(7), "")s = Replace(s, vbCr, "")s = Replace(s, vbLf, "")s = Replace(s, ChrW(160), "")'把不同形式的撇号统一为英文直撇号s = Replace(s, ChrW(&H2018), "'")s = Replace(s, ChrW(&H2019), "'")s = Replace(s, ChrW(&H2032), "'")s = Replace(s, ChrW(&H2B9), "'")s = Replace(s, ChrW(&HFF07), "'")s = Trim$(s)CleanLabelText = sEnd FunctionPrivate Function GetLabelWidthCm( _ByVal s As String) As DoubleDim firstLetter As StringDim hasPrime As Boolean'允许 A、m 等单字母标签,'也允许 A'、m' 等带一个撇号的标签。If Len(s) = 1 ThenIf Not s Like "[A-Za-z]" Then Exit FunctionfirstLetter = UCase$(s)hasPrime = FalseElseIf Len(s) = 2 ThenIf Not Left$(s, 1) Like "[A-Za-z]" Then Exit FunctionIf Right$(s, 1) <> "'" Then Exit FunctionfirstLetter = UCase$(Left$(s, 1))hasPrime = TrueElseExit FunctionEnd IfIf firstLetter = "M" ThenIf hasPrime ThenGetLabelWidthCm = 0.55ElseGetLabelWidthCm = 0.5End IfElseIf hasPrime ThenGetLabelWidthCm = 0.45ElseGetLabelWidthCm = 0.4End IfEnd IfEnd Function