マクロ名を連結する \foo + bar ==> \foobar

マクロ名を連結する \foo + bar ==> \foobar

コマンドの\fooが引数の 1 つである場合、たとえばを に実行して、つまり を追加したコマンドを定義するには#1どうすればよいでしょうか?\def\foobarbar#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}

関連情報