我目前正在制作一个模板,供我们的顾问使用。为此,我制作了一组函数,可以自动生成和计算报告的某些部分。
编写的 LaTeX 示例如下:
\DataPoint{entry=123,description={Discovered that \textbf{something} is going on}, imporantance={High}}
使用该xkeyval
包对其进行解析,使其成为美观有效的 LaTeX。现在luatex
开始进行这一部分。我们希望将这些值转换为 lua 变量,这样我们还可以将它们存储在磁盘上,并在构建时对其进行验证等等。
因此现在我有:
\directlua{
local datapoint = {}
datapoint.entry = "{\DataPointEntry}"
datapoint.description = "{\DataPointDescription}"
}
这对于条目来说效果很好。但是对于描述,由于其中有额外的文本,我遇到了堆栈问题:
! TeX capacity exceeded, sorry [parameter stack size=10000].
\csuse #1->
\ifcsname #1\endcsname \csname #1\expandafter \endcsname \fi
l.55 }
11237 words of node memory still in use:
62 hlist, 10 vlist, 54 rule, 93 disc, 10 local_par, 1 dir, 2 math, 290 glue,
78 kern, 29 penalty, 956 glyph, 108 attribute, 48 glue_spec, 108 attribute_lis
t, 1 if_stack, 2 write, 17 pdf_colorstack nodes
avail lists: 1:3,2:8,3:1,4:12,5:31,6:1,7:12,8:3,9:3,10:14
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on test.log.
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1
当我删除描述字段中的 LateX 时,它就可以完美地工作了。那么我怎样才能让 LuaTex 先解析 LaTeX,然后将其转换为 Lua 变量呢?
谢谢,这让我发疯了。
答案1
您需要防止材料不受控制地膨胀,这种情况在您将材料传递给时发生\directlua
。同时,如果您想“尽可能安全地”膨胀,那么您需要单独进行。类似
\makeatletter
\begingroup
\protected@edef\@tempa{\DataPointEntry}%
\protected@edef\@tempb{\DataPointDescription}%
\directlua{
local datapoint = {}
datapoint.entry = "\luaescapestring{\unexpanded\expandafter{\@tempa}}"
datapoint.description = "\luaescapestring{\unexpanded\expandafter{\@tempb}}"
}%
\endgroup
\makeatother