\xdef 在 \newcommand 中带有参数吗?

\xdef 在 \newcommand 中带有参数吗?

考虑到这一点newcommand(效果很好)

\newcommand\createCMDSH[4]{%
  \expandafter\@ifdefinable\csname #3#2\endcsname{%
    \expandafter\xdef\csname #3#2\endcsname{%
      \noexpand\vcenteredhbox{\noexpand\includegraphics[height=\noexpand\taille,trim=0 0 1 -1]{BD_CATIA/#4/#1.png}}%
    }%
  }%
}

我可以获得一个由指定名称的命令#3#2来显示一张图片。

这个想法是将xdef命令更改为使用一个参数构建新#3#2命令。我该怎么做?这是xdef正确的命令吗?

解释 ( #3#2= cmdperso):

  • 旧版\cmdperso{}
  • 新版本\cmdperso{0.5}(50% \textwidth)

我已经尝试过这个,但是没有用:

\newcommand\createCMDM[4]{%
  \expandafter\@ifdefinable\csname #3#2\endcsname{%
    \expandafter\xdef\csname #3#2\endcsname[1][]{%
      \noexpand\includegraphics[width=\noexpand##1\textwidth]{BD_CATIA/#4/#1.png}%
    }%
  }%
}

解决方案

\newcommand\createCMDM[4]{%
  \expandafter\@ifdefinable\csname #3#2\endcsname{%
    \expandafter\xdef\csname #3#2\endcsname##1{%
      \noexpand\includegraphics[width=##1\noexpand\hsize]{BD_CATIA/#4/#1.png}%
    }%
  }%
}

答案1

您将\newcommand参数声明的语法与\xdef原始语法相结合。但原始命令具有正常且优雅的语法,没有方括号。

\def\createCMDM#1#2#3#4{% I don't understand why #3 is merged with #2
  \expandafter\@ifdefinable\csname #3#2\endcsname{%
    \expandafter\gdef\csname #3#2\endcsname##1{%
      \includegraphics[width=##1\hsize]{BD_CATIA/#4/#1.png}%
    }%
  }%
}

如果你正在使用\cmdperso{}full\hsize\cmdperso{0.5}half \hsize,则不需要实现可选参数。

编辑:我替换\xdef\gdef删除一个\noexpand\xdef这里不需要 。

答案2

你可以创建一个模拟\newcommand两个可选参数的功能,但我认为最好使用xparseexpl3来实现这一点:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\createCMDSH}{mmmm}
 {
  \guuk_create_cmdsh:cxx { #3#2 } { #1 } { #4 }
 }

\cs_new_protected:Nn \guuk_create_cmdsh:Nnn
 {
  \NewDocumentCommand{#1}{}
   {
    \vcenteredhbox{
     \includegraphics[height=\taille,trim=0~0~1~-1]{BD_CATIA/#3/#2.png}
    }
   }
 }
\cs_generate_variant:Nn \guuk_create_cmdsh:Nnn { cxx }

\NewDocumentCommand{\createCMDM}{mmmm}
 {
  \guuk_create_cmdm:cxx { #3#2 } { #1 } { #4 }
 }

\cs_new_protected:Nn \guuk_create_cmdm:Nnn
 {
  \NewDocumentCommand{#1}{O{}}
   {
    \vcenteredhbox{
     \includegraphics[width=##1\textwidth]{BD_CATIA/#3/#2.png}
    }
   }
 }
\cs_generate_variant:Nn \guuk_create_cmdm:Nnn { cxx }
\ExplSyntaxOff

\newcommand{\txtA}{TEXTA}
\newcommand{\txtB}{TEXTB}
\createCMDSH{\txtA}{\txtB}{X}{Y} % this will create \XTEXTB

\createCMDM{\txtA}{\txtB}{ZZZ}{WWW} % this will create `\ZZZTEXTB`

该命令\ZZZTEXTB将有一个可选参数,因此\ZZZTEXTB将打印图像的\textwidth宽度,而\ZZZTEXTB[0.5]将打印文本宽度的一半。

相关内容