![在 Latex 中使用 for 循环生成有限集符号的正确方法是什么?](https://linux22.com/image/262609/%E5%9C%A8%20Latex%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20for%20%E5%BE%AA%E7%8E%AF%E7%94%9F%E6%88%90%E6%9C%89%E9%99%90%E9%9B%86%E7%AC%A6%E5%8F%B7%E7%9A%84%E6%AD%A3%E7%A1%AE%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我正在尝试创建一个将索引 n 作为参数的命令,并生成此 {a_1, a_2, a_3, ...,a_n} 的展开形式。
第一次尝试时,我尝试使用pgffor:对 \foreach-list 中最后一项进行特殊处理和https://stackoverflow.com/questions/2561791/iteration-in-latex创建代码,如果索引为 1,则输出 a_1;如果索引不是 1,则输出“,”后跟 a_n。
\usepackage{pgffor}
\newcommand{\sigi}[1]{\foreach \n [count=\ni] in {1,...#1}{%
\ifnum\ni=1%
\sigma_#1%
\else%
,\sigma_#1%
}}
不幸的是,我之前既没有使用过 LaTeX 循环,也没有使用过 pgffor 包,所以我不清楚如何解释当我尝试使用此命令时发生的编译错误,如下所示:
$\sigi{1}$
错误信息:
! Undefined control sequence.
\pgffor@count@@parse ...mathresult }\pgfmathparse
{int(#3-1)}\let #1=\pgfmat...
l.363 \sigi{1}
答案1
这个想法不错,但是你的代码中有几个错误。以下是修复版本:
\documentclass{article}
\usepackage{pgffor,pgfmath}
\begin{document}
\newcommand{\sigi}[1]{\foreach \ni in {1,...,#1}{%
\ifnum\ni=1
\sigma_{\ni}%
\else%
,\sigma_{\ni}%
\fi
}}
$\sigi{12}$
\end{document}
问题是:
- 丢失
pgfmath
包裹 - 后面缺少逗号
...
- 多余
%
的\ifnum\ni=1
- 的下标
\sigma
应为\ni
,而不是#1
,并且应括在括号中(当#1
大于 9 时很重要) - 丢失的
\fi
\foreach \n [count=\ni]
还不错,但\foreach \ni
更简单
答案2
这是一个使用 LaTeX3 的相当可定制的版本。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
% the user level macro
\NewDocumentCommand{\sigi}{ s O{a} D<>{2} m }
{
\{ % initial delimiter
\IfBooleanTF{#1}
{
\merlin_sigi_nodots:nn { #2 } { #3 }, \dots, #2\sb{#4}
}
{
\merlin_sigi:nnn { #2 } { #3 } { #4 }
}
\} % final delimiter
}
% the inner main function that decides if dots are necessary or not
\cs_new_protected:Npn \merlin_sigi:nnn #1 #2 #3
{
\int_compare:nTF { #3 < #2 }
{\merlin_sigi_nodots:nn { #1 } { #3 } }
{
\int_compare:nTF { #3 <= #2 + 2 }
{ \merlin_sigi_nodots:nn { #1 } { #3 } }
{ \merlin_sigi_dots:nnn { #1 } { #2 } { #3 } }
}
}
% the loop for printing the sequence when no dots are required
\cs_new_protected:Npn \merlin_sigi_nodots:nn #1 #2
{
\int_step_inline:nnnn { 1 } { 1 } { #2 - 1 } { #1\sb{##1}, }
#1\sb{#2}
}
% the loop for printing the sequence when dots are required
\cs_new_protected:Npn \merlin_sigi_dots:nnn #1 #2 #3
{
\int_step_inline:nnnn { 1 } { 1 } { #2 } { #1\sb{##1}, }
\dots,
#1\sb{#3}
}
\ExplSyntaxOff
\begin{document}
$\sigi{3}$
$\sigi{4}$
$\sigi[b]{5}$
$\sigi<3>{10}$
$\sigi[c]<4>{20}$
$\sigi<5>{4}$
$\sigi{1}$
$\sigi{2}$
\bigskip
$\sigi*{n}$
$\sigi*[b]{m}$
$\sigi*[c]<3>{k}$
\end{document}
您可以指定变量名称(默认A) 和初始索引元素的数量(默认为 2)。如果作为参数给出的数字小于默认数字或大一到两个,则将完整列表打印为列表
{ a1,a2,…,a4 }
会比较尴尬。
规格
宏\sigi
有
- 一个可选参数(括号中)代表变量名称(默认
a
) - 一个可选参数(介于
<
和之间>
),表示开头说明的元素数量 - 一个强制参数(通常用括号括起来),代表最终数字
在第二个可选参数或强制参数中输入非正整数将导致错误。
但是,宏还允许使用 * 变体作为“通用”最后一个参数,如输入的最后三行所示。可选参数的语法相同;强制参数可以是任何参数。