考虑到这一点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
两个可选参数的功能,但我认为最好使用xparse
和expl3
来实现这一点:
\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]
将打印文本宽度的一半。