LuaTeX 字符串和 xspace

LuaTeX 字符串和 xspace

我正在使用 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 代码会处理任何不需要的添加空格。

相关内容