Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

A period inside the math delimiters (`$\frac{1}{3}.$`) makes correct answers fail and can make wrong ones pass

Abierto Apto para principiantes
#85 0 comentarios 0 reacciones 0 asignados Ver en GitHub

@MohammadHijjawi97 ya está trabajando en esto.

Desde el 1/10/2026.

  • #86 de @MohammadHijjawi97 — abierto

Evaluación

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

Línea de trabajo

Comienza con extract_latex en parser.py, donde el contenido delimitado se pasa a la normalización, y luego revisa los casos relacionados en tests/test_all.py. Añade cobertura de regresión para puntos finales, comas, puntos y comas, espacios en blanco, signos de puntuación escapados y puntos suspensivos; el trabajo estará terminado cuando las filas indicadas se califiquen como se espera y pasen las pruebas existentes.

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

Descripción

When a sentence-final period (or comma or semicolon) is written inside the math delimiters, the LaTeX does not parse. A correct answer is then graded wrong. With the default extraction config, the number pattern can instead read a fragment of the formula, so some wrong answers are graded correct.

The false-negative half is already documented: arXiv:2609.01354 ("Where the Verifier Fails", §3.2 and Table 8) reports that a trailing period makes Math-Verify reject an expression it otherwise accepts (\frac{1}{2} vs \frac{1}{2}.), and that whitespace and punctuation make up 93.0% of the default LaTeX configuration's in-contract failures in that study. What I haven't seen reported is the other direction: the same trailing period can make a wrong answer pass (the last three rows of the table below).

Reproduction
from math_verify import parse, verify

# Timeouts are disabled only because the default timeout fails on Windows (#79).
def grade(gold, answer):
    return verify(
        parse(gold, parsing_timeout=None),
        parse(answer, parsing_timeout=None),
        timeout_seconds=None,
    )

print(parse(r"The answer is $\frac{1}{3}.$", parsing_timeout=None))  # ['\\frac{1}{3}.']
print(grade(r"$\frac{1}{3}$", r"The answer is $\frac{1}{3}.$"))      # False, expected True
print(parse(r"The answer is $2^{10}.$", parsing_timeout=None))       # [2, '2^{10}.']
print(grade(r"$2$", r"The answer is $2^{10}.$"))                     # True, expected False
Expected vs actual

All rows use the default parse config (LatexExtractionConfig(), ExprExtractionConfig()) unless noted.

Gold Answer Expected Actual parse(answer)
$\frac{1}{3}$ $\frac{1}{3}.$ True False ['\\frac{1}{3}.']
$\frac{1}{3}$ $$\frac{1}{3}.$$ True False ['\\frac{1}{3}.']
$\frac{1}{3}$ \[\frac{1}{3}.\] True False ['\\frac{1}{3}.']
$\frac{1}{3}$ $\frac{1}{3},$ True False ['\\frac{1}{3},']
$\sqrt{2}$ $\sqrt{2}.$ True False ['\\sqrt{2}.']
$(1,2)$ $(1,2).$ True False ['(1,2).']
$42$ $42.$ (LaTeX config only) True False ['42.']
$2$ $2^{10}.$ False True [2, '2^{10}.']
$1$ The answer is $1/3.$ False True [1, '1/3.']
$12$ $12 - \sqrt{5}.$ False True [12, '12 - \\sqrt{5}.']

Controls: $\frac{1}{3}$. (period outside the delimiters) and $\frac{1}{3}$ are accepted. $42.$ is also accepted with the default config, but only because the number pattern reads $42, with $ taken as a currency sign. The LaTeX parse fails for that one too.

Cause

extract_latex passes the delimited content with its trailing . to normalize_latex and latex2sympy, which raises I don't understand this. With the default extraction_mode="any_match", the ExprExtractionConfig patterns are tried next. Their number pattern accepts a currency sign before a number, so it reads $2 from $2^{10}.$. An integer answer still gets its right value, which hides the problem. Any other answer is either lost (only the fallback string is returned) or replaced by its leading number.

Suggested fix

Before normalization, remove one trailing ., , or ; (and any whitespace after it) from the delimited LaTeX. Keep escaped characters (\,, \;, \.) and ellipses (...). This is a small change in parser.py, and I can open a PR for it with regression tests in tests/test_all.py. With the change, every case above grades as expected and the existing tests still pass.

The change does not cover a period inside \boxed{...}, as in \boxed{\sqrt{2}.}, because the boxed content is extracted inside latex2sympy2_extended's normalization. It also leaves the general fallback that reads numbers out of a LaTeX match that failed to parse (the subject of the closed PR #82). It only removes a common way of reaching that fallback.

Environment
  • Windows 11 Pro 10.0.26200, x86-64, CPU only
  • Python 3.13.14
  • math-verify 0.9.0 from main at ba3d3aa (editable install), latex2sympy2_extended 1.11.0, sympy 1.14.0, antlr4-python3-runtime 4.13.2
  • Not run on Linux. The code path is regex and ANTLR only, so I expect the same result there.

Found while systematically testing graders with meaning-preserving rewrites of gold answers and provably wrong answers.

I plan to mention this case, by mechanism only, in a write-up on grader reliability no earlier than 2026-10-31; happy to wait longer if you need.

Lenguaje dominante
Python
Estrellas
1.2k
Forks
65
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

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 huggingface/Math-Verify

Todos los issues de huggingface/Math-Verify

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.