编写宏来排版一系列可变数量的项

编写宏来排版一系列可变数量的项

我一直在尝试编写一个宏,在其中可以指定一个系列的项数,然后它会打印:

 n0+n1+n2+n3...+nn

能够打印任意数量的术语对我的工作来说很重要。我试过,但循环超出了我目前对 TeX 的理解。

先谢谢您的帮助。

答案1

这与 Martin 提出的解决方案略有不同。为了提供一些灵活性,我首先定义一个“setup”宏,您可以这样调用它:

  \series[5]{nseries}{n}

我之所以要将其概括化,是因为您可能不仅想要“n 系列”,还可能想要定义其他类型的系列。

此设置命令将自动创建一个名为的命令,\<symbol>series该命令将排版所需数量的术语。创建命令的过程使用\csname..\endcsname。您可能希望在 TeXbook 或 Tex by Topic 中进一步查找。

\Z通过改变下面 MWE 中的定义,还可以进一步开发更困难的系列宏。

\documentclass{article}
\usepackage{amsmath}
\parindent=0pt \parskip=6pt
\begin{document}
\newcount\ct

\newcommand\series[3][3]{%
  \ct=0
  \expandafter\xdef\csname #2\endcsname{}
  \def\temp{\csname#2\endcsname}
  \loop
    \def\Z{#3_{\the\ct}+}
    \expandafter\xdef\csname #2\endcsname{\temp\Z}
    \advance\ct by1
    \ifnum \the\ct<#1
  \repeat
 %% add the ldots by redefining the command again
 \expandafter\xdef\csname#2\endcsname{\temp\cdots+#3_n}
}
% Define some series
\series[8]{kseries}{{\text{k}}t^2}
\series[5]{nseries}{n}
\series[5]{tseries}{t}
\series{zetaseries}{\zeta}
% call the series
The \texttt{nseries} \[\nseries\]
The \texttt{tseries} \[\tseries\]
The \texttt{kseries} \[\kseries\]
The \texttt{\(\zeta\)-series} \[\zetaseries\]
\end{document}

样本输出,

在此处输入图片描述

答案2

\documentclass{article}
\usepackage{pstricks}
\def\series#1{%
  \ifcase#1{n0+}\or{n0+n1+}\else
  \psforeach{\nA}{0,1,..,#1}{n\nA+}\fi
  \ldots+nn}
\begin{document}
\series{0}

$\series{1}$

$\series{11}$

\end{document}

在此处输入图片描述

答案3

您可以使用递归扩展宏来完成此操作,例如:

\documentclass{article}

\usepackage{amsmath}

\newcommand*{\series}[2]{% #1 = variable, #2 = max. number of seriess
    \ensuremath{%
       \iftrue\seriesx{0}{#2}{#1}\fi
       \dots+{#1}_{n}%
    }%
}

\newcommand*{\seriesx}[4]{% #1 = current index, #2 = max index, #3 = variable, #4 = \fi
    #4% = \fi
    \ifnum#1>#2 \else
        {#3}_{#1}+%
        \expandafter\seriesx\expandafter{\the\numexpr#1+1\relax}{#2}{#3}%
    \fi
}

\begin{document}

\series{n}{10}

\series{n}{22}

\series{n}{0}

\series{n}{-1}

\series{n}{1}

\series{m}{5}

\end{document}

递归宏将\termx尾随内容\fi作为最后一个参数读取,并将其插入到开头,以避免条件语句的深度嵌套。没有它也可以工作,但有它会更好。还有其他方法可以做到这一点。

(已更新以包含+...+X_n部分;重命名宏)

答案4

这是一个使用循环的解决方案\foreach。我仍然不确定 OP 到底想要什么,但为了遵循其他答案,我添加了尾随部分。如果不需要,+...+n_n只需删除该行即可。\dots+{#1}_{n}%

\documentclass{article}

\usepackage{pgffor}

\newcommand*{\series}[2]{%
    {#1}_0%
    \ifnum#2>0
    \foreach \n in {1,...,#2}{%
        +{#1}_{\n}%
    }%
    \fi
    +\dots+{#1}_{n}%
}

\begin{document}

$\series{n}{6}$

$\series{m}{8}$

$\series{n}{0}$

$\series{m}{1}$

\end{document}

相关内容