Issue
The next example is one of many tables I produce with pandas for a report, for which I need to make the header columns bold.
Due to other processing needed for the tables, I can’t make it before, meaning that I really need to make the changes in the LateX code.
I get the full table in LateX as a string from python code.
\begin{table}[H]
\centering
\begin{tabular}{llrrrrr}
\toprule
{} & {} & {\#d} & {\#i} & {\#l} & {\#s} & {\#o} \\
{Dataset} & {Model} & {} & {} & {} & {} & {} \\
\midrule
\multirow[c]{5}{*}{\textit{D (simple)}} & b & 1,026 & 692 & \itshape 31 & 284 & 1,007 \\
& f & 1,366 & 398 & 49 & 238 & 685 \\
& f+d & 1,372 & 415 & 46 & 215 & 676 \\
& f+d+pt & 1,372 & 415 & 46 & 215 & 676 \\
& f+d+tg & \bfseries 1,732 & \itshape 8 & 82 & 262 & \itshape 352 \\
\multirow[c]{5}{*}{\textit{D (complex)}} & b & 527 & 266 & 228 & 589 & 1,083 \\
& f & 759 & 153 & 270 & 470 & 893 \\
& f+d & 749 & 177 & 233 & 456 & 866 \\
& f+d+pt & 749 & 177 & 233 & 456 & 866 \\
& f+d+tg & \bfseries 969 & \itshape 33 & \itshape 38 & \itshape 380 & \itshape 451 \\
\bottomrule
\end{tabular}
\end{table}
Is there a simple way to make the column headers bold? Ie, I’d like to obtain the following output:
\begin{table}[H]
\centering
\begin{tabular}{llrrrrr}
\toprule
{} & {} & {\textbf{\#d}} & {\textbf{\#i}} & {\textbf{\#l}} & {\textbf{\#s}} & {\textbf{\#o}} \\
{\textbf{Dataset}} & {\textbf{Model}} & {} & {} & {} & {} & {} \\
\midrule
\multirow[c]{5}{*}{\textit{D (simple)}} & b & 1,026 & 692 & \itshape 31 & 284 & 1,007 \\
& f & 1,366 & 398 & 49 & 238 & 685 \\
& f+d & 1,372 & 415 & 46 & 215 & 676 \\
& f+d+pt & 1,372 & 415 & 46 & 215 & 676 \\
& f+d+tg & \bfseries 1,732 & \itshape 8 & 82 & 262 & \itshape 352 \\
\multirow[c]{5}{*}{\textit{D (complex)}} & b & 527 & 266 & 228 & 589 & 1,083 \\
& f & 759 & 153 & 270 & 470 & 893 \\
& f+d & 749 & 177 & 233 & 456 & 866 \\
& f+d+pt & 749 & 177 & 233 & 456 & 866 \\
& f+d+tg & \bfseries 969 & \itshape 33 & \itshape 38 & \itshape 380 & \itshape 451 \\
\bottomrule
\end{tabular}
\end{table}
I assume that this can be done with regex but I can’t understand it. I’d need to replace every occurrence of {content}
when content
is not empty.
Can anyone help?
Solution
The code below should give you the desired output. Basically searching for the header section, and then replacing the non-empty brackets with regex. This part can also be done with some for loops but this seems cleaner.
1 { all stuff with 1+ chars except } ->\g<1> 1 }
[\{] ([^}]+?) [\}]
import re
new_table = ''
working_on_header = False
for line in old_table.split('\n'):
if line == '\\toprule':
working_on_header = True
elif line == '\\midrule':
working_on_header = False
elif working_on_header:
line = re.sub(r"[\{]([^}]+?)[\}]", r"{\\textbf{\g<1>}}", line)
new_table += line + '\n'
Answered By – stuckonhere
Answer Checked By – Gilberto Lyons (BugsFixing Admin)