amsthmの定理番号のpresectionnameを取り除きたい

amsthmの定理番号のpresectionnameを取り除きたい

- Seki Motoki の投稿
返信数: 5
amsthmを用いた文章を作成しようとしています.
とりあえずコードを提示してしまいます.

---

\documentclass{jsarticle}

\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{thm}{定理}[section]

\renewcommand{\presectionname}{\S}
% \renewcommand{\thesection}{\arabic{section}}

\begin{document}
\section{ほげ}
\begin{thm}
あああ
\end{thm}
\end{document}

---

このコードをコンパイルすると,「§1 ほげ」「定理 §1.1. あああ」となるのですが,
これを「§1 ほげ」「定理 1.1. あああ」となるようにしたいです.
プリアンブルの最後のコメントを外すと今度は「1 ほげ」「定理 1.1. あああ」となってうまくいきません.
amsthmが\begin{thm}で呼び出している\thesectionをなんとかして
\arabic{section}にすればうまくいきそうなものですが,
やりかたがよく分かりませんでした.

よろしくお願いします.
Seki Motoki への返信

Re: amsthmの定理番号のpresectionnameを取り除きたい

- Shikano Keiichiro の投稿
たまたまamsthmのソースが手元に開いていたので、見てみました。jsarticleの\thesectionの定義で\presectionnameが埋め込まれてしまうこと、amsthmの実装では\thesectionが使われていることから、話はそれほど簡単ではなさそうで、amsthmの実装中の\@xthmというマクロの動作を変更する必要がありそうです。そのためのパッチコマンドはこんな感じになると思います。

\usepackage{regexpatch}
\makeatletter
\regexpatchcmd{\@xthm}
{\c{csname} the\cP\#3}
{\c{@arabic}\c{@xp}\c{@nx}\c{csname} c@\cP\#3}{}{}
\makeatother

これを、プリアンブルでamsthmをusepackageした後に挿入して試してみてください。

Shikano Keiichiro への返信

Re: amsthmの定理番号のpresectionnameを取り除きたい

- Seki Motoki の投稿
Shikano Keiichiroさん,回答ありがとうございました.
私のサンプルコードの該当部分に入力してもどうもうまくいかなかったのですが,
次のようなコードを書いてみたところ,うまく目的の出力が得られました.

--

\documentclass{jsarticle}

\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{thm}{定理}[section]

\makeatletter
\def\@seccntformat#1{% #1: <counter name>
\@nameuse{@seccnt@prefix@#1}%
\@nameuse{the#1}%
\@nameuse{@seccnt@postfix@#1}%
\@nameuse{@seccnt@afterskip@#1}}
\def\@seccnt@prefix@section{\S}
\makeatother

\begin{document}
\section{ほげ}
\begin{thm}
あああ
\end{thm}
\end{document}

--

amsthmの方ではなく,sectionのフォーマットを
\thesectionの前に\Sを挿入するようなものに変更しているようです.

ありがとうございました.
Seki Motoki への返信

Re: amsthmの定理番号のpresectionnameを取り除きたい

- Shikano Keiichiro の投稿
なるほど、\presectionnameは使わないというわけですね。(そのまま\subsectionなどを使うとエラーになりそうですが、吉永さんの記事にはそのケースも網羅されてました。)

ちなみにですが、\@seccntformatを再定義するアプローチでも、最初の提案で使ったregexpatchパッケージを使うとコンパクトに書けます。


最初の例が動かないようなので、お手元の環境にregexpatchパッケージが導入されていない可能性もありそうですが、参考まで。

Shikano Keiichiro への返信

Re: amsthmの定理番号のpresectionnameを取り除きたい

- Z. R. の投稿

自分の感覚としては、\@seccntformat マクロは、「機能の実装コードの一部」ではなくて「クラス実装者が自分で決めるマクロ」なので、パッチではなくて直接定義するのが素直である気がします。

\def\@seccntformat#1{\S\@nameuse{the#1}\quad}

(補足)

jsclassesのクラスの場合、付録の節の「付録」の出力に \presectionname を利用しているので、このままだと「§付録A」のようになります。

Z. R. への返信

Re: amsthmの定理番号のpresectionnameを取り除きたい

- Seki Motoki の投稿
お二方とも回答ありがとうございました.
補足の説明をしていただいて理解が少し深まりました.
これを機にもう少し詳しく学んでみたいと思います.