在我的l3
冒险中,我看了这篇文章如何格式化生成的乘法表我很确定可以使用l3
实现来实现。在做研究时,我发现@egreg 的帖子加法和乘法表并查看了有关定义新整数值并增加该值的代码。
是否可以在其中创建类似的命令l3
?
这是我目前的代码:
\documentclass[letterpaper]{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\shcmultiplicationtable}{m}
{% #1 is max value of multiplication table
\shc_make_multi_table:n { #1 }
}
%\NewDocumentCommand{\shcmultiply}{ m m } % does the multiplication that is desired
% {
% \fp_eval:n{ #1 * #2 }
% }
\int_new:N \l_shc_first_number_int
\int_new:N \l_shc_second_number_int
\cs_new_protected:Npn \shc_make_multi_table:n #1
{
\int_set:Nn \l_shc_first_number_int { 0 }
\int_set:Nn \l_shc_second_number_int { #1 }
\int_step_inline:nn {#1}
{
\int_incr:N \l_shc_first_number_int
\fp_eval:n{ \l_shc_first_number_int * #1 }
}
}
\ExplSyntaxOff
\begin{document}
\shcmultiplicationtable{4}
\end{document}
那么如何才能编写下面的代码呢l3
?
\def\sz{11}
\foreach \b in {1,...,\sz}{%
\noindent%
\foreach \a in {1,2,...,\sz}{%
\pgfmathparse{int(\a*\b)}%
\makebox[2em][r]{${\pgfmathresult}$}
}
}
答案1
嵌套两个\int_step_inline:nn
循环:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\multiplicationtable}{m}
{
\noindent
\int_step_inline:nn { #1 }
{
\int_step_inline:nn { #1 }
{
\makebox[2em][r]{ \int_to_arabic:n { ##1*####1 } }
}
\int_compare:nF { #1=##1 } { \\ }
}
}
\ExplSyntaxOff
\begin{document}
\multiplicationtable{11}
\end{document}
第一个\int_step_inline:nn
循环用于构建行,基本条目为##1=1
。这里的索引必须命名,##1
因为它处于“第二级”。每个循环都有一个嵌套\int_step_inline:nn
循环,用于构建行中的单元格;这里的索引必须命名为,因为我们处于第三级。参数编号前的标记####1
数为 2#
n–1,因为在每个级别中都会构建一个带有参数的宏;在更高级别上,当执行宏定义时,每对#
标记都会变成一个标记。
在每个单元格中,我们可以使用来计算所需的值\int_to_arabic:
,它需要一个“整数表达式”作为其参数。
在外层循环的末尾,我添加了一个测试#1=##1
,即我们是否在最后一行;如果不是,则添加。这避免了在空行之前出现\\
警告。\\
一种不同的实现方式是使用tabular
,其中表主体是预先构建的,从而更容易添加“装饰品”。
\documentclass{article}
\usepackage{xparse,array}
\ExplSyntaxOn
\NewDocumentCommand{\multiplicationtable}{O{2em}m}
{
\azetina_multiplicationtable:nn { #1 } { #2 }
}
\tl_new:N \l__azetina_multiplicationtable_tl
\cs_new_protected:Nn \azetina_multiplicationtable:nn
{
\tl_set:Nn \l__azetina_multiplicationtable_tl { $\times$ }
\int_step_inline:nn { #2 }
{
\tl_put_right:Nn \l__azetina_multiplicationtable_tl { & ##1 }
}
\tl_put_right:Nn \l__azetina_multiplicationtable_tl { \\ \hline }
\int_step_inline:nn { #2 }
{
\tl_put_right:Nn \l__azetina_multiplicationtable_tl { ##1 }
\int_step_inline:nn { #2 }
{
\tl_put_right:Nx \l__azetina_multiplicationtable_tl
{
& \int_to_arabic:n { ##1*####1 }
}
}
\tl_put_right:Nn \l__azetina_multiplicationtable_tl { \\ }
}
\begin{tabular}{ @{} r |@{} *{#2}{w{r}{#1}@{}} }
\tl_use:N \l__azetina_multiplicationtable_tl
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\multiplicationtable{11}
\bigskip
\multiplicationtable[1.5em]{4}
\end{document}