在列出的元素中使用 Lua(图片列表、表格列表、内容列表)

在列出的元素中使用 Lua(图片列表、表格列表、内容列表)

我不确定我是否使用了错误的方法,或者这是否是 LuaLaTex 的普遍问题。我尝试使用 Lua 将一些国际化 (I18n) 集成到我们的文档框架中。长话短说:我想从资源文件中读取“参考”、“附录”等一般章节的标题。但是在 \chapter 或 \section 中使用 luaexec 会将无用的条目写入 .aux,因此也会写入 .toc .lof 和 .lot 文件。

这是我的小样本:

\documentclass[]{article}
\usepackage{luacode}

\newcommand{\intString}[1]{\luaexec{tex.print("#1")}}

\begin{document}
\section{\intString{test}} %this breaks
\intString{lofCaption}  % this works

\cleardoublepage
\addcontentsline{toc}{chapter}{\intString{lofCaption}} % this breaks
\protect\listoffigures

\cleardoublepage
\addcontentsline{toc}{chapter}{\intString{lotCaption}} % this breaks
\protect\listoftables
\end{document}

我不知道为什么这会导致我的 .aux 文件中出现如下一些条目:

\@writefile{toc}{\contentsline {section}{\numberline {1}\begingroup \escapechar 92 \newlinechar 10 \edef \\{\\}\edef \nobreakspace  {}{~}\let \%=%\let \#=#\endgroup test}{1}}

看起来在创建 .aux 文件期间,lua 代码既没有被执行也没有被写入 .aux,而是被看起来像引用的东西所取代。

有人知道这是 LuaLaTeX 的故障还是我的错误?

感谢您的关注。

答案1

这些luacode命令不可扩展或不强大,因此需要\protect。但\protect需要在移动参数中应用,在顶层使用它,如

\protect\listoftables

此时\protect什么也不做。\relax

所以这有效

\documentclass[]{article}
\usepackage{luacode}

\newcommand{\intString}[1]{\luaexec{tex.print("#1")}}

\begin{document}
\section{\protect\intString{test}} %this breaks
\intString{lofCaption}  % this works

\cleardoublepage
\addcontentsline{toc}{chapter}{\protect\intString{lofCaption}} % this breaks
\listoffigures

\cleardoublepage
\addcontentsline{toc}{chapter}{\protect\intString{lotCaption}} % this breaks
\listoftables
\end{document}

或者更简单地说,您可以使用\directlualuacode包装包装器,因为它是可扩展的。

所以这也有效

\documentclass[]{article}


\newcommand{\intString}[1]{\directlua{tex.print("#1")}}

\begin{document}
\section{\intString{test}} %this breaks
\intString{lofCaption}  % this works

\cleardoublepage
\addcontentsline{toc}{chapter}{\intString{lofCaption}} % this breaks
\listoffigures

\cleardoublepage
\addcontentsline{toc}{chapter}{\intString{lotCaption}} % this breaks
\listoftables
\end{document}

这两个版本并不等效,第二个版本在文件写出intString时进行扩展,第一个版本在文件写入时进行扩展,在文件读回时进行扩展。在这个例子中,最终结果是相同的。aux\intString\intStringaux

相关内容