如何将\pgfkeys执行结果传入Lua?自定义\pgfkeysprint宏方法
解决方案
1. 将pgfkeys执行结果传递给Lua
要获取pgfkeys执行参数后的完整输出并传递给Lua,核心是先捕获pgfkeys的输出内容,再将捕获的内容转义后传入Lua环境。可以通过TeX的盒子(box)机制实现输出捕获:
\documentclass{article} \usepackage{pgfkeys} \usepackage{luacode} % 先定义示例键的处理逻辑(模拟你提到的输出格式) \pgfkeys{ /c/.code={(c)}, /d/.code={(d:)}, /e/.code={(d:#1)}, } % 定义宏:执行pgfkeys并将结果传递给Lua \newcommand{\pgfkeystolua}[1]{% % 用盒子捕获pgfkeys的输出 \setbox0=\hbox{% \pgfkeys{#1}% }% % 将盒子内容转义后传入Lua \directlua{% local output = "\luaescapestring{\unhbox0}" -- Lua端可以打印到控制台或输出到PDF print("pgfkeys执行结果:" .. output) tex.print("Lua处理后的输出:" .. output) }% } \begin{document} \pgfkeystolua{/c,/d,/e=DD} \end{document}
关键逻辑说明
- 用
\setbox0=\hbox{\pgfkeys{#1}}将pgfkeys执行时的输出临时存储到盒子中; \unhbox0取出盒子中的内容,\luaescapestring处理特殊字符后,传入Lua的directlua环境;- Lua端可以通过
print()输出到控制台,或tex.print()输出到PDF文档。
2. 实现\pgfkeysprint宏
要将pgfkeys参数的展开结果存入\luatmp再通过Lua打印,同样基于盒子捕获输出,再通过全局展开赋值将内容存入宏,最后传递给Lua:
\documentclass{article} \usepackage{pgfkeys} \usepackage{luacode} % 示例键定义 \pgfkeys{ /c/.code={(c)}, /d/.code={(d:)}, /e/.code={(d:#1)}, } % 实现\pgfkeysprint宏 \newcommand{\pgfkeysprint}[1]{% % 捕获pgfkeys输出到盒子 \setbox0=\hbox{% \pgfkeys{#1}% }% % 全局展开盒子内容,存入\luatmp \xdef\luatmp{\unhbox0}% % 调用Lua打印\luatmp的内容 \directlua{% local tmp_content = "\luaescapestring{\luatmp}" print("\luatmp内容:" .. tmp_content) tex.print("Lua打印结果:" .. tmp_content) }% } \begin{document} \pgfkeysprint{/c,/d,/e=DD} % 直接输出\luatmp的内容验证 \bigskip \luatmp \end{document}
关键逻辑说明
\xdef\luatmp{\unhbox0}:\xdef是全局展开定义,会将\unhbox0的内容完全展开后赋值给\luatmp,确保宏中存储的是最终输出文本;- 后续通过
\luaescapestring{\luatmp}将宏内容转义后传入Lua,避免特殊字符导致Lua语法错误。
内容的提问来源于stack exchange,提问作者Eduardo Ochs
相关产品推荐
相关产品推荐

