简化长正合序列的命令

简化长正合序列的命令

在此回答,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。

相关内容