LuaTex 将 LaTeX 解析为变量

LuaTex 将 LaTeX 解析为变量

我目前正在制作一个模板,供我们的顾问使用。为此,我制作了一组函数,可以自动生成和计算报告的某些部分。

编写的 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

相关内容