如何使带有长标题单元格的表格适合“S”型列?

如何使带有长标题单元格的表格适合“S”型列?

对我来说,在 LaTeX 中很好地匹配表格很难,我不知道是否有手册介绍这方面的良好做法。我需要创建一个包含 S 列并列数字的表格,但这些列的标题很长,我无法找到使用此处学到的技巧将其放入页面的方法。

我的 MWE 可能是这样的:

\documentclass[fontsize=11pt,paper=letter,headings=small,bibliography=totoc,DIV=9,headsepline=true]{scrartcl}
\usepackage[utf8]{inputenx}
\usepackage[TS1,T1]{fontenc}
\usepackage{textcomp}
\usepackage[spanish,mexico]{babel}
\usepackage[intlimits]{amsmath}
\usepackage{xspace}
\usepackage{xkeyval}
\usepackage{array,multirow,tabularx,ragged2e,booktabs}
%\newcolumntype{Y}{>{\RaggedRight\arraybackslash\hspace{0pt}}X}
\newcolumntype{Y}{>{\RaggedRight\arraybackslash}X}
%\newcolumntype{C}{>{\centering\arraybackslash\hspace{0pt}}X}
\usepackage{rotating}
\usepackage{colortbl}
\usepackage[per-mode=symbol]{siunitx}
\sisetup{
    output-decimal-marker = {,}, 
    range-units = brackets,
    list-final-separator = { \translate{and} },
    list-pair-separator = { \translate{and} },
    range-phrase = { \translate{to (numerical range)} },
}
\ExplSyntaxOn
\providetranslation [ to = Spanish ]
{ to~(numerical~range) } { a }%substitute the right word here
\ExplSyntaxOff


\begin{document}

\begin{table}[htb]
    \caption{Capacidad de generación eléctrica en México}
    \label{tab:CGE}
    \centering

    \begin{tabularx}{\textwidth}{@{} l S S[table-format=6.2] S[table-format=3.2]@{}}
    \toprule
        & \textbf{Permisos de la CRE} & \textbf{Capacidad de generación de energía} [\si{\giga\watt\hour}] & \textbf{Porcentaje}\\
    \midrule
    % Pública
    \textbf{Energía de generación propia} & & \textbf{169,900.00} & \textbf{42.25} \\
    \midrule
    \textbf{Pemex} & &  & \\
    \textbf{Autoabastecimiento} & 31 & 2526.40 & 0.61 \\
    \textbf{Cogeneración} & 18 & 7049.04 & 1.75 \\ 
    \textbf{Subtotal} & & 9575.44 & 2.38 \\
    % Privada
    \midrule
    \textbf{Autoabastecimiento} & 486 & 67145.80 & 16.70 \\
    \textbf{Cogeneración} & 109 & 18153.66 & 4.51 \\
    \textbf{Producción independiente} & 30 & 105634.80 & 26.27 \\
    \textbf{Exportación} & 8 & 13295.60 & 3.31 \\
    \textbf{Importación} & 44 & 2061.30 & 0.51 \\
    \textbf{Pequeña producción} & 178 & 12212.60 & 3.04 \\
    \textbf{Usos Propios Continuos} & 36 & 1523.50 & 0.38 \\
    \textbf{Pemex-Cogeneración} & 1 & 2628.00 & 0.65 \\
    \textbf{Subtotal} & 844 & 222655.26 & 55.37 \\
    \textbf{Total CRE} & 892 & 232230.70 & 57.75 \\
    \midrule
    \textbf{Total} & 892 & 402130.14 & 100 \\
    \bottomrule
    \end{tabularx}
\end{table}

\end{document}

如您所见,我的第一个问题是让表格适合页面。第二个问题是用粗体显示标题行中的单位。第三个问题是在表格左侧添加一列以指定公共和私有生成,但我认为在解决第一个问题之后这个问题很容易解决。

抱歉,如果这是一个重复的问题,但我没有在之前阅读的问题中找到答案。

答案1

解决方案是makecell包,它允许在单元格中换行,并对列标题进行通用格式设置。在行中添加了一个小的垂直填充,并将l列替换为X。最后,我擅自纠正了第二行粗体数字格式的一些不一致之处。

\documentclass[fontsize=11pt,paper=letter,headings=small,bibliography=totoc,DIV=9,headsepline=true]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[TS1,T1]{fontenc}
\usepackage{textcomp}
\usepackage[spanish,mexico]{babel}
\usepackage[intlimits]{amsmath}
\usepackage{xspace}
\usepackage{xkeyval}
\usepackage{array,multirow,tabularx,ragged2e, booktabs}
%\newcolumntype{Y}{>{\RaggedRight\arraybackslash\hspace{0pt}}X}
\newcolumntype{Y}{>{\RaggedRight\arraybackslash}X}
%\newcolumntype{C}{>{\centering\arraybackslash\hspace{0pt}}X}
\usepackage{rotating}
\usepackage{colortbl}
\usepackage[per-mode=symbol]{siunitx}
\sisetup{
output-decimal-marker = {,},
range-units = brackets,
list-final-separator = { \translate{and} },
list-pair-separator = { \translate{and} },
range-phrase = { \translate{to (numerical range)} },
}
\ExplSyntaxOn
\providetranslation [ to = Spanish ]
{ to~(numerical~range) } { a }%substitute the right word here
\ExplSyntaxOff

