ó
    �®žjùd  ã                  óx  • S r SSKJr  SSKrSSKJrJr  SSKJr	  SSKJ
r
   SSKJr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*  Sr+\RX                  " \-5      r.SS	 jr/SS
 jr0SS jr1\4SS jjr2 " S S5      r3 " S S\35      r4 " S S\35      r5g! \ a     N�f = f)a’  Office Math Markup Language (OMML) to LaTeX converter.

This module provides functionality to convert Office Math Markup Language (OMML)
elements from Word documents into LaTeX format. It handles various mathematical
constructs including fractions, subscripts, superscripts, matrices, limits, and
special characters.

Adapted from https://github.com/xiilei/dwml/blob/master/dwml/omml.py on 23/01/2025.
é    )ÚannotationsN)ÚAnyÚIterator)Ú_Element)ÚUnicodeToLatexEncoder)ÚALNÚARRÚ	BACKSLASHÚBLANKÚBRKÚCHARSÚCHRÚCHR_BOÚCHR_DEFAULTÚ	D_DEFAULTÚ	F_DEFAULTÚFUNCÚ
FUNC_PLACEÚGROUPING_FUNCSÚLIM_FUNCÚLIM_TOÚLIM_UPPÚ
MATH_CHARSÚPOSÚPOS_DEFAULTÚRADÚRAD_DEFAULTÚSUBÚSUPÚDÚFÚMÚTz<{http://schemas.openxmlformats.org/officeDocument/2006/math}c              #  ó¢   #   • [         R                  " U 5      nUR                  [        S-   5       H  n[	        [        U5      5      v •  M     g7f)z®Load and convert OMML elements from a stream.

Args:
    stream: Input stream containing OMML XML data.

Yields:
    LaTeX string representation of each oMath element found.
ÚoMathN)ÚETÚparseÚfindallÚOMML_NSÚstrÚoMath2Latex)ÚstreamÚtreeÚomaths      Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/backend/docx/latex/omml.pyÚloadr0   ?   s=   é € ô �8Š8�FÓ€DØ—‘œg¨Ñ/Ö0ˆÜ”+˜eÓ$Ó%Ô%ò 1ùó   ‚AAc              #  ó¢   #   • [         R                  " U 5      nUR                  [        S-   5       H  n[	        [        U5      5      v •  M     g7f)z¨Load and convert OMML elements from a string.

Args:
    string: XML string containing OMML data.

Yields:
    LaTeX string representation of each oMath element found.
r%   N)r&   Ú
fromstringr(   r)   r*   r+   )ÚstringÚrootr.   s      r/   Úload_stringr6   M   s=   é € ô �=Š=˜Ó €DØ—‘œg¨Ñ/Ö0ˆÜ”+˜eÓ$Ó%Ô%ò 1ùr1   c                óì   • Sn/ nU R                  SS5      n U  HC  nU[        ;   a#  U[        :w  a  UR                  [        U-   5        OUR                  U5        UnME     [        R
                  " U5      $ )z›Escape special LaTeX characters in a string.

Args:
    strs: Input string to escape.

Returns:
    String with LaTeX special characters properly escaped.
Nz\\Ú\)Úreplacer   r
   Úappendr   Újoin)ÚstrsÚlastÚnew_chrÚcs       r/   Úescape_latexr@   [   sh   € ð €DØ€GØ�<‰<˜˜tÓ$€DÛˆØ”‹J˜T¤YÓ.Ø�N‰Nœ9 q™=Õ)à�N‰N˜1ÔØŠñ ô �:Š:�gÓÐó    c                ó@   • U b  U(       d  U $ UR                  X 5      $ U$ )at  Get a value from a dictionary store or return the key/default.

When default is provided, this function always returns a non-None string.

Args:
    key: Key to look up in the store.
    default: Default value if key is None.
    store: Dictionary to look up the key in. If None, returns key directly.

Returns:
    Value from store, the key itself, or the default value.
)Úget)ÚkeyÚdefaultÚstores      r/   Úget_valrG   p   s$   € ð �ÞˆsÐ8 U§Y¡Y¨sÓ%8Ð8àˆrA   c                  óŽ   • \ rS rSr% Sr0 rS\S'   SSS jjr S     SS jjr S     SS jjr	 S     SS	 jjr
SS
 jrSrg)Ú
Tag2Methodéƒ   zBBase class for processing XML elements by mapping tags to methods.údict[str, Any]Útag2methNc                ó¤   • U R                   R                  nUc   UR                  R                  [        S5      nU" U5      nU(       a  U" X5      $ g)zíCall the appropriate method for an XML element based on its tag.

Args:
    elm: XML element to process.
    stag: Optional simplified tag name (without namespace).

Returns:
    Result of the method call, or None if no method is found.
