名前: 北見 けん 日時: 2006-05-25 16:23:04 IPアドレス: 211.128.71.*
>>43046 > ただし、この場合、通常の文中で \ref を使った場合、例えば第 2 節の冒頭で > \begin{問}\label{A} > 問題の文章 > \end{問} > \begin{問} > 問\ref{A}と同じ条件で‥‥ > \end{問} > のようにしても、「問 2.1 と同じ条件で‥‥」というような出力になってしまい、 > 実際の参照先の問題番号は「問 1」としか出力されていないため、 > 読者はその問題を見つけることが出来ないので、注意が必要でしょう。 小柴さんの43022に > ..chapter,sectionカウンター出力をそのときの必要度に応じて出すには.. とあるように、そのときの必要度は著者が判断するのでしょうから、 「chapter.section.問」 → \chapsec問ref 「section.問」 → \sec問ref 「問」 → \問ref という具合に異なるマークアップで記述しておけば問題番号を合わせることは出来ますね。 もっとも、所望の参照方法では、目下の問がどのセクション・チャプターにあるのかを 柱を見るなり章扉へ戻るなりして常に意識する必要があるので、読者には酷ですね。 これは、実際にそのように番号付けられている教科書を使用している上での実感です。 トノさんのご指摘どおりに、参照番号はユニークなほうがよいと思います。 従って、実際には使用されないことを望みますが、 マクロの練習問題として作ってみましたので、下につけます。 \documentclass{jsbook} \newtheorem{問}{問}[section] \makeatletter %\begin{案A}\p@問 を使わず。 %\def\the問{\protect\@@問ref{\arabic{chapter}}{\arabic{section}}{\arabic{問}}} %\gdef\@問ref#1#2#3{#3} %\gdef\@sec問ref#1#2#3{#2.#3} %\gdef\@chapsec問ref#1#2#3{#1.#2.#3} %\global\let\@@問ref\@問ref %\def\問ref#1{{\let\@@問ref\@問ref\ref{#1}}} %\def\sec問ref#1{{\let\@@問ref\@sec問ref\ref{#1}}} %\def\chapsec問ref#1{{\let\@@問ref\@chapsec問ref\ref{#1}}} %\end{案A} %\begin{案B}\the問 をシンプルに。 %\def\the問{\arabic{問}} %\def\p@問{\protect\@@問ref{\arabic{chapter}}{\arabic{section}}} %\gdef\@問ref#1#2{} %\gdef\@sec問ref#1#2{#2.} %\gdef\@chapsec問ref#1#2{#1.#2.} %\global\let\@@問ref\@問ref %\def\問ref#1{{\let\@@問ref\@問ref\ref{#1}}} %\def\sec問ref#1{{\let\@@問ref\@sec問ref\ref{#1}}} %\def\chapsec問ref#1{{\let\@@問ref\@chapsec問ref\ref{#1}}} %\end{案B} %\begin{案C}% 論理フラグを利用 \def\the問{\arabic{問}} \def\p@問{\protect\@@問ref{\arabic{chapter}}{\arabic{section}}} \newif\if@chap問ref\@chap問reffalse \newif\if@sec問ref\@sec問reffalse \def\@@問ref#1#2{\if@chap問ref#1.\fi\if@sec問ref#2.\fi} \def\問ref#1{{\@chap問reffalse\@sec問reffalse\ref{#1}}} \def\sec問ref#1{{\@chap問reffalse\@sec問reftrue\ref{#1}}} \def\chapsec問ref#1{{\@chap問reftrue\@sec問reftrue\ref{#1}}} %\end{案C} \makeatother \begin{document} \chapter{はじめに} \section{この節} \begin{問} \label{A} a+b=c %問1と出したい、実際は1.1.1 \end{問} \section{あの節} \begin{問} \label{B} A+B=C %問1と出したい、実際は1.2.1 \end{問} \chapter{つぎに} \section{ここら辺の節} \begin{問} \label{C} qQ %問1と出したい、実際は2.1.1 \end{問} \chapter*{解答} \問ref{A} \\%ここは1.1と出したい、実際は1.1.1 \sec問ref{B} \\%ここは2.1と出したい、実際は1.2.1 \chapsec問ref{C} %ここは1.1と出したい、実際は2.1.1 \end{document} マクロを作っていて思ったことを少し。このマクロでは、 文書クラスで定まるはずの \thesection や \thechapter の情報を生かしていません。 これは、通常は \thesection の中に chapter番号まで入っているために 両方用いると chapter番号が重複してしまうし、\thesection を分解しようとすると chapter番号と section番号がピリオドで区切られているなどという一般的でない仮定が 必要になるためです。 \thesection を分解するようなことをして場所によって section番号だけに言及したり することができない(する必要が無い、しないほうが望ましい)わけです。 \thesection がもともとこのようになっているのも、 参照番号はユニークであるべきということの表れであるように思いました。
この書き込みへの返事: