我想知道是否有办法判断宏是数字还是维度,如下例所示。也就是说,如果宏是数字,则会执行某些操作,如果是维度,则会执行其他操作。
例子:
\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
这里,我使用了一个技巧来区分数字和维度。由于\newcount
s 可用于存储机器单位的长度,因此我将 设置\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