如果这是一个微不足道的问题,我很抱歉,但我对乳胶还很陌生。我一直在尝试使用将几个数学表达式保存到一个变量中\xdef
(在循环内,但这不是这里的问题)。似乎我可以使用将任何数学表达式存储到一个变量中,\xdef
但我不能存储任何包含的表达式\sqrt
。例如在以下程序中:
\documentclass{article}
\begin{document}
\xdef\TestFun{e^{x+1}}
$\TestFun$
\xdef\TestFunA{{\sqrt{x+1}}}
$\TestFunA$
\end{document}
$TestFun$
工作并打印预期的内容,而当我运行时\TestFunA
,我收到以下错误消息:
l.14 \xdef\TestFun{\sqrt
{x+1}}
?
! Undefined control sequence.
如果您能提出任何有关如何实现此项工作的想法,我们将不胜感激!
更新:
我的目标是循环遍历函数列表以创建函数的线性组合。如果有帮助,完整的循环代码如下:
\documentclass{article}
\usepackage{listofitems}
\usepackage{pgffor}
\begin{document}
\readlist\FUNS{X,X^2,e^{x+1},\sqrt{X}}
\xdef\SUMFUNS{\FUNS[1]}
\foreach \x in {2,...,\FUNSlen} {
\xdef\SUMFUNS{\SUMFUNS+{\noexpand\FUNS[\x]}}
}
$\SUMFUNS$
\end{document}
我采纳了@clemens 的建议,它目前能完成我想要它做的事情,但前提是该\sqrt
函数是列表中的最后一个,这对我来说不算什么。但是,我会欢迎任何改进!
答案1
答案2
使用\xdef
是危险的,扩展应该限制在所需的水平。对于你的情况,你需要扩展一次\SUMFUNS
和两次\FUNS[\x]
。
\documentclass{article}
\usepackage{listofitems}
\usepackage{pgffor}
\providecommand\expandonce{% etoolbox has it
\unexpanded\expandafter
}
\newcommand\expandtwice{%
\unexpanded\expandafter\expandafter\expandafter
}
\begin{document}
\readlist\FUNS{X,X^2,e^{x+1},\sqrt{X}}
\xdef\SUMFUNS{\expandtwice{\FUNS[1]}}
\foreach \x in {2,...,\FUNSlen} {%
\xdef\SUMFUNS{%
\expandonce{\SUMFUNS}+\expandtwice{\FUNS[\x]}%
}%
}
$\SUMFUNS$
\end{document}
一种更简单的方法expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definelist}{mm}
{
\clist_clear_new:c { l_babis_list_#1_clist }
\clist_set:cn { l_babis_list_#1_clist } { #2 }
}
\NewDocumentCommand{\sumlist}{m}
{
\clist_use:cn { l_babis_list_#1_clist } { + }
}
\ExplSyntaxOff
\begin{document}
\definelist{FUNS}{X,X^2,e^{x+1},\sqrt{X}}
$\sumlist{FUNS}$
\end{document}