将环境内容视为字符串,替换子字符串并进行解释

将环境内容视为字符串,替换子字符串并进行解释

我想定义一个环境,它可以“解析”其内容并在显示之前对其进行更改。

另一个困难是,我还需要替换空格。替换工具(正则表达式是理想的)的灵活性越高越好。

我知道或xstringStrSubstitute这里的解决方案:如何替换文本. 但目前为止它们还没有什么帮助。

例子:

\begin{changecontent}
some text 
 some text 
  some text 
\end{changecontent}

简而言之,我希望从中获得如下信息:

\command\\
~\command\\
~~\command\\

然后它将编译成某种东西,并\command扩展为之前定义的任何东西。这是一个任意的例子。这个命令是什么并不重要。它可以在序言中定义,例如它可以绘制一个 tikz 方块或只是扩展为简单的文本。

关键步骤是:

  1. 保留空格和换行符,直到内容被解析,以便它们可以用于替换部分
  2. 进行替换:在正则表达式中,如下所示:

    • ^.* => \命令\\
    • ^\s.* => ~\command\\
    • ^\s\s.* => ~~\command\\
  3. 展开结果并输出

对于如何实现这一点没有任何限制。

这对 *TeX 的要求是不是太高了?

答案1

这是一个基于 LuaLaTeX 的解决方案。它定义了一个名为 的环境changecontent。在此环境的实例中(和仅有的在这个环境的实例中),所有字符串“some text”的实例都会被改为\somecommand\par;并且,所有位于这个字符串前面的单空格或双空格都会被转换为~(不可中断的空格)。如果“some text”实例前面有两个以上的空格,那么只有最后两个空格会被转换为~。执行替换的 Lua 函数被分配给process_input_buffer回调,该回调在很早的阶段对输入流进行操作,TeX 的“眼睛”、“嘴巴”和“胃”可以做任何事情。

对于下面的代码,我为设置了一个虚拟定义\somecommand。当然,您应该\somecommand在文档的序言中提供真正的定义。

在此处输入图片描述

\documentclass{article}
\usepackage{luacode,luatexbase}

%% Lua-side code
\begin{luacode}
function sometexttocommand ( line )
    line = string.gsub ( line , "%s%ssome text", "~~\\somecommand\\par" )
    line = string.gsub ( line , "%ssome text",   "~\\somecommand\\par" )    
    line = string.gsub ( line , "some text",     "\\somecommand\\par" )
    return ( line )
end 
\end{luacode}

%% TeX-side code
\newenvironment{changecontext}{%
   \directlua{luatexbase.add_to_callback(
              "process_input_buffer",
              sometexttocommand, "sometexttocommand")}}{%
   \directlua{luatexbase.remove_from_callback(
              "process_input_buffer",
              "sometexttocommand")}}

% provide a dummy definition of "\somecommand"
\providecommand\somecommand{Hello World} 

\begin{document}
some text
 some text
  some text
   some text

\begin{changecontext}
some text
 some text
  some text
   some text
\end{changecontext}

some text
 some text
  some text
   some text

\end{document}

相关内容