In LaTeX2e,how can I sum two values and assign them to other variable?
I want to compute something like:
var=\textwidth - 1cm
And if both were constants:
var=1+1
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It only takes a minute to sign up.
Sign up to join this communityIn regular LaTeX, the calc
package allows for easy manipulation of length arithmetic:
\documentclass{article}
\usepackage{calc}% http://ctan.org/pkg/calc
\newlength{\mylength}
\begin{document}
\setlength{\mylength}{\textwidth}%
\noindent\rule{\mylength}{20pt}
\bigskip
\setlength{\mylength}{\textwidth-1cm}%
\noindent\rule{\mylength}{20pt}
\bigskip
\setlength{\mylength}{\textwidth-80pt+5mm-1bp}%
\noindent\rule{\mylength}{20pt}
\end{document}
The above deals with lengths. For basic arithmetic using numbers, the fp
package. Here is an example using infix notation (Reverse Polish Notation/RPN is also possible via \FPupn
):
\documentclass{article}
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp
\begin{document}
The following arithmetic is easy:
\begin{itemize}
\item \FPeval{\result}{clip(5+6)}%
$5+6=\result$
\item \FPeval{\result}{round(2+3/5*pi,5)}%
$2+3/5\times\pi=\result$
\end{itemize}
\end{document}
In classical Knuth TeX,
\newdimen\len
\len=\hsize
\advance\len by -1cm
\newcount\cnt
\cnt=1
\advance\cnt by 1
eTeX,
\newdimen\len
\len=\dimexpr\hsize-1cm\relax
\newcount\cnt
\cnt=\numexpr1+1\relax
LaTeX with calc
,
\usepackage{calc}
\newlength\len
\setlength{\textwidth+1cm}
\newcounter{cnt}
\setcounter{cnt}{1+1}
LaTeX2e with expl3
(LaTeX3),
\usepackage{expl3}
\ExplSyntaxOn
\dim_new:N \l_len_dim
\dim_set:Nn \l_len_dim {\textwidth + 1cm}
\int_new:N \l_cnt_int
\int_set:Nn \l_cnt_int {1+1}
\ExplSyntaxOff
Since LuaTeX is available, forget all that complicated stuff and do something like:
\directlua{
a = 0
a = a + 1
tex.print(a)
}
In LaTeX, if you just want to subtract one known length (say, 1cm
) from another (say, \textwidth
) to obtain a new length variable, you can do so using the \newlength
, \setlength
, and \addtolength
instructions, as in the following example:
\newlength\mylength
\setlength\mylength\textwidth
\addtolength\mylength{-1cm} %% note the minus sign
With a fairly recent TeX distribution
\newdimen\len
\len=\dimexpr\textwidth-1cm\relax
\newcount\cnt
\cnt=\numexpr1+1\relax
It's not quite clear what's the framework you're interested in, though.
This is a bit overkill for the particular examples that you mention, but since this works for more complicated expressions I tend to use it:
\documentclass{article}
\usepackage{pgf}
\begin{document}
\pgfmathsetmacro{\var}{\textwidth - 1cm}
The value of var is \var
\end{document}
Note that with pgfmathsetmacro
the result is a decimal without units. If you are only interested in lengths, then you can use a similar macro \pgfmathsetlength
.
If you want to minimize what gets loaded and still use pgfmath
, then see Is it possible to load pgfmath without loading the full pgf package?
I often use the tikz
package for its wide range of capabilities; consider the following:
\documentclass[varwidth]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\begin{document}
textwidth = \the\textwidth
\tikzmath{
\resultone = \textwidth - 1cm;
}
textwidth - 1cm = \resultone
\tikzmath{
\resulttwo = 1 + 1; % default type is float
%
integer \resultthree; % declare a variable as an integer
\resultthree = 1 + 1;
}
1 + 1 as float = \resulttwo\\
1 + 1 as integer = \resultthree
\end{document}
produces the following:
textwidth = 345.0pt
textwidth - 1cm = 316.54726
1 + 1 as float = 2.0
1 + 1 as integer = 2
More information can be found in the pgf/tikz manual in the chapter for the Math Library.
\resultone
appears to be a scalar, not a length variable. Can you modify the code so that \resultone
contains a length variable?
this helped me:
\documentclass{article}
\usepackage{xfp}
\begin{document}
$12.5+13.8 = \fpeval{12.5+13.8} $
\end{document}
There is the adjcalc
package which is a sub-package of adjustbox
used to abstract the different calculation backends (eTeX, calc, pgfmath) to a common interface. Which backend is used can be selected by package options.
\usepackage{adjcalc} % or {adjustbox}
\newdimen\lengthmacro
\adjsetlength{\lengthmacro}{\textwidth-1cm}
\textwidth
is also constant. Or do you mean number vs. dimension?plain-tex
together withlatex3
?latex3
tag if you are not using it.