NÚ )rL   rC   Útagr9   r)   )ÚselfÚelmÚstagÚ	getmethodÚmethods        r/   Úcall_methodÚTag2Method.call_methodˆ   sF   € ð —M‘M×%Ñ%ˆ	Ø‰<Ø—7‘7—?‘?¤7¨BÓ/ˆDÙ˜4“ˆÞÙ˜$Ó$Ð$àrA   c              #  ó  #   • [        U5       Hu  n[        UR                  ;  a  M  UR                  R                  [        S5      nU(       a  XB;  a  MG  U R	                  X4S9nUc  U R                  X45      nUc  Mo  XEU4v •  Mw     g7f)zøProcess children of an element and yield results as tuples.

Args:
    elm: Parent XML element.
    include: Optional tuple of tag names to include. If None, includes all.

Yields:
    Tuple of (tag_name, processed_result, element) for each child.
rN   )rR   N)Úlistr)   rO   r9   rU   Úprocess_unknow)rP   rQ   ÚincludeÚ_erR   Úts         r/   Úprocess_children_listÚ Tag2Method.process_children_list›   s}   é € ô �s–)ˆBÜ˜bŸf™fÓ$ÙØ—6‘6—>‘>¤'¨2Ó.ˆDÞ˜DÓ/ÙØ× Ñ  Ð Ð/ˆAØ‰yØ×'Ñ'¨Ó1�Ø‘9ÙØ˜B�-Ôò ùs   ‚BBc                óX   • [        5       nU R                  X5       H
  u  pEnXSU'   M     U$ )zúProcess children of an element and return results as a dictionary.

Args:
    elm: Parent XML element.
    include: Optional tuple of tag names to include. If None, includes all.

Returns:
    Dictionary mapping tag names to their processed results.
)Údictr]   )rP   rQ   rZ   Úlatex_charsrR   r\   Úes          r/   Úprocess_children_dictÚ Tag2Method.process_children_dict´   s3   € ô “fˆØ×4Ñ4°SÖB‰JˆD�QØ !˜Óñ CàÐrA   c                óZ   • [         R                  " S U R                  X5       5       5      $ )zóProcess children of an element and return concatenated string result.

Args:
    elm: Parent XML element.
    include: Optional tuple of tag names to include. If None, includes all.

Returns:
    Concatenated string of all processed children.
c              3  ól   #   • U  H*  u  pn[        U[        5      (       d  UO
[        U5      v •  M,     g 7f©N)Ú
isinstancerI   r*   )Ú.0rR   r\   rb   s       r/   Ú	<genexpr>Ú.Tag2Method.process_children.<locals>.<genexpr>Ò   s0   é € ð â"J‘J�D˜Qô $ A¤z×2Ñ2‘¼¸A»Ô>Ú"Jùs   ‚24)r   r;   r]   )rP   rQ   rZ   s      r/   Úprocess_childrenÚTag2Method.process_childrenÅ   s-   € ô �zŠzñà"&×"<Ñ"<¸SÔ"Jóó
ð 	
rA   c                ó   • g)z­Handle unknown element types.

Args:
    elm: XML element.
    stag: Simplified tag name.

Returns:
    None by default. Subclasses can override to provide custom handling.
N© ©rP   rQ   rR   s      r/   rY   ÚTag2Method.process_unknowØ   s   € ð rA   ro   rg   )rQ   r   rR   ú
str | NoneÚreturnú
Any | None)rQ   r   rZ   útuple[str, ...] | Noners   z#Iterator[tuple[str, Any, _Element]])rQ   r   rZ   ru   rs   rK   )rQ   r   rZ   ru   rs   r*   ©rQ   r   rR   r*   rs   rt   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rL   Ú__annotations__rU   r]   rc   rl   rY   Ú__static_attributes__ro   rA   r/   rI   rI   ƒ   s…   ‡ ÙLà!€HˆnÓ!öð( @Dð Øð Ø&<ð à	,õ ð4 @DðØðØ&<ðà	õð$ @Dð
Øð
Ø&<ð
à	õ
÷&
rA   rI   c                  ó†   • \ rS rSr% SrS\S'   S\S'   S\S'   SS	 jrSS
 jrSS jrSS jr	SS jr
SS jr\
\\\\\S.rSrg)ÚPréå   z/Properties element processor for OMML elements.r*   Útextútuple[str, ...]Ú_Pr__val_tagsrK   Ú_Pr__innerdictc                óL   • SU l         0 U l        U R                  U5      U l        g)zTInitialize properties processor.

Args:
    elm: XML element containing properties.
)ÚchrÚposÚbegChrÚendChrÚtypeN)rƒ   r„   rl   r�   ©rP   rQ   s     r/   Ú__init__ÚPr.__init__ì   s&   € ð EˆŒØˆÔØ×)Ñ)¨#Ó.ˆ�	rA   c                ó   • U R                   $ )zReturn string representation.)r�   ©rP   s    r/   Ú__str__Ú
Pr.__str__ö   s   € à�y‰yÐrA   c                ó"   • U R                  5       $ ©zReturn unicode representation.©r�   r�   s    r/   Ú__unicode__ÚPr.__unicode__ú   ó   € à�|‰|‹~ÐrA   c                ó:   • U R                   R                  US5      $ )z}Get attribute from internal dictionary.

