使用 siunitx 包获取一天中的时间或时间段

使用 siunitx 包获取一天中的时间或时间段

我想用 显示一天中的时间,如 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
            }%
        }%
    }%
}

相关内容