我知道在 latex 中可以使用基于整数的计数器。是否还有某种方法可以定义浮点寄存器来执行简单的算术运算?
基本上我需要某种方式来写类似的东西
\newreg{myx}
\setreg{myx}{0.0}
\addreg{myx}{0.5}
\addreg{myx}{-0.25}
\valuereg{myx} % this expands to 0.25
答案1
如果您只需要加法、减法和乘法,并且期望数字在 +-16380 范围内且小数点后有四位(或更少),那么您可以直接使用 TeX 自然支持的维度寄存器。例如:
\def\newreg{\csname newdimen\endcsname}
\def\setreg#1#2{#1=#2pt }
\def\addreg#1#2{\advance#1by#2pt }
\def\mulreg#1#2{#1=#2#1}
\def\valuereg#1{\expandafter\ignorept\the#1}
\bgroup\lccode`\?=`\p \lccode`\!=`\t \lowercase{\egroup\def\ignorept#1?!{#1}}
\newreg\myx
\setreg\myx {0.0}
\addreg\myx {0.5}
\addreg\myx {-0.25}
\valuereg\myx % this expands to 0.25
\bye
但是使用维度寄存器进行除法稍微复杂一些。
当然,您可以使用pgfmath
或calc
或lua
或expl3
或apnum
或有点类似,但在声明需求的情况下,这似乎就像用大炮轰麻雀一样。
答案2
这是一个简单的例子pgfmath
,是 pgf/TikZ 的一部分:
\documentclass{article}
\usepackage{pgfmath}
\begin{document}
\pgfmathsetmacro\myx{0}
\pgfmathsetmacro\myx{\myx + 0.5}
\pgfmathsetmacro\myx{\myx - 0.25}
\myx
\end{document}
这里的“寄存器”是一个简单的宏(\myx
)。此外,还可以定义一个“addto”宏:
\documentclass{article}
\usepackage{pgfmath}
% #1: macro token, e.g. \myx
% #2: math expression
\newcommand*{\pgfmathaddtomacro}[2]{%
\pgfmathsetmacro#1{#1+(#2)}
}
\begin{document}
\pgfmathsetmacro\myx{0}
\pgfmathaddtomacro\myx{0.5}
\pgfmathaddtomacro\myx{-0.25}
\myx
\end{document}
答案3
您可以使用 强大的浮点模块expl3
。我使用全局分配,就像 LaTeX 计数器一样,但也可以进行局部分配。
\documentclass{article}
\usepackage{xparse,xfp}
\ExplSyntaxOn
\NewDocumentCommand{\newreg}{m}
{
\fp_new:c { g_nicmus_#1_fp }
}
\NewDocumentCommand{\setreg}{mm}
{
\fp_gset:cn { g_nicmus_#1_fp } { #2 }
}
\NewDocumentCommand{\addreg}{mm}
{
\fp_gset:cn { g_nicmus_#1_fp } { \fp_use:c { g_nicmus_#1_fp } + (#2) }
}
\NewExpandableDocumentCommand{\valuereg}{m}
{
\fp_use:c { g_nicmus_#1_fp }
}
\ExplSyntaxOff
\newreg{myx}
\begin{document}
\setreg{myx}{0.0}
\addreg{myx}{0.5}
\addreg{myx}{-0.25}
\valuereg{myx} % this expands to 0.25
\addreg{myx}{sqrt(3)+pi}
\valuereg{myx} % this expands to 5.12364346115867
\fpeval{round(\valuereg{myx},2)} % this expands to 5.12
\end{document}