如何进行算术运算并获取整数表达式的字符串版本?

如何进行算术运算并获取整数表达式的字符串版本?

在 Tex 宏的上下文中,我如何对整数进行算术运算,并捕获表达式值的字符串表示以便显示它?现在加法和减法就够了,不过以后我可能需要乘法和除法。MWE 中使用的表达式很简单,但知道如何做更复杂的事会很有用,包括声明和赋值变量,以及使用变量的值。

这是 MWE(好吧,它可以编译并生成一些东西,但不是我想要的)。我的目标是计算表达式 -#1 和 #1+#2 的值,并显示它们的值的十进制表示。

我故意在代码中留下各种尝试来获得我想要的东西,以便让大家了解我尝试过但没有成功的事情。通过搜索 tex.SE,我找到了对软件包 calc、etex 和 xlop 的引用,所以我查看了它们的文档,但我没有看到任何对我的目的有用的东西。

我正在使用 pdfTex。

\documentclass[a4paper]{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
%\usepackage{calc}
% Found these out from https://tex.stackexchange.com/questions/284977/use-floating-point-with-calc
%\newcounter{dac}
%\newcounter{bad}
\newcommand\trian[4]{
  \tkzDefPoint(0,0){A}
  \tkzDefPoint(1,0){B}
  \tkzDefPointBy[rotation=center A angle #2](B) \tkzGetPoint{C1}
  \tkzDefPointBy[rotation=center A angle #1](C1) \tkzGetPoint{D1}
  \tkzDefPointBy[rotation=center B angle -#3](A) \tkzGetPoint{D2}
  \tkzDefPointBy[rotation=center B angle -#4](D2) \tkzGetPoint{C2}
  \tkzInterLL(A,C1)(B,C2) \tkzGetPoint{C}
  \tkzInterLL(A,D1)(B,D2) \tkzGetPoint{D}
  \tkzDrawSegments(A,B A,C A,D B,C B,D C,D)
%  \setcounter{dac}{ -#1 }
%  \setcounter{bad}{ #1+#2 }
%  \def\dac{ -#1 }
%  \tkzLabelAngle[pos=6/\value{dac}](D,A,C){\value{dac}}
%  \tkzLabelAngle[pos=6/{dac}](D,A,C){dac}
%  \tkzLabelAngle[pos=6/{\dac}](D,A,C){\dac}
%  \tkzLabelAngle[pos=-6/#1](D,A,C){\value{-#1}}
  \tkzLabelAngle[pos=-6/#1](D,A,C){- #1}
  \tkzLabelAngle[pos=6/(#1+#2)](B,A,D){#1+#2}
  \tkzLabelAngle[pos=6/#3](D,B,A){#3}
  \tkzLabelAngle[pos=6/#4](C,B,D){#4}
}
\begin{document}
\begin{figure}[h]
 \centering
 \begin{tikzpicture}[scale=5.0]
  \trian{-40}{70}{50}{20}
 \end{tikzpicture}
\end{figure}
\end{document}

答案1

“传统” TeX 没有简单的“整数表达式”原语,但 e-TeX(目前常规可用)有:\numexpr。可以直接使用,或者可能更方便地使用xfp包,它为其提供了 LaTeX 语法

\documentclass{article}
\usepackage{xfp}
\begin{document}
Primitive syntax: \number\numexpr -40 + 70\relax

In a LaTeX 'wrapper': \inteval{-40 + 70}
\end{document}

这可以在您的示例中用作

\tkzLabelAngle[pos=6/(#1+#2)](B,A,D){\inteval{#1+#2}}

(看\dimexpr \numexpr 的参考资料以了解正式文件的详细信息\numexpr。)


\numexpr/方法\inteval快速且可扩展(这可能很有用,具体取决于上下文)。但是,可以使用宏来解析表达式,并在没有 e-TeX 的情况下进行处理。如果您需要超出 TeX 的整数范围,这可能很重要。这种能力最引人注目的可能是xint

\documentclass{article}
\usepackage{xintexpr}
\begin{document}
A large value: \thexintexpr -400000000000000000 + 70\relax
\end{document}

相关内容