Как создать расширенную матрицу в редакторе уравнений Word 2007+ (2010)?
Является ли это возможным?
Как создать расширенную матрицу в редакторе уравнений Word 2007+ (2010)?
Является ли это возможным?
Ответы:
Я думаю, что вы можете сделать это таким образом ...
Это приводит к разделителю, который довольно близок к двум матрицам. Чтобы добавить дополнительное пространство, после шага (4) вы можете ввести пробел, а перед шагом 6 вы можете вставить пробел. Я не знаю, если это хороший способ сделать что-то.
Вы можете сделать это в VBA, используя что-то вроде этого. Этот материал для меня совершенно новый, поэтому, несомненно, может быть улучшен. Если вы регулярно работаете только с небольшим количеством размеров массивов, вы можете рассмотреть возможность использования VBA для генерации каждого массива, а затем сохранить его как строительный блок / автотекст.
Sub testInsertAugmentedMatrix1()
' Insert a test equation at the selection point
Call insertAugmentedMatrix1(Selection.Range, 2, 5)
End Sub
Sub insertAugmentedMatrix1(rng As Word.Range, RowCount As Integer, ColumnCount As Integer)
' Insert a "basic" augmented matrix at the specified range,
' with RowCount rows, ColumnCount columns, and a single column after the separator
Dim mainFunction As Word.OMathFunction
Dim subFunction As Word.OMathFunction
' Insert the framework
rng.OMaths.Add rng
With rng.OMaths(1)
Set mainFunction = .Functions.Add(.Range, wdOMathFunctionDelim, 2)
With mainFunction
.Delim.BegChar = 40
.Delim.SepChar = 124
.Delim.EndChar = 41
.Delim.Grow = True
.Delim.Shape = wdOMathShapeCentered
End With
With mainFunction.Args(1)
Set subFunction = .Functions.Add(.Range, wdOMathFunctionMat, ColumnCount * RowCount, ColumnCount)
subFunction.Range.InsertAfter " "
End With
With mainFunction.Args(2)
Set subFunction = .Functions.Add(.Range, wdOMathFunctionMat, RowCount, 1)
subFunction.Range.InsertBefore " "
End With
Set subFunction = Nothing
Set mathFunction = Nothing
End With
End Sub
Другой способ в VBA - создать «Математическую строку», например:
Sub testInsertAugmentedMatrix2()
' Insert a test equation at the selection point
Call insertAugmentedMatrix2(Selection.Range, 4, 6)
End Sub
Sub insertAugmentedMatrix2(rng As Word.Range, RowCount As Integer, ColumnCount As Integer)
Const mthMatrix As Long = &H25A0 '"Black Square"
Const chrMatrixColumnDelimiter As String = "&"
Const chrMatrixRowDelimiter As String = "@"
Const mthVbar As Long = &H2502
Dim i As Integer
Dim strArray As String
strArray = ""
For i = 1 To RowCount
If i > 1 Then
strArray = strArray & chrMatrixRowDelimiter
End If
strArray = strArray & String(ColumnCount - 1, chrMatrixColumnDelimiter)
Next
rng.Text = "(" & _
ChrW(mthMatrix) & "(" & strArray & ")" & _
" " & ChrW(mthVbar) & " " & _
ChrW(mthMatrix) & "(" & String(RowCount - 1, chrMatrixRowDelimiter) & ")" & _
")"
rng.OMaths.Add rng
rng.OMaths.BuildUp
End Sub
Или вы можете использовать жетоны "математического автозамены" \ matrix и т. Д. Вместо специальных символов Unicode, как это. Функция mathSubstitute копируется из мой пост здесь и не был тщательно протестирован. Я думаю, что это потенциально самый читаемый подход.
Sub testInsertAugmentedMatrix3()
' Insert a test equation at the selection point
Call insertAugmentedMatrix3(Selection.Range, 4, 6)
End Sub
Sub insertAugmentedMatrix3(rng As Word.Range, RowCount As Integer, ColumnCount As Integer)
Const mthMatrix As String = "\matrix"
Const chrMatrixColumnDelimiter As String = "&"
Const chrMatrixRowDelimiter As String = "@"
Const mthVbar As String = "\vbar"
Dim i As Integer
Dim strArray As String
strArray = ""
For i = 1 To RowCount
If i > 1 Then
strArray = strArray & chrMatrixRowDelimiter
End If
strArray = strArray & String(ColumnCount - 1, chrMatrixColumnDelimiter)
Next
rng.Text = mathSubstitute("(" & _
mthMatrix & "(" & strArray & ")" & _
" " & mthVbar & " " & _
mthMatrix & "(" & String(RowCount - 1, chrMatrixRowDelimiter) & ")" & _
")")
rng.OMaths.Add rng
rng.OMaths.BuildUp
End Sub
Function mathSubstitute(s As String) As String
Const bslash As String = "\"
Dim a() As String
Dim sout As String
Dim i As Integer
Dim j As Integer
Dim sac As String
sout = ""
If s <> "" Then
a = Split(s, bslash)
sout = a(LBound(a))
For i = LBound(a) + 1 To UBound(a)
Debug.Print a(i)
For j = 1 To Len(a(i))
On Error Resume Next
sac = Application.OMathAutoCorrect.Entries(bslash & Left(a(i), j)).Value
If Err.Number = 0 Then
sout = sout & sac & Mid(a(i), j + 1)
Exit For
Else
sac = ""
Err.Clear
End If
Next
If sac = "" Then sout = sout & bslash & a(i)
'Debug.Print sout
Next
End If
On Error GoTo 0
mathSubstitute = sout
End Function
Есть статья Мюррея Сарджента Вот это описывает, как все это должно работать. Я не думаю, что вещь нумерации уравнения там работает в слове но это может сделать это в другом месте.
Создайте объект уравнения. Щелкните правой кнопкой мыши, измените на встроенный. Вставьте в него следующее, затем щелкните правой кнопкой мыши и перейдите на экран
[■ (& амп; @ & амп;) │ ■ (& амп; @ & амп;)]
Это даст вам расширенную матрицу с двумя частями 2x2, разделенными разделителем. В общем, переключение на встроенное дает вам возможность возиться с кодом, который генерирует объект уравнения.
Это работало для меня как в Word, так и в OneNote.
Введите [|] и пробел в редакторе уравнений. Теперь у вас будет два заполнителя рядом с | где вы можете вставить две матрицы без скобок (с панели инструментов). После того, как вы вставили две матрицы, вы можете вставить пробелы до и после | чтобы сделать его более читабельным.