查找函数中参数的最小值和最大值

查找函数中参数的最小值和最大值

我正在定义一个调用其他命令的\newcommand命令:\eventsperiodslist\event[]{Digits}{}\period[]{Digits}{Digits}{}

\event和中的“数字”参数\period包含我试图提取的数字,以找出 内所有数字的最小值和最大值\eventsperiodslist

我不知道从哪里开始:

  • 对于\foreach,我需要知道有多少 个\event\period其中\eventsperiodslist我不知道。
  • 使用包中的函数时xstring,我对花括号有问题。

有什么建议么?

编辑@egreg 的评论 根据下面 MWE 中的值,我希望能够调用,\findminmax{\eventsperiodslist}预期输出类似于\newcommand{\myminvalue}{-6}\newcommand{\mymaxvalue}{23}

编辑:我不介意从数组中定义我的事件和周期,然后从该数组中构建\event命令。\period

平均能量损失(至少是命令\eventsperiodslist

\documentclass{article}

\begin{document}

    \newcommand{\event}[3][non-dated]{*Some command*}

    \newcommand{\period}[4][right]{*Some other command*}

    \newcommand{\findminmax}[1]{
        *Some code to identify the minimum and maximum values*
        \newcommand{\myminvalue}{*calculated minimum value*}% Here: minimum is -6
        \newcommand{\mymaxvalue}{*calculated maximum value*}% Here: maximum is 23
    }

    \newcommand{\eventsperiodslist}{
        \event[dated]{-6}{Some text}
        \period{1}{5}{Nothing}
        \period[center]{2}{7}{Something else}
        \period[left]{4}{10}{Random text}
        \event[dated]{23}{Making a test}

    \findminmax{\eventsperiodslist}

    \end{document}
    }

答案1

使用您显示的输入,您可以简单地重新定义\event\period执行框内的内容\eventsperiodslist。这样,任何可能的输出都只会排版到框中(因此永远不会显示),并且通过重新定义,我们可以将正确的参数与当前的最小值和最大值进行比较。

限制:如果您的列表包含可能产生全局影响的输入,那么这将是不安全的。

\documentclass{article}

\newcommand{\event}[3][non-dated]{*Some command*}

\newcommand{\period}[4][right]{*Some other command*}


\makeatletter
\newcount\AlMa@min
\newcount\AlMa@max
\newcommand\AlMa@period[4][]
  {%
    \AlMa@maxmin{#2}%
    \AlMa@maxmin{#3}%
  }
\newcommand\AlMa@event[3][]{\AlMa@maxmin{#2}}
\newcommand\AlMa@maxmin[1]
  {%
    \ifnum\numexpr#1\relax>\AlMa@max
      \global\AlMa@max=\numexpr#1\relax
    \fi
    \ifnum\numexpr#1\relax<\AlMa@min
      \global\AlMa@min=\numexpr#1\relax
    \fi
  }
\newcommand\findminmax[3]
  {%
    \begingroup
      \global\AlMa@max=-\number\maxdimen
      \global\AlMa@min=\number\maxdimen
      \let\period\AlMa@period
      \let\event\AlMa@event
      \sbox0{#1}%
      \edef\AlMa@tmp
        {%
          \endgroup
          \def\unexpanded{#2}{\the\AlMa@min}%
          \def\unexpanded{#3}{\the\AlMa@max}%
        }%
    \AlMa@tmp
  }
\makeatother

\newcommand{\eventsperiodslist}
  {%
    \event[dated]{-6}{Some text}%
    \period{1}{5}{Nothing}%
    \period[center]{2}{7}{Something else}%
    \period[left]{4}{10}{Random text}%
    \event[dated]{23}{Making a test}%
  }

% just allocating macro names
\newcommand\mymin{0}
\newcommand\mymax{0}

\findminmax{\eventsperiodslist}\mymin\mymax


\begin{document}
Minimum was \mymin, and maximum was \mymax.
\end{document}

在此处输入图片描述

相关内容