在此回答,u/Qrrbrbirlbel 编写了一个很棒的代码,该命令只需获取条目即可生成长精确序列。为了理解并感受它的目标,我建议访问一次答案;但简单地说,目标是创建一个命令,该命令\longexactsequence{-,-,...,-}
以逗号分隔的顺序生成一个长序列。
我修改了所提供的代码,使其更加灵活(开始和结束时的零有点限制):
\usepackage{extarrows,pgffor}
\newcommand*{\longexactsequence}[2]{%
\foreach \superscript/\entry in {#1} {%
\entry \xlongrightarrow{\ifx\superscript\entry\else\superscript\fi}%
} #2%
}
此代码的工作方式与上一个代码完全相同,不同之处在于要编写连接 A、B、C、D、E 的长序列,请使用:
\longexact{A,B,C,D}{E}
效果非常好;它具有早期代码的所有功能(特别是命名功能)。但可以看出它不够完美:您必须将序列中的最后一个对象写在单独的括号中。
非常感谢大家帮助我修复这个问题;有没有办法让命令只需要一个括号,而不会丢失命令已有的所有可访问性(特别是箭头标记)?我相信如果有办法识别输入中的最后一个条目,就可以做些什么。
我希望答案不要创建新的代码,而是修改已经完善和呈现的代码,但欢迎任何答案!
答案1
如果不需要标记箭头:
\documentclass{article}
\usepackage{amsmath,extarrows}
\ExplSyntaxOn
\NewDocumentCommand{\longexactsequence}{m}
{
\clist_use:nn { #1 } { \xlongrightarrow{} }
}
\ExplSyntaxOff
\begin{document}
\[
\longexactsequence{A,B,C,D,E}
\]
\end{document}
对于(可能)标记的箭头,我建议使用不同的语法:
\documentclass{article}
\usepackage{amsmath,extarrows}
\ExplSyntaxOn
\NewDocumentCommand{\longexactsequence}{m}
{
\pceltide_les:n { #1 }
}
\seq_new:N \l_pceltide_les_items_seq
\cs_new_protected:Nn \pceltide_les:n
{
\seq_set_split:Nnn \l_pceltide_les_items_seq { - } { #1 }
\seq_indexed_map_function:NN \l_pceltide_les_items_seq \__pceltide_les_item:nn
}
\cs_new_protected:Nn \__pceltide_les_item:nn
{
\int_if_odd:nTF { #1 } { #2 } { \xlongrightarrow{#2} }
}
\ExplSyntaxOff
\begin{document}
\[
\longexactsequence{A -f- B -- C -g- D -- E}
\]
\end{document}
如果你被束缚于类似
\longexactsequence{A/f,B,C/g,D,E}
那么事情就会变得有点复杂。
\documentclass{article}
\usepackage{amsmath,extarrows}
\ExplSyntaxOn
\NewDocumentCommand{\longexactsequence}{m}
{
\pceltide_les:n { #1 }
}
\seq_new:N \l_pceltide_les_items_seq
\seq_new:N \l__pceltide_les_term_seq
\tl_new:N \l__pceltide_les_last_tl
\cs_new_protected:Nn \pceltide_les:n
{
\seq_set_from_clist:Nn \l_pceltide_les_items_seq { #1 }
\seq_pop_right:NN \l_pceltide_les_items_seq \l__pceltide_les_last_tl
\seq_map_function:NN \l_pceltide_les_items_seq \__pceltide_les_item:n
\tl_use:N \l__pceltide_les_last_tl
}
\cs_new_protected:Nn \__pceltide_les_item:n
{
\seq_set_split:Nnn \l__pceltide_les_term_seq { / } { #1 }
\seq_item:Nn \l__pceltide_les_term_seq { 1 }
\xlongrightarrow { \seq_item:Nn \l__pceltide_les_term_seq { 2 } }
}
\ExplSyntaxOff
\begin{document}
\[
\longexactsequence{A/f,B,C/g,D,E}
\]
\end{document}
答案2
我们可以在不使用 expl3 的情况下,仅使用 TeX 原语和基本的纯 TeX 宏来做什么:
\def\longexactsequence #1{\lexseA #1 --\end}
\def\lexseA #1{#1\lexseB}
\def\lexseB #1-#2-#3{\ifx#3\end\else
\buildrel#2\over\longrightarrow #3\expandafter\lexseB\fi}
$$
\longexactsequence{A -f- B -- C -g- D -- E}
$$
注意:它也适用于 LaTeX。