B
    ]”t\„C  ã               @   sŽ   d Z ddlZddlZddlZddlZddlZddlmZ ddlZddl	Z	ddl
ZddlZddlmZmZmZmZ e e¡ZG dd„ deƒZdS )aÒ  
This module supports embedded TeX expressions in matplotlib via dvipng
and dvips for the raster and postscript backends.  The tex and
dvipng/dvips information is cached in ~/.matplotlib/tex.cache for reuse between
sessions

Requirements:

* latex
* \*Agg backends: dvipng>=1.6
* PS backend: psfrag, dvips, and Ghostscript>=8.60

Backends:

* \*Agg
* PS
* PDF

For raster output, you can get RGBA numpy arrays from TeX expressions
as follows::

  texmanager = TexManager()
  s = ('\TeX\ is Number '
       '$\displaystyle\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}$!')
  Z = texmanager.get_rgba(s, fontsize=12, dpi=80, rgb=(1,0,0))

To enable tex rendering of all text in your matplotlib figure, set
:rc:`text.usetex` to True.
é    N)ÚPath)Ú_pngÚcbookÚdvireadÚrcParamsc               @   s€  e Zd ZdZe ¡ Zedk	r>ej 	ed¡Z
ee
ƒjddd ndZ
i Zi Zeej d¡dd„ ƒƒZeej d¡d	d„ ƒƒZd
ZdZdZdZdZdZdddddddd
dddddd
dddœZdZdedd„ eD ƒƒ Zdd„ Zd>dd„Zd d!„ Z d"d#„ Z!d$d%„ Z"d&d'„ Z#e$ %d(¡Z&d)d*„ Z'd+d,„ Z(d-d.„ Z)d/d0„ Z*d1d2„ Z+ej d¡d3d4„ ƒZ,ej d¡d5d6„ ƒZ-d?d7d8„Z.d@d:d;„Z/dAd<d=„Z0dS )BÚ
TexManagerzU
    Convert strings to dvi files using TeX, caching the results to a directory.
    Nz	tex.cacheT)ÚparentsÚexist_okz2.2c             C   s   i S )N© )Úselfr
   r
   ú4lib/python3.7/site-packages/matplotlib/texmanager.pyÚ<lambda>A   s    zTexManager.<lambda>c             C   s   dS )Nr   r
   )r   r
   r
   r   r   B   s    )ZcmrÚ )Zcmssr   )Zcmttr   )Zpzcz\usepackage{chancery}Úserif)r   z
