我的文档中有很多图片需要展示。我的想法是为每张图片创建一个命令。所以我尝试使用foreach
命令(可能不是最好的选择...)。
我将文件名和我想要的名称存储newcommand
在一个列表中:
\newcommand{\listPartDesign}{%
BOV_Esquisse/BOVEsquisse,%
Esquisse/Esquisse,%
BOV_Web/BOVWeb%
}
我使用foreach
这些元素进行循环:
\foreach \fileCATIA/\nameCATIA in \listPartDesign {
\createCMDS{\fileCATIA}{\nameCATIA}
}
将\createCMDS
创建命令。我试过这个(\taille
定义如下\def\taille{1em}
):
\newcommand\createCMDS[2]{%
\expandafter\newcommand\csname #2\endcsname{\includegraphics[width=\taille]{BD_CATIA/PartDesign/#1.png}}}
我把图片放在 中./BD_CATIA/PartDesign
。想法是使用 来调用图片,例如在本例中\BOVWeb{}
。LaTeX 说:
Undefined control sequence.
l.52 \BOVWeb
我认为这是由于一些扩展问题造成的,但我找不到任何解决方案。也许可以使用另一种解决方案\pgfkeys
,但我对此不太熟悉。
答案1
\foreach
这是围绕每个循环的常见问题,其中\begingroup
和\endgroup
。因此,\newcommand
循环一结束,您的 就会丢失。
您必须使用\gdef
,但实际上\xdef
需要扩展本地循环变量。如果您担心重新定义现有命令,则可以使用\@ifdefinable
:
\makeatletter
\newcommand\createCMDS[2]{%
\expandafter\@ifdefinable\csname #2\endcsname{%
\expandafter\xdef\csname #2\endcsname{%
\noexpand\includegraphics[width=\noexpand\taille]{BD_CATIA/PartDesign/#1.png}%
}%
}%
}
\makeatother
一个不同的策略xparse
:
\documentclass{article}
\usepackage{xparse}
\newcommand{\subscripttoken}{_} % small kludge
\ExplSyntaxOn
\NewDocumentCommand{\newlist}{mm}
{
\clist_gclear_new:c { g_guuk_list_#1_clist }
\clist_gset:cn { g_guuk_list_#1_clist } { #2 }
}
\NewDocumentCommand{\createcommandsfrom}{m}
{
\clist_map_inline:cn { g_guuk_list_#1_clist } { \createcommand{##1} }
}
\NewDocumentCommand{\createcommand}{m}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\tl_remove_all:NV \l_tmpa_tl \subscripttoken
\cs_new_protected:cpn { \l_tmpa_tl }
{
\includegraphics[width=\taille]{BD_CATIA/PartDesign/#1.png}
}
}
\cs_generate_variant:Nn \tl_remove_all:Nn { NV }
\ExplSyntaxOff
\newlist{PartDesign}{
BOV_Esquisse,
Esquisse,
BOV_Web
}
\createcommandsfrom{PartDesign}
这样,您不需要手动删除_
;BOV_Esquisse
宏名称\BOVEsquisse
将自动被定义。