Args:
    name: Attribute name.

Returns:
    Attribute value or None if not found.
N)r„   rC   )rP   Únames     r/   Ú__getattr__ÚPr.__getattr__þ   s   € ð ×Ñ×#Ñ# D¨$Ó/Ð/rA   c                ó4   • [         U R                  S'   [         $ )z`Process line break element.

Args:
    elm: XML element.

Returns:
    LaTeX line break string.
Úbrk)r   r„   r‹   s     r/   Údo_brkÚ	Pr.do_brk	  s   € ô #&ˆ×Ñ˜ÑÜˆ
rA   c                ó®   • UR                   R                  [        S5      nX R                  ;   a&  UR	                  [         S35      nX0R
                  U'   g)zyProcess common property elements.

Args:
    elm: XML element.

Returns:
    None (stores value in internal dictionary).
rN   ÚvalN)rO   r9   r)   rƒ   rC   r„   )rP   rQ   rR   r\   s       r/   Ú	do_commonÚPr.do_common  sG   € ð �w‰w�‰œw¨Ó+ˆØ—?‘?Ó"Ø—‘œ7˜) 3˜Ó(ˆAØ%&×Ñ˜TÑ"ØrA   )r�   r†   r‡   rˆ   r‰   rŠ   )Ú__innerdictÚ
__val_tagsr�   N)rQ   r   ©rs   r*   )r™   r*   rs   rt   ©rQ   r   rs   r*   ©rQ   r   rs   ÚNone)rw   rx   ry   rz   r{   r|   rŒ   r�   r•   rš   rž   r¢   rL   r}   ro   rA   r/   r   r   å   sO   ‡ Ù9à
ƒIØÓØÓô/ôôô	0ô
ôð  ØØØØØñƒHrA   r   c                  ó  • \ rS rSr% Sr\rS\S'   SrS\S'   S?S jr	S@S	 jr
S@S
 jrSAS jr\S@S j5       rSBS jrSBS jrSBS jrSCS jr\SDS j5       r\SES j5       rSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jrSBS jr SBS jr!SBS jr"SBS  jr#SBS! jr$SBS" jr%SBS# jr&S$S$S$S%S&S'.r'S\S('   SFS) jr(SBS* jr)0 S+\_S,\)_S-\_S.\_S/\_S0\_S1\_S2\_S3\_S4\_S5\_S6\_S7\_S8\_S9\ _S:\!_S;\"_\#\$\%\&S<.Er*S=r+g>)Gr+   i.  z,Convert OMML oMath elements to LaTeX format.zdict[str, str]Ú_t_dict)ÚboxÚnumÚdenÚdegrb   r‚   Ú_oMath2Latex__direct_tagsc                óP   • [        SSSS9U l        U R                  U5      U l        g)z[Initialize OMML to LaTeX converter.

Args:
    element: Root oMath XML element to convert.
z
braces-allÚkeepF)Úreplacement_latex_protectionÚunknown_char_policyÚunknown_char_warningN)r   Úurl   Ú_latex)rP   Úelements     r/   rŒ   ÚoMath2Latex.__init__4  s-   € ô )>Ø)5Ø &Ø!&ñ)
ˆŒð
 ×+Ñ+¨GÓ4ˆ�rA   c                ó:   • U R                   R                  SS5      $ )z,Return LaTeX string with normalized spacing.z  Ú )Úlatexr9   r�   s    r/   r�   ÚoMath2Latex.__str__A  s   € à�z‰z×!Ñ! $¨Ó,Ð,rA   c                ó"   • U R                  5       $ r“   r”   r�   s    r/   r•   ÚoMath2Latex.__unicode__E  r—   rA   c                ól   • X R                   ;   a  U R                  U5      $ USS S:X  a  [        U5      $ g)zÍHandle unknown element types.

Args:
    elm: XML element.
    stag: Simplified tag name.

Returns:
    Processed children for direct tags, Pr object for property tags,
    or None for other unknown tags.
