DOCX math: degHide is ignored and a hidden radical degree is emitted

Abierto
#2,806 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@feiiiiii5 ya está trabajando en esto.

Desde el 1/11/2026.

  • #2807 de @feiiiiii5 — abierto
  • #2814 de @phanipaladugula — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
30/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
python
Área
backend

Línea de trabajo

Start with do_rad in packages/markitdown/src/markitdown/converter_utils/docx/math/omml.py, which picks the indexed root only from whether the degree text is nonempty, and with the radical properties parser that ignores degHide. Run the reproduction snippet from the issue to confirm $\sqrt[3]{x}$ is emitted. Linked PR #2807 is already open for this, so review it before starting. Done means a hidden degree gives \sqrt{x}, the val and bare-element defaults are honored, and visible degrees are unchanged.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Problem

When an OMML radical retains a nonempty m:deg but marks it hidden with m:radPr/m:degHide, DOCX conversion still emits the degree. For example, a radical whose degree 3 is hidden becomes $\sqrt[3]{x}$ instead of $\sqrt{x}$.

This changes the displayed mathematical expression in the Markdown consumed by downstream readers or LLMs. Conversion succeeds without a warning.

Reproduced on current main at 7482c092, reporting version 0.1.9. I searched existing issues and PRs for degHide, hidden degree, radical, and square root and did not find this case.

Reproduction

From a checkout of that commit:

pip install -e "./packages/markitdown[docx]" python-docx

The following creates a synthetic DOCX in memory and uses the public conversion API. No LLM or external service is involved.

import io

from docx import Document
from docx.oxml import parse_xml
from markitdown import MarkItDown, StreamInfo

document = Document()
document.add_paragraph()._p.append(parse_xml("""
<m:oMath xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math">
  <m:rad>
    <m:radPr><m:degHide m:val="1"/></m:radPr>
    <m:deg><m:r><m:t>3</m:t></m:r></m:deg>
    <m:e><m:r><m:t>x</m:t></m:r></m:e>
  </m:rad>
</m:oMath>
"""))
stream = io.BytesIO()
document.save(stream)
stream.seek(0)

result = MarkItDown(enable_plugins=False).convert_stream(
    stream, stream_info=StreamInfo(extension=".docx")
)
print(result.markdown)
# Actual:   $\sqrt[3]{x}$
# Expected: $\sqrt{x}$

Expected behavior and controls

Microsoft's HideDegree documentation specifies that degHide=1/true hides the radical degree. A present degHide with no val also means enabled; an absent element means disabled.

I checked the following through both oMath2Latex and serialized DOCX conversion, keeping the stored degree 3 and radicand x constant:

Radical properties Expected LaTeX Actual
<m:degHide m:val="1"/> \sqrt{x} \sqrt[3]{x}
<m:degHide m:val="true"/> \sqrt{x} \sqrt[3]{x}
<m:degHide/> \sqrt{x} \sqrt[3]{x}
<m:degHide m:val="0"/> \sqrt[3]{x} correct
<m:degHide m:val="false"/> \sqrt[3]{x} correct
<m:radPr/> \sqrt[3]{x} correct
no m:radPr \sqrt[3]{x} correct

The first five rows place the listed element inside m:radPr.

Likely cause

oMath2Latex.do_rad chooses an indexed root solely from whether the converted degree text is nonempty. It never checks degHide; the properties parser does not read that flag either.

The radical handler should honor the visibility flag and its on/off defaults while preserving the existing visible-degree behavior.

Environment

  • macOS 26.4, Apple Silicon; Python 3.13.3
  • markitdown 0.1.9 from the commit above
  • python-docx 1.2.0, mammoth 1.13.0, lxml 6.1.3
  • beautifulsoup4 4.15.0, markdownify 1.2.3
Lenguaje dominante
Python
Estrellas
194k
Forks
14.5k
Merge medio
24 min
PR fusionados (30 d)
7

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

  • Incluye un Dockerfile o un archivo de Docker Compose
  • Sin plantilla de pull request
  • Sin guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/markitdown

Todos los issues de microsoft/markitdown

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.