我正在尝试制作一个命令,将小时(例如:“14:17”)转换为十进制值(小时+分钟/60 = 14.28333333333),以用于 TikZ 计划:
\creneau[day=1, start=13.5, end=\hourtodec{14:17}]{Maths}
-> 星期一 (day=1),13:30 至 14:17:数学
xstring
我已经知道如何使用包(\StrBefore{14:17}{:}
和)从 14:17 中提取数字\StrBehind{14:17}{:}
,但我不知道如何计算分钟(calc
包仅适用于整数)。
答案1
可以通过 TeX 本身完成:
\documentclass{article}
\usepackage[francais]{babel}
\makeatletter
\newcommand*\dechour[1]{\expandafter\dechour@i#1\@nil}
\def\dechour@i#1:#2\@nil{\strip@pt\dimexpr #1pt+#2pt/60\relax}
\makeatother
\begin{document}
\shorthandoff{:}
\dechour{12:31}
\dechour{12:30}
\def\mbf{10:20} and \dechour{\mbf}
\end{document}
答案2
\usepackage{fp}
\newcommand\dechour[1]{\splithour#1!}
\def\splithour#1:#2!{\FPupn\result{60 #2 / #1 +}\FPround\result\result{5}\result}
\begin{document}
\dechour{12:31}
\dechour{12:30}
\end{document}
这将打印
12.51667
12.50000
答案3
虽然在 TeX 中可以解析这些简单的表达式并进行简单的计算,但我更喜欢使用 luatex 来完成此类任务。这是 ConTeXt 中的解决方案,我使用预定义的 lpeg 模式来匹配整数。
\startluacode
local C, P = lpeg.C, lpeg.P
local integer = lpeg.patterns.integer
local match = lpeg.match
local function hourtodec(hour, min)
return hour + min/60
end
local pattern = C(integer) * P(':') * C(integer) / hourtodec
function commands.hourtodec(hour)
return context(match(pattern, hour))
end
\stopluacode
\def\hourtodec#1{\ctxcommand{hourtodec("#1")}}
\starttext
\hourtodec{14:17}
\stoptext
几乎相同的解决方案在 LaTeX 中有效,只需用 lua 代码替换 ConTeXt 提供的一些便利函数即可
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
local C, P, R = lpeg.C, lpeg.P, lpeg.R
local integer = R('09')^1
local match = lpeg.match
local function hourtodec(hour, min)
return hour + min/60
end
local pattern = C(integer) * P(':') * C(integer) / hourtodec
commands = commands or {}
function commands.hourtodec(hour)
return tex.print(match(pattern, hour))
end
\end{luacode}
\def\hourtodec#1{\directlua{commands.hourtodec("#1")}}
\begin{document}
\hourtodec{14:17}
\end{document}