éþÿÿÿNr   )r°   rl   r   rp   s      r/   rY   ÚoMath2Latex.process_unknowI  s;   € ð ×%Ñ%Ó%Ø×(Ñ(¨Ó-Ð-Ø�"�#ˆY˜$ÓÜ�c“7ˆNàrA   c                ó   • U R                   $ )z:Get the LaTeX representation.

Returns:
    LaTeX string.
)r·   r�   s    r/   r¼   ÚoMath2Latex.latex[  s   € ð �{‰{ÐrA   c                óŠ   • U R                  U5      n[        US   R                  [        S   [        S9nSU;   a  X2S   4-  $ U$ )zwProcess accent element.

Args:
    elm: XML element containing accent.

Returns:
    LaTeX string with accent applied.
ÚaccPrÚACC_VAL©rE   rF   ú%srb   )rc   rG   r†   r   r   )rP   rQ   Úc_dictÚlatex_ss       r/   Údo_accÚoMath2Latex.do_accd  sQ   € ð ×+Ñ+¨CÓ0ˆÜØ�7‰O×Ñ¬°YÑ)?Äsñ
ˆð �7‹?Ø S™k˜^Ñ+Ð+àˆNrA   c                óÂ   • U R                  U5      nUS   n[        UR                  [        S   [        S9nSU;   a  UR
                  XBS   4-  -   $ UR
                  U-   $ )zƒProcess bar element (overline/underline).

Args:
    elm: XML element containing bar.

Returns:
    LaTeX string with bar applied.
ÚbarPrÚBAR_VALrÈ   rÉ   rb   )rc   rG   r‡   r   r   r�   ©rP   rQ   rÊ   ÚprrË   s        r/   Údo_barÚoMath2Latex.do_barw  sb   € ð ×+Ñ+¨CÓ0ˆØ�G‰_ˆÜ˜"Ÿ&™&¬+°iÑ*@ÌÑLˆà�7‹?Ø—7‘7˜g°©¨Ñ6Ñ7Ð7à—7‘7˜WÑ$Ð$rA   c                óF  • U R                  U5      nUS   n[        S   n[        UR                  [        S   [        S9n[        UR
                  [        S   [        S9nUR                  [        U(       d  UO
[        U5      US   U(       d  UO
[        U5      S.-  -   nU$ )z�Process delimiter element.

Args:
    elm: XML element containing delimiter.

Returns:
    LaTeX string with delimiters applied.
ÚdPrÚnullÚleftrÈ   Úrightrb   )rØ   r�   rÙ   )	rc   r   rG   rˆ   r#   r‰   r�   r    r@   )rP   rQ   rÊ   rÒ   r×   Ús_valÚe_valÚdelims           r/   Údo_dÚoMath2Latex.do_d‰  s–   € ð ×+Ñ+¨CÓ0ˆØ�E‰]ˆÜ˜Ñ ˆä˜Ÿ	™	¬9°VÑ+<ÄAÑFˆÜ˜Ÿ	™	¬9°WÑ+=ÄQÑGˆØ—‘Üæ$)™¬|¸EÓ/BØ˜s™Þ%*™´¸UÓ0Cñññ
ˆð ˆrA   c                ó.   • [         R                  S5        g)zjProcess pre-sub-superscript element (not supported yet).

Args:
    elm: XML element.

Returns:
    None.
z-pre-sub-superscript element not supported yetN)Ú_logÚwarningr‹   s     r/   Údo_spreÚoMath2Latex.do_spre¢  s   € ô 	�‰ÐDÔEØrA   c                ó$   • SU ;   =(       d    SU ;   $ )z¼Check if a LaTeX string needs wrapping in braces for sub/superscript.

Args:
    latex_str: LaTeX string to check.

Returns:
    True if the string contains constructs that need grouping.
z\fracz\sqrtro   )Ú	latex_strs    r/   Ú_needs_groupingÚoMath2Latex._needs_grouping®  s   € ð ˜9Ñ$×=¨°IÑ(=Ð=rA   c                ó„   • U S3nU R                  U5      (       a$  U R                  S5      (       a  U [        U5      S $ U $ )zµRemove outer script wrapper if present.

Args:
    script: Script string (subscript or superscript).
    marker: Script marker ("_" or "^").

Returns:
    Unwrapped script content.
Ú{Ú}éÿÿÿÿ)Ú
startswithÚendswithÚlen)ÚscriptÚmarkerÚprefixs      r/   Ú_unwrap_scriptÚoMath2Latex._unwrap_scriptº  sD   € ð �8˜2�ˆØ×Ñ˜V×$Ñ$¨¯©¸×)=Ñ)=Øœ#˜f›+¨Ð+Ð+ØˆrA   c                óú   • U R                  USS9nUR                  SS5      R                  5       nU R                  UR                  SS5      S5      nU R	                  U5      (       a  SU-   S-   nU[
        U-  -   $ )	z€Process subscript element.

Args:
    elm: XML element containing subscript.

Returns:
    LaTeX string with subscript applied.
)rb   ÚsubÚsSubPr©rZ   rb   rN   rõ   Ú_ré   rê   )rc   rC   Úrstriprò   ræ   r   )rP   rQ   rÊ   Úbaserõ   s        r/   Údo_ssubÚoMath2Latex.do_ssubÊ  ó~   € ð ×+Ñ+¨CÐ9OÐ+ÐPˆØ�z‰z˜#˜rÓ"×)Ñ)Ó+ˆØ×!Ñ! &§*¡*¨U°BÓ"7¸Ó=ˆØ×Ñ ×%Ñ%Ø˜‘: Ñ#ˆDØ”s˜S‘yÑ!Ð!rA   c                óú   • U R                  USS9nUR                  SS5      R                  5       nU R                  UR                  SS5      S5      nU R	                  U5      (       a  SU-   S-   nU[
        U-  -   $ )	z†Process superscript element.

