如何在乳胶 table 中加粗每个单词?

How to make bold each word in a latex table?

下一个示例是我使用 pandas 为报告生成的众多 table 之一,为此我需要将 header 列设为粗体。 由于 tables 需要其他处理,我以前做不到,这意味着我真的需要在 LateX 代码中进行更改。 我从 python 代码中以字符串的形式在 LateX 中获得了完整的 table。

\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}

有没有一种简单的方法可以使 header 列加粗?即,我想获得以下输出:

\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}

我认为这可以用正则表达式来完成,但我无法理解。当 content 不为空时,我需要替换每次出现的 {content} 。 有人可以帮忙吗?

我建议使用 tabularray 包。这允许在 table 开始时做出有关格式化的所有决定,因此您只需将以前的 tabular 环境与新设置交换,而不必触摸单元格本身.你甚至可以让乳胶为你做这个:

\documentclass{article}

\usepackage{float}
\usepackage{tabularray}[=v2021]
\usepackage{multirow}
\UseTblrLibrary{booktabs}

\renewenvironment{tabular}[1]{
  \begin{tblr}{
    row{1-2}={font=\bfseries},
    colspec={#1}
  }
}{\end{tblr}}


\begin{document}

\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}

\end{document}

下面的代码应该会为您提供所需的输出。基本上搜索 header 部分,然后用正则表达式替换 non-empty 括号。这部分也可以用一些 for 循环来完成,但这看起来更干净。

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'