我正在定义一个调用其他命令的\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}