我想用 显示一天中的时间,如 18h30 或 18h30m siunitx
。有没有合适的方法来显示时间和时间间隔?
我读过一些关于邮件列表,但它似乎已经过时了。
我的个人解决方案是定义以下命令:
\newcommand{\hms}[3]{
% Stunden nur zeigen, wenn gesetzt
\ifthenelse{\isempty{#1}}
{}
{\SI{#1}{\hour}}
%
% Luecke nur, wenn Stunden und Minuten
\ifthenelse{\isempty{#1} \OR \isempty{#2}}
{}
{\,\,}
%
% Minuten nur zeigen, wenn gesetzt
\ifthenelse{\isempty{#2}}
{}
{\SI{#2}{\minute}}
% %
% Luecke nur, wenn Minuten und Sekunden
\ifthenelse{\isempty{#2} \OR \isempty{#3}}
{}
{\,\,}
%
%Luecke nur, wenn Sekunden und Stunden aber nicht Minuten
\ifthenelse{\isempty{#2} \AND \NOT \isempty{#3} \AND \NOT \isempty{#1}}
{\,\,}
{}
%
% Sekunden nur zeigen, wenn gesetzt
\ifthenelse{\isempty{#3}}
{}
{\SI{#3}{\second}}
}
你的看法是什么?你会如何排版时间和时间段?
答案1
我被问过几次这个问题。这是一个尴尬的问题,因为人们想要的格式(例如“18 小时 30 分钟”)实际上并不是科学工作中表达时间的唯一想法。你通常希望用一个单位来表达,即小时或分钟,但不能同时用两者。话虽如此,构造一个\hms
以类似方式工作的函数并不难\ang
(多单位参数也适用于后者!)。这需要代码测试以及\IfNoValueTF
,这对最终用户来说有点尴尬,但类似
\documentclass{article}
\usepackage{siunitx}
\ExplSyntaxOn
\NewDocumentCommand \hms { o > { \SplitArgument { 2 } { ; } } m }
{
\group_begin:
\IfNoValueF {#1}
{ \keys_set:nn { siunitx } {#1} }
\siunitx_hms_output:nnn #2
\group_end:
}
\cs_new_protected:Npn \siunitx_hms_output:nnn #1#2#3
{
\IfNoValueF {#1}
{
\tl_if_blank:nF {#1}
{
\SI {#1} { \hour }
\IfNoValueF {#2} { ~ }
}
}
\IfNoValueF {#2}
{
\tl_if_blank:nF {#2}
{
\SI {#2} { \minute }
\IfNoValueF {#3} { ~ }
}
}
\IfNoValueF {#3}
{ \tl_if_blank:nF {#3} { \SI {#3} { \second } } }
}
\ExplSyntaxOff
\begin{document}
\hms{10}\\
\hms{;10}\\
\hms{;;10}\\
\hms{10;10}\\
\hms{10;;10}\\
\hms{10;10;10}\\
\end{document}
应该可以满足您的要求。我已按常规方式添加了一个可选的第一个参数,用于本地设置siunitx
。
答案2
\NewDocumentCommand{\hms}{sm}{%
\StrCut[1]{#2}{;}{\H}{\MS}%
\StrCut[1]{\MS}{;}{\M}{\S}%
\IfStrEq{\H}{}{}{\edef\H{\SI{\H}{\hour}}}%
\IfBooleanTF{#1}{%
\IfStrEq{\M}{}{}{\edef\M{\num{\M}}}%
}{%
\IfStrEq{\M}{}{}{\edef\M{\SI{\M}{\minute}}}%
}%
\IfStrEq{\S}{}{}{\edef\S{\SI{\S}{\second}}}%
\IfStrEq{\H}{}{% Pas d'heure
\IfStrEq{\M}{}{% Pas de minutes
\IfStrEq{\S}{}{% Pas de secondes
}{% avec secondes
\S
}%
}{% avec minutes
\IfStrEq{\S}{}{% Pas de secondes
\H~\M
}{% avec secondes
\M~\S
}%
}%
}{% avec heure
\IfStrEq{\M}{}{% Pas de minutes
\IfStrEq{\S}{}{% Pas de secondes
\H
}{% avec secondes
\H~\S
}%
}{% avec minutes
\IfStrEq{\S}{}{% Pas de secondes
\H~\M
}{% avec secondes
\H~\M~\S
}%
}%
}%
}