Re: 番号の参照

名前: .
日時: 2005-11-20 19:35:21
IPアドレス: 59.134.169.*

>>39374 この掲示板の 37451 での本田さんのお話で扱われている問題と, まったく同種の問題ですね. その問題への解決法を理解するためには,少なくとも, 『LaTeX2e マクロ&プログラミング 基礎解説』 (以下,『基礎解説』と略)の第 3 章の内容 あるいはそれと同レベル以上の “LaTeX のカウンタ”についての基礎事項 をふまえておく必要があります. とりあえず,問題点を挙げると, >\DeclareRobustCommand*\mrunumb[1]{\ifcase#1\or \mruichi \or \mruni \fi} という定義では \mrunumb の引数は整数であることを仮定しているにもかかわらず, # 引数 #1 を \ifcase にそのまま与えていることに注意してください. >\def\eqref#1{\,\mrunumb{\ref{#1}}} のように,\mrunumb の引数に整数とは限らないものを与えている, というところが問題です. # “MacOSX ではおきません”(“件の不都合が”起きない,ということで # よろしいですか?)とのことですが,それはむしろ,“MacOSX での LaTeX # システムとお使いの ceo パッケージなるものとの組み合わせにおいて # 何かがおかしい”ということでもあります. # 実際,aux ファイルが存在していない最初のコンパイル時,といった場合に # \ref での参照結果を取得することに失敗した場合には,提示して # いただいた定義での \mrunumb{\ref{...}} は *必ず* エラーとなる # はずですから. 解決のために必要な事実は次の点です. ・\ref{<label>}(<label> は文字列)で参照される情報は,\r@<label> で 与えられます. # \r@<label> が未定義である場合への対処も必要であることをお忘れなく. ・\ref{<label>} を直接用いたのでは,仮に <label> が参照可能であって, かつ,\ref{<label>} の出力結果が単なる数字列に見える場合であっても, \ref{<label>} 自身の展開結果は単なる数字列では *ありません*. # cf. latex.ltx (あるいは,『LaTeX2e マクロ&プログラミング 実践解説』 # p.169 のコラム) # 先に言及した 37451 のお話でも触れられています. ・前項により,\mrunumb の引数に \ref{<label>} を直接入れることはできないので, \r@<label> の構造に注意して,“参照される整数”の部分を直接利用する 必要があります. # ここでは,37451 の場合とは異なり,\theequation を再定義して # 済ますことができないので,参照する側に細工をします. # なお,\r@<label> は # {<\ref{<label>} で参照されるもの>}{<\pageref{<label>} で参照されるもの>} # に展開されるマクロである,ということをふまえておく必要があります. あとは,比較的単純な条件処理およびマクロの展開順序の問題なので, (必要があれば『基礎解説』の第 1 章で扱われている程度のマクロ作成の基礎を 学習した上で)ご自分でお考えになってください. ===== 以下は,24 時間考えてもおわかりにならなかった場合のための蛇足 結局, \DeclareRobustCommand*\eqref[1]{% \,% \expandafter\ifx\csname r@#1\endcsname\relax \ref{#1}% 相互参照の不整合に関する警告を出させるため,\ref を使用. \else \edef\@tempa{% \noexpand\mrunumb{% \expandafter\expandafter\expandafter \@firstoftwo\csname r@#1\endcsname}}% \@tempa \fi} 程度のことをすればよい,ということになります. # もっとも,数式番号と思しきものを参照している,という点を # 利用してもう少し手短に済ますことはできるでしょう. # なお,わざわざ ceo パッケージを入手・インストールしてまで # 動作確認するほどの興味はありませんので,“机上デバッグ”のみしか # 行っておりません(あしからず). # また,hyperref などの相互参照の内部処理を書き換えるような # パッケージとの併用は効きません.

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)