使用 LuaLaTeX 编译文档时,通过 xkeyval 包传递带有转义符和逗号的字符串

使用 LuaLaTeX 编译文档时,通过 xkeyval 包传递带有转义符和逗号的字符串

以下是该文件的代码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}

相关内容