TeX/LaTeX:用于获取数字长度的宏

TeX/LaTeX:用于获取数字长度的宏

我想编写一个宏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}如果您想要一个包含多个测量单位的表达式。

相关内容