U
    ÎZj-b  ã                   @  sF  d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 ddl
ZddlmZ erXddlmZ dd	d
œdd„ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd „ d ƒZd!d"d#œd$d%„Zd!d&d"d'œd(d)„Zed*k�rBddlZe ¡  dS )+z-
Module for formatting output data in Latex.
é    )Úannotations)ÚABCÚabstractmethod)ÚTYPE_CHECKINGÚIteratorÚSequenceN)ÚABCMultiIndex)ÚDataFrameFormatterústr | tuple[str, str] | Noneztuple[str, str])ÚcaptionÚreturnc              
   C  sh   | rXt | tƒr| }d}q`z| \}}W q` tk
rT } zd}t|ƒ|‚W 5 d}~X Y q`X nd}d}||fS )aÊ  Extract full and short captions from caption string/tuple.

    Parameters
    ----------
    caption : str or tuple, optional
        Either table caption string or tuple (full_caption, short_caption).
        If string is provided, then it is treated as table full caption,
        while short_caption is considered an empty string.

    Returns
    -------
    full_caption, short_caption : tuple
        Tuple of full_caption, short_caption strings.
    Ú z9caption must be either a string or a tuple of two stringsN)Ú
isinstanceÚstrÚ
ValueError)r   Zfull_captionÚshort_captionÚerrÚmsg© r   úZ/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/pandas/io/formats/latex.pyÚ_split_into_full_short_caption   s    
r   c                   @  sÞ   e Zd ZdZd+ddddddœd	d
„Zdddœdd„Zeddœdd„ƒZeddœdd„ƒZeddœdd„ƒZ	eddœdd„ƒZ
ddœdd„Zedd„ ƒZddd œd!d"„Zddd œd#d$„Zdddd%œd&d'„Zdddd(œd)d*„ZdS ),ÚRowStringConverterav  Converter for dataframe rows into LaTeX strings.

    Parameters
    ----------
    formatter : `DataFrameFormatter`
        Instance of `DataFrameFormatter`.
    multicolumn: bool, optional
        Whether to use \multicolumn macro.
    multicolumn_format: str, optional
        Multicolumn format.
    multirow: bool, optional
        Whether to use \multirow macro.

    FNr	   Úboolú
str | NoneÚNone)Ú	formatterÚmulticolumnÚmulticolumn_formatÚmultirowr   c                 C  sF   || _ | j j| _|| _|| _|| _g | _|  ¡ | _tt	| jŽ ƒ| _
d S ©N)ÚfmtÚframer   r   r   ÚclinebufÚ_get_strcolsÚstrcolsÚlistÚzipÚstrrows)Úselfr   r   r   r   r   r   r   Ú__init__I   s    

zRowStringConverter.__init__Úintr   )Úrow_numr   c           	      C  sÊ   | j | }|| jk o | jjo | j}|| jkoB| jjoB| joB| jdk}|oX|t	| j ƒd k }|  
|¡}|rr|  |¡}|r‚|  ||¡}g }| d |¡¡ | d¡ |rÀ|  |t	| jƒ¡}| |¡ d |¡S )z%Get string representation of the row.é   z & z \\r   )r'   Úcolumn_levelsr    Úheaderr   Úheader_levelsÚindexr   Úindex_levelsÚlenÚ_preprocess_rowÚ_format_multicolumnÚ_format_multirowÚappendÚjoinÚ_compose_cliner$   )	r(   r+   ÚrowZis_multicolZis_multirowZis_cline_maybe_requiredÚcrowÚlstZcliner   r   r   Ú
get_strrowY   s.    
ÿ
ÿþü



zRowStringConverter.get_strrow©r   c                 C  s   | j jr| jS dS )zNumber of rows in header.r   )r    r.   r/   ©r(   r   r   r   Ú_header_row_numy   s    z"RowStringConverter._header_row_numc                 C  s
   | j jjS )z"Integer number of levels in index.)r!   r0   Únlevelsr>   r   r   r   r1   ~   s    zRowStringConverter.index_levelsc                 C  s
   | j jjS r   )r!   Úcolumnsr@   r>   r   r   r   r-   ƒ   s    z RowStringConverter.column_levelsc                 C  s"   | j }| jjr| jjr|d7 }|S )Nr,   )r-   r    Úhas_index_namesZshow_index_names)r(   r@   r   r   r   r/   ‡   s    z RowStringConverter.header_levelszlist[list[str]]c                   sÜ   | j jjr| jgg}n
| j  ¡ }| j jrØt| jjtƒrØ| jjjd| j j	| j j
| j jd�}dd„ ‰‡fdd„|D ƒ}| jjj‰ ‡ fdd„|D ƒ}| jjj}t|ƒrÈd	d„ |D ƒ}||| jjjd
  dˆ …< ||d
d…  }|S )z%String representation of the columns.F)ZadjoinÚsparsifyÚnamesÚna_repc                   s:   t | ƒD ]‰ ˆ r qq| d g‡ fdd„| dd … D ƒ S )Nr   c                   s    g | ]}|r|n
d t ˆ ƒ ‘qS )ú ©r2   ©Ú.0Úi©Úpadr   r   Ú
<listcomp>¤   s     zHRowStringConverter._get_strcols.<locals>.pad_empties.<locals>.<listcomp>r,   )Úreversed)Úxr   rK   r   Úpad_empties    s    z4RowStringConverter._get_strcols.<locals>.pad_emptiesc                 3  s   | ]}ˆ |ƒV  qd S r   r   rH   )rP   r   r   Ú	<genexpr>¦   s     z2RowStringConverter._get_strcols.<locals>.<genexpr>c                   s&   g | ]}d t |d ƒ gˆ  | ‘qS )rF   éÿÿÿÿrG   rH   )Úclevelsr   r   rM   ª   s     z3RowStringConverter._get_strcols.<locals>.<listcomp>c                 S  s   g | ]}|r|nd ‘qS ©ú{}r   rH   r   r   r   rM   ¯   s     r,   N)r    r!   ÚemptyÚ_empty_info_lineZget_strcolsr0   r   r   ÚformatrC   rB   rE   rA   r@   rD   Úany)r(   r$   ÚoutÚgenZcnamesZ	new_namesr   )rS   rP   r   r#   Ž   s(    

ü	

zRowStringConverter._get_strcolsc                 C  s&   dt | jƒj› d| jj› d| jj› �S )NzEmpty z

Columns: z
Index: )Útyper!   Ú__name__rA   r0   r>   r   r   r   rW   ¶   s    $ÿz#RowStringConverter._empty_info_lineúSequence[str]ú	list[str]©r9   r   c                 C  s@   | j jrt|ƒ}ndd„ |D ƒ}| j jr<| j jr<t|| jƒ}|S )zPreprocess elements of the row.c                 S  s   g | ]}|r|nd ‘qS rT   r   ©rI   rO   r   r   r   rM   Ã   s     z6RowStringConverter._preprocess_row.<locals>.<listcomp>)r    ÚescapeÚ_escape_symbolsZ	bold_rowsr0   Ú_convert_to_boldr1   )r(   r9   r:   r   r   r   r3   ¾   s    
z"RowStringConverter._preprocess_rowc                   sn   |dˆj … ‰d‰d‰ ‡ ‡‡‡fdd„}|ˆj d… D ](}| ¡ rVˆ rL|ƒ  |‰ d‰q6ˆd7 ‰q6ˆ rj|ƒ  ˆS )zø
        Combine columns belonging to a group to a single multicolumn entry
        according to self.multicolumn_format

        e.g.:
        a &  &  & b & c &
        will become
        \multicolumn{3}{l}{a} & b & \multicolumn{2}{l}{c}
        Nr,   r   c                	     s>   ˆdkr0ˆ  dˆd›dˆj› dˆ  ¡ › d�¡ n
ˆ  ˆ ¡ d S )Nr,   ú\multicolumn{Údz}{Ú})r6   r   Ústripr   ©ZcoltextZncolZrow2r(   r   r   Ú
append_colÖ   s
    ÿz:RowStringConverter._format_multicolumn.<locals>.append_col)r1   rh   )r(   r9   rj   Úcr   ri   r   r4   È   s    

z&RowStringConverter._format_multicolumn)r9   rJ   r   c                 C  sš   t | jƒD ]Š}||  ¡ r
d}| j|d d… D ]}||  ¡ sJ|d7 }q0 qPq0|dkr
d|d›d||  ¡ › d�||< | j || d |d g¡ q
|S )zá
        Check following rows, whether row should be a multirow

        e.g.:     becomes:
        a & 0 &   \multirow{2}{*}{a} & 0 &
          & 1 &     & 1 &
        b & 0 &   \cline{1-2}
                  b & 0 &
        r,   Nz
\multirow{rf   z}{*}{rg   )Úranger1   rh   r'   r"   r6   )r(   r9   rJ   ÚjZnrowÚrr   r   r   r5   ð   s    

 z#RowStringConverter._format_multirow)rJ   Úicolr   c                   s\   g }| j D ]F}|d ˆ kr
| d|d d›d|d›d�¡ ‡ fdd„| j D ƒ| _ q
d	 |¡S )
zC
        Create clines after multirow-blocks are finished.
        r   z
\cline{r,   rf   ú-rg   c                   s   g | ]}|d  ˆ kr|‘qS )r   r   ra   ©rJ   r   r   rM     s      z5RowStringConverter._compose_cline.<locals>.<listcomp>r   )r"   r6   r7   )r(   rJ   ro   r;   Úclr   rq   r   r8   	  s    
 z!RowStringConverter._compose_cline)FNF)r]   Ú
__module__Ú__qualname__Ú__doc__r)   r<   Úpropertyr?   r1   r-   r/   r#   rW   r3   r4   r5   r8   r   r   r   r   r   9   s*      û (

(r   c                   @  s"   e Zd ZdZeddœdd„ƒZdS )ÚRowStringIteratorz:Iterator over rows of the header or the body of the table.úIterator[str]r=   c                 C  s   dS )z2Iterate over LaTeX string representations of rows.Nr   r>   r   r   r   Ú__iter__  s    zRowStringIterator.__iter__N)r]   rs   rt   ru   r   ry   r   r   r   r   rw     s   rw   c                   @  s   e Zd ZdZddœdd„ZdS )ÚRowHeaderIteratorz#Iterator for the table header rows.rx   r=   c                 c  s.   t t| jƒƒD ]}|| jk r|  |¡V  qd S r   ©rl   r2   r'   r?   r<   ©r(   r+   r   r   r   ry   !  s    
zRowHeaderIterator.__iter__N©r]   rs   rt   ru   ry   r   r   r   r   rz     s   rz   c                   @  s   e Zd ZdZddœdd„ZdS )ÚRowBodyIteratorz!Iterator for the table body rows.rx   r=   c                 c  s.   t t| jƒƒD ]}|| jkr|  |¡V  qd S r   r{   r|   r   r   r   ry   *  s    
zRowBodyIterator.__iter__Nr}   r   r   r   r   r~   '  s   r~   c                   @  sÚ   e Zd ZdZddddddddddddœ
d	d
„Zddœdd„Zeeddœdd„ƒƒZeeddœdd„ƒƒZ	eeddœdd„ƒƒZ
eeddœdd„ƒƒZeeddœdd„ƒƒZeeddœdd„ƒƒZeeddœdd„ƒƒZdS )ÚTableBuilderAbstracta  
    Abstract table builder producing string representation of LaTeX table.

    Parameters
    ----------
    formatter : `DataFrameFormatter`
        Instance of `DataFrameFormatter`.
    column_format: str, optional
        Column format, for example, 'rcl' for three columns.
    multicolumn: bool, optional
        Use multicolumn to enhance MultiIndex columns.
    multicolumn_format: str, optional
        The alignment for multicolumns, similar to column_format.
    multirow: bool, optional
        Use multirow to enhance MultiIndex rows.
    caption: str, optional
        Table caption.
    short_caption: str, optional
        Table short caption.
    label: str, optional
        LaTeX label.
    position: str, optional
        Float placement specifier, for example, 'htb'.
    NFr	   r   r   r   )
r   Úcolumn_formatr   r   r   r   r   ÚlabelÚpositionr   c
           
      C  s:   || _ || _|| _|| _|| _|| _|| _|| _|	| _d S r   )	r    r€   r   r   r   r   r   r�   r‚   )
r(   r   r€   r   r   r   r   r   r�   r‚   r   r   r   r)   J  s    zTableBuilderAbstract.__init__r   r=   c                 C  sD   | j | j| j| j| j| j| jg}d dd„ |D ƒ¡}d}||7 }|S )z%String representation of LaTeX table.Ú
c                 S  s   g | ]}|r|‘qS r   r   ©rI   Úitemr   r   r   rM   k  s      z3TableBuilderAbstract.get_result.<locals>.<listcomp>)Ú	env_beginÚtop_separatorr.   Úmiddle_separatorÚenv_bodyÚbottom_separatorÚenv_endr7   )r(   ÚelementsÚresultZtrailing_newliner   r   r   Ú
get_result`  s    ù	zTableBuilderAbstract.get_resultc                 C  s   dS )zBeginning of the environment.Nr   r>   r   r   r   r†   p  s    zTableBuilderAbstract.env_beginc                 C  s   dS )zTop level separator.Nr   r>   r   r   r   r‡   u  s    z"TableBuilderAbstract.top_separatorc                 C  s   dS )zHeader lines.Nr   r>   r   r   r   r.   z  s    zTableBuilderAbstract.headerc                 C  s   dS )zMiddle level separator.Nr   r>   r   r   r   rˆ     s    z%TableBuilderAbstract.middle_separatorc                 C  s   dS )zEnvironment body.Nr   r>   r   r   r   r‰   „  s    zTableBuilderAbstract.env_bodyc                 C  s   dS )zBottom level separator.Nr   r>   r   r   r   rŠ   ‰  s    z%TableBuilderAbstract.bottom_separatorc                 C  s   dS )zEnd of the environment.Nr   r>   r   r   r   r‹   Ž  s    zTableBuilderAbstract.env_end)NFNFNNNN)r]   rs   rt   ru   r)   rŽ   rv   r   r†   r‡   r.   rˆ   r‰   rŠ   r‹   r   r   r   r   r   0  s@           ö"r   c                   @  s¼   e Zd ZdZeddœdd„ƒZeddœdd„ƒZeddœdd	„ƒZeddœd
d„ƒZddœdd„Z	eddœdd„ƒZ
eddœdd„ƒZeddœdd„ƒZdddœdd„Zdddœdd„ZdS )ÚGenericTableBuilderz=Table builder producing string representation of LaTeX table.r   r=   c                 C  s   | j dd�}d t|ƒ¡S )Nr.   ©Úoverrƒ   ©Ú_create_row_iteratorr7   r%   ©r(   Úiteratorr   r   r   r.   —  s    zGenericTableBuilder.headerc                 C  s   dS )Nz\topruler   r>   r   r   r   r‡   œ  s    z!GenericTableBuilder.top_separatorc                 C  s   |   ¡ rdS dS )Nú\midruler   )Ú_is_separator_requiredr>   r   r   r   rˆ      s    z$GenericTableBuilder.middle_separatorc                 C  s   | j dd�}d t|ƒ¡S )NÚbodyr�   rƒ   r’   r”   r   r   r   r‰   ¤  s    zGenericTableBuilder.env_bodyr   c                 C  s   t | jo| jƒS r   )r   r.   r‰   r>   r   r   r   r—   ©  s    z*GenericTableBuilder._is_separator_requiredc                 C  s   | j rd| j › d�S dS )z7Position macro, extracted from self.position, like [h].ú[ú]r   )r‚   r>   r   r   r   Ú_position_macro¬  s    z#GenericTableBuilder._position_macroc                 C  s8   | j r4d d| jr d| j› d�ndd| j › d�g¡S dS )zÌCaption macro, extracted from self.caption.

        With short caption:
            \caption[short_caption]{caption_string}.

        Without short caption:
            \caption{caption_string}.
        r   z\captionr™   rš   Ú{rg   )r   r7   r   r>   r   r   r   Ú_caption_macro±  s    
