下面的代码有两个分支:如果为真分支,则将参数 #2 放入\colorbox
其中并进行排版;如果为假分支,则直接排版参数 #2。
#2 必须出现在两个分支中。在我的示例(\cmda
)的第一部分中,#2 的代码很简单(只是它本身)。但如果 #2 的代码很大且很复杂,那么重复 #2 代码的一部分就会很无聊。
然后我尝试使用我的示例的第二部分(\cmdb
)和bgroup
,egroup
但失败了。
那么,如何用另一个宏来“覆盖”部分代码,就像我在 中尝试的那样\cmdb
?
例子:
\documentclass{article}
\usepackage{geometry,xparse,xcolor}
\geometry{showframe}
\begin{document}
%%%%% \cmda %%%%%
\NewDocumentCommand\cmda{sm}{%
\IfBooleanTF{#1}
{\colorbox{green}{#2}}
{#2}
}
Test: \par
\cmda*{with back-ground color.} \cmda{no back-ground color.}
%%%%%%%%%%%%%%%%%%
%%%%% \cmdb %%%%%
\NewDocumentCommand\cmdb{sm}{%
\IfBooleanT{#1}
{\colorbox{green}\bgroup}
#2
\IfBooleanT{#1}{\egroup}
}
Test: \par
\cmdb*{with back-ground color.} \cmdb{no back-ground color.}
%%%%%%%%%%%%%%%%%
\end{document}
答案1
\colorbox
将事物包装成类似于\fbox
其框线厚度为 0pt 且事物背景为彩色的东西。
似乎有了星星,您希望这个盒子有背景颜色,而如果没有星星,您根本不希望将任何内容包装到盒子中。
这样,事物的测量结果会根据是否需要为背景着色而有所不同。
您可以使用内核宏\@firstofone
。
如果您不想在中间包装东西,\makeatletter..\makeatother
您可以这样做\csname @firstofone\endcsname
。
在 expl3-syntax 中\@firstofone
是\use:n
。
\documentclass{article}
\usepackage{geometry,xparse,xcolor}
\geometry{showframe}
%%%%% \cmda %%%%%
\NewDocumentCommand\cmda{sm}{%
\IfBooleanTF{#1}%
{\colorbox{green}}%
{\csname @firstofone\endcsname}%
{#2}%
}
\begin{document}
Test: \par
\cmda*{with back-ground color.} \cmda{no back-ground color.}
\end{document}
如果您希望彩色盒子和无色盒子的尺寸相同,那么这样做可能会奏效:
\documentclass{article}
\usepackage{geometry,xparse,xcolor}
\geometry{showframe}
%%%%% \cmda %%%%%
\newcommand\framelessfbox[1]{{\fboxrule=0pt \fbox{#1}}}%
\NewDocumentCommand\cmda{sm}{%
\IfBooleanTF{#1}%
{\colorbox{green}}%
{\framelessfbox}%
{#2}%
}
\begin{document}
Test: \par
\fbox{\cmda*{with or without back-ground color.}} \fbox{\cmda{with or without back-ground color.}}
\fbox{\cmda{with or without back-ground color.}} \fbox{\cmda*{with or without back-ground color.}}
\end{document}