我在表格中输入的值有误。我需要将所有值除以 105。有没有一种方法可以做到这一点,而不必用一个全新的表格替换它?
% Table generated by Excel2LaTeX from sheet 'Sheet1'
\begin{table}[htbp]
\centering
\caption{Add caption}
\begin{tabular}{rrrr}
\toprule
& A & B & C \\
\midrule
1 & 122 & 133 & 156 \\
2 & 112 & 135 & 155 \\
3 & 150 & 139 & 158 \\
4 & 145 & 135 & 159 \\
5 & 150 & 130 & 200 \\
\bottomrule
\end{tabular}%
\label{tab:addlabel}%
\end{table}%
答案1
您可以使用spreadtab
包;一个简单的例子:
\documentclass{article}
\usepackage{numprint}
\usepackage{booktabs}
\usepackage{spreadtab}
\newcommand\Factor{105}
\begin{document}
\renewcommand\STprintnum[1]{\numprint{#1}}
\nprounddigits{3}
\begin{spreadtab}{{tabular}{rrrr}}
\toprule
& @A & @B & @C \\
\midrule
@1 & 122/\Factor & 133/\Factor & 156/\Factor \\
@2 & 112/\Factor & 135/\Factor & 155/\Factor \\
@3 & 150/\Factor & 139/\Factor & 158/\Factor \\
@4 & 145/\Factor & 135/\Factor & 159/\Factor \\
@5 & 150/\Factor & 130/\Factor & 200/\Factor \\
\bottomrule
\end{spreadtab}
\end{document}
而且使用\STcopy
这项工作更简单;我们用一条指令构建一个包含除法结果的新表并隐藏原始值:
\documentclass{article}
\usepackage{numprint}
\usepackage{booktabs}
\usepackage{spreadtab}
\newcommand\Factor{105}
\begin{document}
\renewcommand\STprintnum[1]{\numprint{#1}}
\nprounddigits{3}
\begin{spreadtab}{{tabular}{rrrrrrr}}
\toprule
& \SThidecol @A & \SThidecol @B & \SThidecol @C & @A & @B & @C \\
\midrule
@1 & 122 & 133 & 156 & \STcopy{>3,v4}{b2/\Factor} & & \\
@2 & 112 & 135 & 155 & & & \\
@3 & 150 & 139 & 158 & & & \\
@4 & 145 & 135 & 159 & & & \\
@5 & 150 & 130 & 200 & & & \\
\bottomrule
\end{spreadtab}
\end{document}
答案2
您也可以这样做没有通过使用更改数据条目包裹collcell
。
下面我定义了R
列类型,它将数字除以 中指定的值\Factor
,并使用 打印数字,\pgfmathprintnumber
从而允许格式化数字。[precision=3]
已应用选项仅打印三位小数。左侧的表格使用r
列类型,右侧的表格使用R
列类型。
笔记:
- 下面我使用了来自的切换
etoolbox
,但可以使用其他方法实现相同的功能,例如条件排版/构建。
手动指定标题的结尾:
\StartingHeader
此版本需要在标题开头添加(这将禁用将因子应用于数据条目),并\DoneWithHeader
在标题结尾添加,以便后续数据值除以\Factor
。自动化版本如下。
代码:
\documentclass{article}
\usepackage{booktabs}
\usepackage{collcell}
\usepackage{pgf}
\usepackage{etoolbox}
\newcommand{\Factor}{105}%
\newcommand{\FactorCell}[1]{%
\iftoggle{DoneWithHeader}{%
\pgfmathsetmacro{\ComputedValue}{#1/\Factor}%
\pgfmathprintnumber[,fixed,precision=3]{\ComputedValue}%
}{%
#1% Still working on header
}%
}%
\newtoggle{DoneWithHeader}%
\togglefalse{DoneWithHeader}%
\newcommand*{\StartingHeader}{\global\togglefalse{DoneWithHeader}}%
\newcommand*{\DoneWithHeader}{\global\toggletrue{DoneWithHeader}}%
\newcolumntype{R}{>{\collectcell\FactorCell}r<{\endcollectcell}}
\begin{document}
\begin{tabular}{rrrr}
\toprule
& A & B & C \\
\midrule
1 & 122 & 133 & 156 \\
2 & 112 & 135 & 155 \\
3 & 150 & 139 & 158 \\
4 & 145 & 135 & 159 \\
5 & 150 & 130 & 200 \\
\bottomrule
\end{tabular}%
\hspace{2.0ex}
\begin{tabular}{rRRR}
\toprule\StartingHeader
& A & B & C \\
\midrule\DoneWithHeader
1 & 122 & 133 & 156 \\
2 & 112 & 135 & 155 \\
3 & 150 & 139 & 158 \\
4 & 145 & 135 & 159 \\
5 & 150 & 130 & 200 \\
\bottomrule
\end{tabular}%
\end{document}
自动化方法:
如果您总是\toprule
在标题行之前有一个,并且\midrule
在数据条目之前有一个,则可以自动设置\StartingHeader
和\DoneWithHeader
。在此版本中,唯一需要进行的更改是将数据列类型形式切换r
为R
。
下面的 MWE 产生与上面相同的输出。
参考:
- 我需要添加和
\noexpand
的重新定义。请参阅\toprule
\midrule
将 \cmidrule 包装在宏中了解更多详情。似乎\toprule
和\midrule
有类似的问题。
代码:
\documentclass{article}
\usepackage{booktabs}
\usepackage{collcell}
\usepackage{pgf}
\usepackage{etoolbox}
\usepackage{letltxmacro}
\newcommand{\Factor}{105}%
\newcommand{\FactorCell}[1]{%
\iftoggle{DoneWithHeader}{%
\pgfmathsetmacro{\ComputedValue}{#1/\Factor}%
\pgfmathprintnumber[precision=3]{\ComputedValue}%
}{%
#1% Still working on header
}%
}%
\newtoggle{DoneWithHeader}%
\togglefalse{DoneWithHeader}%
\newcommand*{\StartingHeader}{\global\togglefalse{DoneWithHeader}}%
\newcommand*{\DoneWithHeader}{\global\toggletrue{DoneWithHeader}}%
\LetLtxMacro\OldTopRule\toprule
\def\toprule{\StartingHeader\noexpand\OldTopRule}
\LetLtxMacro\OldMidRule\midrule
\def\midrule{\DoneWithHeader\noexpand\OldMidRule}
\newcolumntype{R}{>{\collectcell\FactorCell}r<{\endcollectcell}}
\begin{document}
\begin{tabular}{rrrr}
\toprule
& A & B & C \\
\midrule
1 & 122 & 133 & 156 \\
2 & 112 & 135 & 155 \\
3 & 150 & 139 & 158 \\
4 & 145 & 135 & 159 \\
5 & 150 & 130 & 200 \\
\bottomrule
\end{tabular}%
\hspace{2.0ex}
\begin{tabular}{rRRR}
\toprule
& A & B & C \\
\midrule
1 & 122 & 133 & 156 \\
2 & 112 & 135 & 155 \\
3 & 150 & 139 & 158 \\
4 & 145 & 135 & 159 \\
5 & 150 & 130 & 200 \\
\bottomrule
\end{tabular}%
\end{document}