ýÿz"GenericTableBuilder._caption_macroc                 C  s   | j rd| j › d�S dS )z9Label macro, extracted from self.label, like \label{ref}.z\label{rg   r   )r�   r>   r   r   r   Ú_label_macroÅ  s    z GenericTableBuilder._label_macrorw   )r‘   r   c                 C  s"   |   |¡}|| j| j| j| jd�S )a
  Create iterator over header or body of the table.

        Parameters
        ----------
        over : {'body', 'header'}
            Over what to iterate.

        Returns
        -------
        RowStringIterator
            Iterator over body or header.
        )r   r   r   r   )Ú_select_iteratorr    r   r   r   )r(   r‘   Ziterator_kindr   r   r   r“   Ê  s    
üz(GenericTableBuilder._create_row_iteratorztype[RowStringIterator]c                 C  s0   |dkrt S |dkrtS d|› d�}t|ƒ‚dS )z'Select proper iterator over table rows.r.   r˜   z.'over' must be either 'header' or 'body', but z was providedN)rz   r~   r   )r(   r‘   r   r   r   r   rŸ   ß  s    z$GenericTableBuilder._select_iteratorN)r]   rs   rt   ru   rv   r.   r‡   rˆ   r‰   r—   r›   r�   rž   r“   rŸ   r   r   r   r   r�   ”  s$   r�   c                   @  sf   e Zd ZdZeddœdd„ƒZddœdd„Zeddœdd	„ƒZeddœd
d„ƒZeddœdd„ƒZ	dS )ÚLongTableBuilderaV  Concrete table builder for longtable.

    >>> from pandas.io.formats import format as fmt
    >>> df = pd.DataFrame({"a": [1, 2], "b": ["b1", "b2"]})
    >>> formatter = fmt.DataFrameFormatter(df)
    >>> builder = LongTableBuilder(formatter, caption='a long table',
    ...                            label='tab:long', column_format='lrl')
    >>> table = builder.get_result()
    >>> print(table)
    \begin{longtable}{lrl}
    \caption{a long table}
    \label{tab:long}\\
    \toprule
    {} &  a &   b \\
    \midrule
    \endfirsthead
    \caption[]{a long table} \\
    \toprule
    {} &  a &   b \\
    \midrule
    \endhead
    \midrule
    \multicolumn{3}{r}{{Continued on next page}} \\
    \midrule
    \endfoot
    <BLANKLINE>
    \bottomrule
    \endlastfoot
    0 &  1 &  b1 \\
    1 &  2 &  b2 \\
    \end{longtable}
    <BLANKLINE>
    r   r=   c                 C  s8   d| j › d| j› d�}||  ¡ › g}d dd„ |D ƒ¡S )Nz\begin{longtable}rœ   rg   rƒ   c                 S  s   g | ]}|r|‘qS r   r   r„   r   r   r   rM     s      z.LongTableBuilder.env_begin.<locals>.<listcomp>)r›   r€   Ú_caption_and_labelr7   )r(   Ú	first_rowrŒ   r   r   r   r†     s    ÿzLongTableBuilder.env_beginc                 C  sH   | j s| jr@d}| j› | j› g}d dd„ |D ƒ¡}||7 }|S dS d S )Nz\\rƒ   c                 S  s   g | ]}|r|‘qS r   r   r„   r   r   r   rM     s      z7LongTableBuilder._caption_and_label.<locals>.<listcomp>r   )r   r�   r�   rž   r7   )r(   Zdouble_backslashrŒ   Zcaption_and_labelr   r   r   r¡     s    z#LongTableBuilder._caption_and_labelc                 C  sf   | j dd�}dd| jr$d| j› d�nd| j| jdddd	t|jƒ› d
�ddddg}|  ¡ rbd |¡S dS )Nr.   r�   r–   z\endfirstheadz\caption[]{z} \\r   z\endheadre   z!}{r}{{Continued on next page}} \\z	\endfoot
ú\bottomrulez\endlastfootrƒ   )r“   r   r‡   r.   r2   r$   r—   r7   )r(   r•   rŒ   r   r   r   rˆ     s$    ò
z!LongTableBuilder.middle_separatorc                 C  s   dS )Nr   r   r>   r   r   r   rŠ   :  s    z!LongTableBuilder.bottom_separatorc                 C  s   dS )Nz\end{longtable}r   r>   r   r   r   r‹   >  s    zLongTableBuilder.env_endN)
r]   rs   rt   ru   rv   r†   r¡   rˆ   rŠ   r‹   r   r   r   r   r    ê  s   "
r    c                   @  sF   e Zd ZdZeddœdd„ƒZeddœdd„ƒZeddœdd	„ƒZd
S )ÚRegularTableBuildera�  Concrete table builder for regular table.

    >>> from pandas.io.formats import format as fmt
    >>> df = pd.DataFrame({"a": [1, 2], "b": ["b1", "b2"]})
    >>> formatter = fmt.DataFrameFormatter(df)
    >>> builder = RegularTableBuilder(formatter, caption='caption', label='lab',
    ...                               column_format='lrc')
    >>> table = builder.get_result()
    >>> print(table)
    \begin{table}
    \centering
    \caption{caption}
    \label{lab}
    \begin{tabular}{lrc}
    \toprule
    {} &  a &   b \\
    \midrule
    0 &  1 &  b1 \\
    1 &  2 &  b2 \\
    \bottomrule
    \end{tabular}
    \end{table}
    <BLANKLINE>
    r   r=   c                 C  s<   d| j › �d| j› | j› d| j› d�g}d dd„ |D ƒ¡S )Nz\begin{table}z
