我想创建一个具有三个参数的新命令:
- 象征 (
e, \omega,\cdots
) - 上标或下标 (
^
或_
) - 柜台 (
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>
-1
0
1
<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
此解决方案使用etoolbox
和pgffor
。感谢@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}