U
    [Sh(                     @   s  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Zd d d!d"d#d$d%d&d'd(d)d*d%d+Zd,d-d.d/d0d1d2d3d4d5d6d7d8d7d8d8d9Ze
ej e
ej e
ej d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdGdGdHddIdJdKdLdMZe
ej e
ej e
ej e
ej e
ej e
e dNdOdPZdQdRdSdTdUdVdWdXZdYZdZd[d\d\d]d^d^d_d_d`d`dadbdcZdddedfdgdhdidjdkdldmdndodpZdqdrdsdtdudvdwdxZdydrdsdzdud{Zd|d}d~d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"dddddg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/Z0G dd de/Z1G dd de/Z2G dd de/Z3G dd de%Z4G ddÄ de4Z5G ddń de4Z6G ddǄ de4Z7G ddɄ de5Z8G dd˄ de6Z9G dd̈́ de7Z:G ddτ de4Z;G ddф de%Z<G ddӄ de%Z=ddՄ Z>ddׄ Z?ddل Z@ddۄ ZAdd݄ ZBdd߄ ZCdd ZDdd ZEdddZFdd ZGdd ZHdd ZIdd ZJdddZKd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   S/root/rtd-docs/venv/lib/python3.8/site-packages/docutils/utils/math/latex2mathml.py	<genexpr>B   s     r   )ZarccosZarcsinZarctanargcoscoshZcotZcothZcscdegZdetdimexpgcdZhomZkerZlglnlogZPrsecsinsinhtantanh)TTFz0.278em)FTT0.444em)FTFz0.667em)FFTr,   )ZbmodZpmodmodZpodbold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mathscr\u   ↑u   ↓u   ↕u   ⇑u   ⇓u   ⇕u   ⎰u   ⎱u   ⏐u   ⎪|   ‖)Z	backslashZuparrowZ	downarrowZupdownarrowZUparrowZ	DownarrowZUpdownarrowZ
lmoustacheZ
rmoustacheZ	arrowvertZ	bracevertlvertlVertZrvertZrVertZ	Arrowvertu   ≦̸u   ≧̸u   ⩽̸u   ⩾̸u   ≹u   ≸u   ⫅̸u   ⫆̸u   ⬝u   ⌀u   ∝u   △u   ▽   ⋯u   …supinfmaxmin)ZnleqqZngeqqZ	nleqslantZ	ngeqslantZngtrlessZnlessgtrZ
nsubseteqqZ
nsupseteqqZ	centerdotZ
varnothingZ	varproptotriangleZtriangledownZdotsbZdotscZdotsiZdotsmZdotsor   r;   r<   r=   r>   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   r=   r>   r;   r<   2em1emz0.2778emz0.25emz0.2222emz0.1667emz	-0.1667emz	-0.2222emz	-0.2778em)ZqquadZquadZ
thickspace; Zmedspace:Z	thinspace,Znegthinspace!ZnegmedspaceZnegthickspace)   ´u   ́)u   ˉu   ̄)u   ˘u   ̆)u   ˇu   ̌)u   ˙u   ̇)   ¨u   ̈)r:   u   ⃛)`u   ̀)u   ˆu   ̂)u   ˚u   ̊)u   ˜u   ̃)   →u   ⃗)acutebarZbrevecheckdotZddotZdddotZgraveZhatZmathringtildevec)u   ⏞皙ɿ)   ←rS   )u   ↔rS   )_rS   )rL   rS   )^g      )~g333333ӿ)Z	overbraceZoverleftarrowZoverleftrightarrowoverlineZoverrightarrowZwidehatZ	widetilde)u   ⏟g?)rU   g)Z
underbraceZunderleftarrowZunderleftrightarrow	underlineZunderrightarrowu   −u   ∶    )-rF   rW   u   ℾu   ℿ   ⅀u   ℽu   ℼ)r   r   r   u   γu   π) r]   )())[]){})r6   r6   )r7   r7   )rb   r]   )matrixsmallmatrixZpmatrixZbmatrixZBmatrixZvmatrixZVmatrixcasesT)displaystylescriptlevelF      )rg   	textstyleZscriptstyleZscriptscriptstylecfrac)rg   rh   CLASSrg   rk   Zlinethickness)fracrl   ZdfracZtfracbinomZdbinomZtbinomr]   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,d- ZdS )0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)selfr{   r}   keyr   r   r   __init__Z  s
    

zmath.__init__c                 C   sx   dd t | dg D }t| dr0|t| j t| trJ| jrJ|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>n  s     z!math.__repr__.<locals>.<listcomp>r{   datazswitch=Truec                 S   s$   g | ]\}}|d k	rd||f qS )Nz%s=%rr   r   kvr   r   r   r   s  s    z(%s)z, )getattrhasattrappendr   r   
isinstance
MathSchemaswitchr}   items	__class____name__join)r   contentr   r   r   __repr__m  s    

zmath.__repr__c                 C   s
   t | jS r   )lenr{   r   r   r   r   __len__x  s    zmath.__len__c                 C   s
   | j | S r   r}   )r   r   r   r   r   __getitem__}  s    zmath.__getitem__c                 C   s   || j |< d S r   r   )r   r   r   r   r   r   __setitem__  s    zmath.__setitem__c                 O   s   | j j||S r   )r}   get)r   argskwargsr   r   r   r     s    zmath.getc                 C   s   | j dk	ot| | j kS )z;Return boolean indicating whether children may be appended.N)	nchildrenr   r   r   r   r   full  s    
z	math.fullc                 C   s:   |   rtd|  | j| | |_|   r6|  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   SyntaxErrorr{   r   parentclose)r   childr   r   r   r     s    zmath.appendc                 C   s   |D ]}|  | q| S r   )r   )r   r{   r   r   r   r   r|     s    zmath.extendc                 C   s"   | j }|dk	r| r|j }q|S )z7Close element and return first non-full parent or None.N)r   r   )r   r   r   r   r   r     s    z
math.closec                 C   s   d |  S )z,Return XML representation of self as string.r]   )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   r   levelr   r   r   r     s
    z	math._xmlc                 C   s,   dd | j  D }dd| jjf| S )Nc                 s   s:   | ]2\}}|d k	rd|t |ddddf V  qd S )Nz%s="%s"Truerx   Falsery   )strreplacer   r   r   r   r     s   z$math.xml_starttag.<locals>.<genexpr>z<%s>rE   )r}   r   r   r   r   )r   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  ri   )r{   r|   r   )r   r   xmlr   r   r   r   r     s    
zmath._xml_bodyc                 C   sR   z| d dkW S  t k
rL   z| j W  Y S  tk
rF   Y Y dS X Y nX dS )z;Return true, if `self` or a parent has ``display='block'``.displayblockFN)KeyErrorr   is_blockAttributeErrorr   r   r   r   r     s    zmath.is_block)r   )r   )r   
__module____qualname____doc__r   r   _levelordxml_entitiesZ_boolstringsZhtml_tagnamer   r   r   r   r   r   r   r   r|   r   r   r   r   r   r   r   r   r   r   rt   D  s<       


rt   c                   @   s   e Zd ZdS )mtableNr   r   r   r   r   r   r   r     s    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rH|jdkrHt|j|_| j|_| jD ]
}||_ q4| S t| dkrz(| jd |j|j| < || jd _ W n" tt	fk
r   | jd  Y S X 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.
        ri   r   )r   r   MathRowSchemar   r   r{   r   indexr   
ValueErrorsuper)r   r   r   r   r   r   r     s    
z
mrow.close)r   r   r   r   r   __classcell__r   r   r   r   r     s   r   c                   @   s   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   
  s   r   c                   @   s   e Zd ZdS )mtrNr   r   r   r   r   r     s    r   c                   @   s   e Zd ZdS )mtdNr   r   r   r   r   r     s    r   c                   @   s   e Zd ZdZdS )mencloseri   Nr   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )mphantomri   Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )msqrtri   Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )mstyleri   Nr   r   r   r   r   r     s   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f | d S r   )r   r   r   )r   r   r}   r   r   r   r   )  s    zMathToken.__init__c                 C   s   t | j| jgS r   )r   r   	translater   r   r   r   r   r   -  s    zMathToken._xml_body)r   )r   r   r   r   r   r   r   r   r   r   r   r   r   "  s   r   c                   @   s   e Zd ZdS )mtextNr   r   r   r   r   r   1  s    r   c                   @   s   e Zd ZdS )miNr   r   r   r   r   r   2  s    r   c                   @   s   e Zd ZdS )moNr   r   r   r   r   r   3  s    r   c                   @   s   e Zd ZdS )mnNr   r   r   r   r   r   4  s    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.
    rj   c                 O   s$   | dd| _tj| f|| d S )Nr   F)popr   rt   r   )r   r{   r   r   r   r   r   E  s    zMathSchema.__init__c                    sF   t  |}| jrB|  rB| jd | jd  | jd< | jd< d| _|S )NF)r   r   r   r   r{   )r   r   Zcurrent_noder   r   r   r   I  s
    "zMathSchema.append)r   r   r   r   r   r   r   r   r   r   r   r   r   <  s   r   c                   @   s   e Zd ZdS )msubNr   r   r   r   r   r   R  s    r   c                   @   s   e Zd ZdS )msupNr   r   r   r   r   r   S  s    r   c                   @   s   e Zd ZdZdS )msubsuprp   Nr   r   r   r   r   r   V  s   r   c                   @   s   e Zd ZdS )munderNr   r   r   r   r   r   a  s    r   c                   @   s   e Zd ZdS )moverNr   r   r   r   r   r   b  s    r   c                   @   s   e Zd ZdS )
munderoverNr   r   r   r   r   r   s  s    r   c                   @   s   e Zd ZdZdS )mrootrj   Nr   r   r   r   r   r   v  s   r   c                   @   s   e Zd ZdZdS )mfracrj   Nr   r   r   r   r   r   z  s   r   c                   @   s   e Zd ZdZdS )mspacer   Nr   r   r   r   r   r   ~  s   r   c                 C   s4   t d| }|dk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(.?)(.*)ri   rj   rematchgroupstringmr   r   r   tex_cmdname  s    r   c                 C   s0   t d| }|dk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]+)(.*)Nr]   ri   rj   r   r   r   r   r   
tex_number  s    r   c                 C   s8   t d| t j}|dddd\}}}}|p2|p2||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 ]R}|d7 }|rHd}n0|dkrVd}n"|dkrh|d7 }n|dkrx|d8 }|dkr2 qq2t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   Frb   Nri   r5   Trc   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')

    rb   )r   r   lstrip)r   r   r   r   r   r   tex_token_or_group  s    r   c                 C   sf   t d| t j}|dkr*| ds*d| fS z|d|dfW S  tk
r`   td|  Y nX dS )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>.*$)
                 Nr`   r]   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rft|\}}t|| |\} }q|dkrzt| |} q|dkrt }| | |} q|dkr|  } q|d	krt	 }|  | |} q|
 r| t|} q| rt|\}}| t|| } q|tkrzi }|d
krb| jrb| jd }t|dd
dksZ|ddkrbd|d< | tt| f|} q|dkr| t|dd} q|dkr| t|} qtd| q|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')))

    rE   r   ri   Nr5   _^rb   rc   rw   r[   r   r   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_charsr{   r   r   r   r   )	noder   treer   Zcmdnamenew_nodenumberr}   Zprevious_noder   r   r   parse_latex_mathE  sR    







r  c                 C   s8
  | t kr6tt |  }| tkr$d|d< ||}||fS | tkr| dkr`t|\}}t|dd}ntt|  }| dkrt|td}nJ| dkrt|td	d
