定义 LaTeX 命令时遇到问题

定义 LaTeX 命令时遇到问题

我正在尝试在 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}$

你会得到

在此处输入图片描述

相关内容