当我使用时>{$\sqrt\bgroup\tfrac}c<{\egroup$}
,我得到了以下输出。奇怪的部分发生在最后一列。如何修复它?
\documentclass[border=3pt]{standalone}
\usepackage{booktabs}
\usepackage{array}
\usepackage{amsmath}
\begin{document}
\begin{tabular}
{
>{$}c<{^\circ$}
>{$\tfrac1 2\sqrt\bgroup}c<{\egroup$}
>{$\tfrac1 2\sqrt\bgroup}c<{\egroup$}
>{$\sqrt\bgroup\tfrac}c<{\egroup$}
}
\toprule
\multicolumn{1}{c}{$\theta$}&
\multicolumn{1}{c}{$\sin\theta$}&
\multicolumn{1}{c}{$\cos\theta$}&
\multicolumn{1}{c}{$\tan\theta$}\\
\midrule
0&
0&
4&
0 4\\
30&
1&
3&
1 3\\
45&
2&
2&
2 2\\
60&
3&
1&
3 1\\
90&
4&
0&
4 0\\
\bottomrule
\end{tabular}
\end{document}
奖励:请将行高一点。如果可以的话,我们可以提取第二列和第三列用于第四列吗?
答案1
您不能使用\bgroup
它来括起宏参数。
正如评论中所指出的\sqrt
那样,它不会将其参数作为宏参数。
最后一列有所不同,因为&
是 TeX 基元,它会导致文本<{...}
在被看到时立即插入,但是\\
是宏,并且在扫描参数时不会扩展宏。因此,您需要使用始终为空的虚拟最后一列,以便您的扫描始终以&
或结束(功能有所损失)使用\cr
基元而不是\\
。或者(最好)插入\\
而不是\endgroup
插入序言中,<{\\}
并且在>{...}
不要\sqrt
直接使用,而是使用使用分隔参数的宏,\foo#1\\
这个分隔参数将始终拾取内容(如果您在最后一行,则必须放回真正的 \)
\documentclass[border=3pt]{standalone}
\usepackage{booktabs}
\usepackage{array}
\usepackage{amsmath}
\setlength\extrarowheight{2pt}
\def\getNum#1\relax{\gdef\num{#1}$\tfrac{1}{2}\sqrt{#1}$}
\def\getDenum#1\\{\gdef\denum{#1}$\tfrac{1}{2}\sqrt{#1}$&$\sqrt{\tfrac{\num}{\denum}}$\\}
\begin{document}
\begin{tabular}
{
>{$}c<{^\circ$}
>{\getNum}c
>{\getDenum}c
c
}
\toprule
\multicolumn{1}{c}{$\theta$}&
\multicolumn{1}{c}{$\sin\theta$}&
\multicolumn{1}{c}{$\cos\theta$}&
\multicolumn{1}{c}{$\tan\theta$}\\
\midrule
0&
0&
4\\
30&
1&
3\\
45&
2&
2\\
60&
3&
1\\
90&
4&
0\\
\bottomrule
\end{tabular}
\end{document}
答案2
Martin Scharrer 提供的软件包collcell
解决了这个问题:
\documentclass[border=3pt]{standalone}
\usepackage{booktabs}
\usepackage{array}
\usepackage{amsmath}
\usepackage{collcell}
\newcommand\getnumerator[1]{$\tfrac{1}{2}\sqrt{#1}$\gdef\numerator{#1}}
\newcommand\getdenominator[1]{$\tfrac{1}{2}\sqrt{#1}$\gdef\denominator{#1}}
\begin{document}
\begin{tabular}
{
>{$}c<{^\circ$}
>{\collectcell\getnumerator}c<{\endcollectcell}
>{\collectcell\getdenominator}c<{\endcollectcell}
>{$\sqrt{\tfrac{\numerator}{\denominator}}$}c
}
\toprule
\multicolumn{1}{c}{$\theta$}&
\multicolumn{1}{c}{$\sin\theta$}&
\multicolumn{1}{c}{$\cos\theta$}&
\multicolumn{1}{c}{$\tan\theta$}\\
\midrule
0 & 0 & 4 & \\\addlinespace
30 & 1 & 3 & \\\addlinespace
45 & 2 & 2 & \\\addlinespace
60 & 3 & 1 & \\\addlinespace
90 & 4 & 0 & \\
\bottomrule
\end{tabular}
\end{document}