替换环境内的字符串

替换环境内的字符串
\documentclass {article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\newcommand{\testone}{Test one.}
\newenvironment{test}{}

\begin{document}

\begin{test}
    t1
\end{test}

\end{document}

有没有办法用 替换字符串t1\testone但仅限于环境内部test

答案1

最灵活的方法是使用正则表达式。

\documentclass{article}
%\usepackage{xparse} % uncomment if using LaTeX prior to release 2020-10-01

\ExplSyntaxOn

\tl_new:N \l__blackened_test_tl

\NewDocumentEnvironment{test}{+b}
 {
  \tl_set:Nn \l__blackened_test_tl { #1 }
  \regex_replace_all:nnN { \,? (\ )? t1 } { \1 \c{testone} } \l__blackened_test_tl
  \tl_use:N \l__blackened_test_tl
 }
 {}

\ExplSyntaxOff

\newcommand{\testone}{test one}

\begin{document}

\begin{test}
First t1 without a comma.

Then, t1 with a comma.
\end{test}

\end{document}

测试

搜索正则表达式的意思是“一个可能的逗号,后跟一个可能的空格,后跟t1;替换表达式是“如果有空格,则重新插入,然后插入\testone”。

答案2

假设 Steven B. Segletes 的解释是正确的,您可以做这样的事情。

\documentclass {article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{environ}
\usepackage{etoolbox}

\newcommand{\testone}{Test one.}
\NewEnviron{test}{%
\newcommand\patch{\patchcmd{\BODY}{t1}{\testone}{\patch}{}}
\patch\BODY}

\begin{document}
\begin{test}
    t1 abc t1 def
\end{test}
\end{document}

环境包允许我们创建将其内容“舀”到\BODY命令中的环境。etoolbox 包提供\patchcmd,用于替换t1\testone默认情况下,只替换第一个实例,但\patchcmd成功时执行 的第四个参数(失败时执行第五个参数)。此机制用于递归调用命令,直到替换\patch所有 的实例。t1

当然,您需要小心处理 后面的空格t1;具体需要做什么取决于您的实际使用情况。

答案3

您还可以使用\StrSubstitute以下xtring包:

在此处输入图片描述

代码:

\documentclass {article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{environ}
\usepackage{xstring}

\newcommand{\testone}{Test one.}
\NewEnviron{test}{%
    \StrSubstitute{\BODY}{t1}{TEST ONE}%
}%

\begin{document}

\begin{test}
    t1 some text t1 and more text.
\end{test}

\end{document}

答案4

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

在此处输入图片描述

请注意,这种方法会删除一个逗号在“测试”环境中,紧接在“t1”之前或之后。如果您想要删除任意数量的逗号,请将函数?搜索部分中的字符更改为。(在 Lua 的模式匹配术语中,表示“0 或 1”次出现,而表示“0 次或更多次”出现。)string.gsub*?*

% !TEX TS-program = lualatex
% Don't load 'fontenc' and 'inputenc' when using LuaLaTeX
\documentclass {article}    
\newcommand{\testone}{Test one.}
\newenvironment{test}{}{}

\usepackage{luacode} % for 'luacode' environment
\begin{luacode}
local in_test_env = false -- initialize a Boolean variable
function replace_t1 ( s )
   if string.find ( s , "\\begin{test}" ) then 
      in_test_env = true  -- switch the Boolean variable to 'true'
   elseif string.find ( s , "\\end{test}" ) then
      in_test_env = false -- switch the Boolean variable to 'false'
   elseif in_test_env == true then -- replace any occurrences of 't1'
      s = string.gsub ( s , "%,?t1%,?" , "\\testone" )
   end
   return s
end
\end{luacode}
%% assign the Lua function to LuaTeX's 'process_input_buffer' callback
\AtBeginDocument{ \directlua { luatexbase.add_to_callback ( 
   "process_input_buffer" , replace_t1 , "replacet1" )}}

\begin{document}
t1.

\begin{test}%
,t1,

,,t1,,
\end{test}

t1.
\end{document}

相关内容