我有一个lua
函数,我想传递一些额外的可选latex
代码(基本上是一个带参数的宏,宏可以改变,参数也可以改变)。我必须在宏的名称上加两个反斜杠,我明白为什么,但我希望有一个巧妙的方法来避免这种“不自然的”双反斜杠(乳胶视图方面)?
\documentclass[french]{article}
\usepackage{polyglossia,xcolor}
\directlua{require("bob.lua")}
\def\Red{red}
\newcommand{\MyC}[1]{\colorbox{\Red}{#1}}
\newcommand{\TP}[1][]{%
\directlua{Semaine("\unexpanded{#1}")}
}
\begin{document}
% How to avoid this following double \\ ?
% if possible ...
\TP
\TP[\\MyC{works}]
\TP{\MyC{doesn't'}}
\end{document}
bob.lua
文件 :
t = {}
sem = 1
t[1] = "31 Août" -- the Semaine function calculates this values
t[2] = "5 Sept"
t[3] = "A"
function Semaine (option)
tex.print ("\\rule[.5em]{0pt}{1em}\\colorbox{gray!30!white}{"
..sem.." -- "
..t[3].."}\\quad"..option.."\\hfill\\textit{"
..t[1].." -- "..t[2].."}\\par")
end
答案1
问题是
\directlua{Semaine("\unexpanded{#1}")}
至少它可以防止#1
过早扩展。但#1
用户贡献的内容可能包含任何内容,包括引号,这会破坏预期的 Lua 语法。因此 LuaTeX 提供了\luaescapestring
,可以像\luatexluaescapestring
在 LuaLaTeX 中一样使用。它会自动引用特殊字符以获得安全的 Lua 字符串:
\directlua(Semaine("\luatexluaescapestring{\unexpanded{#1}}")}%
然后\MyC
保留为宏并\\
保留新行的命令。