newcommand内のnewcommandの引数

newcommand内のnewcommandの引数

- 森岡 翔輔 の投稿
返信数: 5
¥newcommand{¥答}[1]{}
¥newcommand{¥解答}{¥renewcommand{¥答}[1]{#1}}

作りたいのは\解答commandを入力した時 \答{####} の文章が表示され
\解答commandを入力しなければ \答{####} の文章は表示しないようなマクロです。

しかし2行目でエラーが出てしまいます。2行目の#1が\解答のものと判断されているようです
このように引数がどちらのcommandのものか正しく認識させるにはどうすれば良いのでしょうか。

森岡 翔輔 への返信

Re: newcommand内のnewcommandの引数

- 帯田 木偶太 の投稿

どういうコマンドを定義しようとなさっているのか理解できていないのですが、
一般論として、\newcommand/\renewcommand は入れ子にすることができません。
代わりに TeX のプリミティブである \def を使います。そして内側にある
定義の引数は ##1 のように、# を二重にします。

\newcommand{\答}[1]{}
%   \newcommand{\解答}{\renewcommand{\答}[1]{#1}}
\newcommand\解答{%
    \def\答##1{##1}%
}

帯田 木偶太 への返信

Re: newcommand内のnewcommandの引数

- 森岡 翔輔 の投稿
>>定義の引数は ##1 のように、# を二重にします。

これで解決できました。ありがとうございます。
森岡 翔輔 への返信

Re: newcommand内のnewcommandの引数

- 帯田 木偶太 の投稿

あ、\newcommandの中の\renewcommand自体はエラーになりませんねえ。

ひょっとして私は思い違いしていたのかも。

帯田 木偶太 への返信

Re: newcommand内のnewcommandの引数

- 前田 一貴 の投稿
TeX by Topic の 11.5.5節にありますが,TeX がマクロを展開するときのパラメータ文字 # の扱いは,
・#1, #2, ... を1番目,2番目,……の引数にそれぞれ置き換える.
・## を # に置き換える.
という単純な仕組みのようです.
入れ子の場合も,実際に \renewcommand が展開される時点で #1 になるように
# を重ねておけば大丈夫ということになるかと思います.

\newcommand{\解答}{\renewcommand{\答}[1]{##1}}

の例だと,\解答 を展開すると \renewcommand{\答}[1]{#1} になるというわけです.
帯田 木偶太 への返信

Re: newcommand内のnewcommandの引数

- Z. R. の投稿

LaTeX の“仕様”(Lamport 本に書いてあるもの)では以下のように定められているようです:

  • 命令や環境を定義する命令(\newcommand 等)は入れ子にすることができる。
  • ただしその場合は、内側の命令の環境を定義では引数を持たせることができない。

しかし、実際(つまり“実装”)では、\newcommand の定義本体はそのまま \def の定義本体となるため、結局 TeX のマクロの定義の入れ子と同じ処理(# を二重にする)で通ってしまいます。

(恐らく Lamport 氏は「# を二重にする」という文法を LaTeX に入れたくなかったのだと想像しています。)

というわけで、この話は、pure-LaTeX を書こうとする(酔狂な?)人以外にはどうでもよいトリビアでした。