\usepackage{makecell}
\renewcommand\theadfont{\bfseries}
\renewcommand\theadalign{bc}
\setcellgapes{1.5pt}

\begin{document}

\begin{table}[htb]
  \centering\makegapedcells
  \caption{Capacidad de generación eléctrica en México}
  \label{tab:CGE}
  \begin{tabularx}{\linewidth}{@{}>{\bfseries\RaggedRight}X S S[table-format=6.2] S[table-format=2.2]@{}}
    \addlinespace
    \toprule
    \addlinespace[-0.3ex]
    & {\thead{Permisos\\ de la CRE}} & {\thead{Capacidad de \\generación de\\ energía (\si{\giga\watt\hour})}}
    & {\thead{Porcentaje}}\\[-0.6ex]
    \midrule
    % Pública
    Energía de generación propia & & \textbf{169\,900,00} & \textbf{42,25} \\
    \midrule
    Pemex & & & \\
    Autoabastecimiento & 31 & 2526.40 & 0.61 \\
    Cogeneración & 18 & 7049.04 & 1.75 \\
    Subtotal & & 9575.44 & 2.38 \\
    % Privada
    \midrule
    Autoabastecimiento & 486 & 67145.80 & 16.70 \\
    Cogeneración & 109 & 18153.66 & 4.51 \\
    Producción independiente & 30 & 105634.80 & 26.27 \\
    Exportación & 8 & 13295.60 & 3.31 \\
    Importación & 44 & 2061.30 & 0.51 \\
    Pequeña producción & 178 & 12212.60 & 3.04 \\
    Usos Propios Continuos & 36 & 1523.50 & 0.38 \\
    Pemex-Cogeneración & 1 & 2628.00 & 0.65 \\
    Subtotal & 844 & 222655.26 & 55.37 \\
    Total CRE & 892 & 232230.70 & 57.75 \\
    \midrule
    Total & 892 & 402130.14 & 100 \\
    \bottomrule
  \end{tabularx}
\end{table}

\end{document} 

enter image description here

答案2

尝试使用较小的字体(如有必要)并将列标题放在更多行中,如下所示: enter image description here

对于上表,我添加了包makecell并将列标题theader放入makecell

\documentclass[fontsize=11pt,paper=letter,headings=small,bibliography=totoc,DIV=9,headsepline=true]{scrartcl}
    \usepackage[utf8]{inputenx}
    \usepackage[TS1,T1]{fontenc}
    \usepackage{textcomp}
    \usepackage[spanish,mexico]{babel}
    \usepackage[intlimits]{amsmath}
    \usepackage{xspace}
    \usepackage{xkeyval}
    \usepackage{array,multirow,tabularx,ragged2e,booktabs}
    \usepackage{makecell}% added
\renewcommand\theadfont{\bfseries}% added
%\newcolumntype{Y}{>{\RaggedRight\arraybackslash\hspace{0pt}}X}
\newcolumntype{Y}{>{\RaggedRight\arraybackslash}X}
%\newcolumntype{C}{>{\centering\arraybackslash\hspace{0pt}}X}
    \usepackage{rotating}
    \usepackage{colortbl}
    \usepackage[per-mode=symbol]{siunitx}
\sisetup{
    output-decimal-marker = {,},
    range-units = brackets,
    list-final-separator = { \translate{and} },
    list-pair-separator = { \translate{and} },
    range-phrase = { \translate{to (numerical range)} },
}
\ExplSyntaxOn
\providetranslation [ to = Spanish ]
{ to~(numerical~range) } { a }%substitute the right word here
\ExplSyntaxOff

    \usepackage[active,floats,tightpage]{preview}
\setlength\PreviewBorder{1em}

    \begin{document}
\begin{table}[htb]
    \small% added
    \caption{Capacidad de generación eléctrica en México}
    \label{tab:CGE}
    \centering

    \begin{tabularx}{\textwidth}{>{\bfseries}l S S[table-format=6.2] S[table-format=3.2]}
    \toprule
        &   {\thead{Permisos\\ 
             de la CRE}}
            &   {\thead{Capacidad de\\ generación de \\ 
                       energía [\si{\giga\watt\hour}]}}
                &   {\thead{Porcentaje}}\\
    \midrule
    % Pública
Energía de generación propia
                    & & \textbf{169,900.00} & \textbf{42.25} \\
    \midrule
Pemex               & &  & \\
Autoabastecimiento  & 31 & 2526.40 & 0.61 \\
Cogeneración        & 18 & 7049.04 & 1.75 \\
Subtotal            & & 9575.44 & 2.38 \\
    % Privada
    \midrule
