我想在表格中绘制规则。它们的长度等于单元格长度乘以预定义比率(即\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}