我想设计一个通用的compare
函数数字之间,最好使用以下签名进行扩展:
\NewExpandableDocumentCommand{\compare}{r[] m m m m m}{%CODE HERE%}
其语法如下:
\compare[!=]{lhs}{rhs}{true branch}{false branch}{invalid branch}
其中左侧和lhs
右侧rhs
在处理之前将完全展开,并且第一个参数(也完全展开)可以是,,,,,,。==
我希望该函数适用于:!=
<
>
<=
>=
- 计数器
- 长度
- numexpr、dimexpr 等等……
- 当字符串代表数字时(因此字符串
023
是数字 23)
(无效分支通常会在将长度与诸如、、或运算符之类的plus
术语进行比较时触发,或者当比较根本没有意义时)以便用户可以输入:minus
10pt plus 1.5pt minus 1.5pt
<
<=
>
>=
\compare[==]{\mycounter}{\othercounter}{true}{false}{invalid}
\compare[<]{\mycounter}{12}{true}{false}{invalid}
\compare[>=]{15.8}{\mycounter}{true}{false}{invalid}
\compare[>=]{\mylength}{\otherlength}{true}{false}{invalid}
\compare[>=]{\mylength}{14.3}{true}{false}{invalid}
\compare[\myoperator]{\mylength}{14.3}{true}{false}{invalid}
等等...我需要生成的代码能够运行在 5 年前(~2018 年)的典型 TeX 版本上(因此不能使用超级近期的功能)。
以下是测试代码:
\documentclass[preview = true, varwidth = true]{standalone}
\usepackage{xparse}
\NewExpandableDocumentCommand{\compare}{r[] m m m m m}{%
% CODE HERE
}
\makeatletter
\newcommand{\@@yoperator}{<}
\newcommand{\@myoperatory}{\@@myoperator}
\newcommand{\myoperator}{\@myoperator}
\newcommand{\@@myintstring}{12}
\newcommand{\@myintstring}{\@@myintstring}
\newcommand{\myintstring}{\@myintstring}
\newcounter{mycounter}
\setcounter{mycounter}{15}
\newlength{\mylength}
\setlength{\mylength}{10pt plus 5pt minus 3pt}
\newdimen\mydim
\mydim=1cm
\makeatother
\begin{document}
\begin{tabular}{c}
\compare[==]{23}{24}{true}{false}{invalid} \\
\compare[!=]{23}{24}{true}{false}{invalid} \\
\compare[<]{23}{24}{true}{false}{invalid} \\
\compare[<=]{23}{24}{true}{false}{invalid} \\
\compare[>]{23}{24}{true}{false}{invalid} \\
\compare[>=]{23}{24}{true}{false}{invalid} \\
\compare[\myoperator]{23}{24}{true}{false}{invalid} \\
\compare[\myoperator]{\myintstring}{\myintstring}{true}{false}{invalid} \\
\compare[\myoperator]{\myintstring}{10}{true}{false}{invalid} \\
\compare[\myoperator]{10}{\myintstring}{true}{false}{invalid} \\
\compare[<]{\mylength}{12pt}{true}{false}{invalid} \\
\compare[<]{\mylength}{\mydim}{true}{false}{invalid} \\
\compare[==]{\mydim}{\mydim}{true}{false}{invalid} \\
\compare[==]{\mydim}{12pt}{true}{false}{invalid} \\
\end{tabular}
\end{document}
问题:如何创建这样的函数?(如果太复杂而无法扩展,那么做一个不可扩展的函数也可以)