我正在将代码列表从 latex 传递到 lua 函数进行处理和格式化。使用"\luatexluaescapestring{\unexpanded{ code }}"
主要方法将任意代码列表作为字符串原样传递给 lua。
这种方法效果很好,除了我发现的一种情况。当代码本身包含字符串,而字符串又包含 时%
,这种方法就会失败。代码列表在开头就被截断了%
。
有没有办法告诉 Latex 按原样传递字符串而不是查看它内部?
我认为这\unexpanded
可以防止这种情况发生。这是一个 MWE(这只是一个例子。在实际代码中,我做的不仅仅是摆放verbatim
代码),我还使用了 listing 包等等。
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
function foo(myStr)
tex.print("\\begin{verbatim}"..myStr.."\\end{verbatim}")
end
\end{luacode*}
\begin{document}
\directlua{foo("\luatexluaescapestring{\unexpanded{%
x=10; plotTittle=sprintf("%a pi", 3); y=20;
}}")}
\end{document}
lualatex 提供
TL2016。
问题不在于字符串内部的字符串。因为这是有效的。
\directlua{foo("\luatexluaescapestring{\unexpanded{%
x=10; plotTittle=sprintf("a pi", 3); y=20;
}}")}
并给出
%
问题在于代码中的使用。
问题是:如何防止 latex 以任何方式查看字符串的内容?所有字符串都是源代码列表,来自不同的语言。
答案1
如果由于某种原因你不想luacode
在加载包后使用,那么你可以这样做
\documentclass{article}
\usepackage{luacode}
\makeatletter
\let\percent\@percentchar
\makeatother
\begin{luacode*}
function foo(myStr)
tex.print("\\begin{verbatim}"..myStr.."\\end{verbatim}")
end
\end{luacode*}
\begin{document}
\directlua{foo("\luaescapestring{%
x=10; plotTittle=sprintf("\percent a pi", 3); y=20;}%
")}
\end{document}
或者使用包功能:
\begin{luacode*}
foo('x=10; plotTittle=sprintf("%a pi", 3); y=20;}')
\end{luacode*}