我想编写一个宏getlengthin
来获取指定单位的长度或尺寸作为浮点数。以下是我目前创建的内容:
\documentclass{article}
\usepackage[nomessages]{fp}
\newcount\lengthcount
\newcount\unitcount
\def\getlengthin#1#2{%
\lengthcount=#1%
\unitcount=\dimexpr1#2%
\FPdiv\result{\the\lengthcount}{\the\unitcount}%
\result%
}
\def\a{\getlengthin{\paperwidth}{mm}} % \edef does not work here !
\begin{document}
\a
\getlengthin{\paperwidth}{mm}
\getlengthin{\textheight}{mm}
\end{document}
由于某种原因,我需要计算前导码的长度,并且我尝试使用edef
,但edef
不适用于我的宏。这里的问题是什么?
答案1
我对以下回答进行了修改https://tex.stackexchange.com/a/213027/4427
\documentclass{article}
\usepackage{xparse,siunitx}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\convertdim}{O{2}mm}
{
\fp_eval:n { round ( \dim_to_decimal_in_unit:nn { #2 } { 1#3 } , #1 ) }
}
\ExplSyntaxOff
\NewDocumentCommand{\getlengthin}{O{2}mm}
{%
\SI[round-mode=places,round-precision=#1]{\convertdim{#2}{#3}}{#3}%
}
\begin{document}
\convertdim{\paperwidth}{pt} -- \getlengthin{\paperwidth}{pt}
\convertdim[5]{\paperwidth}{in} -- \getlengthin[5]{\paperwidth}{in}
\convertdim[3]{\paperwidth}{cm} -- \getlengthin[3]{\paperwidth}{cm}
\end{document}
对于这两个命令,可选参数是舍入的位数。
第一个命令是完全可扩展的,因此它可以在需要十进制数的其他环境中使用。
另请参阅lengthconvert
包。
答案2
以下是实现此目的的方法:
8.50 英寸
193.30 毫米
19.3 厘米
\documentclass{article}
\usepackage{siunitx}
\ExplSyntaxOn
\cs_new_eq:NN \calc \fp_eval:n
\ExplSyntaxOff
\makeatletter
\newcommand{\getlengthin}[3][]{%
\setlength{\@tempdima}{#2}% Capture length
\setlength{\@tempdimb}{1 #3}% Capture unit
\SI[round-mode=places,round-precision=2,#1]
{\calc{\strip@pt\@tempdima/\strip@pt\@tempdimb}}{#3}% Divide length by unit
}
\makeatother
\begin{document}
\getlengthin{\paperwidth}{in}
\getlengthin{\textheight}{mm}
\getlengthin[round-precision=1]{\textheight}{cm}
\end{document}
\getlengthin[<options>]{<length>}{<unit>}
需要额外<options>
的siunitx
。
如果您希望执行长度之间的转换而不真正打印它们,您可以直接设置它们而不会出现问题:
\setlength{<length register>}{<length in whatever unit you want>}
因此,例如,\setlength{\mylen}{12in}
将设置\mylen
为 12 英寸,但在内部将其转换为点(您不必担心这一点)。或者,\setlength{\mylen}{\dimexpr 3cm+2in-5pt+3bp-1mm}
如果您想要一个包含多个测量单位的表达式。