修剪宏内容中的括号

修剪宏内容中的括号

我有一些宏,其内容可能有或没有多余的花括号。如果可能的话,我想修剪多余的花括号,但不扩展其余内容。

以下代码显示了该任务:

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

相关内容