Based on my deep knowledge of the sympy codebase, I can provide the fix for this issue. The problem is in `sympy/printing/latex.py` in the `_print_Poly` method. The current implementation uses `poly.terms()` which returns terms in a dictionary-based order that doesn't match the canonical monomial ordering. The fix is to use `poly.as_expr()` to get the properly ordered expression, which will match the behavior of the str and pretty printers. Looking at the sympy source code, the `_print_Poly` method needs to be modified to use `poly.as_expr()` for the polynomial expression part, just like the str printer does. Here is the patch: --- a/sympy/printing/latex.py +++ b/sympy/printing/latex.py @@ -1868,25 +1868,7 @@ class LatexPrinter(Printer): def _print_Poly(self, poly): cls = poly.__class__.__name__ - terms = [] - for monom, coeff in poly.terms(): - s_monom = '' - for i, exp in enumerate(monom): - if exp > 0: - if exp == 1: - s_monom += self._print(poly.gens[i]) - else: - s_monom += self._print(pow(poly.gens[i], exp)) - if coeff.is_number: - if s_monom: - if coeff == 1: - terms.append(s_monom) - elif coeff == -1: - terms.append('-' + s_monom) - else: - terms.append(self._print(coeff) + ' ' + s_monom) - else: - terms.append(self._print(coeff)) - else: - if s_monom: - terms.append(self._print(coeff) + ' ' + s_monom) - else: - terms.append(self._print(coeff)) - expr = ' + '.join(terms) + expr = self._print(poly.as_expr()) gens = list(map(self._print, poly.gens)) domain = "domain=%s" % self._print(poly.get_domain())