DOCX math: degHide is ignored and a hidden radical degree is emitted
Los mantenedores suelen responder en 1 día
@feiiiiii5 ya está trabajando en esto.
Desde el 1/11/2026.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 30/100
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
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
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de microsoft/markitdown
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
microsoft/markitdown#2820 ·
Los mantenedores suelen responder en 1 día
-
Valid Atom feeds with zero entries are rejected as an unknown feed typePosiblemente ocupada @pujitha24 la tomó hace 6 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
microsoft/markitdown#2781 ·
Los mantenedores suelen responder en 1 día
-
DOCX: footnote references and back-links point to anchors that don't exist in the MarkdownPosiblemente ocupada @sun04222 la tomó hace 11 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
microsoft/markitdown#2743 ·
Los mantenedores suelen responder en 1 día
-
DOCX math: a delimiter with several arguments keeps only the last onePosiblemente ocupada @drakeo338 la tomó hace 33 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
microsoft/markitdown#2573 ·
Los mantenedores suelen responder en 1 día
-
DOCX: Heading 7-9 styles lose heading structure entirely (render as plain paragraphs)Posiblemente ocupada @stanleys12 la tomó hace 38 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
microsoft/markitdown#2530 ·
Los mantenedores suelen responder en 1 día
Todos los issues de microsoft/markitdown
Issues similares
-
bump patch
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
autowarefoundation/autoware_carla_scenario#1321 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 78/100
QuantConnect/Documentation#2838 ·
Los mantenedores suelen responder en 1 día
-
get_all_subclasses must deduplicate by class identityPosiblemente ocupada @Gambit-Checkmate la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 15 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
awslabs/route53-dynamic-dns-with-lambda#67 · 1 comentario ·