如何将代码放入另一个宏以避免重复?

如何将代码放入另一个宏以避免重复?

下面的代码有两个分支:如果为真分支,则将参数 #2 放入\colorbox其中并进行排版;如果为假分支,则直接排版参数 #2。

#2 必须出现在两个分支中。在我的示例(\cmda)的第一部分中,#2 的代码很简单(只是它本身)。但如果 #2 的代码很大且很复杂,那么重复 #2 代码的一部分就会很无聊。

然后我尝试使用我的示例的第二部分(\cmdb)和bgroupegroup但失败了。

那么,如何用另一个宏来“覆盖”部分代码,就像我在 中尝试的那样\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}

在此处输入图片描述

相关内容