如何为 \{e_1,\cdots, e_n\} 定义新命令?

如何为 \{e_1,\cdots, e_n\} 定义新命令?

我想创建一个具有三个参数的新命令:

  1. 象征 (e, \omega,\cdots
  2. 上标或下标 (^_)
  3. 柜台 (n

如果 n=3 则返回

\set{a}{^}{3}    ====> output: {a^1,a^2,a^3}

否则输出如下

\set{e}{_}{n}    ====> output: {e_1,\cdots, e_n}

答案1

以下是您所追求的基本实现:

在此处输入图片描述

\documentclass{article}

\newcommand{\set}[3]{%
  \{ #1#2{1},
  \ifnum\pdfstrcmp{#3}{3}=0
    #1#2 2
  \else
    \ldots
  \fi
  , #1#2{#3} \}
}

\begin{document}

$\set{a}{^}{3}$

$\set{e}{_}{n}$

\end{document}

#3我们使用来对作为参数呈现的内容进行条件判断\pdfstrcmp。对和\pdfstrcmp{<strA>}{<strB>}进行字符串比较,如果< | = | >则返回| | (按字典顺序)。<strA><strB>-101<strA><strB>

这两个集合之间的唯一区别在于序列中第二项的设置方式,因此这些元素的设置不考虑条件。对于n=1或不做任何考虑n=2


使用单个参数的补充接口:

在此处输入图片描述

\documentclass{article}

\newcommand{\set}[1]{\setaux#1\relax}
\def\setaux#1#2#3\relax{%
  \{ {#1}#2 1,
  \ifnum\pdfstrcmp{#3}{3}=0
    {#1}#2 2
  \else
    \ldots
  \fi
  , {#1}#2{#3} \}
}

\begin{document}

$\set{a^3}$

$\set{e_n}$

$\set{\alpha^{22}}$

\end{document}

答案2

expl3

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\set}{mmm}
 {
  \lbrace
  \str_case:nnF { #3 }
   {
    {1}{#1#2{1}}
    {2}{#1#2{1},#1#2{2}}
    {3}{#1#2{1},#1#2{2},#1#2{3}}
   }
   { #1#2{1},\dots,#1#2{#3} }
   \rbrace
 }
\ExplSyntaxOff

\begin{document}

$\set{a}{^}{3}$

$\set{a}{^}{n}$

$\set{e}{_}{2}$

$\set{e}{_}{k}$

\end{document}

在此处输入图片描述

替代语法和实现:调用是,\set[<opt>]{<letter><^|_>}其中<opt>是数字或通用下标。如果是数字,则序列会完整拼写出来。在特殊情况下,您想要一个数字,但您更喜欢使用点,请使用[{{9}}]上一个示例中的类似方法。强制参数的形式为a^a_

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\set}{O{n}m}
 {
  \lbrace
  \regex_match:nnTF { \A \d+ \Z } { #1 }
   {
    #2{1}
    \int_step_inline:nnnn { 2 } { 1 } { #1 }
     {
      ,#2{##1}
     }
   }
   {
    #2{1},\dots,#2{#1}
   }
  \rbrace
 }
\ExplSyntaxOff

\begin{document}

$\set[3]{a^}$ $\set{a^}$ $\set[k]{a^}$

$\set[2]{e_}$ $\set[4]{e_}$ $\set[{{9}}]{e_}$

\end{document}

在此处输入图片描述

答案3

此解决方案使用etoolboxpgffor。感谢@TH.的回答测试数字

此实现还处理\mycmd{a}{^}{K},其中K是任何正整数。

\documentclass{article}

\usepackage{etoolbox}
\usepackage{pgffor}
\makeatletter
\newcommand\ifnumber[1]{%
    \begingroup
    \edef\temp{#1}%
    \expandafter\ifstrempty\expandafter{\temp}
    {\endgroup\@secondoftwo}
    {\expandafter\ifnumber@i\temp\@nnil}%
}
\def\ifnumber@i#1#2\@nnil{%
    \if-#1%
    \ifstrempty{#2}
    {\def\temp{X}}
    {\def\temp{#2}}%
    \else
    \def\temp{#1#2}%
    \fi
    \afterassignment\ifnumhelper
    \count@0\temp\relax\@nnil
    \endgroup
}

\def\numrelax{\relax}%
\def\ifnumhelper#1\@nnil{%
    \def\temp{#1}%
    \ifx\temp\numrelax
    \aftergroup\@firstoftwo
    \else
    \aftergroup\@secondoftwo
    \fi
}
\makeatother

\newcommand{\mycmd}[3]{%
        \ifnumber{#3}{%
                \ensuremath{%
                    \foreach \n in {1,...,#3}{#1#2{\n}\ifnum \n < #3 {,} \fi}
            }
        }{%
        \ensuremath{#1#2 1,\ldots,#1#2{#3}}%
    }%
}

\begin{document}

\mycmd{1}{^}{4}

\mycmd{a}{^}{3}

\mycmd{1}{^}{1}

\mycmd{a}{^}{n}

\mycmd{b}{_}{6}

\mycmd{3}{_}{n}

\end{document}

在此处输入图片描述

相关内容