表格标题中的列宽有问题

表格标题中的列宽有问题

好吧,我们都知道在 LaTeX 中编写表格并不容易,然而,尽管有大量现有的软件包和选项可以实现这一点,但我仍然有一些无法解决的问题,我想修复它们。

第一个问题与列宽有关。特别是当单元格包含大量文本时,或者当标题的标题比同一列的内容宽度更长时,情况更常见。这会导致表格内容呈现出可怕的对齐方式,就像在 M$ Word 中制作的那样。

我的第二个问题是垂直对齐,因为我似乎总是认为文本与单元格的顶部边缘对齐不正确。

下表就是一个例子:

\begin{table}[!htb]
\caption{Mezclas de Óxidos de Ir y Ru.} %Tabla 6.2. 
\label{taula:oximixs2}
\begin{center}
\begin{tabular}{cp{30pt}p{30pt}p{55pt}p{45pt}p{43pt}} \hline
\textbf{Óxido}  & \textbf{Sal Precursora} & \textbf{Peso molecular (\si[detect-weight= true]{\g\per\mole})} & \textbf{Volumen de \BPChem{H\_2O} deionizada (\si[detect-weight= true]{\litre})} & \textbf{M (\si[detect-weight= true]{\mole\per\litre})} & \textbf{Cantidad de sal (\si[detect-weight= true]{\g})} \\ \hline
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 80:20} & \BPChem{H\_2IrCl\_6} & 515 & 0.02 & 0.01 & 0.1030 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.005 & 0.01 & 0.0131 \\
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 50:50} & \BPChem{H\_2IrCl\_6} & 515 & 0.0125 & 0.01 & 0.0644 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.0125 & 0.01 & 0.0327 \\
 \multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 20:80} & \BPChem{H\_2IrCl\_6} & 515    & 0.005  & 0.01 & 0.0258 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.02 & 0.01 & 0.0523 \\ \hline
\end{tabular}
\end{center}
\end{table}

好吧,也许没有序言来构建一个没有告诉你任何事情的最小工作示例,因此从原始文档中获取最小包,这将是这样的:

\documentclass[notitlepage,openbib]{book}
\usepackage[utf8]{inputenc}
\usepackage[TS1,T1]{fontenc}
\usepackage[spanish,activeacute,mexico]{babel}
\usepackage[osf]{mathpazo}
\usepackage{amsmath,amsthm,amstext,amssymb}
\usepackage{multicol}
\usepackage[cbgreek]{bpchem}
\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)} },
}

\begin{document}
    \begin{table}[!htb]
\caption{Mezclas de Óxidos de Ir y Ru.} %Tabla 6.2. 
\label{taula:oximixs2}
\begin{center}
\begin{tabular}{cp{30pt}p{30pt}p{55pt}p{45pt}p{43pt}} \hline
\textbf{Óxido}  & \textbf{Sal Precursora} & \textbf{Peso molecular (\si[detect-weight= true]{\g\per\mole})} & \textbf{Volumen de \BPChem{H\_2O} deionizada (\si[detect-weight= true]{\litre})} & \textbf{M (\si[detect-weight= true]{\mole\per\litre})} & \textbf{Cantidad de sal (\si[detect-weight= true]{\g})} \\ \hline
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 80:20} & \BPChem{H\_2IrCl\_6} & 515 & 0.02 & 0.01 & 0.1030 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.005 & 0.01 & 0.0131 \\
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 50:50} & \BPChem{H\_2IrCl\_6} & 515 & 0.0125 & 0.01 & 0.0644 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.0125 & 0.01 & 0.0327 \\
 \multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 20:80} & \BPChem{H\_2IrCl\_6} & 515    & 0.005  & 0.01 & 0.0258 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.02 & 0.01 & 0.0523 \\ \hline
\end{tabular}
\end{center}
\end{table}
\end{document}

我的工作方式是反复试验,这不是最有效的方法,所以接受建议。

答案1

我建议您做出以下更改:

  • 我建议不要计算各个列的宽度,让整个tabular环境占据(或多或少)文本块的宽度,而是使用环境tabularx,至少在开始时为五个数据列分配相等的宽度。列宽度的微调应该在最后进行。

  • 将内容设置为“不对齐”而不是完全对齐,同时仍允许使用连字符。实现此目的的一种方法是通过\RaggedRight列属性规范中的指令。(我应该指出,我不熟悉西班牙语的连字符规则。)

  • 使用包的线条绘制命令booktabs,并增加三个主要行组之间的间隔。

  • 您可能想问自己是否有必要将表格标题排版为粗体。只是一个想法。

在此处输入图片描述

\documentclass[notitlepage,openbib]{book}
\usepackage[utf8]{inputenc}
\usepackage[TS1,T1]{fontenc}
\usepackage[spanish,activeacute,mexico]{babel}
\usepackage[osf]{mathpazo}
\usepackage{amsmath,amsthm,amstext,amssymb}

\usepackage{multirow,tabularx,ragged2e,booktabs}
\newcolumntype{Y}{>{\RaggedRight\arraybackslash}X}

\usepackage[cbgreek]{bpchem}
\usepackage[per-mode=symbol]{siunitx}
\sisetup{ detect-weight = true,
          output-decimal-marker = {,},
          range-units = brackets,
          list-final-separator = { \translate{and} },
          list-pair-separator = { \translate{and} },
          range-phrase = { \translate{to (numerical range)} } }
\begin{document}
\begin{table}
\caption{Mezclas de Óxidos de Ir y Ru.} %Tabla 6.2.
\label{taula:oximixs2}
\begin{tabularx}{\textwidth}{@{} l *{5}{Y} @{}} 
\toprule
\textbf{Óxido}  & \textbf{Sal Precursora} & \textbf{Peso molecular (\si{\g\per\mole})} 
& \textbf{Volumen de \BPChem{H\_2O} deionizada (\si{\litre})} & \textbf{M (\si{\mole\per\litre})} 
& \textbf{Cantidad de sal (\si{\g})} \\ 
\midrule
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 80:20} 
 & \BPChem{H\_2IrCl\_6} & 515 & 0.02 & 0.01 & 0.1030 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.005 & 0.01 & 0.0131 \\ \addlinespace
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 50:50} 
 & \BPChem{H\_2IrCl\_6} & 515 & 0.0125 & 0.01 & 0.0644 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.0125 & 0.01 & 0.0327 \\ \addlinespace
 \multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 20:80} 
 & \BPChem{H\_2IrCl\_6} & 515    & 0.005  & 0.01 & 0.0258 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.02 & 0.01 & 0.0523 \\ 
\bottomrule
\end{tabularx}
\end{table}
\end{document}

附录:一个重要的改进是将数据列中的数字与小数点对齐。这可以通过S整体使用列类型来实现,同时使用先前定义的Y列类型作为标题。这样做还可以确保所有数据列的宽度相同。

在此处输入图片描述

\begin{table}
\caption{Mezclas de Óxidos de Ir y Ru.} %Tabla 6.2.
\label{taula:oximixs2}
\begin{tabularx}{\textwidth}{@{} l Y S[table-format=3.2] S[table-format=1.4] 
                                     S[table-format=1.2] S[table-format=1.4] @{}} 
\toprule
\textbf{Óxido}  & \textbf{Sal Precursora} & 
\multicolumn{1}{Y}{\textbf{Peso molecular (\si{\g\per\mole})}} & 
\multicolumn{1}{Y}{\textbf{Volumen de \BPChem{H\_2O} deionizada (\si{\litre})}} & 
\multicolumn{1}{Y}{\textbf{M (\si{\mole\per\litre})}} & 
\multicolumn{1}{Y@{}}{\textbf{Cantidad de sal (\si{\g})}} \\
\midrule
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 80:20} 
 & \BPChem{H\_2IrCl\_6} & 515 & 0.02 & 0.01 & 0.1030 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.005 & 0.01 & 0.0131 \\ \addlinespace
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 50:50} 
 & \BPChem{H\_2IrCl\_6} & 515 & 0.0125 & 0.01 & 0.0644 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.0125 & 0.01 & 0.0327 \\ \addlinespace
 \multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 20:80} 
 & \BPChem{H\_2IrCl\_6} & 515    & 0.005  & 0.01 & 0.0258 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.02 & 0.01 & 0.0523 \\ 
\bottomrule
\end{tabularx}
\end{table}

S[table-format=3.2]指令告诉 LaTeX 将数字输入与小数点对齐,同时为三位数字留出足够的空间和两位数字小数点标记。我选择了3和,2因为它与您提供的输入相匹配。同样,S[table-format=1.4]针对小数点标记前一位数字、小数点标记后四位数字的数字输入进行了优化。由于S列类型用于数字输入,因此如果某些单元格包含非数字输入,则必须小心格式化;在此表中,非数字单元格(在标题行中)通过列Y类型进行格式化。另外,@{}代码片段指示 LaTeX不是在表格的第一列之前和最后一列之后插入空格。(将“我的”表格的外观与 Andrew Swann 的答案进行比较,然后决定您更喜欢哪种外观。)

答案2

