如何通过循环符号很好地表示排列?即循环
\[1 \mapsto 2 \mapsto 3 \mapsto 1\]
可以通过以下方式完成:
\[ (1\quad2\quad3) \]
使用\quad
,但这似乎有点太多了。
我能做得更好吗?
编辑:不知道\;
——效果很好。
答案1
这是一个\;
默认使用的命令,但您可以根据需要选择其他分隔符;例如,当集合“较小”时,我经常不使用分隔符(最多 9,您可以在第二个示例中看到它):
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\cycle}{ O{\;} m }
{
(
\alec_cycle:nn { #1 } { #2 }
)
}
\seq_new:N \l_alec_cycle_seq
\cs_new_protected:Npn \alec_cycle:nn #1 #2
{
\seq_set_split:Nnn \l_alec_cycle_seq { , } { #2 }
\seq_use:Nn \l_alec_cycle_seq { #1 }
}
\ExplSyntaxOff
\begin{document}
$\cycle{1,2,3}$
$\cycle[]{1,2,3}$
$\cycle[\quad]{1,2,3}$
$\cycle[,]{1,2,3}$
$\cycle[;]{1,2,3}$
\end{document}
不要$$
在 LaTeX 中使用,请参阅为什么 \[ ... \] 比 $$ ... $$ 更可取?
答案2
对于解析器来说很简单listofitems
。
\documentclass{article}
\usepackage{listofitems}
\newcommand\cycle[2][\,]{%
\readlist\thecycle{#2}%
(\foreachitem\i\in\thecycle{\ifnum\icnt=1\else#1\fi\i})%
}
\begin{document}
$\cycle{1,2,3}$
$\cycle[]{1,2,3}$
$\cycle[\quad]{1,2,3}$
$\cycle[,]{1,2,3}$
$\cycle[;]{1,2,3}$
\end{document}
答案3
旧帖子,但这个问题一直困扰着我,所以我把一些我不完全理解的东西拼凑在一起。特别是,我不明白为什么需要两个花括号(“{{”)来打开和关闭定义——我猜这与嵌套定义有关。我受到了 egreg 的回答的启发,但我不明白 expl3 (?) 的东西,而且无论如何它似乎太复杂了。幸运的是,egreg 自己有一个替代方案这答案。仅供参考,我缩短了函数名称,并且在输入源时我更喜欢使用空格而不是逗号( \cyc{1 2 3} 而不是 \cyc{1,2,3} )。
\documentclass[a4paper]{article}
\usepackage{xparse}
\begin{document}
\newif\iffirstitem
\firstitemtrue
% \cyc[optional joiner]{space separated list}
% write list in permutation cycle notation with joiner between
% elements, defaulting to \;
\NewDocumentCommand \cyc { O{\;} >{\SplitList{ }} m }
{{%
\NewDocumentCommand{\processfoo}{ m }
{
\iffirstitem
\firstitemfalse
\else
#1
\fi
##1
}
(\ProcessList{#2}{\processfoo})
\firstitemtrue
}}
$\cyc[]{1 2 3}$
$\cyc[\,]{1 2 3}$
$\cyc{1 2 3}$
$\cyc[\quad]{1 2 3}$
$\cyc[,]{1 2 3}$
$\cyc[;]{1 2 3}$
\end{document}