d}n.| dkrt|td}n| dkrt|td}||}|r|d dkr|td}||fS | t	krt	|  \}}}}|r:|td||d}||fS |
 rHd}|t|d}|rp|tdd
d}|r|td}|tdd}t|\}}t||}|r|tdd
d}||fS | tkr| dkrddi}	ndt|  i}	| dkrd|	d< t|\}}
|dr2t |dd  |}| d!krHt||}| s\|d"krv|t|f|	}||
fS tf |	}|| ||fS | d#kr|td$d%d&d'd(}||fS | d)krt|d*}||fS | tkr|tt|  d+d,}||fS | tkr&|tt|  d-d.}||fS | tkri }	| tkr\|r\|d d/kr\d0|	d1< n| d2krnd3|	d< |tt|  f|	}||fS | tkri }tt|   }t|\}}|d4krzt|d }W n& tk
r   td5| |f Y nX |r||d6< ||d7< d0|d8< | d9ks*| d:r>t }|| |}|d;krZ|t|f| | d<ksp| d=rx| }||fS | d>krt |\}}|d?kr|d@| fS |drzt|dd   }W n" tk
r   tdA| Y nX t!"dB|dC }|t|}||fS | dDkrt|\}}|#dE}t$|D ]@\}}|dF dkrrt%&dGdH|}|t'|}n
t|| q>||fS | t(kr|tdIt(|   d}||fS | dJkrt)|\}}|dKrdLt*|d dM dN  }|tdI| d}||fS | dOkr*t+ }|| ||fS | dPkrPt,dQdR}|| ||fS | dSkrt-|\}}|rt }t.|d0dT}t|| |  nt/ }|| ||fS | t0krjt0|  \}}| dUkrt-|\}}d9d<dV}||kr|1 }|| |dW< dX||  |d< t2f | }}| dYrFttd|tddYdZ}d[|_3|rXt|f|}|| ||fS | dkrt4 }t5|}|  | ||fS | t6krttt6|  d d
dd0dT}| d\krd
|j7d d]< | |_8|| ||fS | t9kr2ttt9|  d d0dd0d
d^}| |_8|| ||fS | d_krXtd0dT}|| ||fS | t:krttt:|  d d0dT}| |_8|| ||fS | d`krtd0dT}|| ||fS | dak	r>t-|\}}ttdb| dd    }|	r$t;|}tt |}t<|dk	r|j7d }|| nt|}|| ||fS | t=k	rtf t=|  }d |_3t>|t	rt<|dk	r||j?j7|j?j7@|< |j?|_?n&|jAjBdck	r|| ntdd|  ||fS | de
r t |\}}
|dfk	r|
}tC||| dg}||fS | dhk
rtD||S | dik
r(tE||S tdj|  d S )kuj  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   r0   )mathvariantr   rU   r      ¯F)accentr   rT   r   rL   r   )rV   rU   u   ⁡r-   )lspacerspacerC   )widthr^   r   0.333emr_   r2   r  r4   r5   ri   Nr3   r\   colonrF   Zpostfix0z0.28em)r   r
  r  Zidotsintz\int\dotsi\intzfont-weight: bold)stylez75%)Zmathsizez _^Tmovablelimits)r8   r9   r   z()[]/|.z!Unsupported "\%s" delimiter "%s"!maxsizeZminsizeZ	symmetricrr   l.rs   rnotrb   z{\not z\not: Cannot negate: "%s"!NFCu   ̸)textZmboxZtextrm$rj   z(^ | $)rZ   z%s)Zhspacer   muz%semr      ZphantomZboxedbox)notationsqrt)r   rl   )r  r  Znumalignz	numalign-ro   )rm   rp   rR   r	  )r   r	  ZoversetZunderset)Z
xleftarrowZxrightarrowlongrt   z3Declaration "\%s" must be first command in a group.limitsr   )r   beginendzUnknown LaTeX command: \)Flettersr   greek_capitalsr   	functionsr   r   r   r   modulo_functionsr   r   r  math_alphabetsr   r   r3   r   r   thick_operatorssmall_operators	operatorsr  bigdelimitersdelimiter_sizesstretchablesr   r   r   endswithr   r   r   unicodedata	normalizer   	enumerater   subr   spacesr   floatr   r   r   r   r   	fractionscopyr   r   r   r   accentsr{   Ztex_cmdoverunderr   r   layout_stylesr   r   r   r   r   r   begin_environmentend_environment)r   r  r   r  r   binarynamedZparenthesespaddingr}   r   r  Zdelimiter_attributessize	delimiterrowpartsipartradixZ	indexnodeZ
style_attsZ	frac_attsr   Zoptargsrn   entryZ	subscriptbaseZsub_noder   r   r   r     s   
















































 


















r   c                 C   s$  | j  }|dkrd|d< n |dks4t|ddtkr<d|d< |dkrt|tr`t|j ddi}nJt|tr|t|j ddi}n.|d	ks|dkr|	dd
rt
|}nt|}nj|dkrt|t
rt|j  }nJt|trt|j  }n4|d	ks|dkr|	dd
rt|}nt|}| | |S )z)Append script or limit element to `node`.r   Fr  r   r]   TrU   r   )r   r  NrV   )r{   r   r   r  r   r   r   r   r   r   r   r   r   )r  r   r   r   r  r   r   r   r     sB    













