o
    N=&bc                     @   sP  d Z ddlZddlZddlmZmZ ejZded< dddd	d
dddddddZdddddddddd	Z	e	
dd dD  ddddddd d!d"d#d$d%d d&Zi d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAd>dBd@dCd@Ze
ej e
ej e
ej i dDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbd_dcd_daddddedfdgdhZe
ej e
ej e
ej e
ej e
ej e
e didjdkZdldmdndodpdqdrdsZdtZdudvdwdxdydzd{d|d}dwdxdydzd~ZdddddddddddddZddddddddZddddddZddddZddddddZdddddddddZdddddddddddddZ i i fddddi fe d i fe d i fi ddife d ddife d ddifdZ!g dZ"ddddddddddd
Z#G dd dZ$G dd de$Z%G dd de$Z&G dd de$Z'G dd de'Z(G ddĄ de'Z)G ddƄ de'Z*G ddȄ de'Z+G ddʄ de'Z,G dd̄ de'Z-G dd΄ de$Z.G ddЄ de.Z/G dd҄ de.Z0G ddԄ de.Z1G ddք de.Z2G dd؄ de$Z3G ddڄ de3Z4G dd܄ de3Z5G ddބ de3Z6G dd de4Z7G dd de5Z8G dd de6Z9G dd de3Z:G dd de$Z;G dd de$Z<dd Z=dd Z>dd Z?dd Z@dd ZAdd ZBdd ZCdd ZDdddZEdd ZFd d ZGdd ZHdd ZId	ddZJdS (
  zConvert LaTex maths code into presentational MathML.

This module is provisional:
the API is not settled and may change with any minor Docutils version.
    N)tex2unichartoplevel_codeu   ℏZhbaru   Φu   Ξ   Σu   Ψu   Δu   Θu   ϒ   Πu   Ω   Γu   Λ)PhiXiSigmaPsiDeltaThetaUpsilonPiOmegaGammaLambdau	   lim infu	   lim supu	   inj limu
   proj limlim)	ZliminfZlimsupZinjlimZprojlim	varlimsup	varliminf
