我有一些公式,例如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}
甚至\zz123
and\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