我有一个带有长 的宏hbox
,我想tikz
通过在其 前面添加一行代码来集成一个简单的框{
。但是,由于该行中包含花括号,我面临挑战。这里有一个 (MWE) 来说明,我需要用\hbox{%
替换\hbox{\tikz[anchor=base,baseline]\node[red] at (0,0) {Tikz};%
。
\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}
\def\text{\hbox{%
This is a test.
%several lines of code here
}}
\patchcmd{\text}{\hbox{%
}
{\hbox{\tikz[anchor=base,baseline]\node[red] at (0,0) {Tikz};%
}
{\typeout{SUCCEEDED}}{\typeout{FAILED}}
\begin{document}
\text
\end{document}
虽然我知道我可以使用整个\hbox{}
结构进行修补,但我发现为了修改一行代码而重复大量代码很麻烦。具体来说,我正在寻找一种更简洁的方法来实现这一点。
答案1
你绝对不能用 来做到这一点\patchcmd
。
我并不是推荐这个,但是,嘿,它确实有效!
\documentclass{article}
\usepackage{tikz}
\usepackage{regexpatch}
\def\mytext{%
\hbox{%
This is a test.%
%several lines of code here
}%
}
\regexpatchcmd{\mytext}
{\c{hbox}\{}
{\c{\hbox}\{\c{tikz}[anchor=base,baseline]\c{node}[red]\ at\ (0,0)\ {Tikz};}
{\typeout{SUCCESS}}{\typeout{FAILURE}}
\begin{document}
\mytext
\end{document}
如果你\show\mytext
在补丁完成后这样做,你就会得到
> \mytext=macro:
->\hbox {\tikz [anchor=base,baseline]\node [red] at (0,0) {Tikz};This is a test.}.
你也可以省去一些麻烦
\documentclass{article}
\usepackage{tikz}
\usepackage{regexpatch}
\def\mytext{%
\hbox{%
This is a test.%
%several lines of code here
}%
}
\def\tmp{\tikz[anchor=base,baseline]\node[red] at (0,0) {Tikz};}
\regexpatchcmd{\mytext}
{\c{hbox}\{}
{\0\u{tmp}}
{\typeout{SUCCESS}}{\typeout{FAILURE}}
\begin{document}
\mytext
\show\mytext
\end{document}
解释:
\c{hbox}
火柴\hbox
;\{
与括号匹配;\0
代表比赛;\u{tmp}
被宏的内容替换\tmp
。
答案2
您可以先定义一个命令,在其中添加内容\hbox
,然后\hbox
通过修补用您的自定义命令替换:
\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}
\newcommand\myhbox[1]{%
\hbox{\tikz[anchor=base,baseline]\node[red] at (0,0) {Tikz};%
#1%
}%
}
\newcommand\mytext{%
\hbox{%
This is a test.
%several lines of code here
}%
}
\patchcmd{\mytext}
{\hbox}
{\myhbox}
{\typeout{SUCCEDED}}{\typeout{FAILED}}
\begin{document}
\mytext
\end{document}