我想创建一个环境,里面有自己的解析规则,例如:
\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}