TeX 中的 Minutes 命令

TeX 中的 Minutes 命令

有人告诉我,会议纪要可以在 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

相关内容