sans-serifÚcursiveÚ	monospace)Zpncz\renewcommand{\rmdefault}{pnc})Zpbkz\renewcommand{\rmdefault}{pbk})Zptmz\usepackage{mathptmx})Zpplz\usepackage{mathpazo})Zpchz\usepackage{charter})Zphvz\usepackage{helvet})Zpagz\usepackage{avant})Zpcrz\usepackage{courier})znew century schoolbookZbookmanÚtimesZpalatinozzapf chanceryr   Zcharterr   z
sans-serifZ	helveticazavant gardeZcourierr   zcomputer modern romanzcomputer modern sans serifzcomputer modern typewriter)ztext.latex.preambleztext.latex.unicodeztext.latex.previewzfont.familyc             c   s   | ]}d | V  qdS )zfont.Nr
   )Ú.0Únr
   r
   r   ú	<genexpr>`   s    zTexManager.<genexpr>c          
   C   sØ  | j d krtdƒ‚t| j ƒjddd td }t|ƒdkr\|d  ¡ | jkr\|d  ¡ | _n>t	|t
ƒr€| ¡ | jkr€| ¡ | _nt dd | j¡¡ d	| _| jg}x²| jD ]¨}| d
d¡}x‚td|  D ]T}| ¡ | jkrt| || j| ¡  ƒ t d||| j| ¡  ¡ P qÈt d|¡ qÈW t d|¡ t| || j| ƒ | t| |ƒd ¡ qªW |  ¡  d¡}| t |¡ ¡ ¡ d |¡| _| jd | jd | jd g}| jdkr¼| | jd ¡ d dg| dg ¡| _d S )NzBCannot create TexManager, as there is no cache directory availableT)r   r	   zfont.familyé   r   zXfont.family must be one of (%s) when text.usetex is True. serif will be used by default.z, r   ú-Ú_zfont.zfamily: %s, font: %s, info: %sz&%s font is not compatible with usetex.zQNo LaTeX-compatible font found for the %s font family in rcParams. Using default.zutf-8r   r   Ú
z\usepackage{type1cm}z\usepackage{textcomp})ÚtexcacheÚRuntimeErrorr   Úmkdirr   ÚlenÚlowerÚfont_familiesÚfont_familyÚ
isinstanceÚstrÚ_logÚinfoÚjoinÚreplaceÚ	font_infoÚsetattrÚdebugÚappendÚgetattrÚget_custom_preambleÚencodeÚhashlibÚmd5Ú	hexdigestÚ_fontconfigr   Ú
sans_serifr   r   Ú_font_preamble)r   ZffZ
fontconfigr    Zfont_family_attrZfontZpreamble_bytesÚcmdr
   r
   r   Ú__init__b   sF    

zTexManager.__init__c             C   sH   d  ||  ¡ d| |  ¡ t|p dƒg¡}tj  | jt | 	d¡¡ 
¡ ¡S )zU
        Return a filename based on a hash of the string, fontsize, and dpi.
        r   z%fzutf-8)r%   Úget_font_configr,   r"   ÚosÚpathr   r.   r/   r-   r0   )r   ÚtexÚfontsizeÚdpiÚsr
   r
   r   Úget_basefile•   s    zTexManager.get_basefilec                s¢   ˆ j dkrt ˆ j¡ˆ _ ‡ fdd„ˆ jD ƒ}|rŽt d|¡ x:|D ]2}t d|ˆ j | t| ¡ t t| ¡ˆ j |< qBW t dˆ j	¡ ˆ  
¡  t dˆ j	¡ ˆ j	S )z8Reinitializes self if relevant rcParams on have changed.Nc                s"   g | ]}t | ˆ j| kr|‘qS r
   )r   Ú	_rc_cache)r   Zpar)r   r
   r   ú
<listcomp>¢   s    z.TexManager.get_font_config.<locals>.<listcomp>zfollowing keys changed: %sz%-20s: %-10s -> %-10szRE-INIT
old fontconfig: %szfontconfig: %s)r>   ÚdictÚfromkeysÚ_rc_cache_keysr#   r)   r   ÚcopyÚdeepcopyr1   r5   )r   ZchangedÚkr
   )r   r   r6   ž   s    

zTexManager.get_font_configc             C   s   | j S )zU
        Return a string containing font configuration for the tex preamble.
        )r3   )r   r
   r
   r   Úget_font_preamble°   s    zTexManager.get_font_preamblec             C   s   d  td ¡S )z>Return a string containing user additions to the tex preamble.r   ztext.latex.preamble)r%   r   )r   r
   r
   r   r,   ¶   s    zTexManager.get_custom_preamblec             C   sÜ   |   ||¡}d| }|  ¡ }dddœ | jd¡}|| }td rFd}nd}d	| j||||d
 |f }t|dƒd}	td rŠ|	 | d¡¡ nDy|	 | d¡¡ W n. t	k
rÌ }
 zt
 d¡ ‚ W dd}
~
X Y nX W dQ R X |S )zv
        Generate a tex file to render the tex string at a specific font size.

        Return the file name.
        z%s.texz{\sffamily %s}z{\ttfamily %s})z
sans-serifr   z{\rmfamily %s}ztext.latex.unicodez
\usepackage[utf8]{inputenc}r   z·
\documentclass{article}
%s
%s
%s
\usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry}
\pagestyle{empty}
\begin{document}
\fontsize{%f}{%f}%s
\end{document}
g      ô?ÚwbÚutf8ÚasciizWYou are using unicode and latex, but have not enabled the 'text.latex.unicode' rcParam.N)r=   r,   Úgetr    r   r3   ÚopenÚwriter-   ÚUnicodeEncodeErrorr#   r$   )r   r9   r:   ÚbasefileÚtexfileÚcustom_preambleÚfontcmdÚunicode_preambler<   ÚfhÚerrr
   r
   r   Úmake_texº   s*    

zTexManager.make_texz3MatplotlibBox:\(([\d.]+)pt\+([\d.]+)pt\)x([\d.]+)ptc             C   sÜ   |   ||¡}d| }|  ¡ }dddœ | jd¡}|| }td rFd}nd}d	| j||||d
 |f }t|dƒd}	td rŠ|	 | d¡¡ nDy|	 | d¡¡ W n. t	k
rÌ }
 zt
 d¡ ‚ W dd}
~
X Y nX W dQ R X |S )zâ
        Generate a tex file to render the tex string at a specific font size.

        It uses the preview.sty to determine the dimension (width, height,
        descent) of the output.

        Return the file name.
        z%s.texz{\sffamily %s}z{\ttfamily %s})z
sans-serifr   z{\rmfamily %s}ztext.latex.unicodez
\usepackage[utf8]{inputenc}r   a±  
\documentclass{article}
%s
%s
%s
\usepackage[active,showbox,tightpage]{preview}
\usepackage[papersize={72in,72in},body={70in,70in},margin={1in,1in}]{geometry}

%% we override the default showbox as it is treated as an error and makes
%% the exit status not zero
\def\showbox#1%%
{\immediate\write16{MatplotlibBox:(\the\ht#1+\the\dp#1)x\the\wd#1}}

\begin{document}
\begin{preview}
{\fontsize{%f}{%f}%s}
\end{preview}
\end{document}
g      ô?rG   rH   rI   zWYou are using unicode and latex, but have not enabled the 'text.latex.unicode' rcParam.N)r=   r,   rJ   r    r   r3   rK   rL   r-   rM   r#   r$   )r   r9   r:   rN   rO   rP   rQ   rR   r<   rS   rT   r
   r
   r   Úmake_tex_previewê   s*    	

zTexManager.make_tex_previewc          
   C   s|   t  |¡ ytj|| jtjd}W nJ tjk
rl } z*tdj|d | 	d¡|j
 d¡dƒ‚W d d }~X Y nX t  |¡ |S )N)ÚcwdÚstderrzr{prog} was not able to process the following string:
{tex!r}

Here is the full report generated by {prog}:
{exc}

r   Zunicode_escapezutf-8)Úprogr9   Úexc)r#   r)   Ú
subprocessZcheck_outputr   ZSTDOUTZCalledProcessErrorr   Úformatr-   ÚoutputÚdecode)r   Zcommandr9   ÚreportrZ   r
   r
   r   Ú_run_checked_subprocess%  s    
$
z"TexManager._run_checked_subprocessc          	   C   s´   t d r|  ||¡S |  ||¡}d| }tj |¡s°|  ||¡}t |¡ |  	ddd|g|¡ W dQ R X xDt
 
|d ¡D ]2}| d¡szyt |¡ W qz tk
rª   Y qzX qzW |S )	zm
        Generate a dvi file containing latex's layout of tex string.

        Return the file name.
        ztext.latex.previewz%s.dviÚlatexz-interaction=nonstopmodez--halt-on-errorNÚ*)Údvir9   )r   Úmake_dvi_previewr=   r7   r8   ÚexistsrU   r   Z
_lock_pathr`   ÚglobÚendswithÚremoveÚOSError)r   r9   r:   rN   ÚdvifilerO   Úfnamer
   r
   r   Úmake_dvi7  s"    