在此处输入图片描述

\documentclass[notitlepage,openbib]{book}
\usepackage[utf8]{inputenc}
\usepackage[TS1,T1]{fontenc}
\usepackage[spanish,activeacute,mexico]{babel}
\usepackage[osf]{mathpazo}
\usepackage{amsmath,amsthm,amstext,amssymb}
\usepackage{multirow,array,booktabs}
\usepackage[cbgreek]{bpchem}
\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)} },}

\newcolumntype{R}[1]{>{\raggedright\arraybackslash}p{#1pt}}
\begin{document}
    \begin{table}[!htb]
\caption{Mezclas de Óxidos de Ir y Ru.} %Tabla 6.2. 
\label{taula:oximixs2}
\begin{center}
\begin{tabular}{cR{30}R{30}R{55}R{45}R{43}} \toprule
\textbf{Óxido}  & \textbf{Sal Precursora} & \textbf{Peso molecular (\si[detect-weight= true]{\g\per\mole})} & \textbf{Volumen de \BPChem{H\_2O} deionizada (\si[detect-weight= true]{\litre})} & \textbf{M (\si[detect-weight= true]{\mole\per\litre})} & \textbf{Cantidad de sal (\si[detect-weight= true]{\g})} \\ \midrule
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 80:20} & \BPChem{H\_2IrCl\_6} & 515 & 0.02 & 0.01 & 0.1030 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.005 & 0.01 & 0.0131 \\
\multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 50:50} & \BPChem{H\_2IrCl\_6} & 515 & 0.0125 & 0.01 & 0.0644 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.0125 & 0.01 & 0.0327 \\
 \multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 20:80} & \BPChem{H\_2IrCl\_6} & 515    & 0.005  & 0.01 & 0.0258 \\
 & \BPChem{RuCl\_3} & 261.42 & 0.02 & 0.01 & 0.0523 \\ \bottomrule
\end{tabular}
\end{center}
\end{table}
\end{document}

答案3

要点是不要期望列标题的格式与列条目的格式相同。您可以使用命令为标题指定不同的格式\multicolumn。最好将其包含在个人宏中。准备好手动打破这些标题。但要格式化,以便 LaTeX 尽可能多地处理间距。

在表格中,最好使用siunitx特殊类型的列来设置小数S;然后您会得到指定的正确小数标记,并且数字会与其对齐。

示例输出

\documentclass[notitlepage,openbib]{book}
\usepackage[utf8]{inputenc}
\usepackage[TS1,T1]{fontenc}
\usepackage[spanish,activeacute,mexico]{babel}
\usepackage[osf]{mathpazo}
\usepackage{amsmath,amsthm,amstext,amssymb}
\usepackage{multirow}
\usepackage[cbgreek]{bpchem}
\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)} },
}

\begin{document}
    \begin{table}[!htb]
\caption{Mezclas de Óxidos de Ir y Ru.} %Tabla 6.2. 
\label{taula:oximixs2}
\begin{center}
  \newcommand{\myhd}[1]{\multicolumn{1}{c}{\textbf{#1}}}
  \begin{tabular}{clSSSS} \hline \myhd{Óxido} & \myhd{Sal} &
    \myhd{Peso molecular}
    & \myhd{Volumen de} & \myhd{M} & \myhd{Cantidad de} \\
    & \myhd{Precursora} & \myhd{(\si[detect-weight=
    true]{\g\per\mole})} & \myhd{\BPChem{H\_2O} deionizada
    (\si[detect-weight= true]{\litre})}& \myhd{ (\si[detect-weight=
    true]{\mole\per\litre})} & \myhd{ sal (\si[detect-weight=
    true]{\g})}\\
    \hline
    \multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 80:20} &
    \BPChem{H\_2IrCl\_6} & 515 & 0.02 & 0.01 & 0.1030 \\
    & \BPChem{RuCl\_3} & 261.42 & 0.005 & 0.01 & 0.0131 \\
    \multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 50:50} & \BPChem{H\_2IrCl\_6}
    & 515 & 0.0125 & 0.01 & 0.0644 \\
    & \BPChem{RuCl\_3} & 261.42 & 0.0125 & 0.01 & 0.0327 \\
    \multirow{2}{*}{\BPChem{Ir:Ru-O\_x} 20:80} & \BPChem{H\_2IrCl\_6}
    & 515    & 0.005  & 0.01 & 0.0258 \\
    & \BPChem{RuCl\_3} & 261.42 & 0.02 & 0.01 & 0.0523 \\ \hline
  \end{tabular}
\end{center}
\end{table}

\end{document}

相关内容