![定义生成序列的命令](https://linux22.com/image/270552/%E5%AE%9A%E4%B9%89%E7%94%9F%E6%88%90%E5%BA%8F%E5%88%97%E7%9A%84%E5%91%BD%E4%BB%A4.png)
我正在尝试定义一个命令来创建下标字符列表\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}