有人告诉我,会议纪要可以在 TeX 中访问,但我找不到调用该命令的命令。
我如何在 TeX 中调用分钟?
请不要告诉我有关分钟的构造\the\time
,我知道如何做到这一点。
请注意:答案仅针对 TeX,而不是 LaTeX。
答案1
我给出了比 egreg 更简单的\minutes
计算\hours
:
\def\hours{\numexpr (\time+30)/60-1\relax}
\def\minutes{\numexpr \time-60*\hours \relax}
\the\hours, \the\minutes
\bye
答案2
嗯,可能使用一些递归魔法。
这是一个\minute
可以在任何引擎 :)
它与 wipet 的不同之处在于\minutes
,他的宏模拟了一个 TeX 寄存器,您可以使用 来访问它\the
,而使用这个则不能,因为 Knuth 的 TeX 没有像 ε-TeX 那样的伪寄存器\numexpr
。
\catcode`\@=11
\def\minute{\number\expandafter\min@i\the\time{}{}{};}
\def\min@i#1#2#3#4#5;{\min@ii#1#2#3#4;}
\def\min@ii#1;{\ifnum#1>59 \expandafter\min@ii\number\min@decr@hour\else #1\fi}
\def\min@decr@hour\else#1\fi{\fi\min@reverse#1{}{};}
\def\min@reverse#1#2#3#4#5;{\min@minus@sixty#4#3#2#100;}
\def\min@afterfi#1#2\fi{\fi\min@re@reverse#1{}{};}
\def\min@re@reverse#1#2#3#4#5;{#4#3#2#1;}
\def\min@minus@sixty#1#2#3#4#5;{\ifcase#2
\min@minus@one{#3}{#4}{#14}\or\min@minus@one{#3}{#4}{#15}%
\or\min@minus@one{#3}{#4}{#16}\or\min@minus@one{#3}{#4}{#17}%
\or\min@minus@one{#3}{#4}{#18}\or\min@minus@one{#3}{#4}{#19}%
\or\min@afterfi{#10#3#4}\or\min@afterfi{#11#3#4}%
\or\min@afterfi{#12#3#4}\or\min@afterfi{#13#3#4}%
\fi}
\def\min@minus@one#1#2#3{\ifcase#1 \min@minus@one{#2}{}{#39}% 0
\or\min@afterfi{#30#2}\or\min@afterfi{#31#2}\or\min@afterfi{#32#2}%
\or\min@afterfi{#33#2}\or\min@afterfi{#34#2}\or\min@afterfi{#35#2}%
\or\min@afterfi{#36#2}\or\min@afterfi{#37#2}\or\min@afterfi{#38#2}%
\fi}
\catcode`\@=12
\edef\x{\minute}\show\x
\end
这个算法真的很蠢。它从 的扩展中取出标记\the\time
,然后连续从中减去 60,直到剩余的数小于 60,然后返回该数。在没有 的情况下\numexpr
,减法是通过十路来完成的\ifcase
,它查看数字的十位数,并返回减去的值(在编写此代码时没有损害任何算术:)
答案3
Knuth TeX 中没有可扩展的方式来访问小时和分钟的时间,只能通过寄存器分配进行算术运算。
嗯,可能使用一些递归魔法。
如果你允许 e-TeX 扩展,那就容易多了:
\long\def\firstoftwo#1#2{#1}
\long\def\secondoftwo#1#2{#2}
\def\minutes{\computeminutes\time}
\def\computeminutes#1{%
\ifnum#1<60
\expandafter\firstoftwo
\else
\expandafter\secondoftwo
\fi
{#1}{\expandafter\computeminutes\expandafter{\the\numexpr#1-60\relax}}%
}
\def\hours{\expandafter\computehours\time}
\def\computehours#1{\the\numexpr(#1-\computeminutes{#1})/60\relax}
\def\longtime{\printlongtime\time}
\def\printlongtime#1{%
\ifnum\computehours{#1}<10 0\fi\computehours{#1}%
:%
\ifnum\computeminutes{#1}<10 0\fi\computeminutes{#1}%
}
\hours, \minutes, \longtime
\computehours{955}, \computeminutes{955}, \printlongtime{955}
\computehours{905}, \computeminutes{905}, \printlongtime{905}
\computehours{37}, \computeminutes{37}, \printlongtime{37}
\computehours{0}, \computeminutes{0}, \printlongtime{0}
\bye
为什么要走这么远的路?因为要按\numexpr
轮次进行除法,而不是截断。
最后的例子是为了模拟不同的时代。
使用expl3
(也可以在纯 TeX 中使用):
\input expl3-generic
\ExplSyntaxOn
\cs_new:Npn \minutes { \int_to_arabic:n { \c_sys_minute_int } }
\cs_new:Npn \hours { \int_to_arabic:n { \c_sys_hour_int } }
\cs_new:Npn \longtime
{
\int_compare:nT { \c_sys_hour_int < 10 } { 0 }
\hours
:
\int_compare:nT { \c_sys_minute_int < 10 } { 0 }
\minutes
}
\ExplSyntaxOff
答案4
\newcount\timebase
\timebase=\the\time
\newcount\hour
\hour=\the\time
\divide\hour by 60
\newcount\minute
\minute=0
\newcount\second
\second=0
\newcount\reduce
\reduce=60
\newcount\start%
\newcount\stop%
\def\while[#1,#2,#3]{%
\start=#1 %
\stop=#2 %
\def\doit{#3}%
\loop \ifnum\start<\the\stop \doit \advance\start by 1\repeat%
\start=0 \stop=0}%
\while[0,24,\ifnum\the\hour=0 \else\ifnum\the\hour=\the\start\multiply\reduce by \start \vskip\baselineskip\advance\timebase by -\reduce\fi\fi]%
\minute=\the\timebase
Output:
The Time: \the\time%
Current time:
\ifnum\the\hour<10 0\fi%
\the\hour:%
\ifnum\the\minute<10 0\fi%
\the\minute:%
\ifnum\the\second<10 0\fi%
\the\second
Seconds are not defined yet.
\bye