我想为可能发生变化的活动制作一份“运行表”,因此如果节目发生变化,我希望 LaTeX 能帮我跟踪计算。我设想存储一个“开始”时间,为每个部分设置一个计数器“持续时间”,并使用 LaTeX 将这两个时间相加,这样结果仍然是下一个部分开始的有效时钟时间。这将按顺序继续每个元素。例如,下午 2 点“开始”,10 分钟介绍“持续时间”,导致下一个项目的打印时间为下午 2:10(下午不是必需的)。这样,如果有人决定他们可以/不能在开幕式上发表演讲,我们就不必费力地更改所有时间。我也不想手动确保 60 分钟的过去实际上会增加小时数。
我查看了datetime2
其他一些软件包,不清楚如何添加存储的日期,但我承认我通常使用 R 对日期格式施加一些要求。我宁愿不必使用 R 脚本来执行此操作,然后将文本导入 LaTeX 文档。欢迎提出任何创建类似我所描述的内容的建议。
答案1
以下内容可能是一个足够的开始:
\documentclass{article}
\usepackage{xfp}
\makeatletter
% Split time into hours and minutes
\def\@splittime#1:#2\relax{\edef\@timehour{#1}\edef\@timeminute{#2}}
% Set start time: \starttime{<hour>:<minute>}
\newcommand{\setstarttime}[1]{%
\@splittime#1\relax%
\xdef\@starttime{\two@digits\@timehour:\two@digits\@timeminute}}
% Print start time
\newcommand{\printstarttime}{\@starttime}
% Set duration of event: \setduration{<hours>:<minutes>}
\newcommand{\setduration}[1]{%
\@splittime#1\relax%
\edef\@durationhour{\@timehour}\edef\@durationminute{\@timeminute}%
\@addduration}
% Adds duration to start time
\newcommand{\@addduration}{%
\expandafter\@splittime\@starttime\relax
\edef\@timehour{\fpeval{\@timehour+\@durationhour+trunc((\@durationminute+\@timeminute)/60)}}%
\edef\@timehour{\fpeval{\@timehour-12*(trunc((\@timehour-1)/12))}}%
\edef\@timeminute{\fpeval{\@timeminute+\@durationminute}}%
\edef\@timeminute{\fpeval{\@timeminute-60*(trunc(\@timeminute/60))}}%
\xdef\@starttime{\two@digits\@timehour:\two@digits\@timeminute}%
}
\makeatother
\begin{document}
Start: \setstarttime{8:12}\printstarttime
+0:15 = \setduration{0:15}\printstarttime
+2:17 = \setduration{2:17}\printstarttime
+5:55 = \setduration{5:55}\printstarttime
+0:21 = \setduration{0:21}\printstarttime
+6:60 = \setduration{6:60}\printstarttime
+1:120 = \setduration{1:120}\printstarttime
\end{document}
您可以使用 来设置开始时间,\setstarttime{<hour>:<minute>}
其中:
是必需的。然后,您可以通过 添加事件持续时间\setduration{<hours>:<minutes>}
;同样,:
是必需的,您也可以在此处设置一些奇怪的内容(例如1:120
,表示事件跨越1
小时和120
分钟,或 3 小时)。\printstarttime
使用 12 小时制和两位数打印来打印开始时间。
没有考虑 PM 或 AM,但可以添加。不过,可能需要一个可靠的输入界面(也许\setstarttime{8:27AM}
)。此外,假设将设置正确的开始时间,尽管如果需要,也可以检查用户是否正确输入了该时间。其他扩展也是可能的,以及必要的错误检查。
答案2
您不需要了解任何 LaTeX 软件包。只需使用 TeX 基元(或普通的 TeX 宏):
\newcount\hr \newcount\mn \newcount\tmpnum
\def\ntime{\tmpnum=\mn
\divide\tmpnum by60 \advance\hr by\tmpnum
\multiply\tmpnum by60 \advance\mn by-\tmpnum
\tmpnum=\hr \divide\tmpnum by12
\multiply\tmpnum by12 \advance\hr by-\tmpnum
\ifnum\hr=0 \hr=12 \fi
}
\def\setstarttime#1{\setstarttimeA#1&}
\def\setduration #1{\setdurationA #1&}
\def\setstarttimeA#1:#2&{\hr=#1\relax \mn=#2\relax \ntime}
\def\setdurationA #1:#2&{\advance\hr by#1\relax \advance\mn by#2\relax \ntime}
\def\printstarttime{\ifnum\hr<10 0\fi \the\hr:\ifnum\mn<10 0\fi \the\mn}
Start: \setstarttime{8:12}\printstarttime
+0:15 = \setduration{0:15}\printstarttime
+2:17 = \setduration{2:17}\printstarttime
+5:55 = \setduration{5:55}\printstarttime
+0:21 = \setduration{0:21}\printstarttime
+6:60 = \setduration{6:60}\printstarttime
+1:120 = \setduration{1:120}\printstarttime
\bye