Args:
    elm: XML element containing superscript.

Returns:
    LaTeX string with superscript applied.
)rb   ÚsupÚsSupPrr÷   rb   rN   rÿ   Ú^ré   rê   )rc   rC   rù   rò   ræ   r   )rP   rQ   rÊ   rú   rÿ   s        r/   Údo_ssupÚoMath2Latex.do_ssupÚ  rý   rA   c                óR  • U R                  USS9nUR                  SS5      R                  5       nU R                  UR                  SS5      S5      nU R                  UR                  SS5      S5      nU R	                  U5      (       a  S	U-   S
-   nU[
        U-  -   [        U-  -   $ )z§Process combined sub-superscript element.

Args:
    elm: XML element containing both subscript and superscript.

Returns:
    LaTeX string with both scripts applied.
)rb   rõ   rÿ   Ú	sSubSupPrr÷   rb   rN   rõ   rø   rÿ   r  ré   rê   )rc   rC   rù   rò   ræ   r   r   )rP   rQ   rÊ   rú   rõ   rÿ   s         r/   Ú
do_ssubsupÚoMath2Latex.do_ssubsupê  s«   € ð ×+Ñ+ØÐ9ð ,ð 
ˆð �z‰z˜#˜rÓ"×)Ñ)Ó+ˆØ×!Ñ! &§*¡*¨U°BÓ"7¸Ó=ˆØ×!Ñ! &§*¡*¨U°BÓ"7¸Ó=ˆØ×Ñ ×%Ñ%Ø˜‘: Ñ#ˆDØ”s˜S‘yÑ!¤S¨3¡YÑ/Ð/rA   c                ó6   • U R                  U5      n[        U-  $ )z†Process standalone subscript content.

Args:
    elm: XML element containing subscript content.

Returns:
    LaTeX subscript string.
)rl   r   ©rP   rQ   r�   s      r/   Údo_subÚoMath2Latex.do_subý  ó   € ð ×$Ñ$ SÓ)ˆÜ�T‰zÐrA   c                ó6   • U R                  U5      n[        U-  $ )zŒProcess standalone superscript content.

Args:
    elm: XML element containing superscript content.

Returns:
    LaTeX superscript string.
)rl   r   r	  s      r/   Údo_supÚoMath2Latex.do_sup	  r  rA   c                óh  • U R                  U5      nUR                  S5      nUc?  [        R                  S5        [        UR                  S5      UR                  S5      S.-  $ [        UR                  [        [        S9nUR                  XBR                  S5      UR                  S5      S.-  -   $ )zpProcess fraction element.

Args:
    elm: XML element containing fraction.

Returns:
    LaTeX fraction string.
ÚfPrz9Missing fPr element in fraction, using default formattingr­   r®   )r­   r®   rÈ   )	rc   rC   rà   Údebugr   rG   rŠ   r!   r�   rÑ   s        r/   Údo_fÚoMath2Latex.do_f  s    € ð ×+Ñ+¨CÓ0ˆØ�Z‰Z˜ÓˆØ‰:Ü�J‰JÐRÔSÜØ—z‘z %Ó(Ø—z‘z %Ó(ñ ñ ð ô ˜"Ÿ'™'¬9¼AÑ>ˆØ�w‰wØŸj™j¨Ó/¸¿
¹
À5Ó8IÑJÑJñ
ð 	
rA   c                ó”   • U R                  U5      nUR                  SS5      nUR                  [        UR                  SS5      5      $ )zˆProcess function application element.

Args:
    elm: XML element containing function application.

Returns:
    LaTeX function string.
ÚfNamerN   rb   )rc   rC   r9   r   )rP   rQ   rÊ   Ú	func_names       r/   Údo_funcÚoMath2Latex.do_func+  sB   € ð ×+Ñ+¨CÓ0ˆØ—J‘J˜w¨Ó+ˆ	Ø× Ñ ¤¨V¯Z©Z¸¸RÓ-@ÓAÐArA   c                óØ  • / nU R                  U5       H©  u  p4nUS:X  au  [        R                  " U5      (       a  UR                  [        U   5        MA  [        R                  SU5        [        U[        5      (       a  UR                  U5        M  M�  [        U[        5      (       d  M˜  UR                  U5        M«     [        R                  " U5      n[        U;   a  U$ U[        -   $ )z‰Process function name element.

Args:
    elm: XML element containing function name.

Returns:
    LaTeX function name with placeholder.
Úrz0Function not supported, will default to text: %s)r]   r   rC   r:   rà   rá   rh   r*   r   r;   r   )rP   rQ   ra   rR   r\   rb   s         r/   Údo_fnameÚoMath2Latex.do_fname8  s¸   € ð ˆØ×4Ñ4°SÖ9‰JˆD�QØ�s‹{Ü—8’8˜A—;‘;Ø×&Ñ&¤t¨A¡wÖ/ä—L‘LÐ!SÐUVÔWÜ! !¤S×)Ñ)Ø#×*Ñ*¨1Ö-ñ *ä˜Aœs×#Ó#Ø×"Ñ" 1Ö%ñ :ô �JŠJ�{Ó#ˆÜ !“OˆqÐ7¨¬Z©Ð7rA   c                óÂ   • U R                  U5      nUS   n[        UR                  [        S   [        S9nSU;   a  UR
                  XBS   4-  -   $ UR
                  U-   $ )aF  Process group character element (e.g., underbrace, overbrace).

