\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}