我正在尝试在 LaTeX 中定义一个直接求和表{\chi_i}
,这意味着条目将是以下形式:5 \chi_2 \bigoplus \chi_4 \bigoplus 2 \chi_7
对于给定的数据,这样 {{1,0},{2,5},{3,0},{4,1},{5,0},{6,0},{7,2}}
告诉您对于给定条目我们需要多少份副本\chi_i
。我编写数据的方式只是一个例子。我可以将数据格式化为最方便的任何形式。
为了避免在表格中的每个条目中进行硬编码,我试图在 LaTeX 中定义一个新命令,无论是通过\newcommand
还是\def
,它将接收此类数据并以上面写的直接和的形式返回,但我对此有点陌生,不知道我应该如何创建一个具有可变数量参数的命令,因为不是每个直接和都可以只用三个项来写。\newcommand
和\def
接受固定数量的参数这一事实使我认为我不应该将它们用于此任务。任何建议都将不胜感激。
编辑:
更准确地说,与和的系数有关的数据看起来应该像{5,2,7,8,2,0,0,1,3}
这样,即5 \chi_1 \bigoplus 2 \chi_2 \bigoplus \ldot \bigoplus 3 \chi_9
序列始终是固定大小。还应该注意的是,零项不应出现在和中。
答案1
更新了新格式:
\documentclass{article}
\makeatletter
\def\zz#1{{\@for\tmp:=#1\do{\expandafter\zzz\tmp\relax}}}
\def\zzz#1,#2\relax{\zzsep#1\chi_{#2}}
\def\zzsep{\def\zzsep{\bigoplus}}
\def\yy#1{{\count@\z@
\@for\tmp:=#1\do{\advance\count@\@ne
\ifnum\tmp=\z@\else\zzsep\tmp\chi_{\the\count@}\fi}}}
\makeatother
\begin{document}
\[
\zz{{1,0},{2,5},{3,0},{4,1},{5,0},{6,0},{7,2}}
\]
\[
\yy{5,2,7,8,2,0,0,1,3}
\]
\end{document}
答案2
该代码比 David 的要长,但由于使用了 LaTeX3 函数,因此更加现代和时尚。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\chisum}{m} % a homage to John Wayne
{
\aentropy_chisum:n { #1 }
}
\cs_new_protected:Npn \aentropy_chisum:n #1
{
\seq_clear:N \l_aentropy_chisum_seq
\clist_map_inline:nn { #1 }
{
\aentropy_add_summand:n { ##1 }
}
\seq_use:Nn \l_aentropy_chisum_seq { \oplus }
}
\cs_new:Npn \aentropy_add_summand:n #1
{
\__aentropy_add_summand:w #1 \q_stop
}
\cs_new:Npn \__aentropy_add_summand:w #1 , #2 \q_stop
{
\int_compare:nTF { #1 = 1 }
{% if the number of summands is 1, we don't show it
\seq_put_right:Nn \l_aentropy_chisum_seq { \chi\c_math_subscript_token{#2} }
}
{
\seq_put_right:Nn \l_aentropy_chisum_seq { #1\chi\c_math_subscript_token{#2} }
}
}
\ExplSyntaxOff
\begin{document}
$\chisum{{1,0},{2,5},{3,0},{4,1},{5,0},{6,0},{7,2}}$
\end{document}
想法是一样的:我们处理逗号分隔的列表,并将每个项目分成两个部分(系数和指数);我们将构建的加数存储在一个序列中,然后将其与 分开来传递\oplus
。
为了符合第二个规范,必须做出一些调整。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\chisum}{m} % a homage to John Wayne
{
\aentropy_chisum:n { #1 }
}
\seq_new:N \l_aentropy_chisum_seq
\int_new:N \l_aentropy_chisum_index_int
\cs_new_protected:Npn \aentropy_chisum:n #1
{
\seq_clear:N \l_aentropy_chisum_seq
\int_zero:N \l_aentropy_chisum_index_int
\clist_map_inline:nn { #1 }
{
\int_incr:N \l_aentropy_chisum_index_int
\aentropy_add_summand:n { ##1 }
}
\seq_use:Nn \l_aentropy_chisum_seq { \oplus }
}
\cs_new:Npn \aentropy_add_summand:n #1
{
\int_compare:nF { #1 = 0 }
{
\seq_put_right:Nx \l_aentropy_chisum_seq
{
\int_compare:nF { #1 = 1 } { #1 }
\exp_not:n { \chi }
\c_math_subscript_token
{ \int_to_arabic:n { \l_aentropy_chisum_index_int } }
}
}
}
\ExplSyntaxOff
\begin{document}
$\chisum{5,2,7,8,2,0,0,1,3}$
\end{document}
请注意,这\exp_not:n { \chi }
并不是真正必要的,因为\chi
它不可扩展;但您可能想要更改符号,因此谨慎一点总是好的。
零项被省略,一项被打印时不带系数 1。
您还可以使用符号系数,但定义不同\aentropy_add_summand:n
。每一项将与字符串进行比较0
,在这种情况下,不会添加任何加数;否则,将与 进行比较1
,在这种情况下,不会添加任何系数。
\cs_new:Npn \aentropy_add_summand:n #1
{
\str_if_eq:nnF { #1 } { 0 }
{
\seq_put_right:Nx \l_aentropy_chisum_seq
{
\str_if_eq:nnF { #1 } { 1 } { #1 }
\exp_not:n { \chi }
\c_math_subscript_token
{ \int_to_arabic:n { \l_aentropy_chisum_index_int } }
}
}
}
尝试
$\chisum{5,2,7,8,2,0,0,1,3}$
$\chisum{a,b,2,0,0,0,0,1,3}$
你会得到