You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:25:24