varprojlim	varinjlimoperatornamec                 c   s    | ]}||fV  qd S N ).0namer   r   Dusr/lib/python3.10/site-packages/docutils/utils/math/latex2mathml.py	<genexpr>B   s    r   )ZarccosZarcsinZarctanargcoscoshZcotZcothZcscdegZdetZdimexpgcdZhomZkerZlglnlogZPrZsecsinsinhtantanhZboldZitalicZ	monospacenormalz
sans-serifscriptzbold-italiczdouble-struckZfrakturzsans-serif-italiczsans-serif-bold-italic)
boldsymbolZmathbfZmathitZmathttZmathrmZmathsfZmathcalZmathbfitmathbbZmathfrakZmathsfitZ
mathsfbfitmathscrZ	backslash\Zuparrowu   ↑Z	downarrowu   ↓Zupdownarrowu   ↕ZUparrowu   ⇑Z	Downarrowu   ⇓ZUpdownarrowu   ⇕Z
lmoustacheu   ⎰Z
rmoustacheu   ⎱Z	arrowvertu   ⏐Z	bracevertu   ⎪lvert|lVert   ‖ZrvertZrVertZ	ArrowvertZnleqqu   ≦̸Zngeqqu   ≧̸Z	nleqslantu   ⩽̸Z	ngeqslantu   ⩾̸Zngtrlessu   ≹Znlessgtru   ≸Z
nsubseteqqu   ⫅̸Z
nsupseteqqu   ⫆̸Z	centerdotu   ⬝Z
varnothingu   ⌀Z	varproptou   ∝Ztriangleu   △Ztriangledownu   ▽Zdotsb   ⋯Zdotscu   …ZdotsiZdotsmsupinfmaxmin)Zdotsor   r5   r6   r7   r8   u   ∼u   ≈)ZthicksimZthickapproxu   ∣u   ∥u   ∤u   ∦u   ⌢u   ⌣u   ∫)ZshortmidZshortparallelZ	nshortmidZnshortparallelZ
smallfrownZ
smallsmileZsmallint)ZbigcapZbigcupZbigodotZbigoplusZ	bigotimesZbigsqcupZbiguplusZbigveeZbigwedgeZcoprodZintopZointopprodsumr   r7   r8   r5   r6   2emZ1emz0.2778emz0.2222emz0.1667emz	-0.1667emz	-0.2222emz	-0.2778emz0.25em)ZqquadZquadZ
thickspaceZmedspaceZ	thinspaceZnegthinspaceZnegmedspaceZnegthickspace ;:,!)   ´u   ́)u   ˉu   ̄)u   ˘u   ̆)u   ˇu   ̌)u   ˙u   ̇)   ¨u   ̈)r4   u   ⃛)`u   ̀)u   ˆu   ̂)u   ˚u   ̊)u   ˜u   ̃)   →u   ⃗)acuteZbarZbrevecheckdotZddotZdddotZgraveZhatZmathringtildevec)u   ⏞皙ɿ)   ←rJ   )u   ↔rJ   )_rJ   )rD   rJ   )^g      )~g333333ӿ)Z	overbraceZoverleftarrowZoverleftrightarrowZoverlineZoverrightarrowZwidehatZ	widetilde)u   ⏟g?)rL   g)Z
underbraceZunderleftarrowZunderleftrightarrowZ	underlineZunderrightarrowu   −u   ∶    )-r>   rN   u   ℾu   ℿ   ⅀u   ℽu   ℼ)r   r   r   u   γu   π) rR   )())[]){})r1   r1   )r3   r3   )rW   rR   )ZmatrixsmallmatrixZpmatrixZbmatrixZBmatrixZvmatrixZVmatrixcasesT)displaystylescriptlevelF      )r[   	textstyleZscriptstyleZscriptscriptstylecfrac)r[   r\   CLASSr[   r_   Zlinethickness)fracr`   ZdfracZtfracbinomZdbinomZtbinom)rR   z1.2emz1.623emz2.047emz2.470em      )
leftrightZbiglZbigrZBiglZBigrZbigglZbiggrZBigglZBiggrc                   @   s   e Zd ZdZdZ	 dZ	 dZeddeddedd	d
diZdddZ		 dZ
	 dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd,d&d'Zd(d) Zd,d*d+ZdS )-mathz8Base class for MathML elements and root of MathML trees.Nr   <z&lt;>z&gt;&z&amp;ia   z&ApplyFunction;truefalse)TFspanc                 O   s:   g | _ | | i | _| D ]}|| | j| < qdS )a  Set up node with `children` and `attributes`.

        Attributes are downcased: Use CLASS to set "class" value.
        >>> math(mn(3), CLASS='test')
        math(mn(3), class='test')
        >>> math(CLASS='test').toprettyxml()
        '<math class="test">
</math>'

        N)childrenextend
attributeskeyslower)selfro   rq   keyr   r   r   __init__G  s   

