[Tex/LaTex] Getting length as number

lengths

I have probably formulated the question wrong, as I don't know the Tex internals – but this is what I mean; consider this example:

\newcommand{\myNum}{2}
\newlength{\myLength}
\setlength{\myLength}{\myNum cm}

Here, I'd consider \myNum to represent a 'numeric variable', and \myLength a Tex length (i.e. a number and a unit); and so I'd consider the above example a "conversion" from numeric to length "variable".

Is it possible to do the other way around? I.e. if \myLength is given to be 2 cm, is there a command that will "get"/"extract" the numeric value only? I'd imagine doing something like this (pseudocode):

\newcommand{\myNum}{\getlength{\myLength}}

… after which, \myNum would have value "2" …

Does anything like this exist?

EDIT: I guess I need something similar to \the which is for counters … ?!

Best Answer

You can remove the pt unit from the length using \strip@pt as shown below. I you want the number in cm you would have to convert it by yourself.

\documentclass{article}

\makeatletter
\newcommand*{\getlength}[1]{\strip@pt#1}
% Or rounded back to `cm` (there will be some rounding errors!)
%\newcommand*{\getlength}[1]{\strip@pt\dimexpr0.035146\dimexpr#1\relax\relax}

\makeatother

\begin{document}

Test: \getlength{\textwidth}  % Result: 345

\end{document}

Another alternative which is more flexible and also allows you to store the resulting number in a macro is to use pgfmath (pgf package). It also allows you to easily convert the number to cm:

\documentclass{article}

\usepackage{pgf}
\newcommand*{\getlength}[2]{%
   \pgfmathsetmacro#1{#2}%  Result in `pt`
   % Or:
   %\pgfmathsetmacro#1{0.0351459804*#2}%  Result in `cm`
}

\begin{document}

\getlength{\myNum}{\textwidth}

Test: \myNum % Result: 345.0

\end{document}

There is also the round( ) function for pgfmath which allows you to round the number, e.g. to two fractional digits. The trick is to multiple it with 100 before the rounding and divide it afterwards by 100.

\documentclass{article}

\usepackage{pgf}
\newcommand*{\getlength}[2]{%
   % Convert to `cm` and round to two fractional digits:
   \pgfmathsetmacro#1{round(3.51459804*#2)/100.0}%
}

\begin{document}

\setlength{\textwidth}{2.123cm}
\getlength{\myNum}{\textwidth}

Test: \myNum% Gives 2.12

\setlength{\textwidth}{2cm}
\getlength{\myNum}{\textwidth}

Test: \myNum% Gives 2.0

\end{document}

The fractional part (like .0) can be avoided by using \pgfmathtruncatemacro instead of \pgfmathsetmacro, but I don't think you need that.

Related Question