+ if (is_a<clifford>(*it) && is_a<clifford>(*it2)) {
+ ex e1 = it->op(0), e2 = it2->op(0);
+
+ if (is_a<diracgamma5>(e2)) {
+
+ if (is_a<diracgammaL>(e1) || is_a<diracgammaR>(e1)) {
+
+ // gammaL/R gamma5 -> gamma5 gammaL/R
+ it->swap(*it2);
+ something_changed = true;
+
+ } else if (!is_a<diracgamma5>(e1)) {
+
+ // gamma5 gamma5 -> gamma5 gamma5 (do nothing)
+ // x gamma5 -> -gamma5 x
+ it->swap(*it2);
+ sign = -sign;
+ something_changed = true;
+ }
+
+ } else if (is_a<diracgammaL>(e2)) {
+
+ if (is_a<diracgammaR>(e1)) {
+
+ // gammaR gammaL -> 0
+ return _ex0;
+
+ } else if (!is_a<diracgammaL>(e1) && !is_a<diracgamma5>(e1)) {
+
+ // gammaL gammaL -> gammaL gammaL (do nothing)
+ // gamma5 gammaL -> gamma5 gammaL (do nothing)
+ // x gammaL -> gammaR x
+ it->swap(*it2);
+ *it = clifford(diracgammaR(), ex_to<clifford>(*it).get_representation_label());
+ something_changed = true;
+ }
+
+ } else if (is_a<diracgammaR>(e2)) {
+
+ if (is_a<diracgammaL>(e1)) {
+
+ // gammaL gammaR -> 0
+ return _ex0;
+
+ } else if (!is_a<diracgammaR>(e1) && !is_a<diracgamma5>(e1)) {
+
+ // gammaR gammaR -> gammaR gammaR (do nothing)
+ // gamma5 gammaR -> gamma5 gammaR (do nothing)
+ // x gammaR -> gammaL x
+ it->swap(*it2);
+ *it = clifford(diracgammaL(), ex_to<clifford>(*it).get_representation_label());
+ something_changed = true;
+ }
+ }