@@ -33,7 +33,7 @@ def test_minimal_latex_tabular(styler):
3333    expected  =  dedent (
3434        """\  
3535\\ begin{tabular}{lrrl}
36-         {}  & {A}  & {B}  & {C}  \\ \\  
36+          & A  & B  & C  \\ \\  
3737        0 & 0 & -0.61 & ab \\ \\  
3838        1 & 1 & -1.22 & cd \\ \\  
3939        \\ end{tabular} 
@@ -47,7 +47,7 @@ def test_tabular_hrules(styler):
4747        """\  
4848\\ begin{tabular}{lrrl}
4949        \\ toprule 
50-         {}  & {A}  & {B}  & {C}  \\ \\  
50+          & A  & B  & C  \\ \\  
5151        \\ midrule 
5252        0 & 0 & -0.61 & ab \\ \\  
5353        1 & 1 & -1.22 & cd \\ \\  
@@ -69,7 +69,7 @@ def test_tabular_custom_hrules(styler):
6969        """\  
7070\\ begin{tabular}{lrrl}
7171        \\ hline 
72-         {}  & {A}  & {B}  & {C}  \\ \\  
72+          & A  & B  & C  \\ \\  
7373        0 & 0 & -0.61 & ab \\ \\  
7474        1 & 1 & -1.22 & cd \\ \\  
7575        \\ otherline 
@@ -170,7 +170,7 @@ def test_cell_styling(styler):
170170    expected  =  dedent (
171171        """\  
172172\\ begin{tabular}{lrrl}
173-         {}  & {A}  & {B}  & {C}  \\ \\  
173+          & A  & B  & C  \\ \\  
174174        0 & 0 & \\ itshape {\\ Huge -0.61} & ab \\ \\  
175175        1 & \\ itshape {\\ Huge 1} & -1.22 & \\ itshape {\\ Huge cd} \\ \\  
176176        \\ end{tabular} 
@@ -185,8 +185,8 @@ def test_multiindex_columns(df):
185185    expected  =  dedent (
186186        """\  
187187\\ begin{tabular}{lrrl}
188-         {}  & \\ multicolumn{2}{r}{A} & {B}  \\ \\  
189-         {}  & {a}  & {b}  & {c}  \\ \\  
188+          & \\ multicolumn{2}{r}{A} & B  \\ \\  
189+          & a  & b  & c  \\ \\  
190190        0 & 0 & -0.61 & ab \\ \\  
191191        1 & 1 & -1.22 & cd \\ \\  
192192        \\ end{tabular} 
@@ -199,8 +199,8 @@ def test_multiindex_columns(df):
199199    expected  =  dedent (
200200        """\  
201201\\ begin{tabular}{lrrl}
202-         {}  & {A}  & {A}  & {B}  \\ \\  
203-         {}  & {a}  & {b}  & {c}  \\ \\  
202+          & A  & A  & B  \\ \\  
203+          & a  & b  & c  \\ \\  
204204        0 & 0 & -0.61 & ab \\ \\  
205205        1 & 1 & -1.22 & cd \\ \\  
206206        \\ end{tabular} 
@@ -218,7 +218,7 @@ def test_multiindex_row(df):
218218    expected  =  dedent (
219219        """\  
220220\\ begin{tabular}{llrrl}
221-         {}  & {}  & {A}  & {B}  & {C}  \\ \\  
221+          &  & A  & B  & C  \\ \\  
222222        \\ multirow[c]{2}{*}{A} & a & 0 & -0.61 & ab \\ \\  
223223         & b & 1 & -1.22 & cd \\ \\  
224224        B & c & 2 & -2.22 & de \\ \\  
@@ -232,7 +232,7 @@ def test_multiindex_row(df):
232232    expected  =  dedent (
233233        """\  
234234\\ begin{tabular}{llrrl}
235-         {}  & {}  & {A}  & {B}  & {C}  \\ \\  
235+          &  & A  & B  & C  \\ \\  
236236        A & a & 0 & -0.61 & ab \\ \\  
237237        A & b & 1 & -1.22 & cd \\ \\  
238238        B & c & 2 & -2.22 & de \\ \\  
@@ -251,8 +251,8 @@ def test_multiindex_row_and_col(df):
251251    expected  =  dedent (
252252        """\  
253253\\ begin{tabular}{llrrl}
254-         {}  & {}  & \\ multicolumn{2}{l}{Z} & {Y}  \\ \\  
255-         {}  & {}  & {a}  & {b}  & {c}  \\ \\  
254+          &  & \\ multicolumn{2}{l}{Z} & Y  \\ \\  
255+          &  & a  & b  & c  \\ \\  
256256        \\ multirow[b]{2}{*}{A} & a & 0 & -0.61 & ab \\ \\  
257257         & b & 1 & -1.22 & cd \\ \\  
258258        B & c & 2 & -2.22 & de \\ \\  
@@ -266,8 +266,8 @@ def test_multiindex_row_and_col(df):
266266    expected  =  dedent (
267267        """\  
268268\\ begin{tabular}{llrrl}
269-         {}  & {}  & {Z}  & {Z}  & {Y}  \\ \\  
270-         {}  & {}  & {a}  & {b}  & {c}  \\ \\  
269+          &  & Z  & Z  & Y  \\ \\  
270+          &  & a  & b  & c  \\ \\  
271271        A & a & 0 & -0.61 & ab \\ \\  
272272        A & b & 1 & -1.22 & cd \\ \\  
273273        B & c & 2 & -2.22 & de \\ \\  
@@ -287,15 +287,15 @@ def test_multi_options(df):
287287
288288    expected  =  dedent (
289289        """\  
290- {}  & {}  & \\ multicolumn{2}{r}{Z} & {Y}  \\ \\ 
291-     {}  & {}  & {a}  & {b}  & {c}  \\ \\  
290+ \\ multicolumn{2}{r}{Z} & Y  \\ \\ 
291+      &  & a  & b  & c  \\ \\  
292292    \\ multirow[c]{2}{*}{A} & a & 0 & -0.61 & ab \\ \\  
293293    """ 
294294    )
295295    assert  expected  in  styler .to_latex ()
296296
297297    with  option_context ("styler.latex.multicol_align" , "l" ):
298-         assert  "{}  & {}  & \\ multicolumn{2}{l}{Z} & {Y}  \\ \\ "  in  styler .to_latex ()
298+         assert  " &  & \\ multicolumn{2}{l}{Z} & Y  \\ \\ "  in  styler .to_latex ()
299299
300300    with  option_context ("styler.latex.multirow_align" , "b" ):
301301        assert  "\\ multirow[b]{2}{*}{A} & a & 0 & -0.61 & ab \\ \\ "  in  styler .to_latex ()
@@ -342,7 +342,7 @@ def test_hidden_index(styler):
342342    expected  =  dedent (
343343        """\  
344344\\ begin{tabular}{rrl}
345-         {A}  & {B}  & {C}  \\ \\  
345+         A  & B  & C  \\ \\  
346346        0 & -0.61 & ab \\ \\  
347347        1 & -1.22 & cd \\ \\  
348348        \\ end{tabular} 
@@ -385,8 +385,8 @@ def test_comprehensive(df, environment):
385385\\ rowcolors{3}{pink}{}
386386\\ begin{tabular}{rlrlr}
387387\\ toprule
388- {}  & {}  & \\ multicolumn{2}{r}{Z} & {Y}  \\ \\ 
389- {}  & {}  & {a}  & {b}  & {c}  \\ \\ 
388+  &  & \\ multicolumn{2}{r}{Z} & Y  \\ \\  
389+  &  & a  & b  & c  \\ \\  
390390\\ midrule
391391\\ multirow[c]{2}{*}{A} & a & 0 & \\ textbf{\\ cellcolor[rgb]{1,1,0.6}{-0.61}} & ab \\ \\ 
392392 & b & 1 & -1.22 & cd \\ \\  
@@ -580,12 +580,12 @@ def test_longtable_comprehensive(styler):
580580\\ begin{longtable}{lrrl}
581581        \\ caption[short]{full} \\ label{fig:A} \\ \\  
582582        \\ toprule 
583-         {}  & {A}  & {B}  & {C}  \\ \\  
583+          & A  & B  & C  \\ \\  
584584        \\ midrule 
585585        \\ endfirsthead 
586586        \\ caption[]{full} \\ \\  
587587        \\ toprule 
588-         {}  & {A}  & {B}  & {C}  \\ \\  
588+          & A  & B  & C  \\ \\  
589589        \\ midrule 
590590        \\ endhead 
591591        \\ midrule 
@@ -607,9 +607,9 @@ def test_longtable_minimal(styler):
607607    expected  =  dedent (
608608        """\  
609609\\ begin{longtable}{lrrl}
610-         {}  & {A}  & {B}  & {C}  \\ \\  
610+          & A  & B  & C  \\ \\  
611611        \\ endfirsthead 
612-         {}  & {A}  & {B}  & {C}  \\ \\  
612+          & A  & B  & C  \\ \\  
613613        \\ endhead 
614614        \\ multicolumn{4}{r}{Continued on next page} \\ \\  
615615        \\ endfoot 
@@ -623,27 +623,34 @@ def test_longtable_minimal(styler):
623623
624624
625625@pytest .mark .parametrize ( 
626-     "sparse, exp" , 
626+     "sparse, exp, siunitx " , 
627627    [ 
628-         (True , "{} & \\ multicolumn{2}{r}{A} & {B}" ), 
629-         (False , "{} & {A} & {A} & {B}" ), 
628+         (True , "{} & \\ multicolumn{2}{r}{A} & {B}" , True ), 
629+         (False , "{} & {A} & {A} & {B}" , True ), 
630+         (True , " & \\ multicolumn{2}{r}{A} & B" , False ), 
631+         (False , " & A & A & B" , False ), 
630632    ], 
631633) 
632- def  test_longtable_multiindex_columns (df , sparse , exp ):
634+ def  test_longtable_multiindex_columns (df , sparse , exp ,  siunitx ):
633635    cidx  =  MultiIndex .from_tuples ([("A" , "a" ), ("A" , "b" ), ("B" , "c" )])
634636    df .columns  =  cidx 
637+     with_si  =  "{} & {a} & {b} & {c} \\ \\ " 
638+     without_si  =  " & a & b & c \\ \\ " 
635639    expected  =  dedent (
636640        f"""\  
637- \\ begin{{longtable}}{{lrrl }}
641+ \\ begin{{longtable}}{{l { "SS"   if   siunitx   else   "rr" } l }}
638642        { exp } \\ \\  
639-         {{}} & {{a}} & {{b}} & {{c}}  \\ \\  
643+         { with_si   if   siunitx   else   without_si }  
640644        \\ endfirsthead 
641645        { exp } \\ \\  
642-         {{}} & {{a}} & {{b}} & {{c}}  \\ \\  
646+         { with_si   if   siunitx   else   without_si }  
643647        \\ endhead 
644648        """ 
645649    )
646-     assert  expected  in  df .style .to_latex (environment = "longtable" , sparse_columns = sparse )
650+     result  =  df .style .to_latex (
651+         environment = "longtable" , sparse_columns = sparse , siunitx = siunitx 
652+     )
653+     assert  expected  in  result 
647654
648655
649656@pytest .mark .parametrize ( 
@@ -661,7 +668,7 @@ def test_longtable_caption_label(styler, caption, cap_exp, label, lab_exp):
661668    expected  =  dedent (
662669        f"""\  
663670{ cap_exp1 } { lab_exp } \\ \\ 
664-         {{}}  & {{A}}  & {{B}}  & {{C}}  \\ \\  
671+          & A  & B  & C  \\ \\  
665672        \\ endfirsthead 
666673        { cap_exp2 } \\ \\  
667674        """ 
@@ -672,8 +679,15 @@ def test_longtable_caption_label(styler, caption, cap_exp, label, lab_exp):
672679
673680
674681@pytest .mark .parametrize ("index" , [True , False ]) 
675- @pytest .mark .parametrize ("columns" , [True , False ]) 
676- def  test_apply_map_header_render_mi (df , index , columns ):
682+ @pytest .mark .parametrize ( 
683+     "columns, siunitx" , 
684+     [ 
685+         (True , True ), 
686+         (True , False ), 
687+         (False , False ), 
688+     ], 
689+ ) 
690+ def  test_apply_map_header_render_mi (df , index , columns , siunitx ):
677691    cidx  =  MultiIndex .from_tuples ([("Z" , "a" ), ("Z" , "b" ), ("Y" , "c" )])
678692    ridx  =  MultiIndex .from_tuples ([("A" , "a" ), ("A" , "b" ), ("B" , "c" )])
679693    df .loc [2 , :] =  [2 , - 2.22 , "de" ]
@@ -688,7 +702,7 @@ def test_apply_map_header_render_mi(df, index, columns):
688702    if  columns :
689703        styler .applymap_index (func , axis = "columns" )
690704
691-     result  =  styler .to_latex ()
705+     result  =  styler .to_latex (siunitx = siunitx )
692706
693707    expected_index  =  dedent (
694708        """\  
@@ -699,13 +713,17 @@ def test_apply_map_header_render_mi(df, index, columns):
699713    )
700714    assert  (expected_index  in  result ) is  index 
701715
702-     expected_columns  =  dedent (
716+     exp_cols_si  =  dedent (
703717        """\  
704718\\ multicolumn{2}{r}{\\ bfseries{Z}} & {Y} \\ \\ 
705719    {} & {} & {a} & {b} & {\\ bfseries{c}} \\ \\  
706720    """ 
707721    )
708-     assert  (expected_columns  in  result ) is  columns 
722+     exp_cols_no_si  =  """\  
723+ \\ multicolumn{2}{r}{\\ bfseries{Z}} & Y \\ \\ 
724+  &  & a & b & \\ bfseries{c} \\ \\  
725+ """ 
726+     assert  ((exp_cols_si  if  siunitx  else  exp_cols_no_si ) in  result ) is  columns 
709727
710728
711729def  test_repr_option (styler ):
@@ -714,3 +732,8 @@ def test_repr_option(styler):
714732    with  option_context ("styler.render.repr" , "latex" ):
715733        assert  "\\ begin{tabular}"  in  styler ._repr_latex_ ()[:15 ]
716734        assert  styler ._repr_html_ () is  None 
735+ 
736+ 
737+ def  test_siunitx_basic_headers (styler ):
738+     assert  "{} & {A} & {B} & {C} \\ \\ "  in  styler .to_latex (siunitx = True )
739+     assert  " & A & B & C \\ \\ "  in  styler .to_latex ()  # default siunitx=False 
0 commit comments