获取长度作为数字?

获取长度作为数字?

我可能错误地提炼了这个问题,因为我不知道 Tex 的内部原理 - 但这就是我的意思;考虑这个例子:

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

在这里,我考虑\myNum表示一个“数字变量”和\myLength一个 Tex 长度(即一个数字和一个单位);因此我认为上面的例子是从数字到长度“变量”的“转换”。

是否可以反过来做?例如,如果\myLength给定的是 2 厘米,是否有命令可以仅“获取”/“提取”数值?我想象做这样的事情(伪代码):

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

... 此后,\myNum其值将为“2”...

有这样的事存在吗?

编辑:我想我需要一些类似\the计数器的东西......?!

答案1

您可以pt使用如下所示的方式从长度中删除单位\strip@pt。如果您想要以厘米为单位的数字,则必须自行转换。

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

pgfmath另一种更灵活的替代方法是使用(包) ,它还允许您将结果数字存储在宏中pgf。它还允许您轻松地将数字转换为厘米:

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

还有一个round( )函数pgfmath允许您将数字四舍五入,例如四舍五入到两位小数。诀窍是在四舍五入之前将其乘以 100,然后除以 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}

可以使用而不是 来.0避免小数部分(如) ,但我认为您不需要这样做。\pgfmathtruncatemacro\pgfmathsetmacro

答案2

Martin 的方法的另一种选择是使用 TeX 的\number原语,它将为你提供底层的整数值sp

\documentclass{article}

\newcommand*\getlength[1]{\number#1}

\begin{document}

Test: \getlength{\textwidth}

\end{document}

(TeX 或多或少以整数来处理所有事情,因此长度实际上存储在 中sp,它是微小的长度单位。其他所有东西都是 中某个值的整数倍sp。)

答案3

可以使用xfp

\documentclass{article}
\usepackage{xfp}

\NewExpandableDocumentCommand{\getlengthnumber}{O{pt}m}{%
  % #1 (optional, default pt), #2 = length
  \fpeval{(#2)/(1#1)}%
}

\begin{document}

\getlengthnumber{\textwidth}

\getlengthnumber[cm]{\textwidth}

\getlengthnumber[cm]{1in}

\getlengthnumber[sp]{1pt}

\end{document}

与这些方法相比,其最大的优势pgf在于它是完全可扩展的。

在此处输入图片描述

答案4

在这里我想提供一个简单的解决方案pgf

% !Mode:: "TeX:UTF-8"
\documentclass{article}
\usepackage{pgf}

\begin{document}
\noindent
\the\textwidth \\
\pgfmathparse{\textwidth}
\pgfmathresult \\
\end{document}

其中,\the\textwidth打印带单位的长度,而\pgfmathparse返回\textwidth不带单位的长度\pgfmathresult

长度

还有更多功能可供选择数学表达式前列腺素手动的。

相关内容