可变参数命令

可变参数命令

我正在排版一些群论笔记,其中相当一部分是循环,即\left(1\,2\,3\right)。有没有办法定义一个可以接受任意数量参数的命令,这样我就可以写\cycle{1}{2}{3}

答案1

您可以使用逗号分隔的列表来定义您的循环:

在此处输入图片描述

\documentclass{article}
\newcounter{listcount}\newcounter{totalcount}%
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\cycle}[1]{%
  \setcounter{totalcount}{0}% Reset total count
  \renewcommand*{\do}[1]{\stepcounter{totalcount}}% Reconfigure count
  \docsvlist{#1}% Count number of items
  \setcounter{listcount}{0}% Reset current item count
  \renewcommand*{\do}[1]{% Reconfigure item \do
    \stepcounter{listcount}% Next item
    ##1\ifnum\value{listcount}<\value{totalcount}\,\fi% Print item
  }
  \left(\docsvlist{#1}\right)% Process list
}
\begin{document}
\[ \cycle{1} \quad \cycle{1,2,3} \quad \cycle{1,1,2,3,5,8,13} \]
\end{document}

该命令\do在 内部被重新定义了两次\cycle。第一次用于计算提供的物品数量,第二次用于打印所有物品。

答案2

确实建议使用逗号分隔的列表符号。

\usepackage{xparse}
\ExplSyntaxOn

\NewDocumentCommand{\cycle}{m}{\cycle_main:n {#1}}

\seq_new:N \l_cycle_body_seq
\cs_new:Npn \cycle_main:n #1
 {
  \seq_set_split:Nnn \l_cycle_body_seq {,} { #1 }
  \seq_pop_right:NN \l_cycle_body_seq \l_tmpa_tl
  \seq_map_inline:Nn \l_cycle_body_seq { ##1 \, }
  \tl_use:N \l_tmpa_tl
 }
\ExplSyntaxOff

如果真的 \left\right是必需的,我不相信,因为参数应该始终是数字列表,然后将 的定义更改\cycle

\NewDocumentCommand{\cycle}{ s O{} m }
 {
  \IfBooleanTF{#1}{\left(}{\mathopen{#2(}}
  \cycle_main:n { #3 }
  \IfBooleanTF{#1}{\right)}{\mathclose{#2)}}
 }

这将允许使用常用的“栅栏”符号:

  • \cycle{1,2,3}对于正常大小的括号
  • \cicle[\big]{1,2,3}对于较大的括号(可以使用任何大小的规定命令
  • \cycle*{1,2,3}括入\left(\right)

相关内容