r   c                 C   s   t |\}}|tkrt| d }i }|rdtt|}|dkrTtt|dd}d|d< | | |} n0|dkrd|d	< d
|d< tdd}| | |} t }| tt|f| |} nt	d| |fS )Nr   rf   z0.17em)r  rr   columnalignre   z0.02emZ
rowspacingr  columnspacing1)rh   Environment not supported!)
r   matricesr   r   r   r   r   r   r   r   )r  r   r   Zleft_delimiterr}   wrapperrG  r   r   r   r;    s,    


r;  c                 C   sn   t |\}}|tkr^|    } t| d }|rL| t|} |  } qf|dkrf|  } ntd| |fS )Nri   rf   rL  )r   rM  r   r   r   r   )r  r   r   Zright_delimiterr   r   r   r<  6  s    

r<  c                 C   s.   t dd | D }|dkrdS t|d d S )Nc                 s   s"   | ]}| d | d V  qdS rw   z\&Ncountr   rB  r   r   r   r   H  s     z'tex_equation_columns.<locals>.<genexpr>r   rj   ri   )r=   int)rowstabsr   r   r   tex_equation_columnsG  s    rV  c                 C   sl   ddd}t dd | D }|rhddg| }dd	g| }d
|d |d  |d< d
|d | |d< |S )NalignT)r   rg   c                 s   s"   | ]}| d | d V  qdS rO  rP  rR  r   r   r   r   [  s     z#align_attributes.<locals>.<genexpr>rs   rr   r  rB   rE   ri   rI  rJ  )r=   r   )rT  ZattsrU  Zalignsspacingr   r   r   align_attributesX  s    rY  c                 C   sf   t dd}|}|sTd|d< t| d}t|dkrTt }|tt|f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xmlnsr   r   z\\ri   )rt   r   r   r   r   r   r   r   rY  r  r   )Ztex_mathinlineZ	math_treer  rT  r   r   r   
tex2mathmlm  s    

r[  )r]   )T)Lr   r   r/  Zdocutils.utils.mathr   r   Z	mathalphar#  r$  r%  updater&  r'  r-  Z	mathfencer   Z	mathcloser*  ZmathbinZmathrelZmathordZ	mathpunctZmathopr(  r)  r  r3  r7  r8  r9  r  r3   rM  r:  r5  r,  r+  rt   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<  rV  rY  r[  r   r   r   r   <module>   s  
       	







 	
1S  c
!