一个用于多个公式的新命令

一个用于多个公式的新命令

我有一些公式,例如z_{(h_{1},h_{2},h_{3})}z_{(h_{4},h_{5},h_{6})}。如何\newcommand{}{}为所有这些公式引入一个?

提前致谢

答案1

他们忘了xinttools

\documentclass{article}

\usepackage{xinttools}

% Thank you very much. I will be very thankful if you write the commands for
% z_{j_{1}(h_{1},h_{2})} and z_{k(h_{3},h_{4},h_{5})}

\newcommand{\zz}[2]{z_{#1(\xintFor ##1 in {#2}\do {h_{##1}\xintifForLast{}{,}})}}
\begin{document}

\[ \zz{j_{1}}{1,2} = \zz{k}{3, 4, 5}\]

\end{document}

在此处输入图片描述

答案2

  \newcommand\zz[3]{z_{(h_{#1},h_{#2},h_{#3})} 

然后你可以使用 and \zz{1}{2}{3}and\zz{4}{5}{6}甚至\zz123and\zz456

答案3

将其扩展到任意数量的下标并不困难:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\zz}{m}
 {
  z
  \sp{}\sb
   {
    \clist_map_inline:nn { #1 }
     {
      \seq_put_right:Nn \l_fahim_z_subscripts_seq { h\sb{##1} }
     }
    (\seq_use:Nn \l_fahim_z_subscripts_seq { , })
   }
 }
\seq_new:N \l_fahim_z_subscripts_seq
\ExplSyntaxOff

\begin{document}

$\zz{1,2,3}+\zz{4,5,6}=\zz{1,2,3,4,5,6}$

\end{document}

在此处输入图片描述

这可以推广到不同的基本字母和不同的下标处理。尾随的可选参数设置如何处理逗号分隔列表中的每个项目,请参阅示例。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\zz}{O{z}mO{h\sb{##1}}}
 {
  #1
  \sp{}\sb
   {
    \cs_set_protected:Nn \__fahim_z_subscript:n { #3 }
    \clist_map_inline:nn { #2 }
     {
      \seq_put_right:Nn \l_fahim_z_subscripts_seq { \__fahim_z_subscript:n { ##1 } }
     }
    (\seq_use:Nn \l_fahim_z_subscripts_seq { , })
   }
 }
\seq_new:N \l_fahim_z_subscripts_seq
\ExplSyntaxOff

\begin{document}

$\zz{1,2,3}+\zz{4,5,6}=\zz{1,2,3,4,5,6}$

$\zz[Z]{1,2,3}[k_{#1}]$

$\zz{1,2,3}[(#1)]$

\end{document}

在此处输入图片描述

对于更复杂的设置,我建议使用键值语法。这里的键是var(用于变量的名称)、outer用于设置整体设置(默认只是添加括号)和inner用于实际下标的序列。请参阅给出的示例。您可以随时发出\zzset更改(在当前范围内)一个或多个值。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\zz}{O{}m}
 {
  \group_begin:
  \keys_set:nn { fahim/zz } { #1 }
  \fahim_zz:n { #2 }
  \group_end:
 }

\NewDocumentCommand{\zzset}{m}
 {
  \keys_set:nn { fahim/zz } { #1 }
 }

\keys_define:nn { fahim/zz }
 {
  var .tl_set:N = \l__fahim_zz_var_tl,
  outer .code:n = \cs_set_protected:Nn \__fahim_zz_outer:n { #1 },
  inner .code:n = \cs_set_protected:Nn \__fahim_zz_inner:n { #1 },
 }

\seq_new:N \l__fahim_zz_subscripts_seq

\cs_new_protected:Nn \fahim_zz:n
 {
  \tl_use:N \l__fahim_zz_var_tl
  \sp{} % a dummy superscript to lower the subscript
  \sb
   {
    \__fahim_zz_outer:n
     {
      \clist_map_inline:nn { #1 }
       {
        \seq_put_right:Nn \l__fahim_zz_subscripts_seq { \__fahim_zz_inner:n { ##1 } }
       }
      \seq_use:Nn \l__fahim_zz_subscripts_seq { , }
     }
   }
 }
\ExplSyntaxOff

% initialize
\zzset{
  var=z,
  outer=(#1),
  inner=h_{#1},
}

\begin{document}

$\zz{1,2,3}+\zz{4,5,6}=\zz{1,2,3,4,5,6}$

$\zz[var=Z,inner=k_{#1}]{1,2,3}$

$\zz[outer=i(#1)]{1,2,3}$

$\zz[outer=i(#1),inner=k_{#1}]{1,2,3}$

\end{document}

在此处输入图片描述

答案4

listofitems软件包非常简单:

\documentclass{article}
\usepackage{listofitems}
\newcommand\zz[1]{
  z_{(
    \setsepchar{,}
    \readlist*\zlist{#1}
    \foreachitem\i\in\zlist{\ifnum\icnt=1\relax\else,\fi h_{\i}}
  )}
}
\begin{document}
$\zz{1,2,3}+\zz{4,5,6}=\zz{1,2,3,4,5,6}$
\end{document}

在此处输入图片描述

顺便说一下,listofitems在纯 TeX 中也可以使用:

\input listofitems.tex
\def\zz#1{
  z_{(
    \setsepchar{,}
    \readlist*\zlist{#1}
    \foreachitem\i\in\zlist{\ifnum\icnt=1\relax\else,\fi h_{\i}}
  )}
}
$\zz{1,2,3}+\zz{4,5,6}=\zz{1,2,3,4,5,6}$
\end

相关内容