是否有一个包可以允许以数学模式正确写出小时,分钟和秒的时间?

是否有一个包可以允许以数学模式正确写出小时,分钟和秒的时间?

这个问题接着另一个问题:是否可以调整持续时间计算宏以在 foreach 循环中使用它?


我正在寻找一个包,甚至是一个宏,它允许我简单地为年轻学生编写持续时间计算。例如这个(Lebossé-Hemery 1957 六年级):

Lebossé-Hémery 1957 六年级

min我更喜欢用 分钟 (而不是)来更新这个符号m

我找到了这个代码:http://forum.mathematex.net/latex-f6/module-sinuitx-et-le-temps-t11198.html#p108990

\documentclass{article}
\usepackage{ifmtarg}
\usepackage{siunitx}
\sisetup{number-unit-separator=~}
\makeatletter
\newcommand{\sitime}[1]{\sitime@aux#1;;;\@nil}
\def\sitime@aux#1;#2;#3;#4\@nil{%
  \@ifmtarg{#1#2#3}%
  {%
    \PackageError{siunitx (modified)}%
                 {Empty \string\sitime\space argument}{}%
  }%
  {%
    \@ifmtarg{#1}{}{\SI{#1}{\hour}\@ifmtarg{#2#3}{}{\csname l_siunitx_number_unit_separator_tl\endcsname}}%
    \@ifmtarg{#2}{}{\SI{#2}{\minute}\@ifmtarg{#3}{}{\csname l_siunitx_number_unit_separator_tl\endcsname}}%
    \@ifmtarg{#3}{}{\SI{#3}{\second}}%
  }%
}
\makeatother
\newcommand{\sep}{\qquad}
\begin{document}

$\sitime{10;7;12}-\sitime{9;13;8}$

\end{document}

它给出了这个,小时和分钟之间的间距管理不善,但宏很方便:

截屏

  1. 是否有一个包可以允许本地完成此操作?
  2. 有什么想法可以改进这个宏吗?
  3. 另一个宏?

答案1

你可以有一个友好的语法:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\hms}{ >{\SplitArgument{2}{;}}m }
 {
  \ensuremath{\andrec_hms:nnn #1}
 }

\cs_new_protected:Nn \andrec_hms:nnn
 {
  \group_begin:
  \bool_set_false:N \l__andrec_hms_thinspace_bool
  \__andrec_hms_print:nn { 0#1 } { h }
  \tl_if_novalue:nTF { #2 }
   {
    \__andrec_hms_print:nn { 0 } { m }
   }
   {
    \__andrec_hms_print:nn { 0#2 } { m }
   }
  \tl_if_novalue:nTF { #3 }
   {
    \__andrec_hms_print:nn { 0 } { s }
   }
   {
    \__andrec_hms_print:nn { 0#3 } { s }
   }
  \group_end:
}
\cs_new_protected:Nn \__andrec_hms_print:nn
 {
  \int_compare:nT { #1 != 0 }
   {
    \bool_if:NT \l__andrec_hms_thinspace_bool { \, }
    \int_eval:n { #1 } \, \mathrm{#2}
    \bool_set_true:N \l__andrec_hms_thinspace_bool
   }
 }
\ExplSyntaxOff

\begin{document}

$\hms{7;40;21}+\hms{3;17;5}+\hms{2;4;20}$

$\hms{12;41;}+\hms{0;47;20}+\hms{7;0;37}$

$\hms{5;12;45}-\hms{4;9}$

\end{document}

对于缺失值,您可以使用 0 或不输入任何值;尾随缺失值可以完全省略;因此对于 2 小时,您可以说\hms{2},对于 2 小时 2 分钟,您可以说\hms{2;2}

在此处输入图片描述

使用可以在运行时设置或重置的分隔符,也可以选择作为可选参数:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\hms}{ o m }
 {
  \ensuremath
   {
    \IfNoValueTF { #1 }
     {
      \andrec_hms:Ve \l_andrec_hms_sep_str { \tl_to_str:n { #2 } }
     }
     {
      \andrec_hms:ee { \tl_to_str:n { #1 } } { \tl_to_str:n { #2 } }
     }
   }
 }
\NewDocumentCommand{\sethmssep}{m}
 {
  \str_set:Nn \l_andrec_hms_sep_str { #1 }
 }

\cs_new_protected:Nn \andrec_hms:nn
 {
  \group_begin:
  \seq_set_split:Nnn \l__andrec_hms_seq { #1 } { #2 }
  % normalize the sequence to have three (or more!) items
  \int_compare:nT { \seq_count:N \l__andrec_hms_seq = 1 }
   {
    \seq_put_right:Nn \l__andrec_hms_seq { 0 }
   }
  \int_compare:nT { \seq_count:N \l__andrec_hms_seq = 2 }
   {
    \seq_put_right:Nn \l__andrec_hms_seq { 0 }
   }
  % print
  \bool_set_false:N \l__andrec_hms_thinspace_bool
  \__andrec_hms_print:nn { 1 } { h }
  \__andrec_hms_print:nn { 2 } { m }
  \__andrec_hms_print:nn { 3 } { s }
  \group_end:
}
\cs_generate_variant:Nn \andrec_hms:nn { Ve,ee }

\cs_new_protected:Nn \__andrec_hms_print:nn
 {
  \int_compare:nF { 0\seq_item:Nn \l__andrec_hms_seq { #1 } = 0 }
   {
    \bool_if:NT \l__andrec_hms_thinspace_bool { \, }
    \int_eval:n { 0\seq_item:Nn \l__andrec_hms_seq { #1 } } \, \mathrm{#2}
    \bool_set_true:N \l__andrec_hms_thinspace_bool
   }
 }
\ExplSyntaxOff

\sethmssep{:}

\begin{document}

$\hms{7:40:21}+\hms[;]{3;17;5}+\hms{2:4:20}$

\sethmssep{;}

$\hms{12;41;}+\hms{0;47;20}+\hms{7;0;37}$

\sethmssep{,}

$\hms{5,12,45}-\hms[;]{4;9}$

\end{document}

输出是一样的。使用“字符串化”,我们解决了 babel 的问题。

只要您不想要负数,这里有一个修改,允许在输入中使用小数。请注意,您仍然必须输入带有小数点的数字,但可以使输出尊重语言环境。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{xparse}
\usepackage{siunitx}

\sisetup{locale=FR}

\ExplSyntaxOn

\NewDocumentCommand{\hms}{ o m }
 {
  \ensuremath
   {
    \IfNoValueTF { #1 }
     {
      \andrec_hms:Ve \l_andrec_hms_sep_str { \tl_to_str:n { #2 } }
     }
     {
      \andrec_hms:ee { \tl_to_str:n { #1 } } { \tl_to_str:n { #2 } }
     }
   }
 }
\NewDocumentCommand{\sethmssep}{m}
 {
  \str_set:Nn \l_andrec_hms_sep_str { #1 }
 }

\cs_new_protected:Nn \andrec_hms:nn
 {
  \group_begin:
  \seq_set_split:Nnn \l__andrec_hms_seq { #1 } { #2 }
  % normalize the sequence to have three (or more!) items
  \int_compare:nT { \seq_count:N \l__andrec_hms_seq = 1 }
   {
    \seq_put_right:Nn \l__andrec_hms_seq { 0 }
   }
  \int_compare:nT { \seq_count:N \l__andrec_hms_seq = 2 }
   {
    \seq_put_right:Nn \l__andrec_hms_seq { 0 }
   }
  % print
  \bool_set_false:N \l__andrec_hms_thinspace_bool
  \__andrec_hms_print:nn { 1 } { h }
  \__andrec_hms_print:nn { 2 } { m }
  \__andrec_hms_print:nn { 3 } { s }
  \group_end:
}
\cs_generate_variant:Nn \andrec_hms:nn { Ve,ee }

\cs_new_protected:Nn \__andrec_hms_print:nn
 {
  \fp_compare:nF { 0\seq_item:Nn \l__andrec_hms_seq { #1 } = 0 }
   {
    \bool_if:NT \l__andrec_hms_thinspace_bool { \, }
    \num{\fp_eval:n { 0\seq_item:Nn \l__andrec_hms_seq { #1 } }} \, \mathrm{#2}
    \bool_set_true:N \l__andrec_hms_thinspace_bool
   }
 }
\ExplSyntaxOff

\sethmssep{:}

\begin{document}

$\hms{1.5::}=\num{1.5}\times\hms{:60:}=\hms{:90:}$ % new

$\hms{7:40:21}+\hms[;]{3;17;5}+\hms{2:4:20}$

\sethmssep{;}

$\hms{12;41;}+\hms{0;47;20}+\hms{7;0;37}$

\sethmssep{,}

$\hms{5,12,45}-\hms[;]{4;9}$

\end{document}

在此处输入图片描述

答案2

只需稍微修改一下代码:

    \documentclass{article}
    \usepackage{ifmtarg}
    \usepackage{siunitx}
    \sisetup{number-unit-separator=\,}
    \makeatletter
    \newcommand{\sitime}[1]{\sitime@aux#1;;;\@nil}
    \def\sitime@aux#1;#2;#3;#4\@nil{%
      \@ifmtarg{#1#2#3}%
      {%
        \PackageError{siunitx (modified)}%
                     {Empty \string\sitime\space argument}{}%
      }%
    {%
    \@ifmtarg{#1}{}{\SI{#1}{\hour}\@ifmtarg{#2#3}{}{\csname l_siunitx_number_unit_separator_tl\endcsname}}%
    \@ifmtarg{#2}{}{~ \SI{#2}{\minute}\@ifmtarg{#3}{}{\csname l_siunitx_number_unit_separator_tl\endcsname}}%
    \@ifmtarg{#3}{}{~\SI{#3}{\second}}%
    }%
    }
    \makeatother
    \newcommand{\sep}{\qquad}
    \begin{document}

    $\sitime{10;7;12}-\sitime{9;13;8}$

    \end{document} 

在此处输入图片描述

修改代码以用作:参数的分隔符:使用

    \makeatletter
    \newcommand{\sitime}[1]{\sitime@aux#1:::\@nil}
    \def\sitime@aux#1:#2:#3:#4\@nil{%
      \@ifmtarg{#1#2#3}%
      {%
        \PackageError{siunitx (modified)}%
                     {Empty \string\sitime\space argument}{}%
      }%
    {%
    \@ifmtarg{#1}{}{\SI{#1}{\hour}\@ifmtarg{#2#3}{}{\csname l_siunitx_number_unit_separator_tl\endcsname}}%
    \@ifmtarg{#2}{}{\ \SI{#2}{\minute}\@ifmtarg{#3}{}{\csname l_siunitx_number_unit_separator_tl\endcsname}}%
    \@ifmtarg{#3}{}{\ \SI{#3}{\second}}%
    }%
    }
    \makeatother

相关内容