\centeringú\begin{tabular}{rg   rƒ   c                 S  s   g | ]}|r|‘qS r   r   r„   r   r   r   rM   f  s      z1RegularTableBuilder.env_begin.<locals>.<listcomp>)r›   r�   rž   r€   r7   )r(   rŒ   r   r   r   r†   ]  s    
ûzRegularTableBuilder.env_beginc                 C  s   dS ©Nr£   r   r>   r   r   r   rŠ   h  s    z$RegularTableBuilder.bottom_separatorc                 C  s   d  ddg¡S )Nrƒ   ú\end{tabular}z\end{table})r7   r>   r   r   r   r‹   l  s    zRegularTableBuilder.env_endN©r]   rs   rt   ru   rv   r†   rŠ   r‹   r   r   r   r   r¤   C  s   
r¤   c                   @  sF   e Zd ZdZeddœdd„ƒZeddœdd„ƒZeddœdd	„ƒZd
S )ÚTabularBuilderañ  Concrete table builder for tabular environment.

    >>> from pandas.io.formats import format as fmt
    >>> df = pd.DataFrame({"a": [1, 2], "b": ["b1", "b2"]})
    >>> formatter = fmt.DataFrameFormatter(df)
    >>> builder = TabularBuilder(formatter, column_format='lrc')
    >>> table = builder.get_result()
    >>> print(table)
    \begin{tabular}{lrc}
    \toprule
    {} &  a &   b \\
    \midrule
    0 &  1 &  b1 \\
    1 &  2 &  b2 \\
    \bottomrule
    \end{tabular}
    <BLANKLINE>
    r   r=   c                 C  s   d| j › d�S )Nr¥   rg   )r€   r>   r   r   r   r†   …  s    zTabularBuilder.env_beginc                 C  s   dS r¦   r   r>   r   r   r   rŠ   ‰  s    zTabularBuilder.bottom_separatorc                 C  s   dS )Nr§   r   r>   r   r   r   r‹   �  s    zTabularBuilder.env_endNr¨   r   r   r   r   r©   q  s   r©   c                   @  s¤   e Zd ZdZdddddddddddd	œ
d
d„Zddœdd„Zeddœdd„ƒZddœdd„Zeddœdd„ƒZ	e	j
dddœdd„ƒZ	ddœdd„Zddœdd„ZdS )ÚLatexFormattera   
    Used to render a DataFrame to a LaTeX tabular/longtable environment output.

    Parameters
    ----------
    formatter : `DataFrameFormatter`
    longtable : bool, default False
        Use longtable environment.
    column_format : str, default None
        The columns format as specified in `LaTeX table format
        <https://en.wikibooks.org/wiki/LaTeX/Tables>`__ e.g 'rcl' for 3 columns
    multicolumn : bool, default False
        Use \multicolumn to enhance MultiIndex columns.
    multicolumn_format : str, default 'l'
        The alignment for multicolumns, similar to `column_format`
    multirow : bool, default False
        Use \multirow to enhance MultiIndex rows.
    caption : str or tuple, optional
        Tuple (full_caption, short_caption),
        which results in \caption[short_caption]{full_caption};
        if a single string is passed, no short caption will be set.
    label : str, optional
        The LaTeX label to be placed inside ``\label{}`` in the output.
    position : str, optional
        The LaTeX positional argument for tables, to be placed after
        ``\begin{}`` in the output.

    See Also
    --------
    HTMLFormatter
    FNr	   r   r   r
   r   )
r   Ú	longtabler€   r   r   r   r   r�   r‚   r   c
           
      C  sN   || _ | j j| _|| _|| _|| _|| _|| _t|ƒ\| _| _	|| _
|	| _d S 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)   ³  s    
zLatexFormatter.__init__r   r=   c                 C  s
   | j  ¡ S )zp
        Render a DataFrame to a LaTeX tabular, longtable, or table/tabular
        environment output.
        )ÚbuilderrŽ   r>   r   r   r   Ú	to_stringÊ  s    zLatexFormatter.to_stringr   c                 C  s4   |   ¡ }|| j| j| j| j| j| j| j| j| j	d�	S )zVConcrete table builder.

        Returns
        -------
        TableBuilder
        )	r   r€   r   r   r   r   r   r�   r‚   )
Ú_select_builderr    r€   r   r   r   r   r   r�   r‚   )r(   r¬   r   r   r   r¬   Ñ  s    ÷zLatexFormatter.builderztype[TableBuilderAbstract]c                 C  s&   | j r
tS t| j| j| jgƒr"tS tS )zSelect proper table builder.)r«   r    rY   r   r�   r‚   r¤   r©   r>   r   r   r   r®   æ  s
    zLatexFormatter._select_builderc                 C  s   | j S )zColumn format.)Ú_column_formatr>   r   r   r   r€   î  s    zLatexFormatter.column_format)Úinput_column_formatr   c                 C  sD   |dkr|   ¡ |  ¡  | _n$t|tƒs:tdt|ƒ› �ƒ‚n|| _dS )zSetter for column format.Nz*column_format must be str or unicode, not )Ú_get_index_formatÚ"_get_column_format_based_on_dtypesr¯   r   r   r   r\   )r(   r°   r   r   r   r€   ó  s    ÿ
ÿc                 C  s"   dd„ }| j jj}d t||ƒ¡S )zkGet column format based on data type.

        Right alignment for numbers and left - for strings.
        c                 S  s   t | jtjƒrdS dS )Nrn   Úl)Ú
issubclassr\   ÚnpÚnumber)Zdtyper   r   r   Úget_col_type  s    zGLatexFormatter._get_column_format_based_on_dtypes.<locals>.get_col_typer   )r!   ÚdtypesZ_valuesr7   Úmap)r(   r·   r¸   r   r   r   r²     s    
z1LatexFormatter._get_column_format_based_on_dtypesc                 C  s   | j jrd| jjj S dS )zGet index column format.r³   r   )r    r0   r!   r@   r>   r   r   r   r±     s    z LatexFormatter._get_index_format)FNFNFNNN)r]   rs   rt   ru   r)   r­   rv   r¬   r®   r€   Úsetterr²   r±   r   r   r   r   rª   ’  s(   #        ö"rª   r^   r_   r`   c                 C  s   dd„ | D ƒS )züCarry out string replacements for special symbols.

    Parameters
    ----------
    row : list
        List of string, that may contain special symbols.

    Returns
    -------
    list
        list of strings with the special symbols replaced.
    c                 S  sp   g | ]h}|rh|d krh|  dd¡  dd¡  dd¡  dd¡  d	d
¡  dd¡  dd¡  dd¡  dd¡  dd¡nd ‘qS )rU   ú\z\textbackslash Ú_z\_ú%z\%ú$z\$ú#z\#rœ   z\{rg   z\}ú~z\textasciitilde ú^z\textasciicircum ú&z\&)Úreplacera   r   r   r   rM   "  sB   ýö
ö ÿ þ ý ü û ú ù ø	 ÷z#_escape_symbols.<locals>.<listcomp>r   )r9   r   r   r   rc     s    ñrc   r*   )r:   Úilevelsr   c                   s   ‡ fdd„t | ƒD ƒS )z%Convert elements in ``crow`` to bold.c                   s4   g | ],\}}|ˆ k r,|  ¡ d kr,d|› d�n|‘qS ))r   rU   z\textbf{rg   )rh   )rI   rm   rO   ©rÄ   r   r   rM   7  s   ÿz$_convert_to_bold.<locals>.<listcomp>)Ú	enumerate)r:   rÄ   r   rÅ   r   rd   5  s    
þrd   Ú__main__) ru   Ú
__future__r   Úabcr   r   Útypingr   r   r   Únumpyrµ   Zpandas.core.dtypes.genericr   Zpandas.io.formats.formatr	   r   r   rw   rz   r~   r   r�   r    r¤   r©   rª   rc   rd   r]   ÚdoctestÚtestmodr   r   r   r   Ú<module>   s2   ! ^		dVY.!  
