在 Latex 中使用 for 循环生成有限集符号的正确方法是什么?

在 Latex 中使用 for 循环生成有限集符号的正确方法是什么?

我正在尝试创建一个将索引 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)。如果作为参数给出的数字小于默认数字或大一到两个,则将完整列表打印为列表

{ a1a2,…,a4 }

会比较尴尬。

规格

\sigi

  • 一个可选参数(括号中)代表变量名称(默认a
  • 一个可选参数(介于<和之间>),表示开头说明的元素数量
  • 一个强制参数(通常用括号括起来),代表最终数字

在第二个可选参数或强制参数中输入非正整数将导致错误。

但是,宏还允许使用 * 变体作为“通用”最后一个参数,如输入的最后三行所示。可选参数的语法相同;强制参数可以是任何参数。

相关内容