假设我想使用 LaTeX 3 的循环功能在 amsmath 环境中打印一些公式序列,例如 align。该怎么做?
以下是一个失败的例子:
\seq_clear_new:N \l__example_seq
\seq_set_from_clist:Nn \l__example_seq {a,b,c,d,e}
\begin{align*}
\int_until_do:nn {\seq_count:N \l__example_seq = 0}
{\seq_pop_left:NNTF \l__example_seq \l_tempa_tl
{\tl_use:N \l_tempa_tl {&} \tl_use:N \l_tempa_tl {^{\tl_use:N \l_tempa_tl}}\\}
{} }
\end{align*}
问题主要出在环境&
上align*
。如何解决这个问题?(PS:我不是询问如何将函数应用于列表中的项目并寻找类似 \seq_map_inline 的答案。上面的代码只是为了展示这个问题。)
答案1
稍微玩一下你的例子,看看发生了什么,我将其重写为:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\ExplSyntaxOn
\seq_clear_new:N \l__example_seq
\seq_set_from_clist:Nn \l__example_seq {a,b,c,d,e}
\begin{align*} % ❶
\int_until_do:nn
{\seq_count:N \l__example_seq = 0}
{
\seq_pop_left:NNTF
\l__example_seq
\l_tempa_tl
{
\typeout{\l_tempa_tl} % ❷
\tl_use:N \l_tempa_tl \& \tl_use:N \l_tempa_tl HAT{\tl_use:N \l_tempa_tl}\\ }
{}
}
\end{align*} % ❶
\end{document}
尝试定位错误。注释掉align*
标记为 ❶ 的行上的环境(这就是我&
用\&
和^
替换的原因HAT
(并且还删除了制表符和上标表达式周围的不正确括号),我得到了扩展的预期结果,但是当我将其放回align*
原位时,它显示\typeout
❷ 陷入了a
无限循环。这告诉我\seq_pop_left
当组以表格的每一行结束时会被撤消(\seq_gpop_left
应该可以完成工作)。
我觉得那里的整个构造有点可疑。如果你有一个序列,那么使用\seq_map_inline
或\seq_map_function
迭代它比执行你正在做的事情更有意义。你会发现下面的代码有效,而且语法不那么晦涩难懂:
\begin{align*}
\seq_map_inline:Nn
\l__example_seq
{
#1 & #1^{#1} \\
}
\end{align*}