According to OMML spec, when chr is not specified and pos is not specified,
the default position is "bot" (bottom), which corresponds to underbrace.

Args:
    elm: XML element containing group character.

Returns:
    LaTeX string with group character applied.
Ú
groupChrPrÚGROUPCHR_VALrÈ   rÉ   rb   )rc   rG   r†   r   r   r�   rÑ   s        r/   Údo_groupchrÚoMath2Latex.do_groupchrO  sc   € ð ×+Ñ+¨CÓ0ˆØ�LÑ!ˆÜ˜"Ÿ&™&¬+°nÑ*EÌSÑQˆà�7‹?Ø—7‘7˜g°©¨Ñ6Ñ7Ð7à—7‘7˜WÑ$Ð$rA   c                ó¢   • U R                  U5      nUR                  S5      nUR                  S5      nU(       a  [        XCS.-  $ [        SU0-  $ )ztProcess radical (root) element.

Args:
    elm: XML element containing radical.

Returns:
    LaTeX radical string.
rb   r¯   )r¯   r�   r�   )rc   rC   r   r   )rP   rQ   rÊ   r�   Údeg_texts        r/   Údo_radÚoMath2Latex.do_radd  sO   € ð ×+Ñ+¨CÓ0ˆØ�z‰z˜#‹ˆØ—:‘:˜eÓ$ˆÞÜ Ñ8Ñ8Ð8ä &¨$ Ñ/Ð/rA   c                ó˜   • [         S[        R                  " U R                  USS9 VVVs/ s H  u  p#oCPM	     snnn5      0-  $ s  snnnf )zyProcess equation array element.

Args:
    elm: XML element containing equation array.

Returns:
    LaTeX array string.
r�   ©rb   r÷   )r	   r   r;   r]   ©rP   rQ   rR   r\   rb   s        r/   Údo_eqarrÚoMath2Latex.do_eqarru  sO   € ô Ø”C—H’HØ%)×%?Ñ%?ÀÈVÐ%?Ñ%TÕUÒ%T‘z�t ’Ñ%TÓUóð
ñ 
ð 	
ùäUs   «Ac                óB  ^• U R                  USS9nUR                  SS5      mUR                  SS5      n[        R                  " T5      nU(       a  USU0-  $ [        U4S j[         5       5      (       a  T SU S3$ [
        R                  S	T S
35        T SU S3$ )z†Process lower limit element.

Args:
    elm: XML element containing lower limit.

Returns:
    LaTeX string with lower limit applied.
©rb   Úlimr÷   rb   rN   r.  c              3  óL   >#   • U  H  nTR                  U S 35      v •  M     g7f)ré   N)rì   )ri   Úfuncrú   s     €r/   rj   Ú(oMath2Latex.do_limlow.<locals>.<genexpr>˜  s#   øé € ÐGº°ˆt�‰ $  r˜{×+Ð+ºùs   ƒ!$z_{rê   zLimit function z2 not in LIM_FUNC dictionary, using fallback format)rc   rC   r   Úanyr   rà   rá   )rP   rQ   Út_dictr.  rË   rú   s        @r/   Ú	do_limlowÚoMath2Latex.do_limlow„  s²   ø€ ð ×+Ñ+¨C¸Ð+ÐFˆØ�z‰z˜#˜rÓ"ˆØ�j‰j˜ Ó#ˆô —,’,˜tÓ$ˆÞØ˜e S˜\Ñ)Ð)ô ÔG½ÓG×GÑGØ�V˜3˜s˜e 2Ð&Ð&ô 	�‰Ø˜d˜VÐ#UÐVô	
ð ��s˜3˜%˜rÐ"Ð"rA   c                óv   • U R                  USS9n[        UR                  S5      UR                  S5      S.-  $ )z†Process upper limit element.

Args:
    elm: XML element containing upper limit.

Returns:
    LaTeX string with upper limit applied.
