我正在排版一些群论笔记,其中相当一部分是循环,即\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)
。