zmath.__init__c                 C   sx   dd t | dg D }t| dr|t| j t| tr%| jr%|d |dd | j	 D 7 }| j
jdd|  S )	Nc                 S   s   g | ]}t |qS r   )repr)r   itemr   r   r   
<listcomp>[  s    z!math.__repr__.<locals>.<listcomp>ro   datazswitch=Truec                 S   s$   g | ]\}}|d urd||f qS )Nz%s=%rr   r   kvr   r   r   ry   `  s    
z(%s)z, )getattrhasattrappendrw   rz   
isinstance
MathSchemaswitchrq   items	__class____name__join)rt   contentr   r   r   __repr__Z  s   

zmath.__repr__c                 C   s
   t | jS r   )lenro   rt   r   r   r   __len__e     
zmath.__len__c                 C   s
   | j | S r   rq   )rt   ru   r   r   r   __getitem__j  r   zmath.__getitem__c                 C   s   || j |< d S r   r   )rt   ru   rx   r   r   r   __setitem__m  s   zmath.__setitem__c                 O   s   | j j|i |S r   )rq   get)rt   argskwargsr   r   r   r   p  s   zmath.getc                 C   s   | j duot| | j kS )z;Return boolean indicating whether children may be appended.N)	nchildrenr   r   r   r   r   fulls  s   
z	math.fullc                 C   s:   |   r
td|  | j| | |_|   r|  S | S )zAppend child and return self or first non-full parent.

        If self is full, go up the tree and return first non-full node or
        `None`.
        zNode %s already full!)r   SyntaxErrorro   r   parentclose)rt   childr   r   r   r   x  s   zmath.appendc                 C   s   |D ]}|  | q| S r   )r   )rt   ro   r   r   r   r   rp     s   zmath.extendc                 C   s0   | j }|dur| r|j }|dur| s|S )z7Close element and return first non-full parent or None.N)r   r   )rt   r   r   r   r   r     s
   z
math.closec                 C   s   d |  S )z,Return XML representation of self as string.rR   )r   _xmlr   r   r   r   toprettyxml  s   zmath.toprettyxmlc                 C   s"   |   g| | d| jj g S )Nz</%s>)xml_starttag	_xml_bodyr   r   rt   levelr   r   r   r     s
   z	math._xmlc                 C   s.   dd | j  D }dd| jjg|R  S )Nc                 s   s<    | ]\}}|d urd|t |ddddf V  qd S )Nz%s="%s"Truerl   Falserm   )strreplacer{   r   r   r   r     s    z$math.xml_starttag.<locals>.<genexpr>z<%s>r<   )rq   r   r   r   r   )rt   attrsr   r   r   r     s   zmath.xml_starttagc                 C   sP   g }| j D ]}|dd|d  g |||d  q|dd| g |S )N
z  r]   )ro   rp   r   )rt   r   xmlr   r   r   r   r     s   
zmath._xml_bodyr   )r   
__module____qualname____doc__r   r   Z_levelordxml_entitiesZ_boolstringsZhtml_tagnamerv   r   r   r   r   r   r   r   rp   r   r   r   r   r   r   r   r   r   rh   2  s<    

rh   c                   @      e Zd ZdS )mtableNr   r   r   r   r   r   r   r         r   c                       s    e Zd ZdZ fddZ  ZS )mrowz*Group sub-expressions as a horizontal row.c              	      s   | j }t|tr$|jdkr$t|j|_| j|_| jD ]}||_ q| S t| dkrOz| jd |j|j| < || jd _ W n tt	fyN   | jd  Y S w t
  S )zClose element and return first non-full parent or None.

        Remove <mrow>, if it is single child and the parent infers an mrow
        or if it has only one child element.
        r]   r   )r   r   MathRowSchemar   r   ro   r   indexAttributeError
ValueErrorsuper)rt   r   r   r   r   r   r     s   

z
mrow.close)r   r   r   r   r   __classcell__r   r   r   r   r     s    r   c                   @      e Zd ZdZdS )r   zCBase class for elements treating content as a single inferred mrow.N)r   r   r   r   r   r   r   r   r         r   c                   @   r   )mtrNr   r   r   r   r   r     r   r   c                   @   r   )mtdNr   r   r   r   r   r     r   r   c                   @   r   )mencloser]   Nr   r   r   r   r   r   r   r   r     r   r   c                   @   r   )mphantomr]   Nr   r   r   r   r   r     r   r   c                   @   r   )msqrtr]   Nr   r   r   r   r   r     r   r   c                   @   r   )mstyler]   Nr   r   r   r   r   r     r   r   c                       s.   e Zd ZdZdZ fddZdddZ  ZS )	MathTokenzbToken Element: contains textual data instead of children.

    Base class for mo, mi, and mn.
    r   c                    s   || _ t jdi | d S )Nr   )rz   r   rv   )rt   rz   rq   r   r   r   rv     s   zMathToken.__init__c                 C   s   t | j| jgS r   )r   rz   	translater   r   r   r   r   r     s   zMathToken._xml_bodyr   )r   r   r   r   r   rv   r   r   r   r   r   r   r     s
    r   c                   @   r   )mtextNr   r   r   r   r   r   
  r   r   c                   @   r   )miNr   r   r   r   r   r     r   r   c                   @   r   )moNr   r   r   r   r   r     r   r   c                   @   r   )mnNr   r   r   r   r   r     r   r   c                       s,   e Zd ZdZdZdd Z fddZ  ZS )r   zBase class for schemata expecting 2 or more children.

    The special attribute `switch` indicates that the last two child
    elements are in reversed order and must be switched before XML-export.
    r^   c                 O   s*   | dd| _tj| g|R i | d S )Nr   F)popr   rh   rv   )rt   ro   r   r   r   r   rv     s   zMathSchema.__init__c                    sF   t  |}| jr!|  r!| jd | jd | jd< | jd< d| _|S )NF)r   r   r   r   ro   )rt   r   Zcurrent_noder   r   r   r   "  s
   "zMathSchema.append)r   r   r   r   r   rv   r   r   r   r   r   r   r     s
    r   c                   @   r   )msubNr   r   r   r   r   r   +  r   r   c                   @   r   )msupNr   r   r   r   r   r   ,  r   r   c                   @   r   )msubsuprd   Nr   r   r   r   r   r   /  r   r   c                   @   r   )munderNr   r   r   r   r   r   :  r   r   c                   @   r   )moverNr   r   r   r   r   r   ;  r   r   c                   @   r   )
munderoverNr   r   r   r   r   r   L  r   r   c                   @   r   )mrootr^   Nr   r   r   r   r   r   O  r   r   c                   @   r   )mfracr^   Nr   r   r   r   r   r   S  r   r   c                   @   r   )mspacer   Nr   r   r   r   r   r   W  r   r   c                 C   s4   t d| }|du rt d| }|d|dfS )a"  Return leading TeX command name and remainder of `string`.

    >>> tex_cmdname('mymacro2') # up to first non-letter
    ('mymacro', '2')
    >>> tex_cmdname('name 2') # strip trailing whitespace
    ('name', '2')
    >>> tex_cmdname('_2') # single non-letter character
    ('_', '2')

    z([a-zA-Z]+) *(.*)Nz(.?)(.*)r]   r^   rematchgroupstringmr   r   r   tex_cmdnamea  s   r   c                 C   s0   t d| }|du rd| fS |d|dfS )zmReturn leading number literal and remainder of `string`.

    >>> tex_number('123.4')
    ('123.4', '')

    z([0-9.,]*[0-9]+)(.*)NrR   r]   r^   r   r   r   r   r   
tex_number~  s   r   c                 C   s8   t d| t j}|dddd\}}}}|p|p||fS )zReturn first simple TeX token and remainder of `string`.

    >>> tex_token('\command{without argument}')
    ('\command', '{without argument}')
    >>> tex_token('or first character')
    ('o', 'r first character')

    a%  ((?P<cmd>\\[a-zA-Z]+)\s* # TeX command, skip whitespace
                      |(?P<chcmd>\\.)          # one-character TeX command
                      |(?P<ch>.?))            # first character (or empty)
                     (?P<remainder>.*$)    # remaining part of string
                 cmdchcmdch	remainder)r   r   VERBOSEr   )r   r   r   r   r   r   r   r   r   	tex_token  s
   	r   c                 C   s   d}d}d}|  ds| dd | dd fS | D ])}|d7 }|r$d}n|dkr+d}n|dkr4|d7 }n|dkr<|d8 }|dkrB nqtd	| d|d  | |d fS )
zReturn first TeX group or token and remainder of `string`.

    >>> tex_group('{first group} returned without brackets')
    ('first group', ' returned without brackets')

    r   FrW   Nr]   r/   TrX   zGroup without closing bracket)
startswithr   )r   Zsplit_indexZ
nest_levelescapecr   r   r   	tex_group  s(   

r   c                 C   s,   t | \}}|dkrt|  \}}||fS )a  Return first TeX group or token and remainder of `string`.

    >>> tex_token_or_group('\command{without argument}')
    ('\command', '{without argument}')
    >>> tex_token_or_group('first character')
    ('f', 'irst character')
    >>> tex_token_or_group(' also whitespace')
    (' ', 'also whitespace')
    >>> tex_token_or_group('{first group} keep rest')
    ('first group', ' keep rest')

    rW   )r   r   lstrip)r   r   r   r   r   r   tex_token_or_group  s   r   c                 C   s\   t d| t j}|du r| dsd| fS z|d|dfW S  ty-   td|  w )a$  Return optional argument and remainder.

    >>> tex_optarg('[optional argument] returned without brackets')
    ('optional argument', ' returned without brackets')
    >>> tex_optarg('{empty string, if there is no optional arg}')
    ('', '{empty string, if there is no optional arg}')

    z\s*                            # leading whitespace
                 \[(?P<optarg>(\\]|[^\[\]]|\\])*)\] # [group] without nested groups
                 (?P<remainder>.*$)
                 NrU   rR   optargr   z+Could not extract optional argument from %r)r   r   r   r   r   r   r   r   r   r   r   
tex_optarg  s   	r   c           	      C   s  d | }| }t|dkr|d |dd }}|dkrq	|dkr2t|\}}t|| |\} }n|dv r<t| |} n|dkrKt }| | |} n|dkrT|  } n|d	kret	 }|  | |} ns|
 rq| t|} ng| rt|\}}| t|| } nS|tv ri }|d
kr| jr| jd }t|dd
dv s|ddkrd|d< | tt| fi |} n |dv r| t|dd} n|dv r| t|} ntd| t|dks|S )u   Append MathML conversion of `string` to `node` and return it.

    >>> parse_latex_math(math(), r'lpha')
    math(mi('α'))
    >>> parse_latex_math(mrow(), r'x_{n}')
    mrow(msub(mi('x'), mi('n')))

    r<   r   r]   Nr/   _^rW   rX   rk   rP   r   rz   z([=classmathopenprefixformz/()[]|FZstretchyz+*=<>,.!?`';@zUnsupported character: "%s")r   splitr   r   