r-  r÷   r.  rb   )r.  r�   )rc   r   rC   )rP   rQ   r3  s      r/   Ú	do_limuppÚoMath2Latex.do_limupp¡  s:   € ð ×+Ñ+¨C¸Ð+ÐFˆÜ §¡¨EÓ!2¸F¿J¹JÀs»OÑLÑLÐLrA   c                ój  ^• U R                  U5      R                  [        S   [        S   5      mTR                  5       mTR	                  [
        [
        -   5      (       a  TSS R                  5       mT(       a7  [        U4S j[         5       5      (       d  TR                  S[
        S-   5      mT$ )ae  Process limit content element.

This processes the lower limit of limLow and upper limit of limUpp.
It handles special formatting for limit labels including:
- Replacing `rightarrow` with `to`
- Stripping trailing line breaks
- Escaping spaces in plain text labels

Args:
    elm: XML element containing limit content.

Returns:
    Processed limit string.
r   é   NrÁ   c              3  ó,   >#   • U  H	  oT;   v •  M     g 7frg   ro   )ri   ÚcharÚresults     €r/   rj   Ú%oMath2Latex.do_lim.<locals>.<genexpr>Ä  s   øé € ÐDº° fžnºùs   ƒr»   )rl   r9   r   rù   rí   r
   r2  r   )rP   rQ   r=  s     @r/   Údo_limÚoMath2Latex.do_lim­  s�   ø€ ð ×&Ñ& sÓ+×3Ñ3´F¸1±I¼vÀa¹yÓIˆð —‘“ˆØ�?‰?œ9¤yÑ0×1Ñ1Ø˜C˜R�[×'Ñ'Ó)ˆFö œ#ÔD½ÓD×DÑDØ—^‘^ C¬°S©Ó9ˆFØˆrA   c                ó¼   • / nU R                  U5       H'  u  p4nUS:X  a  M  US:X  d  M  UR                  U5        M)     [        S[        R                  " U5      0-  $ )zjProcess matrix element.

Args:
    elm: XML element containing matrix.

Returns:
    LaTeX matrix string.
ÚmPrÚmrr�   )r]   r:   r"   r   r;   )rP   rQ   ÚrowsrR   r\   rb   s         r/   Údo_mÚoMath2Latex.do_mÈ  sX   € ð ˆØ×4Ñ4°SÖ9‰JˆD�QØ�u‹}ÙØ˜•Ø—‘˜A–ñ	 :ô
 �FœCŸHšH T›NÐ+Ñ+Ð+rA   c           
     ó†   • [         R                  " U R                  USS9 VVVs/ s H  u  p#oCPM	     snnn5      $ s  snnnf )zvProcess matrix row element.

Args:
    elm: XML element containing matrix row.

Returns:
    LaTeX matrix row string.
r(  r÷   )r   r;   r]   r)  s        r/   Údo_mrÚoMath2Latex.do_mrÙ  s@   € ô �xŠxØ!%×!;Ñ!;¸CÈÐ!;Ñ!PÕQÒ!P‘:�4˜AŠQÑ!PÓQó
ð 	
ùÜQs   ¥<c                óÖ   • / nSnU R                  U5       H8  u  pEnUS:X  a  [        UR                  S[        S9nM'  UR	                  U5        M:     U[
        R                  " U5      -   $ )z¡Process n-ary operator element (e.g., sum, product, integral).

Args:
    elm: XML element containing n-ary operator.

Returns:
    LaTeX n-ary operator string.
rN   ÚnaryPrz\intrÈ   )r]   rG   r†   r   r:   r   r;   )rP   rQ   ÚresÚborR   r\   rb   s          r/   Údo_naryÚoMath2Latex.do_naryæ  sa   € ð ˆØˆØ×4Ñ4°SÖ9‰JˆD�QØ�xÓä˜QŸU™U¨G¼6ÑB’à—
‘
˜1–ñ :ð ”E—J’J˜s“OÑ#Ð#rA   Ú-r  z\times )u   â€“u   â€”u   âˆ’r  ô   Ã—Ú_MATH_CHAR_MAPc                óÚ  • XR                   ;   a  U R                   U   $ U R                  R                  U5      nUR                  S5      SL aI  UR                  S5      (       a3  UR	                  S5      SL a  UR	                  S5      (       a	  SUSS  S3nSU;   a$  UR                  SS5      nUR                  SS5      nUR                  5       R                  S	5      (       a  S
U S3nU$ )z‘Process Unicode character and convert to LaTeX.

Args:
    s: Unicode character to process.

Returns:
    LaTeX representation of the character.
ré   Frê   r»   r:  rë   Ú
ensuremathz\ensuremath{z\textz \text{z} )rR  r¶   Úunicode_to_latexrì   rí   r9   Ústrip)rP   ÚsÚout_latex_strs      r/   Úprocess_unicodeÚoMath2Latex.process_unicode  sê   € ð ×#Ñ#Ó#Ø×&Ñ& qÑ)Ð)àŸ™×/Ñ/°Ó2ˆð �L‰L˜Ó Ò&Ø×(Ñ(¨×-Ñ-Ø—
‘
˜3“ 5Ò(Ø×&Ñ& s×+Ñ+à ¨a°Ð 3Ð4°AÐ6ˆMà˜=Ó(Ø)×1Ñ1°/À3ÓGˆMØ)×1Ñ1°#°sÓ;ˆMà×ÑÓ ×+Ñ+¨H×5Ñ5Ø'¨ °cÐ:ˆMàÐrA   c                óf  • / n/ nUR                  S[         S35      nU(       a<  U H6  nU R                  U5      nUR                  U5        UR                  U5        M8     [	        [
        R                  " U5      5      n[
        R                  " U5      nSU;  a  SU;   a  UR                  SS5      nSU;  a  SU;   a  UR                  SS5      nU R                  R                  5        HA  u  pšU
[        ;   d  M  X”=(       d    S;   d  M!  SU
 3U;   d  M,  UR                  SU
 3U
5      nMC     U$ )	z›Process run element containing text.

Args:
    elm: XML element containing text run.

Returns:
    LaTeX string with text properly escaped and formatted.
z./r\   ré   z\{rê   z\}rN   r8   )Úfindtextr)   rY  r:   r@   r   r;   r9   rR  Úitemsr   )rP   rQ   Ú_strÚ	_base_strÚ
found_textrW  rX  Úproc_strÚbase_proc_strÚorigÚmappeds              r/   Údo_rÚoMath2Latex.do_r"  s  € ð ˆØˆ	Ø—\‘\ B¤w i¨q /Ó2ˆ
ÞÛ�Ø $× 4Ñ 4°QÓ 7�Ø—‘˜MÔ*Ø× Ñ  Ö#ñ  ô
  ¤§
