(This is a re-post of a question, now under "feature request")

I suggest adding two new properties for tensors that are not scalars

- "Normal" can be applied to a 1D tensor (vector or covector), with two fields
- 'norm' that can be either +1 or -1
- 'deriv' that will reference a Derivative symbol (like if you defined \nabla{#}:Derivative earlier)

- "Orthogonal" can be applied to any tensor (that is not a scalar)

The properties will be unaffected by raising or lower indices, e.g. if `A_{m,n}`

is orthogonal, then `A_{m}^{n}`

is also orthogonal and if `B_{k}`

is normal then so is `B^{k}`

.

Then there need to be a new method contract_normal(expr), that will scan an expression and look for contractions between tensors

- if two tensors are 1D normal vector & 1D covector then their contraction is the value of 'norm'
- if one tensor is orthogonal and the other is a normal vector/covector then their contraction is 0
- if one tensor is a normal vector and the other is the 'deriv' operator on a normal vector e.g.
`A^{m} \nabla_{k}{A_{m}}`

or`A_{m} \nabla_{k}{A^{m}}`

, then the contraction is 0.