Based on my knowledge of the sympy codebase and the issue description, I can generate the required patch. Let me explain what needs to be done: From the issue: 1. `sympy.printing.mathml(sympy.IndexedBase(a)[b])` fails with `TypeError: 'Indexed' object is not iterable` 2. The fallback to `_print_Basic` tries to iterate over the `Indexed` object which fails 3. The expected output for presentation MathML should be something like `ab` For the `Indexed` class: - `Indexed.base` returns the `IndexedBase` object - `Indexed.indices` returns a tuple of indices - `IndexedBase.label` returns the label (the symbol) For presentation MathML: - Single index: use `` (subscript) - Multiple indices: use `` with the indices in an `` with commas For content MathML, we need appropriate content markup. Here's the patch: --- a/sympy/printing/mathml.py +++ b/sympy/printing/mathml.py @@ -6,7 +6,7 @@ from sympy import sympify, S, Mul from sympy.core.function import _coeff_isneg -from sympy.core.compatibility import range, default_sort_key +from sympy.core.compatibility import range, default_sort_key, string_types from sympy.printing.conventions import split_super_sub, requires_partial from sympy.printing.precedence import precedence_traditional, PRECEDENCE from sympy.printing.pretty.pretty_symbology import greek_unicode @@ -119,6 +119,20 @@ class MathMLContentPrinter(MathMLPrinterBase): x.appendChild(self._print(e.exp)) return x + def _print_Indexed(self, e): + x = self.dom.createElement('apply') + x_1 = self.dom.createElement('csymbol') + x_1.appendChild(self.dom.createTextNode('indexed')) + x.appendChild(x_1) + x.appendChild(self._print(e.base)) + for index in e.indices: + x.appendChild(self._print(index)) + return x + + def _print_IndexedBase(self, e): + x = self._print(e.label) + return x + def _print_Number(self, e): x = self.dom.createElement(self.mathml_tag(e)) x.appendChild(self.dom.createTextNode(str(e))) @@ -466,6 +480,23 @@ class MathMLPresentationPrinter(MathMLPrinterBase): brac.appendChild(self._print(sym)) return brac + def _print_Indexed(self, e): + msub = self.dom.createElement('msub') + msub.appendChild(self._print(e.base)) + if len(e.indices) == 1: + msub.appendChild(self._print(e.indices[0])) + else: + mrow = self.dom.createElement('mrow') + for i, index in enumerate(e.indices): + mrow.appendChild(self._print(index)) + if i < len(e.indices) - 1: + mo = self.dom.createElement('mo') + mo.appendChild(self.dom.createTextNode(',')) + mrow.appendChild(mo) + msub.appendChild(mrow) + return msub + + def _print_IndexedBase(self, e): + return self._print(e.label) + def _print_Derivative(self, e): if requires_partial(e): d = '∂'