如何让纯文本被理解为宏?

如何让纯文本被理解为宏?

我想创建一个环境,里面有自己的解析规则,例如:

\begin{foo}
a := 42;
c := a;
\end{foo}

可以理解为:

a \mapsto 42 \\[2pt] c \mapsto a \\[2pt]

这里,:=TeX 将其理解为 ,\mapsto并将;其理解为\\[2pt]。这可能吗?

答案1

这是一个基于 LuaLaTeX 的解决方案。

完成所有工作的 Lua 函数在 LaTeX 进入环境时被激活foo,在 LaTeX 退出环境时被停用foo。我所说的“激活”是指分配给 LuaTeX 的process_input_buffer回调。在激活时,Lua 函数充当预处理器,检查和修改输入流TeX 开始其常规输入处理。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}

%% Lua-side code
\usepackage{luacode}
\begin{luacode}
function do_substitutions ( s )
  s = s:gsub ( ":=" , "\\mapsto " )
  s = s:gsub ( ";"  , "\\\\[2pt]" )
  return s 
end
\end{luacode}

%% LaTeX-side code
\newenvironment{foo}{%
  \directlua { luatexbase.add_to_callback (%
    "process_input_buffer" , do_substitutions , "do_subs" ) }}{%
  \directlua { luatexbase.remove_from_callback (%
    "process_input_buffer" , "do_subs" ) }}
  
\begin{document}
\[
\begin{foo}
\begin{array}{c}
a := 42;
c := a
\end{array}
\end{foo}
\]
\end{document}

答案2

标记循环伪环境\foo...\endfoo可以直接在 (La)TeX 中实现这一点。我不仅展示了排版结果,还展示了导致转换标记列表的去标记化标记。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tokcycle} 
\tokcycleenvironment\foo
{\ifx;##1\addcytoks{\\[2pt]}\else
 \ifx:##1 \tcpeek\z\ifx=\z\addcytoks{\mapsto}\tcpop\z\else
   \addcytoks{##1}\fi\else
 \addcytoks{##1}\fi\fi}
{\processtoks{##1}}
{\addcytoks{##1}}
{\addcytoks{##1}}
\begin{document}
\noindent$\foo
a := 42;
c := a;
\endfoo
%
\textrm{\detokenize\expandafter{\the\cytoks}}$
\end{document}

在此处输入图片描述

相关内容