在表格中使用本地定义的计算器命令(tabularx)

在表格中使用本地定义的计算器命令(tabularx)

我想在表格中绘制规则。它们的长度等于单元格长度乘以预定义比率(即\rule{\ratio\linewidth}{1ex})。我使用-package\DIVIDE{A}{B}{\ratio}的函数calculator,该函数定义\ratio为 A/B 的数值。

如果比例是在表格之外定义的,这种方法很有效。但是,! Undefined control sequence.如果我在表格内定义比例,就会出错(出现错误消息)。

这是一个仅在最后一行具有局部定义比率的示例(参见 MWE)。
在此处输入图片描述

问题:有没有办法calculator在表中本地定义并使用计算值?(我曾尝试摆弄\expandafter但没有成功,因为我的 TeX 技能已经达到极限)


如果取消注释表格的最后两行,MWE 会出现编译错误。

\documentclass{scrartcl}
    \usepackage{calculator}
    \usepackage{tabularx}

\begin{document}
    \COPY{1}{\numberA}
    \COPY{2}{\numberB}
        \DIVIDE{\numberA}{\numberB}{\ratioOne}

    \begin{tabularx}{.5\linewidth}{|l|l|l|X|}
        \textbf{A} & \textbf{B} & \textbf{A/B} & \textbf{Relative rule}
        \\
        1 & 1 & 1 & \rule{\linewidth}{1ex}
        \\
        \numberA & \numberB & \ratioOne & \rule{\ratioOne\linewidth}{1ex}
        \\
        %\numberA & \numberB & \DIVIDE{\numberA}{\numberB}{\ratioTwo} \ratioTwo& \rule{\ratioTwo\linewidth}{1ex}
        %\\
    \end{tabularx}
\end{document}

编辑

根据 Christian 的评论,我发现如果你定义比率之内您使用它的单元格,它会编译而没有错误。 (即以下行不会导致错误。)

\numberA & \numberB & \DIVIDE{\numberA}{\numberB}{\ratioTwo} \ratioTwo& \DIVIDE{\numberA}{\numberB}{\ratioThree}\rule{\ratioThree\linewidth}{1ex}\\

答案1

几乎所有由计算器定义的命令都具有本地行为(其范围被限制为组)。这是因为当您在 tabularx 环境中更改为另一列时, \ratioTwo 未定义。

使用 \GLOBALCOPY 命令来全球化您的号码:

\GLOBALCOPY{\ratioTwo}{\ratioTwo}

(请注意,您可以为新的全局号码分配相同的名称)。

尝试此版本的代码:

 \documentclass{scrartcl}
     \usepackage{calculator}
     \usepackage{tabularx}

 \begin{document}
 \COPY{1}{\numberA}
 \COPY{2}{\numberB}
    \DIVIDE{\numberA}{\numberB}{\ratioOne}

 \begin{tabularx}{.5\linewidth}{|l|l|l|X|}
    \textbf{A} & \textbf{B} & \textbf{A/B} & \textbf{Relative rule}
    \\
    1 & 1 & 1 & \rule{\linewidth}{1ex}
    \\
    \numberA & \numberB & \ratioOne & \rule{\ratioOne\linewidth}{1ex}
    \\
    \numberA & \numberB & \DIVIDE{\numberA}{\numberB}{\ratioTwo}
    \GLOBALCOPY{\ratioTwo}{\ratioTwo} \ratioTwo& \rule{\ratioTwo\linewidth}{1ex}
    \\
 \end{tabularx}
 \end{document}

但是,为什么不定义一个新的命令来计算比例并打印表格行呢?然后你可以写类似这样的内容:

 \documentclass{scrartcl}
     \usepackage{calculator}
     \usepackage{tabularx}

 \begin{document}

 \newcommand{\maketableline}[2]{%
      \GLOBALCOPY{#1}{\numberA}
      \GLOBALCOPY{#2}{\numberB}
        \DIVIDE{\numberA}{\numberB}{\ABratio}
        \GLOBALCOPY{\ABratio}{\ABratio}
          \numberA & \numberB & \ABratio & \rule{\ABratio\linewidth}{1ex}\\
         }

 \begin{tabularx}{.5\linewidth}{|l|l|l|X|}
    \textbf{A} & \textbf{B} & \textbf{A/B} & \textbf{Relative rule}
    \\
    \maketableline{1}{1}
    \maketableline{1}{2}
    \maketableline{2}{3}
    \maketableline{3}{4}
 \end{tabularx}
 \end{document}

答案2

这是一个带有命令包装器的解决方案\DIVIDE,它定义了一个\ratio#3命令,其中#3是第三个参数,等等Two。然而,它是一个全局命令,但却在表格单元格中存在。

使用toks寄存器可能是一种替代方法。

\documentclass{scrartcl}
\usepackage{calculator}
\usepackage{tabularx}

\newcommand{\newratio}[3]{%
  \DIVIDE{#1}{#2}{\radioInt}%
  \expandafter\xdef\csname ratio#3\endcsname{\radioInt}%
}

\begin{document}
    \COPY{1}{\numberA}
    \COPY{2}{\numberB}
    \DIVIDE{\numberA}{\numberB}{\ratioOne}
    \begin{tabularx}{.5\linewidth}{|l|l|l|X|}
        \textbf{A} & \textbf{B} & \textbf{A/B} & \textbf{Relative rule}
        \\
        1 & 1 & 1 & \rule{\linewidth}{1ex}
        \\
        \numberA & \numberB & \ratioOne & \rule{\ratioOne\linewidth}{1ex}
        \\
        \numberA & \numberB & \newratio{\numberA}{\numberB}{Two}\ratioTwo & \rule{\ratioTwo\linewidth}{1ex}
        \\
    \end{tabularx}
\end{document}

相关内容