
Если в команде \foo
есть один из моих аргументов, например, #1
как я могу сделать \def
for \foobar
, т. е. определить команду с bar
добавленным to #1
?
В частности, я пробую следующее
\documentclass{scrbook}
\usepackage[refpage,noprefix]{nomencl}
\makeatletter
\newcommand*{\defsym}[3][]{\def#2{%
\ifx\protect\@unexpandable@protect
#3%
\else
\nomenclature{$#3$}{#1}\gdef#2{#3}#3%
\fi} %
%\def#2FwD{#3} % <-- this does not work
}
\makeatother
\usepackage{amsmath,amsfonts,amssymb}
\defsym{\Rn}{\mathbb{R}^n}
\makenomenclature
\begin{document}
$\Rn$ will be introduced later ...
%$\RnFwD$ will be introduced later ...
\clearpage
$\Rn$ is defined as ...
\printnomenclature
\end{document}
Это используетСписок символов/сокращений и макросовавтоматически помещать символ (здесь \Rn) в Номенклатуру (Список символов) при его первом использовании. Это прекрасно работает для большего количества случаев, но сейчас у меня появился редкий случай, когда я хочу сделать первое использование символа, который еще не должен быть записан в номенклатуре. Для этого я хочу ввести команду \xFwd
для каждой команды, \x
объявленной \defsym
.
Я попробовал сделать это выше, но когда я раскомментировал эту строку, то получил ошибку
Use of \Rn doesn't match its definition.
, которая, как я думаю, связана с вопросом, который я задал первым.
решение1
\makeatletter
\def\addbar#1{%
\expandafter\def\csname\expandafter\@gobble\string#1bar\endcsname}
\addbar\sin#1{hello #1}
\show\sinbar
\stop
определяет \sinbar
:
> \sinbar=macro:
#1->hello #1.
решение2
\documentclass{article}
\makeatletter
\def\foo#1#2{\@namedef{foo#1}{#2}}
\makeatother
\begin{document}
\foo{bar}{foobarbaz}
\foobar
\end{document}