我正在使用 lua 代码自动记录会议期间出现的待办事项。为此,我目前使用包\luastringN
中的代码luacode
。但是,我希望在我的参数中展开所有“文本”宏,因为这将使将这些任务导出到其他程序变得更容易,而无需使用神秘的宏。我发现包含的宏在替换为时\xspace
会导致问题。\luastringN
\luastring
梅威瑟:
\documentclass{article}
\usepackage{luacode}
\usepackage{xspace}
\newcommand{\foo}{Expanded foo\xspace}
\begin{document}
\directlua{\luastring{\foo}}
\end{document}
错误:
This is LuaHBTeX, Version 1.13.0 (TeX Live 2021/Arch Linux)
restricted system commands enabled.
(./main.tex
LaTeX2e <2020-10-01> patch level 4
L3 programming layer <2021-02-18>
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texmf-dist/tex/lualatex/luacode/luacode.sty
(/usr/share/texmf-dist/tex/generic/iftex/ifluatex.sty
(/usr/share/texmf-dist/tex/generic/iftex/iftex.sty))
(/usr/share/texmf-dist/tex/luatex/luatexbase/luatexbase.sty
(/usr/share/texmf-dist/tex/luatex/ctablestack/ctablestack.sty)))
(/usr/share/texmf-dist/tex/latex/tools/xspace.sty)
(/usr/share/texmf-dist/tex/latex/l3backend/l3backend-luatex.def)
(./build/main.aux) (/usr/share/texmf-dist/tex/latex/base/ts1cmr.fd))
! Incomplete \iffalse; all text was ignored after line 10.
<inserted text>
\fi
<*> main.tex
答案1
\xspace
不可扩展,因此不能直接用于\directlua
(或\write
或\edef
或类似命令。
您可以根据想要的结果,在本地为其提供在这些上下文中安全的定义。
\documentclass{article}
\usepackage{luacode}
\usepackage{xspace}
\newcommand{\foo}{Expanded foo\xspace}
\begin{document}
\typeout{}
{\let\xspace\relax\directlua{print(\luastring{\foo} .. 1)}}
{\let\xspace\space\directlua{print(\luastring{\foo} .. 2)}}
{\let\xspace\empty\directlua{print(\luastring{\foo} .. 3)}}
\end{document}
生产
Expanded foo\xspace 1
Expanded foo 2
Expanded foo3
答案2
根据评论和@David Carlisle的回答,我写了以下解决方案:
测试.lua
function xspace_trim(s)
local res = string.gsub(s, " ([%p ])", "%1")
local res = string.gsub(res, "^%s*(.-)%s*$", "%1")
return res
end
function Foo(s)
print("\"" .. s .. "\" --> \""..xspace_trim(s).."\"")
end
主文本
\documentclass{article}
\usepackage{luacode}
\usepackage{xspace}
\directlua{require "test"}
\newcommand{\foo}{Expanded foo\xspace}
\newcommand{\Foo}[1]{{\let\xspace\space\directlua{Foo(\luastring{#1})}}}
\begin{document}
\Foo{\foo}
\Foo{\foo bar}
\Foo{\foo. bar}
\end{document}
结果:
"Expanded foo " --> "Expanded foo"
"Expanded foo bar" --> "Expanded foo bar"
"Expanded foo . bar" --> "Expanded foo. bar"
该函数xspace_trim
会删除字符串中的任何双空格以及标点符号前的空格。它还会删除任何前导和尾随空格。\xspace
在本地, 被定义为空格。然后,lua 代码会处理任何不需要的添加空格。