我搜索了几次,找到了可能的解决方案。但是,我看到的那些解决方案比我认为我真正需要的要复杂得多。所以请原谅我再次提问。以下是场景:
我想定义一个数学命令,给出给定参数的长精确序列。例如,如果我写下,\longexactsequence{A}{B}{C}{D}
那么我期望得到类似这样的结果0 \longrightarrow A \longrightarrow B \longrightarrow C \longrightarrow D \longrightarrow 0
。
同样地,如果我只写\longexactsequence{A}
,那么我就会得到0 \longrightarrow A \longrightarrow 0
。
我该怎么做?我还想再进一步,因为如果输出方程式已经太长,我将非常感谢“修复”断线问题。
非常感谢,非常感谢所有的评论、提示等!
答案1
可以在以下位置找到使用\kernel@ifnextchar
类似输入语法的实现以及使用 LaTeX宏的类似输入语法的\longexactsequence{A}{B}{C}{D}
实现\@for
\longexactsequence{A, B, C, D}
这个答案的历史。
当你想使用 来,
作为条目的分隔符时,你可以使用许多提供循环的包之一。其中一个是PGF相当强大的\foreach
宏,它有自己的标签:foreach。
如果您想为箭头的上标应用第二个值\foreach
,您也可以使用,但需要使用/
作为这些参数的分隔符。
不应标记的箭头需要输入为/<entry>
。
还有其他方法可以输入,比如
$ \longexactsequence{[f]A, [g]B, C} $
使箭头标签成为可选的,但这需要更复杂的实现。
通过使用 来实现此目的的简单版本,\ifx
检查以下两个宏是否相等(如果不提供 ,则\superscript
和相等)。可以通过在两个参数之一中添加另一个空格 ( )、空组 ( ) 或( ) 来超越此目的。\entry
/
D/ D
D{}/D
\relax
D\relax/D
这些例子应该可以清楚地表明这一点。
代码
\documentclass{article}
\usepackage{extarrows,pgffor}
\newcommand*{\longexactsequence}[2][0]{%
#1 \longrightarrow
\foreach \superscript/\entry in {#2} {%
\entry \xlongrightarrow{\ifx\superscript\entry\else\superscript\fi}%
} #1%
}
\begin{document}
$ \longexactsequence{A, B, C, D, E} $
$ \longexactsequence{f/A, g/B, C, D/ D} $ % a space before or after / makes the Ds unequal
$ \longexactsequence[Z]{a/A, {a, b}/B} $
$ \longexactsequence{} $
\end{document}
输出
答案2
宏\getargsC
将单个参数解析为放置在\argi
、\argii
、\argiii
、\argiv
等中的“单词”。单词总数在字符串中设置\narg
。带有空格或以宏结尾的单词可以通过用括号括起来来隔离(即,内部括号的内容成为一个单词)。然后我只需逐个重新整理单词,并在它们周围添加适当的修饰。
在循环中,\csname arg\roman{index}\endcsname
仅变成连续的参数 ( \argi
, \argii
, \argiii
, \argiv
)
\documentclass{article}
\usepackage{readarray}
\newcounter{index}
\newcommand\longexactsequence[1]{%
\getargsC{#1}%
0\longrightarrow%
\setcounter{index}{0}
\whiledo{\value{index} < \narg}{%
\stepcounter{index}%
\csname arg\roman{index}\endcsname\longrightarrow%
}
0%
}
\begin{document}
\(
\longexactsequence{A B C D}
\)
To show with other than simple characters
\(
\longexactsequence{A_1 {\alpha} {B + C}}
\)
\end{document}