I have the following code for normal ordering of two Boson operators $a(x),\,b(y)$:
Unprotect[NonCommutativeMultiply]; ClearAll[NonCommutativeMultiply] NonCommutativeMultiply[] := 1 NonCommutativeMultiply[a_] := a SetAttributes[NonCommutativeMultiply, {OneIdentity, Flat}] Protect[NonCommutativeMultiply]; NO[x___] := NonCommutativeMultiply[x]; NO[] := 1 NO[x_] := x NO[left___ ** a[x_] ** SuperDagger[a][y_] ** right___] := NO[left ** SuperDagger[a][y] ** a[x] ** right] + left ** right*KroneckerDelta[x - y] NO[left___ ** b[x_] ** SuperDagger[b][y_] ** right___] := NO[left ** SuperDagger[b][y] ** b[x] ** right] + left ** right*KroneckerDelta[x - y] NO[left___ ** a[x_] ** SuperDagger[b][y_] ** right___] := NO[left ** SuperDagger[b][y] ** a[x] ** right] NO[left___ ** b[x_] ** SuperDagger[a][y_] ** right___] := NO[left ** SuperDagger[a][y] ** b[x] ** right] NO[left___ ** a[x_] ** b[y_] ** right___] := NO[left ** b[y] ** a[x] ** right] NO[left___ ** SuperDagger[a][x_] ** SuperDagger[b][y_] ** right___] := NO[left ** SuperDagger[b][y] ** SuperDagger[a][x] ** right] NO[Times[u_, y___]] := u NO[y] which works fine, e.g:
NO[b[q] ** a[k] ** SuperDagger[a][q]] (*=> b[q] KroneckerDelta[k - q] + SuperDagger[a][q] ** b[q] ** a[k]) The problem is if the operators product is multiplied by scalars. NO[Times[u_, y___]] := u NO[y] takes care of the problem if you have one scalar e.g:
NO[u b[q] ** a[k] ** SuperDagger[a][q]] (*=> u (b[q] KroneckerDelta[k - q] + SuperDagger[a][q] ** b[q] ** a[k]) ) However I am stuck on how to make it work in case you have many different scalars mutliplying the operators, e.g:
NO[u v w b[q] ** a[k] ** SuperDagger[a][q]] 