自动计算线长+对齐

自动计算线长+对齐

考虑以下示例。

代码

\documentclass{article}

\usepackage{mathtools}
\usepackage{ulem}

\newcommand*\mlr{\hspace{6em}}

\newcommand*\addition[4]{%
\begin{array}{@{} r @{,} l @{}}
                   #1 & #2 \\
  + \hspace{0.2em} #3 & #4 \\
  \hline
\end{array}%
}

\begin{document}

\begin{equation*}
\addition{1}{14}{14}{3}
\mlr
\addition{1}{2}{1}{3}
\mlr
\addition{20}{1}{2}{17}
\mlr
\addition{5}{9}{2}{7}
\end{equation*}

\end{document}

输出

输出

问题

  • 在第三个和中,我希望+符号与 的左侧对齐20.1(而不是2在的下方20.1)。通常,我希望加号与整数部分位数最多的数字的左侧对齐。

  • 如何获得与 长度相同的双下划线\baselineskip\hline\hline希望自动绘制具有正确长度的双下划线。(我知道我可以使用 手动更正此问题\hphantom。)

答案1

为标志分配一个列+,就这么简单。

\documentclass{article}
\usepackage{amsmath}

\newcommand*\addition[4]{%
\begin{array}{@{} r@{} r @{,} l @{}}
   & #1 & #2 \\
 + & #3 & #4 \\
 \hline
 \\
 \hline\hline
\end{array}%
}

\begin{document}

\begin{equation*}
\addition{1}{14}{14}{3}
\qquad
\addition{1}{2}{1}{3}
\qquad
\addition{20}{1}{2}{17}
\qquad
\addition{5}{9}{2}{7}
\end{equation*}

\end{document}

输出

不同的实现方式siunitx,其中第一个参数指定数字的位数:

\documentclass{article}
\usepackage{amsmath,siunitx}

\sisetup{output-decimal-marker={,}}

\NewDocumentCommand{\addition}{mmm}{%
  \begin{array}{@{} r@{\,} S[table-format=#1] @{}}
    & #2 \\
  + & #3 \\
  \hline
  \\
  \hline\hline
  \end{array}%
}

\begin{document}

\begin{equation*}
\addition{2.2}{1,14}{14,3}
\qquad
\addition{1.1}{1,2}{1,3}
\qquad
\addition{2.2}{20,1}{2,17}
\qquad
\addition{2.0}{59}{27}
\end{equation*}

\end{document}

在此处输入图片描述

通过更多的工作,我们可以避免指定数字的需要。

\documentclass{article}
\usepackage{amsmath,siunitx}

\sisetup{output-decimal-marker={,}}

\ExplSyntaxOn
\NewDocumentCommand{\addition}{mm}
 {
  \tl_set:Nn \l_svend_sum_first_tl { #1 }
  \tl_replace_once:Nnn \l_svend_sum_first_tl { . } { , }
  \tl_set:Nn \l_svend_sum_second_tl { #2 }
  \tl_replace_once:Nnn \l_svend_sum_second_tl { . } { , }
  \seq_set_split:NnV \l_svend_sum_first_seq { , } \l_svend_sum_first_tl
  \seq_set_split:NnV \l_svend_sum_second_seq { , } \l_svend_sum_second_tl
  \tl_set:Nx \l_svend_sum_first_tl
   {
    \int_to_arabic:f
     {
      \int_max:nn
       { \tl_count:f { \seq_item:Nn \l_svend_sum_first_seq { 1 } } }
       { \tl_count:f { \seq_item:Nn \l_svend_sum_second_seq { 1 } } }
     }
   }
  \tl_set:Nx \l_svend_sum_second_tl
   {
    \int_to_arabic:f
     {
      \int_max:nn
       { \tl_count:f { \seq_item:Nn \l_svend_sum_first_seq { 2 } } }
       { \tl_count:f { \seq_item:Nn \l_svend_sum_second_seq { 2 } } }
     }
   }
  \begin{array}{@{} r@{\,} S[table-format=\l_svend_sum_first_tl.\l_svend_sum_second_tl] @{}}
    & #1 \\
  + & #2 \\
  \hline
  \\
  \hline\hline
  \end{array}%
}
\tl_new:N \l_svend_sum_first_tl
\tl_new:N \l_svend_sum_second_tl
\seq_new:N \l_svend_sum_first_seq
\seq_new:N \l_svend_sum_second_seq
\cs_generate_variant:Nn \int_to_arabic:n { f }
\cs_generate_variant:Nn \tl_count:n { f }
\ExplSyntaxOff

\begin{document}

\begin{equation*}
\addition{1,14}{14,3}
\qquad
\addition{1,2}{1,3}
\qquad
\addition{20,1}{2,17}
\qquad
\addition{59}{27}
\end{equation*}

\end{document}

输出与以前相同。

相关内容