我需要在 LaTex 中将两个值相除,
\newcommand{\x}{30}
\newcommand{\y}{10}
有没有简单的方法可以做到这一点?即
x / y = 3
最好不要使用外部包或冗长的 \newcommand 函数。它需要尽可能简单。此外,我可能需要将浮点数除以整数值。
答案1
我不知道这是否足够,但对于你的例子来说这已经足够了(它需要 eTeX)
\documentclass{scrartcl}
\def\basiceval#1{\the\numexpr#1\relax}
\begin{document}
\def\x{30}
\def\y{10}
\basiceval{\x/\y}
\end{document}
答案2
您绝对应该使用 eTeX\numexpr
选项;它很清晰并且几乎所有地方都支持。
不过,如果你对原始的 Knuthian TeX 感兴趣,那么还有算术运算符。对于这四个函数,你可以以一种非常独特且我认为非常巧妙的方式使用 TeX 基元\advance
、\multiply
和:\divide
\documentclass{article}
\begin{document}
\def\x{30}
\def\y{10}
$\x \div \y =$
\newcount\a\a=\number\x
\newcount\b\b=\number\y
\divide\a by\b
\def\x{\the\a}
$\x$
\end{document}
因此,为了说明目的,我们首先打印出我们正在解决的问题:
$\x \div \y =$
接下来我们要做的就是将\x
和\y
(TeX 将其视为字符3
和0
,1
和0
,而不是十进制数 30 和 10)转换为数数值,TeX做以十进制数形式查看。因此,我们创建两个计数器\a
和\b
,然后使用以下代码将命令序列的十进制数版本\x
和分配给它们:\y
\newcount\a\a=\number\x
\newcount\b\b=\number\y
现在\a
和\b
有了正确的值(30 和 10),我们就可以进行实际的算术运算了:
\divide\a by\b
\def\x{\the\a}
它的作用正如它看起来的那样:它除以\a
,\b
商存储在 中\a
。然后我们使用\the
指令(另一个 TeX 原语)将 的新值分配给\x
,即您之前的控制序列\a
。最后,我们打印商:
$\x$
打印内容如下:
TeX 为四种算术运算提供了三个原语:
\advance\a by\b
做加法。\advance\a by-\b
做减法。\multiply\a by\b
做乘法。\divide\a by \b
做除法。
这些都适用于计数器、胶水、木胶和尺寸,您甚至可以混合它们,但是在添加计数器时必须小心,因为可能会失去可拉伸性。
值得注意的是,这些都处理整数除法;您不会得到小数值。另一方面,至少对于dimen
s,它们在缩放点中工作,这些点非常小,因此粒度非常令人印象深刻。
答案3
这是一个基于LuaLaTeX的解决方案:
% !TEX TS-program = lualatex
\documentclass{article}
\begin{document}
\newcommand\x{30}
\newcommand\y{10}
\textbackslash x divided by \textbackslash y is \directlua{tex.sprint(\x/\y)}.
2.5 multiplied by 4 is \directlua{tex.sprint(2.5*4)}.
\end{document}
如果你需要做很多简单的除法——以及其他简单的计算——那么创建一个专用的宏可能是一个好主意,比如说,
\newcommand\mycalc[1]{\directlua{tex.sprint(#1)}}
在序言中,以节省在文档正文中输入的内容。请注意,的参数\mycalc
不限于除法——所有满足 Lua 语法规则的计算都是允许的。
% !TEX TS-program = lualatex
\documentclass{article}
\newcommand\mycalc[1]{\directlua{tex.sprint(#1)}}
\begin{document}
\newcommand\x{30}
\newcommand\y{10}
\textbackslash x divided by \textbackslash y is \mycalc{\x/\y}.
42 divided by $(5\times7)$ is \mycalc{42/(5*7)}.
\end{document}
附录我刚刚注意到 Taco Hoekwater 已经\directlua{tex.sprint(...)
在 TeX.SE 上提出了解决方案——请参阅他的回答发帖ConTeXt / e-TeX 实数?