累加器变量

累加器变量

我知道在 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

但是使用维度寄存器进行除法稍微复杂一些。

当然,您可以使用pgfmathcalcluaexpl3apnum或有点类似,但在声明需求的情况下,这似乎就像用大炮轰麻雀一样。

答案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}

在此处输入图片描述

相关内容