¢
¨4Ó 0Ó1ˆÜŸ
š
 9Ó-ˆà�mÓ#¨°Ó(9Ø×'Ñ'¨¨sÓ3ˆHà�mÓ#¨°Ó(9Ø×'Ñ'¨¨sÓ3ˆHð
 !×/Ñ/×5Ñ5Ö7‰LˆDàœ%•Ø×-¨2Õ.Ø˜˜�M XÕ-à#×+Ñ+¨b°°¨M¸6ÓB’ñ 8ð ˆrA   Úaccr  ÚbarÚsSubÚsSupÚsSubSuprõ   rÿ   Úfr0  r  ÚgroupChrÚdÚradÚeqArrÚlimLowÚlimUpp)r.  ÚmrC  Únary)r·   r¶   N)r¸   r   r¦   rv   r§   r¨   )rå   r*   rs   Úbool)rï   r*   rð   r*   rs   r*   )rW  r*   rs   r*   ),rw   rx   ry   rz   r{   r#   r«   r|   r°   rŒ   r�   r•   rY   Úpropertyr¼   rÌ   rÓ   rÝ   râ   Ústaticmethodræ   rò   rû   r  r  r
  r  r  r  r  r!  r%  r*  r4  r7  r?  rE  rH  rN  rR  rY  re  rL   r}   ro   rA   r/   r+   r+   .  sá  ‡ Ù6à€Gˆ^ÓØ%F€M�?ÓFô5ô-ôôð$ óó ðôô&%ô$ô2
ð ó	>ó ð	>ð óó ðô"ô "ô 0ô&
ô
ô
ô,Bô8ô.%ô*0ô"
ô#ô:
Môô6,ô"
ô$ð( ØØØØñ&€N�Nó ôôB&ðPØˆvðàˆTðð 	ˆvðð 	�ð	ð
 	�ðð 	�:ðð 	ˆvðð 	ˆvðð 	ˆTðð 	�ðð 	�ðð 	�Kðð 	ˆTðð 	ˆvðð 	�ðð  	�)ð!ð" 	�)ð#ð$ ØØØò+ƒHrA   r+   )r,   r   rs   úIterator[str])r4   r*   rs   rx  )r<   r*   rs   r*   )rD   rr   rE   r*   rF   zdict | Noners   r*   )6r{   Ú
__future__r   ÚloggingÚtypingr   r   Ú
lxml.etreeÚetreer&   r   Úpylatexenc.latexencoder   ÚImportErrorÚ%docling.backend.docx.latex.latex_dictr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r)   Ú	getLoggerrw   rà   r0   r6   r@   rG   rI   r   r+   ro   rA   r/   Ú<module>r‚     s½   ðñõ #ã ß  å Ý ð	Ý<÷÷ ÷ ÷ ÷ ÷ ÷ ó ð> I€à×Ò˜Ó"€ô&ô&ôð* ADö ÷&_ñ _ôDFˆô FôRr�*õ røðm ó 	Ùð	ús   ¢B0 Â0B9Â8B9