handle_cmdhandle_script_or_limitr   r   r   r   isalphar   isdigitr   r   anomalous_charsro   r~   r   r   r   )	noder   treer   cmdnamenew_nodenumberrq   Zprevious_noder   r   r   parse_latex_math  sR   



*r   c                 C   sn	  | t v rtt |  }| tv rd|d< ||}||fS | tv r| dkr0t|\}}t|dd}ntt|  }| dkrBt|td}n%| dkrPt|td	d
d}n| dkr\t|td}n| dkrgt|td}||}|r{|d dvr{|td}||fS | t	v r| dkrddi}ndt	|  i}| dkrd|d< t|\}}|
drt |dd |}| dkrt||}| s|dkr|t|fi |}||fS tdgi |}|| ||fS | dkr|tddddd }||fS | d!krt|d"}||fS | tv r|tt|  d#d$}||fS | tv r)|tt|  d%d&}||fS | tv r^i }| tv rD|rD|d d'v rDd(|d)< n	| d*v rMd+|d< |tt|  fi |}||fS | tv ri }tt|   }	t|\}
}|
d,vrz	t|
d }
W n ty   td-| |
f w |	r|	|d.< |	|d/< d(|d0< | d1ks| d2rt }|| |}|
d3kr|t|
fi | | d4ks| d5r| }||fS | d6krt|\}}|d7kr|d8| fS |
drz
t|dd  }W n ty   td9| w td:|d; }|t|}||fS | d<v rYt|\}}| d=}t!|D ]!\}}|d> dkrNt"#d?d@|}|t$|}q3t|| q3||fS | t%v rn|t&dAt%|   dB}||fS | dCv rt'|\}}|dDrdEt(|ddF dG  }|t&dA| dB}||fS | dHkrt) }|| ||fS | dIkrt*dJdK}|| ||fS | dLkrt+|\}}|rt }t,|d(dM}t|| |  nt- }|| ||fS | t.v rNt.|  \}}| dNkrt+|\}}d1d4dO}||v r|/ }|| |dP< dQ||  |d< t0dgi | }}| dRr:ttdS|tdTdRdU}dV|_1|rEt|fi |}|| ||fS | dkrgt2 }t3|}|  | ||fS | t4v rttt4|  d d
dWd(dM}| dXkrd
|j5d dY< | |_6|| ||fS | t7v rttt7|  d d(dd(d
dZ}| |_6|| ||fS | d[krtd(dM}|| ||fS | t8v rttt8|  d d(dM}| |_6|| ||fS | d\krtd(dM}|| ||fS | d]v r8t+|\}}ttd^| dd   }|r+t9|}tt |}t:|dkr%|j5d }|| nt|}|| ||fS | t;v rtdgi t;|  }d|_1t<|trit:|dkri||j=j5|j=j5>|< |j=|_=||fS |j?j@d_kry|| ||fS td`|  | dart|\}}|dbv r|}tA||| dc}||fS | ddkrtB||S | dekrtC||S tdf|  )huj  Process LaTeX command `name` followed by `string`.

    Append result to `node`.
    If needed, parse `string` for command argument.
    Return new current node and remainder of `string`:

    >>> handle_cmd('hbar', math(), r' rac')
    (math(mi('ℏ')), ' \frac')
    >>> handle_cmd('hspace', math(), r'{1ex} (x)')
    (math(mspace(width='1ex')), ' (x)')

    zcapital-greekr   r   r*   )mathvariantr   rL   r      ¯F)accentr   rK   r   rD   r   )rM   rL   u   ⁡r,   r   r.   r/   r]   Nr-   rQ   colonr>   Zpostfix0z0.28em)r   ZlspacerspaceZidotsintz\int\dotsi\intzfont-weight: bold)stylez75%)Zmathsizez _^Tmovablelimits)r0   r2   r   z()[]/|.z!Unsupported "\%s" delimiter "%s"!maxsizeZminsizeZ	symmetricrf   l.rg   rnotrW   z{\not z\not: Cannot negate: "%s"!ZNFCu   ̸)textZmboxZtextrm$r^   z(^ | $)rO   z%s)width)Zhspacer   r   z%semr      ZphantomZboxedZbox)Znotationsqrt)r   r`   )r  r  Znumalignz	numalign-rc   rS   rT   )ra   rd   r   rI   r   )r   r   ZoversetZunderset)Z
