名前: . 日時: 2005-08-18 19:05:00 IPアドレス: 210.224.215.*
>>37519 # \ref(の内部で用いられる \@setref)の定義を # お読みになったことはありますか? \ref(あるいは \pageref)で参照しようとしているラベルが未定義なら, 単に“??”という文字列が出力され(もちろん,ほかの処理も行われますが), 数字列など現れません. 一方,\myalph の定義中の \ifcase #1 ... \fi の #1 のところ (\ifcase の直後)には整数が入らなければなりません. # 以上のことは,LaTeX におけるマクロ作成に関する然るべき解説書には # 載っています. 上記の 2 点を確認すれば,\myalph の引数に \ref{...} などというものを 直接書き込んでは不都合がある,ということはおわかりになることでしょう. 結局,\myalph の定義の方に(“引数は整数である,ということを 前提としている”という)問題があるわけです. とりあえず,次のようにいじることはできるでしょうけれども, \remove@to@nnil,\@onelevel@sanitize といった LaTeX でのマクロ作成に 関する“慣用句”に関しては然るべき解説書を参照して(あるいは latex.ltx に おけるそれらの定義を読んで)確認なさってください. # 結局,引数が数字列の類であるかどうかをチェックし,その結果に応じて # 分岐している,ということです.ただ,\myalph の引数に文字列“0”そのものを # 与えたときの挙動については,もう少し考えたほうがよいかもしれませんが. \documentclass{article} \makeatletter \def\myalph#1{% \begingroup \protected@edef\@tempa{#1}\@onelevel@sanitize\@tempa% \afterassignment\remove@to@nnil \count@0\@tempa\relax\@nnil %%% #1 が“数字以外で始まる文字列,または,整数 0 として読み取られる %%% ようなもの(の一部の場合)”に余計なもの(なくても構いません)が %%% ついている場合には \count@ は 0 になります. %%% #1 が正整数を 10 進表記した文字列の場合には,\count@ の値は #1 で %%% 与えた整数になります. \ifnum\count@=\z@ #1% \else \ifcase\count@ \or a\or b\or c\or ... z\fi \fi \endgroup} \makeatother \begin{document} \section{sample}\label{first} zzz \section{sample}\label{second} zzz \myalph{\ref{first}} and \myalph{\ref{second}} \end{document}
この書き込みへの返事: