定义生成序列的命令

定义生成序列的命令

我正在尝试定义一个命令来创建下标字符列表\varphi。我们将其称为\phiseq。我希望能够\phiseq{1,2,3}在文档正文中使用以扩展为$\varphi_1,\varphi_2,\varphi_3$。有什么想法吗?我尝试过几次\@for,但都没有成功。

答案1

在此处输入图片描述

\documentclass{article}

\makeatletter
\def\phiseq#1{$\let\comma\@empty\@for\tmp:=#1\do{\comma\varphi_{\tmp}\def\comma{,}}$}
\makeatother

\begin{document}

\phiseq{1,2,3}

\end{document}

答案2

您可以使用 定义一个相当通用的命令expl3

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \kellvyn_print_seq:nnnn #1 #2 #3 #4
 {% #1 = input delimiter
  % #2 = output delimiter
  % #3 = symbol
  % #4 = list
  % store the list in a sequence
  \seq_set_split:Nnn \l_kellvyn_args_seq { #1 } { #4 }
  % clear the auxiliary sequence
  \seq_clear:N \l_kellvyn_print_seq
  % process the argument list
  \seq_map_inline:Nn \l_kellvyn_args_seq
   {
    \tl_if_eq:nnTF { ##1 } { \dots }
     {% if the item is \dots, store it unchanged
      \seq_put_right:Nn \l_kellvyn_print_seq { \dots }
     }
     {% otherwise, store "symbol_{item}"
      \seq_put_right:Nn \l_kellvyn_print_seq { #3\sb{##1} }
     }
   }
  % print the sequence
  \seq_use:Nnnn \l_kellvyn_print_seq { #2 } { #2 } { #2 }
 }
\NewDocumentCommand{\phiseq}{m}
 {
  \kellvyn_print_seq:nnnn { , } { , }{ \varphi } { #1 }
 }
\NewDocumentCommand{\printseq}{O{,}mm}
 {
  \kellvyn_print_seq:nnnn { , } { #1 } { #2 } { #3 }
 }
\ExplSyntaxOff
\begin{document}
$\phiseq{1,2,3}$

$\phiseq{1,2,\dots,n}$

$\printseq{x}{1,2,\dots,k-1,k}$

$\printseq[;]{y}{1,2,3,4}$
\end{document}

这样,\phiseq您就能获得原始请求,但\dots输入会在输出中产生点。该\printseq命令更通用,可选参数是输出分隔符。我还使用了一个参数作为输入分隔符,以便进行可能的扩展(拥有它并不困难,因此最好尽可能通用)。

在此处输入图片描述

答案3

这对我有用:

\documentclass{article}
\makeatletter
\newif\if@phiseqfirst
\def\phiseq#1{%
  \@phiseqfirsttrue
  $\@for\ind:=#1\do{
    \if@phiseqfirst\else,\fi
    \varphi_{\ind}
  \@phiseqfirstfalse}$}
\makeatother

\begin{document}

\phiseq{1,2,3,4}
\end{document}

魔法\@phiseqfirst就在这里,最后去掉了虚假的逗号(感谢@GonzaloMedina 的指出)。

答案4

还有另一种解决方案pgffor

\documentclass[varwidth]{standalone}
\usepackage{pgffor}
\def\seq#1#2{%
  \foreach \i[count = \j] in {#2}{%
    \unless\ifnum\j=1\relax, \fi$#1_{\i}$}}
\def\phiseq#1{\seq{\phi}{#1}}
\begin{document}
\seq{\psi}{1,...,5}\par
\phiseq{10,...,20}
\end{document}

在此处输入图片描述

相关内容