xleftarrowZxrightarrowlongrh   z3Declaration "\%s" must be first command in a group.limitsr   )r  beginendzUnknown LaTeX command: r   )Dlettersr   greek_capitalsr   	functionsr   r   r   r   math_alphabetsr   r   r-   r   r   r   thick_operatorssmall_operators	operatorsr  bigdelimitersdelimiter_sizesstretchablesr   KeyErrorr   endswithr   r   r   unicodedata	normalizer   	enumerater   subr   spacesr   r   floatr   r   r   r   r   	fractionscopyr   r   r   r   accentsro   Ztex_cmdoverunderr   r   layout_stylesr   r   r   r   r   r   begin_environmentend_environment)r   r   r   r   r   rq   r   r  Zdelimiter_attributessize	delimiterrowpartsipartradixZ	indexnodeZ
style_attsZ	frac_attsr   Zoptargsrb   entryZ	subscriptbaseZsub_noder   r   r   r   q  s  



























































r   rR   c                 C   s  | j  }|dkrd|d< n|dkst|ddtv rd|d< |dkrVt|tr0t|j ddi}nWt|tr>t|j ddi}nI|d	v sL|dkrQ|	dd
rQt
|}n6t|}n1|dkrt|t
ret|j  }n"t|trpt|j  }n|d	v s~|dkr|	dd
rt|}nt|}| | |S )z)Append script or limit element to `node`.r  Fr  rz   rR   TrL   r   )r  r  NrM   )ro   r   r~   r  r   r   r   r   r   r   r   r   r   )r   r   r  r   r   r   r   r   r     s4   









