如何使 \tfrac 在 >{} 中工作?

如何使 \tfrac 在 >{} 中工作?

当我使用时>{$\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}

在此处输入图片描述

相关内容