zTexManager.make_dvic          	   C   sÞ   |   ||¡}d| }d| }tj |¡r4tj |¡sÚ|  ||¡}|  ddd|g|¡}tj | 	d¡¡}t
|d dƒ}	|	 d	 | ¡ ¡¡ W d
Q R X xDt |d ¡D ]2}
|
 d¡s¤yt |
¡ W q¤ tk
rÔ   Y q¤X q¤W |S )zí
        Generate a dvi file containing latex's layout of tex string.

        It calls make_tex_preview() method and store the size information
        (width, height, descent) in a separate file.

        Return the file name.
        z%s.dviz%s.baselinera   z-interaction=nonstopmodez--halt-on-errorzutf-8z	.baselineÚwú Nrb   )rc   r9   Zbaseline)r=   r7   r8   re   rV   r`   r   Ú_re_vboxÚsearchr^   rK   rL   r%   Úgroupsrf   rg   rh   ri   )r   r9   r:   rN   rj   ÚbaselinefilerO   r_   ÚmrS   rk   r
   r
   r   rd   R  s$    	


zTexManager.make_dvi_previewc             C   sV   |   |||¡}d| }tj |¡sR|  ||¡}|  ddddt|ƒddd||g
|¡ |S )	zp
        Generate a png file containing latex's rendering of tex string.

        Return the file name.
        z%s.pngZdvipngz-bgZTransparentz-Dz-TZtightz-o)r=   r7   r8   re   rl   r`   r"   )r   r9   r:   r;   rN   Úpngfilerj   r
   r
   r   Úmake_pngt  s    zTexManager.make_pngc             C   sH   |   ||¡}d| }tj |¡sD|  ||¡}|  dddd||g|¡ |S )zw
        Generate a postscript file containing latex's rendering of tex string.

        Return the file name.
        z%s.epsfZdvipsz-qz-Ez-o)r=   r7   r8   re   rl   r`   )r   r9   r:   rN   Úpsfilerj   r
   r
   r   Úmake_ps„  s    zTexManager.make_psc          	   C   sb   |   ||¡}t|ƒ8}x0|D ](}| d¡rdd„ | ¡ dd… D ƒS qW W dQ R X td| ƒ‚dS )zU
        Return a list of PS bboxes for latex's rendering of the tex string.
        z%%BoundingBox:c             S   s   g | ]}t |ƒ‘qS r
   )Úint)r   Úvalr
   r
   r   r?   œ  s    z*TexManager.get_ps_bbox.<locals>.<listcomp>r   NzCould not parse %s)rw   rK   Ú
startswithÚsplitr   )r   r9   r:   rv   ZpsÚliner
   r
   r   Úget_ps_bbox“  s    


(zTexManager.get_ps_bboxc             C   sl   ||   ¡ ||f}| j |¡}|dkrh|  |||¡}t tj | j	|¡¡}|dd…dd…df  | j|< }|S )zReturn the alpha channel.Néÿÿÿÿ)
r6   Úgrey_arraydrJ   ru   r   Zread_pngr7   r8   r%   r   )r   r9   r:   r;   ÚkeyÚalphart   ÚXr
   r
   r   Úget_greyŸ  s     zTexManager.get_grey©r   r   r   c             C   sz   |st d }|st d }|\}}}||  ¡ ||t|ƒf}| j |¡}	|	dkrv|  |||¡}
t ||||
g¡}	|	| j|< |	S )z<Return latex's rendering of the tex string as an rgba array.z	font.sizezsavefig.dpiN)r   r6   ÚtupleÚrgba_arraydrJ   rƒ   ÚnpZdstack)r   r9   r:   r;   ZrgbÚrÚgÚbr€   ÚZr   r
   r
   r   Úget_rgba©  s    

zTexManager.get_rgbac          	      sê   |  ¡ dkrdS |r| d¡nd‰ td rœ|  ||¡}d| }tj |¡sV|  ||¡}t|ƒ}| 	¡  
¡ }W dQ R X ‡ fdd	„|D ƒ\}	}
}||	|
 |
fS |  ||¡}t |d
ˆ  ¡}tt|ƒƒ}W dQ R X |j|j|j |jfS dS )z-Return width, height and descent of the text.r   )r   r   r   g      ð?r   ztext.latex.previewz%s.baselineNc                s   g | ]}t |ƒˆ  ‘qS r
   )Úfloat)r   Úl1)Údpi_fractionr
   r   r?   Ë  s    z<TexManager.get_text_width_height_descent.<locals>.<listcomp>éH   )ÚstripZpoints_to_pixelsr   r=   r7   r8   re   rd   rK   Úreadr{   rl   r   ZDviÚnextÚiterÚwidthÚheightZdescent)r   r9   r:   ZrendererrN   rr   rj   rS   Úlr–   Zdepthr•   rc   Zpager
   )r   r   Úget_text_width_height_descentº  s     
z(TexManager.get_text_width_height_descent)N)NN)NNr„   )N)1Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚmplZget_cachedirZcachedirr7   r8   r%   r   r   r   r†   r   Úpropertyr   Z
deprecatedZpostscriptdZpscntr   r2   r   r   r    r   r'   r>   r…   rB   r5   r=   r6   rF   r,   rU   ÚreÚcompilero   rV   r`   rl   rd   ru   rw   r}   rƒ   rŒ   r˜   r
   r
   r
   r   r   0   sj   3
	-;"


r   )rœ   rC   rf   r.   Zloggingr7   Zpathlibr   rŸ   r[   Znumpyr‡   Z
matplotlibr   r   r   r   r   Z	getLoggerr™   r#   Úobjectr   r
   r
   r
   r   Ú<module>   s   