r   c                 C   s   t |\}}|tv r`t| d }i }|r2tt|}|dkr*tt|dd}d|d< | | |} n|dkrJd|d	< d
|d< tdd}| | |} t }| tt|fi | |} | |fS t	d)Nr   rZ   z0.17em)r  rf   columnalignrY   z0.02emZ
rowspacingz0.333emcolumnspacing1)r\   Environment not supported!)
r   matricesr   r   r   r   r   r   r   r   )r   r   r   Zleft_delimiterrq   wrapperr4  r   r   r   r+    s,   


r+  c                 C   sr   t |\}}|tv r5|    } t| d }|r)| t|} |  } | |fS |dkr1|  } | |fS td)Nr]   rZ   r9  )r   r:  r   r   r   r   )r   r   r   Zright_delimiterr   r   r   r,    s   r,  c                 C   s.   t dd | D }|dkrdS t|d d S )Nc                 s   $    | ]}| d | d V  qdS rk   z\&Ncountr   r/  r   r   r   r        " z'tex_equation_columns.<locals>.<genexpr>r   r^   r]   )r7   int)rowstabsr   r   r   tex_equation_columns  s   rE  c                 C   sl   ddd}t dd | D }|r4ddg| }dd	g| }d
|d |d  |d< d
|d | |d< |S )NZalignT)r   r[   c                 s   r<  r=  r>  r@  r   r   r   r     rA  z#align_attributes.<locals>.<genexpr>rg   rf   r  r;   r<   r]   r6  r7  )r7   r   )rC  ZattsrD  Zalignsspacingr   r   r   align_attributes  s   rG  c                 C   sj   t dd}|}|s,d|d< t| d}t|dkr,t }|tt|fi t| t	||  |
 S )zoReturn string with MathML code corresponding to `tex_math`.

    Set `inline` to False for displayed math.
    z"http://www.w3.org/1998/Math/MathML)ZxmlnsblockZdisplayz\\r]   )rh   r   r   r   r   r   r   r   rG  r   r   )Ztex_mathinlineZ	math_treer   rC  r   r   r   
tex2mathml1  s   

rJ  )rR   )T)Kr   r   r  Zdocutils.utils.mathr   r   Z	mathalphar  r  r  updater  r  Z	mathfencer   Z	mathcloser  ZmathbinZmathrelZmathordZ	mathpunctZmathopr  r  r  r#  r'  r(  r)  r   r-   r:  r*  r%  r  r  rh   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   r   r   r   r   r   r+  r,  rE  rG  rJ  r   r   r   r   <module>   s  

	


			


 
	
1S  N!