我可能错误地提炼了这个问题,因为我不知道 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
还有更多功能可供选择数学表达式在前列腺素手动的。