マクロの定義を見る

マクロの定義を見る

- Ando Ryoya の投稿
返信数: 12
質問させていただきます.
これは自分がLaTeXを教えている知人に指摘されてハッとしたことなのですが,
「あるLaTeX2eに関する本に"\@は何もしない命令である"と書いてるあのを見て,ホントかなぁ,と\@がどのように展開させるのか知りたくなった」ときに,どのようにすれば確認することができますか?
これまで自身の体験として定義を確認したくなったのは\section などのクラスファイルで定義されているトークンのみで,このようなトークンはどこで定義されているのかもわからない状態です.
実際はLaTeX 原稿中でなにかしらのコマンドで表示可能であれば,いちいちソースを確認しなくても済むので楽なのですが…
ご指導よろしくお願いします.
Ando Ryoya への返信

Re: マクロの定義を見る

- 帯田 木偶太 の投稿

基本的には \show\SOMECS とすれば、\SOMECS の意味(マクロなら展開結果)が
表示されます。

ただし、LaTeX のコマンドにはこの方法では実質的な定義が表示されないものも
多くあります。そのようなケースへの対処を施した TeX コマンドを
自作したことがあります(最近とんと使っていませんが)。
私のプロフィールから、私のウェブページに飛んでいただき(近々移転する
つもりでいるので、この書き込みではアドレスの記載は控えさせて
下さい)、showcs.tex のページをご覧になって下さい。また、
これの元になったネタが、旧掲示板(TeX Q & A)の #31453 から始まるスレッドに
出ています(
http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/31001-31500.html)。

帯田 木偶太 への返信

Re: マクロの定義を見る

- 帯田 木偶太 の投稿
ちなみに \@は何もしない命令である と書いてあるような本が本当にあるのなら、その著者の著作は二度と 買わない方がいいでしょう。 ※ 大文字の直後のピリオド等の後ろに単語間スペースではなく、その記号 本来のスペース・ファクターに従ったスペース(ピリオドなら文間スペース)を 出力させるためのコマンドです。
帯田 木偶太 への返信

Re: マクロの定義を見る

- 帯田 木偶太 の投稿
またまたちなみになのですが、クラス・ファイル等で定義されていない
コマンドの定義は、多くは ltex.ltx にあります。その他のファイルも
無視できませんが、grep 等の文字列検索ツールには、特定の
ディレクトリー以下から再帰的に検索してくれるものもありますし、
テキスト・エディターにもそのような機能を持っているものは
少なくありません。
帯田 木偶太 への返信

Re: マクロの定義を見る

- 北見 けん の投稿
> 多くは ltex.ltx にあります

ここは latex.ltx のタイプミスですね。

# まあだいたいわかると思いますが、
# 知らない人は1文字違うだけでも見つけられないかもしれないので、
# 念のため。
帯田 木偶太 への返信

Re: マクロの定義を見る

- Ando Ryoya の投稿
丁寧にありがとうございます.解決しました.
また,showcs.texを拝見させていただきました.
マクロの部分字体は正しく閲覧できるのですが,当方の環境においてUTF-8でもShift_JISを用いても,日本語部分が文字化けしてしまっていることを報告させていただきます.
帯田 木偶太 への返信

非マクロ代入の内容を観る(was Re: マクロの定義を見る)

- 川本 琢二 の投稿
私も帯田 木偶太さんの showcs.tex を使わせて頂きました。
ありがとうございます。
そこで、疑問が生じてしまいました。
私の場合は、TeX の出力ルーチンの改造を考えていて、その定義を見ようと
思って、ここに辿り着きました。
私の場合は ¥output の定義を知りたかったので、

¥showcs:output:

としたのですが、期待する情報が得られませんでした。
TeXブックによると、¥output は非マクロ代入であって

¥output={¥shipout¥box255}

となっていて、マクロではないようです。
この後に

¥showcs:output:

を入れても同じ結果です。
どのようにすれば、代入内容を見ることができるのでしょうか?
ちなみに、¥show でも texdef プログラムでも期待した出力が得られませんでした。
よろしくお願いします。
川本 琢二 への返信

Re: 非マクロ代入の内容を観る(was Re: マクロの定義を見る)

- 北見 けん の投稿
\output はトークンリストレジスタなので、
値を見るには \showthe を使います。
\showthe\output

他にも、数値レジスタなどレジスタの値も同様です。

\showthe\baselineskip
\showthe\count0

など。

\the を使えば作成する文書中に印字できます。

\the\output % <- これは印字に適さない文字トークンが出てきてエラーになりそうですが。
\the\baselineskip

など。
北見 けん への返信

Re: 非マクロ代入の内容を観る(was Re: マクロの定義を見る)

- 川本 琢二 の投稿
北見 けん さん
早速のご回答ありがとうございます。
これは、レジスタでしたか。
非常に助かりました。
それでは、失礼いたします。

川本 琢二 への返信

Re: 非マクロ代入の内容を観る(was Re: マクロの定義を見る)

- 北見 けん の投稿
あ、ここはちょっと違っていましたね。

> \the を使えば作成する文書中に印字できます。
>
> \the\output % <- これは印字に適さない文字トークンが出てきてエラーになりそうですが。

印字するのではなく、レジスタの値をトークン列としてそのまま再処理するのでした。
数値レジスタなどの場合はレジスタの値を表す文字トークンが生成されて処理されるので
結果として印字されることになるわけですね。

訂正します。
川本 琢二 への返信

Re: 非マクロ代入の内容を観る(was Re: マクロの定義を見る)

- 帯田 木偶太 の投稿
拙作をご利用いただきありがとうございます。
        ※      公開はしたものの、自己満足でしかなかろうという認識でしたので
                とてもうれしく思っています。

質問事項については、すでに北見さんから解決策が出されているので、私からは
「言い訳」を一言。

\showcs は、コントロール・シーケンスの「値」ではなく「意味」を知るために
作成したもので、その表示内容は、基本的には、TeX 自体の機能である \meaning による
展開結果そのものです。対象とするコントロール・シーケンスの名称に
「やっかい」な文字が含まれて、\meaning や \show を直接には使えないという場合に備えて
ある種の前処理のようなことをするという以上の役割は、\showcs には期待できません。
\output のような、TeX のプリミティブに対して用いても、そのコントロール・
シーケンス名そのものが出力されるだけです。
        ※      逆に言うと、それがプリミティブであるということだけは
                判明します。

なお、プリミティブでないレジスター(に割り当てられたコントロール・シーケンス)に
ついては、例えば
        *\showcs:textwidth:
        \textwidth=\dimen80<
のようになりますので、それがレジスターであることと、レジスターの種別および番号は
わかりますが、そのレジスターが保持している値は得られません。
Ando Ryoya への返信

Re: マクロの定義を見る

- yudai-nkt の投稿
LaTeX 原稿中でなにかしらのコマンドで表示可能であれば

とのことなのでご所望のものではないかもしれませんが,TeX Live には texdef という Perl スクリプトが標準で同梱されています.これの -s オプションを用いれば,カーネルで定義されているのか標準文書クラスで定義されているのか等も含めて定義が分かります.


$ texdef -t latex -s section
% article.cls, line 302:
\newcommand\section{\@startsection {section}{1}{\z@}%
                                   {-3.5ex \@plus -1ex \@minus -.2ex}%
                                   {2.3ex \@plus.2ex}%
                                   {\normalfont\Large\bfseries}}
$ texdef -t latex -s \@
% latex.ltx, line 1578:
\def\@{\spacefactor\@m{}}%

詳細はリンク先や texdoc texdef でドキュメントを参照ください.