以下是该文件的代码temptest.sty
\ProvidesPackage{temptest}
\RequirePackage{amsmath,amssymb}
\RequirePackage{xkeyval}
\RequirePackage{luacode}
\begin{luacode*}
function myfunc(m,n)
m=m or ''
n=n or ''
return (m .. n)
end
\end{luacode*}
% ========= KEY DEFINITIONS =========
\define@key{luatest}{label}{\def\luatst@label{#1}}
% ========= KEY DEFAULTS =========
\setkeys{luatest}{label=$xyz$}%
% ========= Defining Command =========
\newcommand{\luaTest}[2][]{%
\setkeys{luatest}{#1}
\directlua{tex.sprint(myfunc(\luastringN{#2},'\luatst@label'))}}%
\endinput
以下是test.tex
文件的代码。
\documentclass{article}
\usepackage{temptest}
\begin{document}
\luaTest[label=$(\\mathbb{R}{,} 3)$]{some string }
\end{document}
它运行良好并给出了预期的输出。但是我面临两个问题。
1.反斜杠需要转义,因为它是 lua 中的转义字符。
2.逗号应该写在花括号内(可能是因为它可能会将逗号后面的文本作为lua函数的参数)。
因此我的疑问是:
1.我可以使用一些宏来\luastringN
代替书写\
吗\\
?
2.我可以直接输入,
而不是 吗{,}
?
基本问题是,在使用 LuaLaTeX 编译文档时,如何通过 xkeyval 包传递带有转义字符和逗号的字符串?
答案1
你的第一点很容易解决。只需将其存储\luastringN{#1}
在你的密钥代码中,而不是#1
(我使用它来\edef
提供更好的稳健性,现在你也可以在你的值中使用宏参数,但它必须保持有效的 TeX 代码)。
恐怕你对隐藏逗号无能为力,它是xkeyval
(以及(几乎,YaX 可能很奇怪)所有其他 key=value 包的不同键的分隔符)。但你至少可以将整个值包裹在里面,而不仅仅是{}
逗号(这样你就不会改变它的数学类别,{,}
它是一个原子并且有除了 之外的其他间距,
)。
\documentclass{article}
\makeatletter
\RequirePackage{amsmath,amssymb}
\RequirePackage{xkeyval}
\RequirePackage{luacode}
\begin{luacode*}
function myfunc(m,n)
m=m or ''
n=n or ''
return (m .. n)
end
\end{luacode*}
% ========= KEY DEFINITIONS =========
\define@key{luatest}{label}{\edef\luatst@label{\luastringN{#1}}}
% ========= KEY DEFAULTS =========
\setkeys{luatest}{label=$xyz$}%
% ========= Defining Command =========
\newcommand{\luaTest}[2][]{%
\setkeys{luatest}{#1}
\directlua{tex.sprint(myfunc(\luastringN{#2},\luatst@label))}}%
\makeatother
\begin{document}
\luaTest[label={$(\mathbb{R}, 3)$}]{some string }
\end{document}