在 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}