
Estoy buscando una macro que tome como entrada un término general de una secuencia y escriba la secuencia de manera extensa.
Lo que quiero decir es un comando \GenSeq{general term}{index}{min index}{max index}
para que por ejemplo
\GenSeq{f(i)}{i}{1}{n}
produce
\GenSeq{f(i)}{i}{k}{n}
produce
\GenSeq{\theta^{(s)}}{s}{s}{T}
Me pregunto si algo así se puede programar en látex.
Respuesta1
\documentclass{article}
\def\GenSeq#1#2#3{%
\def\zz##1{#1}%
\def\zzstart{#2}%
\zz{#2},
\ifx\zzstart\zzzero\zz{1}\else\ifx\zzstart\zzone\zz{2}\else\zz{#2+1}\fi\fi,
\ldots,\zz{#3}}
\def\zzzero{0}
\def\zzone{1}
\begin{document}
\parskip\bigskipamount
$\GenSeq{f(#1)}{1}{n}$
$\GenSeq{f(#1)}{k}{n}$
$\GenSeq{\theta^{(#1)}}{s}{T}$
\end{document}
Respuesta2
Una implementación con expl3
.
El primer argumento obligatorio \GenSeq
es una plantilla, que #1
representa el índice actual en el "bucle". El segundo argumento es el punto de partida, el tercer argumento es el punto final.
Si el segundo argumento es un número entero (reconocido mediante una expresión regular, cero o un guión/signo menos y uno o más dígitos), se calculará el índice del segundo elemento impreso; de lo contrario, será <start point>+1
. Sin embargo
- si el punto inicial y el punto final coinciden, se imprimirá un solo elemento;
- si el punto inicial es numérico y el punto final también es numérico y difiere en uno o dos, sólo se imprimirán los elementos relevantes;
- de lo contrario, se imprimirán el elemento inicial, el siguiente, los puntos y el elemento final.
Con \GenSeq*
, se agregarán puntos al final para indicar una secuencia infinita.
\documentclass{article}
\usepackage{amsmath}
%\usepackage{xparse} % not needed with LaTeX 2020-10-01 or later
\ExplSyntaxOn
\NewDocumentCommand{\GenSeq}{smmm}
{% #1 = optional *
% #2 = template
% #3 = starting point
% #4 = end point
\pinkcollins_genseq:nnn { #2 } { #3 } { #4 }
\IfBooleanT{#1}{,\dotsc}
}
\cs_new_protected:Nn \pinkcollins_genseq:nnn
{
% turn the template into a (temporary) function
\cs_set:Nn \__pinkcollins_genseq_temp:n { #1 }
% do the main work
\tl_if_eq:nnTF { #2 } { #3 }
{% if #2=#3, not much to do
\__pinkcollins_genseq_temp:n { #2 }
}
{% now the hard work
\__pinkcollins_genseq_do:nn { #2 } { #3 }
}
}
\cs_new_protected:Nn \__pinkcollins_genseq_do:nn
{% #1 = start point, #2 = end point
% first check whether #1 is an integer
% \-? = one optional minus sign
% [[:digit:]]+ = one or more digits
% \Z = up to the end of the input
\regex_match:nnTF { \-? [[:digit:]]+ \Z } { #1 }
{
\__pinkcollins_genseq_number:nn { #1 } { #2 }
}
{
\__pinkcollins_genseq_symbolic:nn { #1 } { #2 }
}
}
\cs_new_protected:Nn \__pinkcollins_genseq_number:nn
{% #1 = start point, #2 = end point
\tl_if_eq:enTF { \int_eval:n { #1 + 1 } } { #2 }
{
\__pinkcollins_genseq_temp:n { #1 },\__pinkcollins_genseq_temp:n { #2 }
}
{
\__pinkcollins_genseq_temp:n { #1 },
\__pinkcollins_genseq_temp:n { \int_eval:n { #1+1 } },
\tl_if_eq:enF { \int_eval:n { #1 + 2 } } { #2 } { \dots, }
\__pinkcollins_genseq_temp:n { #2 }
}
}
\prg_generate_conditional_variant:Nnn \tl_if_eq:nn { e } { T, F, TF }
\cs_new_protected:Nn \__pinkcollins_genseq_symbolic:nn
{% #1 = start point, #2 = end point
\__pinkcollins_genseq_temp:n { #1 },
\__pinkcollins_genseq_temp:n { #1+1 },
\dots,
\__pinkcollins_genseq_temp:n { #2 }
}
\ExplSyntaxOff
\begin{document}
$\GenSeq{f(#1)}{1}{n}$
$\GenSeq{f(#1)}{0}{n}$
$\GenSeq{f(#1)}{1}{1}$
$\GenSeq{f(#1)}{1}{2}$
$\GenSeq{f(#1)}{1}{3}$
$\GenSeq{f(#1)}{1}{4}$
$\GenSeq{f(#1)}{-2}{k}$
$\GenSeq{f(#1)}{k}{n}$
$\GenSeq*{\theta^{(#1)}}{s}{T}$
\end{document}
Un uso diferente de la *
variante -podría ser hacer que la secuencia sea descendente:
\documentclass{article}
\usepackage{amsmath}
%\usepackage{xparse} % not needed with LaTeX 2020-10-01 or later
\ExplSyntaxOn
\NewDocumentCommand{\GenSeq}{smmm}
{% #1 = optional * for reverse sequence
% #2 = template
% #3 = starting point
% #4 = end point
\IfBooleanTF{#1}
{
\cs_set:Nn \__pinkcollins_genseq_sign: { - }
}
{
\cs_set:Nn \__pinkcollins_genseq_sign: { + }
}
\pinkcollins_genseq:nnn { #2 } { #3 } { #4 }
}
\cs_new_protected:Nn \pinkcollins_genseq:nnn
{
% turn the template into a (temporary) function
\cs_set:Nn \__pinkcollins_genseq_temp:n { #1 }
% do the main work
\tl_if_eq:nnTF { #2 } { #3 }
{% if #2=#3, not much to do
\__pinkcollins_genseq_temp:n { #2 }
}
{% now the hard work
\__pinkcollins_genseq_do:nn { #2 } { #3 }
}
}
\cs_new_protected:Nn \__pinkcollins_genseq_do:nn
{% #1 = start point, #2 = end point
% first check whether #1 is an integer
% \-? = one optional minus sign
% [[:digit:]]+ = one or more digits
% \Z = up to the end of the input
\regex_match:nnTF { \-? [[:digit:]]+ \Z } { #1 }
{
\__pinkcollins_genseq_number:nn { #1 } { #2 }
}
{
\__pinkcollins_genseq_symbolic:nn { #1 } { #2 }
}
}
\cs_new_protected:Nn \__pinkcollins_genseq_number:nn
{% #1 = start point, #2 = end point
\tl_if_eq:enTF { \int_eval:n { #1 \__pinkcollins_genseq_sign: 1 } } { #2 }
{
\__pinkcollins_genseq_temp:n { #1 },\__pinkcollins_genseq_temp:n { #2 }
}
{
\__pinkcollins_genseq_temp:n { #1 },
\__pinkcollins_genseq_temp:n { \int_eval:n { #1\__pinkcollins_genseq_sign: 1 } },
\tl_if_eq:enF { \int_eval:n { #1 \__pinkcollins_genseq_sign: 2 } } { #2 } { \dots, }
\__pinkcollins_genseq_temp:n { #2 }
}
}
\prg_generate_conditional_variant:Nnn \tl_if_eq:nn { e } { T, F, TF }
\cs_new_protected:Nn \__pinkcollins_genseq_symbolic:nn
{% #1 = start point, #2 = end point
\__pinkcollins_genseq_temp:n { #1 },
\__pinkcollins_genseq_temp:n { #1\__pinkcollins_genseq_sign:1 },
\dots,
\__pinkcollins_genseq_temp:n { #2 }
}
\ExplSyntaxOff
\begin{document}
\textbf{Ascending}
$\GenSeq{f(#1)}{1}{n}$
$\GenSeq{f(#1)}{0}{n}$
$\GenSeq{f(#1)}{1}{1}$
$\GenSeq{f(#1)}{1}{2}$
$\GenSeq{f(#1)}{1}{3}$
$\GenSeq{f(#1)}{1}{4}$
$\GenSeq{f(#1)}{-2}{k}$
$\GenSeq{f(#1)}{k}{n}$
$\GenSeq{\theta^{(#1)}}{s}{T}$
\textbf{Descending}
$\GenSeq*{f(#1)}{n}{1}$
$\GenSeq*{f(#1)}{n}{0}$
$\GenSeq*{f(#1)}{1}{1}$
$\GenSeq*{f(#1)}{2}{1}$
$\GenSeq*{f(#1)}{3}{1}$
$\GenSeq*{f(#1)}{4}{1}$
$\GenSeq*{f(#1)}{k}{-2}$
$\GenSeq*{f(#1)}{k}{n}$
$\GenSeq*{\theta^{(#1)}}{s}{T}$
\end{document}
Respuesta3
Para divertirme jugando con expl3 quería hacerlo con expl3.
Pero terminé haciéndolo con una mezcla de expl3 y mi propio código:
- Utilizo expl3-regex-code para comprobar si⟨índice mínimo⟩—(!) sin expandir fichas de⟨índice mínimo⟩ (!)—forma una secuencia de como máximo un signo y algunos dígitos decimales y, si es así, para incrementar y pasar a la rutina de reemplazo el valor (incrementado) de⟨índice mínimo⟩.
- Utilizo mi propio código para reemplazar⟨índice⟩dentro⟨termino general⟩.
⟨índice mínimo⟩no se expande para comprobar si denota/produce (sólo) un texto TeX- válido⟨número⟩-cantidad. Rechazo la idea de tal control/prueba por la siguiente razón: No hay ningún método de prueba para comprobar si se expande completamente⟨índice mínimo⟩produce sólo un TeX- válido⟨número⟩-Conozco una cantidad que no tiene ningún defecto y/o que no impone restricciones a las posibles entradas del usuario. Al intentar implementar un algoritmo para tal prueba, entonces se enfrenta al problema de la detención: en el momento de expandirlos, los tokens que se forman⟨índice mínimo⟩puede formar un algoritmo arbitrario basado en expansión. Hacer que un algoritmo verifique si dicho algoritmo al final produce un texto TeX válido.⟨número⟩-cantidad implica que un algoritmo verifique si otro algoritmo arbitrario termina/termina sin mensajes de error. Éste es el problema de la detención.Alan Turing demostró en 1936que no es posible implementar un algoritmo que, para cualquier algoritmo arbitrario, pueda "decidir" si ese algoritmo terminará alguna vez.
Al principio tenía la intención de hacer el reemplazo de⟨índice⟩mediante rutinas expl3 también:
Parte VII - El paquete l3tl - Listas de tokens, sección3 Modificación de variables de la lista de tokensdeinterfaz3.pdf(Publicado el 27 de octubre de 2020) afirma:
\tl_replace_all:Nnn ⟨tl var⟩ {⟨old tokens⟩} {⟨new tokens⟩}
Reemplazatodas las ocurrenciasde⟨fichas antiguas⟩en el⟨tl var⟩con⟨nuevas fichas⟩.⟨Fichas antiguas⟩no puede contener
{
,}
o#
(más precisamente, tokens de caracteres explícitos con código de categoría 1 (grupo inicial) o 2 (grupo final) y tokens con código de categoría 6). Como esta función opera de izquierda a derecha, el patrón⟨fichas antiguas⟩pueden quedar después del reemplazo (ver\tl_remove_all:Nn
un ejemplo).
(Le dicen que el código de categoría 1 es "grupo inicial" y que el código de categoría 2 es "grupo final". Me pregunto por qué no le dicen que el código de categoría 6 es "parámetro". ;-))
Intenté hacerlo con \tl_replace_all:Nnn
.
Pero esto fracasó porque la afirmación no es cierta.
(Puedes probarte a ti mismo:
En el siguiente ejemplo, no todas las apariciones de u
se reemplazan por d
:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl {uu{uu}uu{uu}}
\tl_replace_all:Nnn \l_tmpa_tl {u} {d}
\tl_show:N \l_tmpa_tl
\stop
⟨fichas antiguas⟩es u
.
⟨nuevas fichas⟩es d
.
todas las restricciones para⟨fichas antiguas⟩y⟨nuevas fichas⟩son obedecidos.
La salida de la consola es:
\l_tmpa_tl=dd{uu}dd{uu}.
Parece que solo se reemplazan las ocurrencias no anidadas entre un par de tokens de caracteres explícitos coincidentes con el código de categoría 1 (grupo inicial) y 2 (grupo final) respectivo.
Entonces, la afirmación de que todas las ocurrencias se reemplazan es incorrecta.
Si la declaración fuera correcta, entonces la salida de la consola sería:
\l_tmpa_tl=dd{dd}dd{dd}.
)
Así que decidí escribir mi propia rutina de reemplazo \ReplaceAllIndexOcurrences
desde cero, sin expl3.
Como efecto secundario, \ReplaceAllIndexOcurrences
se reemplazan todos los tokens de caracteres explícitos del código de categoría 1 por y todos los tokens de caracteres explícitos del código de categoría 2 por .{1
}2
\documentclass[landscape, a4paper]{article}
%===================[adjust margins/layout for the example]====================
\csname @ifundefined\endcsname{pagewidth}{}{\pagewidth=\paperwidth}%
\csname @ifundefined\endcsname{pdfpagewidth}{}{\pdfpagewidth=\paperwidth}%
\csname @ifundefined\endcsname{pageheight}{}{\pageheight=\paperheight}%
\csname @ifundefined\endcsname{pdfpageheight}{}{\pdfpageheight=\paperheight}%
\textwidth=\paperwidth
\oddsidemargin=1.5cm
\marginparsep=.2\oddsidemargin
\marginparwidth=\oddsidemargin
\advance\marginparwidth-2\marginparsep
\advance\textwidth-2\oddsidemargin
\advance\oddsidemargin-1in
\evensidemargin=\oddsidemargin
\textheight=\paperheight
\topmargin=1.5cm
\footskip=.5\topmargin
{\normalfont\global\advance\footskip.5\ht\strutbox}%
\advance\textheight-2\topmargin
\advance\topmargin-1in
\headheight=0ex
\headsep=0ex
\pagestyle{plain}
\parindent=0ex
\parskip=0ex
\topsep=0ex
\partopsep=0ex
%==================[eof margin-adjustments]====================================
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\GenSeq{mmmm}{
\group_begin:
% #1 = general term
% #2 = index
% #3 = min index
% #4 = max index
\regex_match:nnTF { ^[\+\-]?\d+$ }{ #3 }{
\int_step_inline:nnnn {#3}{1}{#3+1}{\ReplaceAllIndexOcurrences{#1}{#2}{##1},}
}{
\ReplaceAllIndexOcurrences{#1}{#2}{#3},
\ReplaceAllIndexOcurrences{#1}{#2}{#3+1},
}
\ldots,
\ReplaceAllIndexOcurrences{#1}{#2}{#4}
\group_end:
}
\ExplSyntaxOff
\makeatletter
%%//////////////////// Code of my own replacement-routine: ////////////////////
%%=============================================================================
%% Paraphernalia:
%% \UD@firstoftwo, \UD@secondoftwo,
%% \UD@PassFirstToSecond, \UD@Exchange, \UD@removespace
%% \UD@CheckWhetherNull, \UD@CheckWhetherBrace,
%% \UD@CheckWhetherLeadingTokens, \UD@ExtractFirstArg
%%=============================================================================
\newcommand\UD@firstoftwo[2]{#1}%
\newcommand\UD@secondoftwo[2]{#2}%
\newcommand\UD@PassFirstToSecond[2]{#2{#1}}%
\newcommand\UD@Exchange[2]{#2#1}%
\newcommand\UD@removespace{}\UD@firstoftwo{\def\UD@removespace}{} {}%
%%-----------------------------------------------------------------------------
%% Check whether argument is empty:
%%.............................................................................
%% \UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's \ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
\newcommand\UD@CheckWhetherNull[1]{%
\romannumeral\expandafter\UD@secondoftwo\string{\expandafter
\UD@secondoftwo\expandafter{\expandafter{\string#1}\expandafter
\UD@secondoftwo\string}\expandafter\UD@firstoftwo\expandafter{\expandafter
\UD@secondoftwo\string}\expandafter\z@\UD@secondoftwo}%
{\expandafter\z@\UD@firstoftwo}%
}%
%%-----------------------------------------------------------------------------
%% Check whether argument's first token is a catcode-1-character
%%.............................................................................
%% \UD@CheckWhetherBrace{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked has leading
%% catcode-1-token>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked has no leading
%% catcode-1-token>}%
\newcommand\UD@CheckWhetherBrace[1]{%
\romannumeral\expandafter\UD@secondoftwo\expandafter{\expandafter{%
\string#1.}\expandafter\UD@firstoftwo\expandafter{\expandafter
\UD@secondoftwo\string}\expandafter\z@\UD@firstoftwo}%
{\expandafter\z@\UD@secondoftwo}%
}%
%%-----------------------------------------------------------------------------
%% Check whether argument's leading tokens form a specific
%% token-sequence that does neither contain explicit character tokens of
%% category code 1 or 2 nor contain tokens of category code 6:
%%.............................................................................
%% \UD@CheckWhetherLeadingTokens{<argument which is to be checked>}%
%% {<a <token sequence> without explicit
%% character tokens of category code
%% 1 or 2 and without tokens of
%% category code 6>}%
%% {<internal token-check-macro>}%
%% {<tokens to be delivered in case
%% <argument which is to be checked> has
%% <token sequence> as leading tokens>}%
%% {<tokens to be delivered in case
%% <argument which is to be checked>
%% does not have <token sequence> as
%% leading tokens>}%
\newcommand\UD@CheckWhetherLeadingTokens[3]{%
\romannumeral\UD@CheckWhetherNull{#1}{\expandafter\z@\UD@secondoftwo}{%
\expandafter\UD@secondoftwo\string{\expandafter
\UD@@CheckWhetherLeadingTokens#3{\relax}#1#2}{}}%
}%
\newcommand\UD@@CheckWhetherLeadingTokens[1]{%
\expandafter\UD@CheckWhetherNull\expandafter{\UD@firstoftwo{}#1}%
{\UD@Exchange{\UD@firstoftwo}}{\UD@Exchange{\UD@secondoftwo}}%
{\expandafter\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter\z@\expandafter\expandafter
\expandafter}\expandafter\UD@secondoftwo\expandafter{\string}%
}%
%%-----------------------------------------------------------------------------
%% \UD@internaltokencheckdefiner{<internal token-check-macro>}%
%% {<token sequence>}%
%% Defines <internal token-check-macro> to snap everything
%% until reaching <token sequence>-sequence and spit that out
%% nested in braces.
%%-----------------------------------------------------------------------------
\newcommand\UD@internaltokencheckdefiner[2]{%
\@ifdefinable#1{\long\def#1##1#2{{##1}}}%
}%
\UD@internaltokencheckdefiner{\UD@InternalExplicitSpaceCheckMacro}{ }%
%%-----------------------------------------------------------------------------
%% Extract first inner undelimited argument:
%%
%% \romannumeral\UD@ExtractFirstArgLoop{ABCDE\UD@SelDOm} yields {A}
%%
%% \romannumeral\UD@ExtractFirstArgLoop{{AB}CDE\UD@SelDOm} yields {AB}
%%.............................................................................
\@ifdefinable\UD@RemoveTillUD@SelDOm{%
\long\def\UD@RemoveTillUD@SelDOm#1#2\UD@SelDOm{{#1}}%
}%
\newcommand\UD@ExtractFirstArgLoop[1]{%
\expandafter\UD@CheckWhetherNull\expandafter{\UD@firstoftwo{}#1}%
{\z@#1}%
{\expandafter\UD@ExtractFirstArgLoop\expandafter{\UD@RemoveTillUD@SelDOm#1}}%
}%
%%=============================================================================
%% \ReplaceAllIndexOcurrences{<term with <index>>}
%% {<index>}%
%% {<replacement for<index>>}%
%%
%% Replaces all <index> in <term with <index>> by <replacement for<index>>
%%
%% !!! Does also replace all pairs of matching explicit character tokens of
%% catcode 1/2 by matching braces!!!
%% !!! <index> must not contain explicit character tokens of catcode 1 or 2 !!!
%% !!! <index> must not contain tokens of catcode 6 !!!
%% !!! Defines temporary macro \UD@temp, therefore not expandable !!!
%%-----------------------------------------------------------------------------
\newcommand\ReplaceAllIndexOcurrences[2]{%
% #1 - <term with <index>>
% #2 - <index>
\begingroup
\UD@internaltokencheckdefiner{\UD@temp}{#2}%
\expandafter\endgroup
\romannumeral\UD@ReplaceAllIndexOcurrencesLoop{#1}{}{#2}%
}%
\newcommand\UD@ReplaceAllIndexOcurrencesLoop[4]{%
% Do:
% \UD@internaltokencheckdefiner{\UD@temp}{<index>}%
% \romannumeral\UD@ReplaceAllIndexOcurrencesLoop
% {<term with <index>>}%
% {<sequence created so far, initially empty>}%
% {<index>}%
% {<replacement for<index>>}%
%
% #1 - <term with <index>>
% #2 - <sequence created so far, initially empty>
% #3 - <index>
% #4 - <replacement for<index>>
\UD@CheckWhetherNull{#1}{\z@#2}{%
\UD@CheckWhetherLeadingTokens{#1}{#3}{\UD@temp}{%
\expandafter\expandafter\expandafter\UD@ReplaceAllIndexOcurrencesLoop
\expandafter\expandafter\expandafter{%
\expandafter\UD@firstoftwo\expandafter{\expandafter}\UD@temp#1%
}{#2#4}%
}{%
\UD@CheckWhetherLeadingTokens{#1}{ }{\UD@InternalExplicitSpaceCheckMacro}{%
\expandafter\UD@ReplaceAllIndexOcurrencesLoop
\expandafter{\UD@removespace#1}{#2 }%
}{%
\UD@CheckWhetherBrace{#1}{%
\expandafter\expandafter\expandafter\UD@PassFirstToSecond
\expandafter\expandafter\expandafter{%
\expandafter\UD@PassFirstToSecond\expandafter{%
\romannumeral\expandafter\UD@ReplaceAllIndexOcurrencesLoop
\romannumeral\UD@ExtractFirstArgLoop{#1\UD@SelDOm}{}{#3}{#4}%
}{#2}}%
{\expandafter\UD@ReplaceAllIndexOcurrencesLoop\expandafter{\UD@firstoftwo{}#1}}%
}{%
\expandafter\UD@PassFirstToSecond\expandafter{%
\romannumeral\expandafter\UD@Exchange\romannumeral\UD@ExtractFirstArgLoop{#1\UD@SelDOm}{\z@#2}%
}{\expandafter\UD@ReplaceAllIndexOcurrencesLoop\expandafter{\UD@firstoftwo{}#1}}%
}%
}%
}%
{#3}{#4}%
}%
}%
\makeatother
%%=============================================================================
%%///////////////// End of code of my own replacement-routine. ////////////////
\makeatletter
\newcommand\ParenthesesIfMoreThanOneUndelimitedArgument[1]{%
\begingroup
\protected@edef\UD@temp{#1}%
\expandafter\expandafter\expandafter\UD@CheckWhetherNull
\expandafter\expandafter\expandafter{\expandafter\UD@firstoftwo\UD@temp{}.}{%
\endgroup#1%
}{%
\expandafter\UD@CheckWhetherNull
\expandafter{\romannumeral\expandafter\expandafter
\expandafter \expandafter
\expandafter\expandafter
\expandafter \z@
\expandafter\expandafter
\expandafter \UD@firstoftwo
\expandafter\UD@firstoftwo
\expandafter{%
\expandafter}%
\UD@temp{}.}{%
\endgroup#1%
}{%
\endgroup(#1)%
}%
}%
}%
\makeatother
\begin{document}
Let's use \verb|i| as \textit{$\langle$index$\rangle$}---\verb|$\GenSeq{f(i)}{i}{1}{n}$| yields:
$\GenSeq{f(i)}{i}{1}{n}$
\vfill
Let's use \verb|i| as \textit{$\langle$index$\rangle$}, but \textit{$\langle$min~index$\rangle$} not a digit sequence---\verb|$\GenSeq{f(i)}{i}{k}{n}$| yields:
$\GenSeq{f(i)}{i}{k}{n}$
\vfill
Let's use \verb|s| as \textit{$\langle$index$\rangle$}---\verb|$\GenSeq{\theta^{(s)}}{s}{s}{T}$| yields:
$\GenSeq{\theta^{(s)}}{s}{s}{T}$
\vfill
Let's use \verb|\Weird\Woozles| as \textit{$\langle$index$\rangle$}---\begin{verbatim}
$\GenSeq{%
\sqrt{%
\vphantom{(}%
ParenthesesIfMoreThanOneUndelimitedArgument{\Weird\Woozles}\cdot\ParenthesesIfMoreThanOneUndelimitedArgument{\Weird\Woozles}%
\vphantom{)}%
}%
}%
{\Weird\Woozles}%
{s}%
{T}$
\end{verbatim} yields:
$\GenSeq{%
\sqrt{%
\vphantom{(}%
\ParenthesesIfMoreThanOneUndelimitedArgument{\Weird\Woozles}\cdot\ParenthesesIfMoreThanOneUndelimitedArgument{\Weird\Woozles}%
\vphantom{)}%
}%
}%
{\Weird\Woozles}%
{s}%
{T}$
\vfill
Let's use the explicit space token as \textit{$\langle$index$\rangle$}---\verb|$\GenSeq{f( )}{ }{k}{n}$| yields:
$\GenSeq{f( )}{ }{k}{n}$
\vfill
Let's use the explicit space token as \textit{$\langle$index$\rangle$}---\verb|$\GenSeq{f( )}{ }{-5}{n}$| yields:
$\GenSeq{f( )}{ }{-5}{n}$
\vfill\vfill
\end{document}