在此,我愿做三件事:
1)我希望我的表格像下面这样
而我的是
2)我希望数字以与标题 p 相同的格式显示(粗体)
3) 我希望 latex 进行一些计算。我的表中的 p 代表女性比例 (女性/(男性 + 女性))。我想知道 latex 是否可以帮我做到这一点,因为我有 16 个组,但不想计算每个组?
% !TEX encoding = UTF-8 Unicode
\documentclass[a4paper,12pt]{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[turkish]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\begin{document}
\begin{table}[h!]
\centering
\begin{tabular}{c|c|c|r}
Group No & Females & Males & \textbf{p} \\ \hline
1 & 18 & 11 & \\
2 & 31 & 22 & \\
3 & 34 & 27 & \\
4 & 33 & 29 & \\
5 & 27 & 24 & \\
6 & 33 & 29 & \\
7 & 28 & 25 & \\
8 & 23 & 26 & \\
9 & 33 & 38 & \\
10 & 12 & 14 & \\
11 & 19 & 23 & \\
12 & 25 & 31 & \\
13 & 14 & 20 & \\
14 & 2 & 20 & \\
15 & 22 & 6 & \\
16 & 7 & 34 & \\
\end{tabular}
\end{table}
\end{document}
答案1
这是一个使用 和 的解决方案collcell
(xparse
对于\fp_eval:n
)
\documentclass{article}
\usepackage{collcell,booktabs,siunitx}
\usepackage{xparse}
\newcolumntype{F}{>{\collectcell\rememberF}c<{\endcollectcell}}
\newcolumntype{M}{>{\collectcell\rememberM}c<{\endcollectcell}}
\newcolumntype{P}{>{\collectcell\computeP}r<{\endcollectcell}}
\newcommand{\rememberF}[1]{%
\gdef\FEMALE{#1}#1%
}
\newcommand{\rememberM}[1]{%
\gdef\MALE{#1}#1%
}
\ExplSyntaxOn
\NewDocumentCommand{\computeP}{}
{
\bfseries\fp_eval:n { round ( \FEMALE/(\FEMALE+\MALE) , 2 ) }
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{c F M P}
\toprule
Group No &
\multicolumn{1}{c}{Females} &
\multicolumn{1}{c}{Males} &
\multicolumn{1}{c}{\textbf{p}} \\
\midrule
1 & 18 & 11 & \\
2 & 31 & 22 & \\
3 & 34 & 27 & \\
4 & 33 & 29 & \\
5 & 27 & 24 & \\
6 & 33 & 29 & \\
7 & 28 & 25 & \\
8 & 23 & 26 & \\
9 & 33 & 38 & \\
10 & 12 & 14 & \\
11 & 19 & 23 & \\
12 & 25 & 31 & \\
13 & 14 & 20 & \\
14 & 2 & 20 & \\
15 & 22 & 6 & \\
16 & 7 & 34 & \\
\bottomrule
\end{tabular}
\end{document}
功能的使用booktabs
不是强制性的,但是没有垂直规则的表格布局会更好。
F
和列类型分别记住和M
中的条目并打印它们,列类型计算比率并打印它。在第一行中,必须使用以避免这些宏启动。\FEMALE
\MALE
P
\multicolumn
可以在宏中更改小数位数\computeP
,我使用的值是2
。
答案2
另一个解决方案是使用spreadtab
包,以及siunitx
和booktabs
来makecell
改善表格的外观。spreadtab 包允许定义计算公式,其中我使用\STcopy{v}{formula}
,其中v
参数使公式翻译为同一列的所有单元格。
另一个功能是我定义了一个rowno
计数器,因此第一列的行号会自动显示,而无需输入它们。
\documentclass[a4paper,12pt]{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage[turkish]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{array, spreadtab, booktabs}
\usepackage{makecell}
\usepackage{siunitx}
\sisetup{table-format = 2.0, table-number-alignment=center}
\newcounter{rowno}
\begin{document}
\begin{table}[h!]
\centering\setcounter{rowno}{0}
\STautoround{2}
\begin{spreadtab}{{tabular}{ @{}>{\stepcounter{rowno} \therowno}c SS>{\bfseries}c}}
\toprule
@ \multicolumn{1}{c}{\thead{Group\\ No}} & @ \multicolumn{1}{c}{Females} & @ \multicolumn{1}{c}{Males} & @p\\
\midrule
& 18 & 11 & \STcopy{v}{b2 /(b2+ c2)}\\
& 31 & 22 & \\
& 34 & 27 & \\
& 33 & 29 & \\
& 27 & 24 & \\
& 33 & 29 & \\
& 28 & 25 & \\
& 23 & 26 & \\
& 33 & 38 & \\
& 12 & 14 & \\
& 19 & 23 & \\
& 25 & 31 & \\
& 14 & 20 & \\
& 2 & 20 & \\
& 22 & 6 & \\
& 7 & 34 & \\
\bottomrule
\end{spreadtab}
\end{table}
\end{document}