我有一些宏,其内容可能有或没有多余的花括号。如果可能的话,我想修剪多余的花括号,但不扩展其余内容。
以下代码显示了该任务:
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\def\TrimBraces#1#2{\edef#1{\expandonce{#2}}}
\def\a{Test}
\TrimBraces\x\a
\show\x
%-- should be ->Test
% OK
\def\b{{Test}}
\TrimBraces\x\b
\show\x
%-- should be ->Test
% but is {Test}
\def\c{Test \textbf{Z}}
\TrimBraces\x\c
\show\x
%-- should be ->Test \textbf{Z}
% OK
\def\d{{Test \textbf{Z}}}
\TrimBraces\x\d
\show\x
%-- should be ->Test \textbf{Z}
% but is {Test \textbf{Z}}
\end{document}
目前,\TrimBraces
它更像是一个将一个参数复制到另一个参数的存根。我尝试了很多使用 toks 的方法,但都没有按预期工作。我希望有人有更好的主意。也许,这甚至是一个已知的任务。
更新: David Carlisle、wipet 和 egreg 的答案完美地回答了我的问题,但我只能接受一个答案......
答案1
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\def\TrimBraces#1#2{\expandafter\zzz\expandafter#1\expandafter{\expandafter\zz#2\zz}}
\def\zz#1\zz{#1}
\def\zzz#1#2{\expandafter\def\expandafter#1\expandafter{#2}}
\def\a{Test}
\TrimBraces\x\a
\show\x
%-- should be ->Test
% OK
\def\b{{Test}}
\TrimBraces\x\b
\show\x
%-- should be ->Test
% but is {Test}
\def\c{Test \textbf{Z}}
\TrimBraces\x\c
\show\x
%-- should be ->Test \textbf{Z}
% OK
\def\d{{Test \textbf{Z}}}
\TrimBraces\x\d
\show\x
%-- should be ->Test \textbf{Z}
% but is {Test \textbf{Z}}
\end{document}}
答案2
我的解决方案只是 David 解决方案的一个小替代方案。主要观点是一样的:如果存在外部括号,TeX 会从分隔参数中删除它们:
\def\aa#1\separator{...} \aa {text}\separator -- #1 is text
\aa {text}b\separator -- #1 is {text}b
我的解决方案是:
\def\TrimBraces#1#2{\def\tmp{#1}\expandafter\trimbracesA#2\end}
\def\trimbracesA#1\end{\expandafter\def\tmp{#1}}
答案3
这是我的看法;假设它\@nil
不会出现在第二个参数的扩展中。
\documentclass{article}
\makeatletter
\def\TrimBraces#1#2{\expandafter\TrimBraces@aux#2\@nil{#1}}
\def\TrimBraces@aux#1\@nil#2{\def#2{#1}}
\makeatother
\def\a{Test}
\TrimBraces\x\a
\show\x %-- should be ->Test
\def\b{{Test}}
\TrimBraces\x\b
\show\x %-- should be ->Test
\def\c{Test \textbf{Z}}
\TrimBraces\x\c
\show\x %-- should be ->Test \textbf{Z}
\def\d{{Test \textbf{Z}}}
\TrimBraces\x\d
\show\x %-- should be ->Test \textbf{Z}
\def\e{{foo}bar}
\TrimBraces\x\e
\show\x %-- should be ->{foo}bar
\stop
以下是日志
> \x=macro:
->Test.
l.10 \show\x
%-- should be ->Test
?
> \x=macro:
->Test.
l.14 \show\x
%-- should be ->Test
?
> \x=macro:
->Test \textbf {Z}.
l.18 \show\x
%-- should be ->Test \textbf{Z}
?
> \x=macro:
->Test \textbf {Z}.
l.22 \show\x
%-- should be ->Test \textbf{Z}
?
> \x=macro:
->{foo}bar.
l.26 \show\x
%-- should be ->{foo}bar
?
)
No pages of output.