名前: トノ 日時: 2004-09-14 14:07:09 IPアドレス: 150.35.254.*
>>31460 \typeout{\meaning\CONTROLSEQUENCE} という方法は、\CONTROLSEQUENCE が \outer なマクロだとエラーになる、@ 等の記号類が名前に含まれて いる場合は、先にカテゴリー・コードを変更しておかなければならない、等の 制約があるので、私は、次のような内容の showcs.tex という ファイルを用意しておいて、\input で読込んで \showcs\LaTeX \ というようなことをやっています。 %==== showcs.tex ====================================================== % % Shows meaning of control sequence on the screen % %======================================================================= \csname @temptokena\endcsname={2002/11/29 }% == file date % '^^^^^^^^^^' \begingroup \makeatletter \@ifundefined{documentclass}{% \def\reserved@a{% \wlog{==== \string showcs.tex : \the\@temptokena ====}% }% }{% \def\reserved@a{% \ProvidesFile{showcs.tex}[\the\@temptokena \space Shows meaning of control sequence% ]% }% } \expandafter \endgroup\reserved@a %**** in order to prevent name conflict \newcommand{\showcs}{} \newcommand{\showcsdefine}{} \begingroup \makeatletter % > : start of def % < : end of def % = : invocation \@temptokena={% \def\showcs{% % > a \begingroup \begingroup \def\do##1{\catcode`##1=12 }% \dospecials \def\showcs##1{% % > b \def\showcs@delimiter{##1}% \def\showcs@name{}% \def\showcs####1{% % > c \if \showcs@delimiter ####1% \def\showcs{% % > d (outdent) \escapechar=\m@ne \@tempswafalse \expandafter\ifcat \expandafter\noexpand\csname\showcs@name\endcsname ################% %then \@tempswatrue \fi \if@tempswa \@temptokena=\expandafter{\csname\showcs@name\endcsname}% \fi \edef\showcs{% % > e \noexpand\escapechar=`\noexpand\\% \noexpand\edef\noexpand\showcs{% % > f \string\\\showcs@name=% \noexpand\meaning \if@tempswa \the\@temptokena \else \expandafter\noexpand\csname\showcs@name\endcsname \fi }% % > f }% % < e \expandafter \endgroup \showcs % = e \immediate\write\@M{\showcs<}% % = f \endgroup }% % < d (outdent) \else \edef\showcs@name{\showcs@name####1}% \fi \showcs % = c/d }% % < c \showcs % = c }% % < b \showcs % = b }% % < a % \def\showcsdefine#1{% % > A \begingroup \def\do##1{\catcode`##1=12 }% \dospecials \def\showcsdefine##1##2{% % > B \def\showcs@delimiter{##2}% \def\showcs@name{}% \def\showcsdefine####1####2{% % > C \if \showcs@delimiter ####2% \def\showcsdefine########1{% % > D (outdent) \edef\showcsdefine{% % > E \def\noexpand########1{% \noexpand\showcs\relax\showcs@name\relax }% }% % < E \expandafter \endgroup \showcsdefine % = E }% % < D (outdent) \else \edef\showcs@name{\showcs@name####2}% \fi \showcsdefine{####1}% % = C/D }% % < C \showcsdefine{##1}% % = C }% % < B \showcsdefine{#1}% % = B }% % < A }% % end of \@temptokena={ \expandafter \endgroup \the\@temptokena \endinput %=========================================================== ==== USAGE =========================================================== \showcs?STRING? ? : 任意の記号(ただし、STRING に含まれないこと) STRING : コントロール・シーケンス名(特殊文字を含んでも可) STRING という名前を持つコントロール・シーケンスの意味を 端末に表示する。 他のコマンドの引数中で使うことは出来ない。 (特殊文字を含まなければ大丈夫?) \showcsdefine\COMMAND?STRING? \COMMAND : 任意のコントロール・シーケンス ? : 任意の記号(ただし、STRING に含まれないこと) \COMMAND を、\showcs?STRING? の意味のマクロとして定義する。 \COMMAND は、他のコマンドの引数中でも使うことが出来る。 \COMMAND が定義済みであった場合、警告も表示せずに再定義してしまう。 ==== HISTORY ========================================================= 2002/04/23 initial version 2002/05/01 * \write\@M に代えて \message で出力するようにした。 * \write だと、\outer のマクロの定義を出力しようとしたときに エラーになる。 2002/05/07 * \message を \write\@M に戻した。 * \showcs をプロンプトから実行した場合にも *.tex 内で実行した 場合にも見やすい改行が行なわれるようにするには、\write を 使うのが適当である。 * \outer マクロの定義も出力できるようにした。 2002/10/01 * 出力の終端を表すのに半角句点を使っていたのをやめて、不等号「<」を 使うようにした。 * \showcs 実行時の \escapechar の値に拘わらず、コントロール・ シーケンスの出力にバックスラッシュが前置されるようにした。 * \escapechar=`\\ を追加した。 2002/11/26 * 使用法を変更した。コントロール・シーケンス名をブレースで 囲むのではなく、\verb コマンドのように、任意の記号で 挟むようにした。 * ほとんど一からの再作成となった。 * 多くの下請けマクロを定義してしまっている。下請けマクロを、 \showcs 自体の中で、\showcs というマクロ名で定義しながら 呼出すようにすれば、下請けマクロの数は減らせるが、 メンテナンスがしんどくなる。 2002/11/26 (2) * 下請けマクロを排除した。 * スクラッチ用途に \showcs@name と \showcs@delimiter を使っているが、 これらは他で定義されていても構わない。 * \showcs?showcs@name? なども期待どおり、他での定義を表示する。 * \showcs によって再定義されることもない。 2002/11/28 * \showcsdefine を定義した。 * BUGS を追加した。 2002/11/29 * 2002/11/28 に記述した BUGS の解決として、\showcs (e) の定義の 前に、対象になるコントロール・シーケンスがカテゴリー・コード 6 の 文字に \let されているかどうかを調べ、そうであれば \@temptokena に 格納し、\showcs (e) の定義を切替えるようにした。 * これで、カテゴリー・コード 6 の文字(macro parameter character)に \let されたコントロール・シーケンスの意味も 表示できるようになった。例えば、LaTeX 2.09 で \showcs\@?@?\ と入力しても、期待どおり動作するようになった。 * 解決方法としては、カテゴリー・コード 6 についての個別の 対応となってしまったが、これ以上すっきりとした(場合分けを 含まないような)方法は思いつかない。 * \@temptokena に格納する方法は、\outer マクロの場合には エラーになってしまう。 * BUGS の記述は削除した。 * 実行時の \escapechar の値に拘わらず、出力されるコントロール・ シーケンスには \ が前置されるようにした。 * 2002/10/01 に変更したものだが、2002/11/26 の変更時に 元に戻ってしまっていたもの。 ========================================================================
この書き込みへの返事: