我不确定我是否使用了错误的方法,或者这是否是 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}
或者更简单地说,您可以使用\directlua
非luacode
包装包装器,因为它是可扩展的。
所以这也有效
\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
\intString
aux