设计一个通用数字比较函数,使用 expl3 来处理字符串、计数器、numexpr、dimexpr

设计一个通用数字比较函数,使用 expl3 来处理字符串、计数器、numexpr、dimexpr

我想设计一个通用的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术语进行比较时触发,或者当比较根本没有意义时)以便用户可以输入:minus10pt 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}

问题:如何创建这样的函数?(如果太复杂而无法扩展,那么做一个不可扩展的函数也可以)

相关内容