它们是数字还是维度

它们是数字还是维度

我想知道是否有办法判断宏是数字还是维度,如下例所示。也就是说,如果宏是数字,则会执行某些操作,如果是维度,则会执行其他操作。

例子:

\documentclass[a4paper]{article}
\geometry{showframe}
\geometry{left=1cm,right=1cm,top=1cm,bottom=1cm}
\begin{document}
\def\aaa{3.5pt}
\def\bbb{\dimexpr 3.5pt}
\def\ccc{\textwidth}
\def\ddd{3.5}
%if \aaa is a number:
%then ...
%else ...
\end{document}

我想再举一个例子来描述我的意图:

\newcommand\test[2]{
  %if #1 is a number
    \parbox{#1\textwidth}{#2}
  %if #1 is a length
    \parbox{#1}{#2}
}
\test{0.5}{some text}
\test(1in}{some text}

答案1

这里,我使用了一个技巧来区分数字和维度。由于\newcounts 可用于存储机器单位的长度,因此我将 设置\mytest=\dimexpr#1 pt\relax为 0。如果#1是数字,则将#1 pt被解释为长度,并将\mytest包含其机器单位的值。但是\box0宽度为零,因为其中没有排版任何内容。

另一方面,如果#1是尺寸,\mytest=\dimexpr#1 pt\relax则将设置#1\mytest,并且尾随pt将被排版为两个字母到\box0

因此,通过检查的宽度\box0,可以确定#1是一个数字还是维度。

\documentclass[a4paper]{article}
\newcount\mytest
\newcommand\testit[1]{%
  \sbox0{\mytest=\dimexpr#1 pt\relax}%
  \ifdim\wd0>0pt dimension\else number\fi
}
\begin{document}
\def\aaa{3.5pt}
\def\bbb{\dimexpr 3.5pt}
\def\ccc{\textwidth}
\def\ddd{3.5}

\testit{\aaa}
\testit{\bbb}
\testit{\ccc}
\testit{\ddd}
\end{document}

在此处输入图片描述

注意,\mytest可以用\newlength而不是\newcount用相同的结果来定义。

答案2

LaTeX 有内置命令来检测是否提供了单位,因此

在此处输入图片描述

\documentclass{article}

\begin{document}
\makeatletter
\newcommand\test[1]{%
\@defaultunitsset\dimen@{#1}\textwidth
\parbox{\dimen@}}
\makeatother
\fbox{\test{0.5}{some text}}
\fbox{\test{1in}{some text}}
\end{document}

如果你有旧的乳胶脱模剂,你还需要添加

\def\@defaultunitsset#1#2#3{\@defaultunits#1\dimexpr#2#3\relax\relax\@nnil}

之后\makeatletter


如果你想测试并执行不同的操作,而不仅仅是默认一个单元,你可以制作内部命令的修改版本,

在此处输入图片描述

\documentclass{article}

\makeatletter
\def\testunits{\afterassignment\test@to@nnil}
\def\test@to@nnil#1\@nnil{\def\zz{#1}}
\def\test#1{%
\testunits\dimen@#1\textwidth\@nnil
\ifx\zz\empty
  \detokenize{#1} is a number
\else
  \detokenize{#1} = \the\dimexpr#1\relax\ is a length
\fi}

\makeatother
\begin{document}

\test{5.5}

\test{5.5in}

\end{document}

答案3

测试可以通过两个嵌套的 if 来完成。最外层的 if\if类似于\if!!\if!pt !

\def\isnumber#1\iftrue{\if!\unless\ifdim\maxdimen<#1pt \fi!}

\isnumber 13\iftrue It is a number
            \else   It is a dimen
            \fi

\isnumber\hsize \iftrue It is a number
                \else   It is a dimen
                \fi

\bye
 

相关内容