Autoabastecimiento  & 486 & 67145.80 & 16.70 \\
Cogeneración        & 109 & 18153.66 & 4.51 \\
Producción independiente  & 30 & 105634.80 & 26.27 \\
Exportación         & 8   & 13295.60 & 3.31 \\
Importación         & 44  & 2061.30 & 0.51 \\
Pequeña producción  & 178 & 12212.60 & 3.04 \\
Usos Propios Continuos    & 36 & 1523.50 & 0.38 \\
Pemex-Cogeneración  & 1   & 2628.00 & 0.65 \\
Subtotal            & 844 & 222655.26 & 55.37 \\
Total CRE           & 92  & 232230.70 & 57.75 \\
    \midrule
Total               & 892 & 402130.14 & 100 \\
    \bottomrule
    \end{tabularx}
\end{table}
    \end{document}

对于最终形式,您可以将分列标题分成适当数量的行并选择其他字体大小。

编辑\textbf{....}正如@Manuel 在他的评论中所说,如果您在列类型中包含,则 可以省略第一列>{\bfseries}l。我现在正在考虑这一点并更正上面的代码。

答案3

您不必更改字体大小或放弃基本tabularx结构。您真正需要做的就是 (a) 将前两个数字列的标题单元格的列类型更改为(居中版本的)列类型X,以及 (b) 在最右侧的列标题周围放置花括号,即\textbf{Porcentaje},告诉 LaTeX 将其内容居中。

为了统一和简化表格的外观,我进一步建议您使用选项siunitxgroup-minimum-digits = 4即不要将表格第一行的数字加粗,并在第一列中缩进一些条目(并省略几条水平线)。最后,如果您将第一列的类型指定为 而>{\bfseries}l不是l,则无需\textbf在该列的所有后续单元格中键入内容。

enter image description here

\documentclass[fontsize=11pt,paper=letter,headings=small,
     bibliography=totoc,DIV=9,headsepline=true]{scrartcl}
\usepackage[utf8]{inputenx}
\usepackage[TS1,T1]{fontenc}
\usepackage{textcomp}
\usepackage[spanish,mexico]{babel}
\usepackage[intlimits]{amsmath}
\usepackage{xspace}
\usepackage{xkeyval}
\usepackage{array,multirow,tabularx,ragged2e,booktabs}
\newcolumntype{C}{>{\Centering\arraybackslash\hspace{0pt}}X}
\usepackage{rotating}
\usepackage{colortbl}
\usepackage[per-mode=symbol]{siunitx}
\sisetup{
    output-decimal-marker = {,},
    group-minimum-digits = 4, 
    range-units = brackets,
    list-final-separator = { \translate{and} },
    list-pair-separator = { \translate{and} },
    range-phrase = { \translate{to (numerical range)} },
}
\ExplSyntaxOn
\providetranslation [ to = Spanish ]
{ to~(numerical~range) } { a }%substitute the right word here
\ExplSyntaxOff


\begin{document}

\begin{table}[htb]
    \caption{Capacidad de generación eléctrica en México}
    \label{tab:CGE}
    %%\centering  % not needed

    \begin{tabularx}{\textwidth}{@{} >{\bfseries}l 
         S[table-format=3.0]
         S[table-format=6.2] 
         S[table-format=3.2] @{}}
    \toprule
    & \multicolumn{1}{C}{\textbf{Permisos de la CRE}} 
    & \multicolumn{1}{C}{\textbf{Capacidad de generación de energía} [\si{\giga\watt\hour}]} & 
    {\textbf{Porcentaje}}\\
    \midrule
    % Pública
    Energía de generación propia & & 169900.00 &  42.25 \\
    \midrule
    Pemex & &  & \\
    Autoabastecimiento & 31 & 2526.40 & 0.61 \\
    Cogeneración & 18 & 7049.04 & 1.75 \\ 
    \addlinespace
    \quad Subtotal & & 9575.44 & 2.38 \\
    % Privada
    \addlinespace
    Autoabastecimiento & 486 & 67145.80 & 16.70 \\
    Cogeneración & 109 & 18153.66 & 4.51 \\
    Producción independiente & 30 & 105634.80 & 26.27 \\
    Exportación & 8 & 13295.60 & 3.31 \\
    Importación & 44 & 2061.30 & 0.51 \\
    Pequeña producción & 178 & 12212.60 & 3.04 \\
    Usos Propios Continuos & 36 & 1523.50 & 0.38 \\
    Pemex-Cogeneración & 1 & 2628.00 & 0.65 \\
    \addlinespace
    \quad Subtotal & 844 & 222655.26 & 55.37 \\
    \addlinespace
    \quad Total CRE & 892 & 232230.70 & 57.75 \\
    \midrule
    Total & 892 & 402130.14 & 100.00 \\
    \bottomrule
    \end{tabularx}
\end{table}

\end{document}

答案4

有一种使用默认booktabs包的简单技术。

\begin{tabular}[c]{@{}l@{}} table \\ heading \end{tabular}

例如,在您的表格中,标题“Permisos de la CRE”可以分为两行:

\begin{tabular}[c]{@{}l@{}} Permisos \\ de la CRE \end{tabular}

这可以在表格的任意行或列中完成,而不仅仅是在标题中。

相关内容