好吧,我们都知道在 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}