我想定义一个环境,它可以“解析”其内容并在显示之前对其进行更改。
另一个困难是,我还需要替换空格。替换工具(正则表达式是理想的)的灵活性越高越好。
我知道或xstring
和StrSubstitute
这里的解决方案:如何替换文本. 但目前为止它们还没有什么帮助。
例子:
\begin{changecontent}
some text
some text
some text
\end{changecontent}
简而言之,我希望从中获得如下信息:
\command\\
~\command\\
~~\command\\
然后它将编译成某种东西,并\command
扩展为之前定义的任何东西。这是一个任意的例子。这个命令是什么并不重要。它可以在序言中定义,例如它可以绘制一个 tikz 方块或只是扩展为简单的文本。
关键步骤是:
- 保留空格和换行符,直到内容被解析,以便它们可以用于替换部分
进行替换:在正则表达式中,如下所示:
- ^.* => \命令\\
- ^\s.* => ~\command\\
- ^\s\s.* => ~~\command\\
展开结果并输出
对于如何实现这一点没有任何限制。
这对 *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}