中央分水嶺によって、太平洋と日本海に流れる水は分かれるのだけど、その分水嶺付近に川や湖があれば、その川や湖は両方に流れているはずだ。登山をしなくても、巡れるような川や湖を調べてみた。
(1)分水嶺に川があると、その水は両方に流れる。
- ひるがの分水嶺公園、御手洗川
- 善知鳥山川
- 加古川水系黒井川
(2)人口的に疎水や用水が作られ、つながる場合もある
- 猪苗代湖
- 猪苗代湖の水は、もともとは日本海に流れるのだが、安積疎水によって、太平洋にも流れる
- 安積疎水
Navigator to Game Theory
中央分水嶺によって、太平洋と日本海に流れる水は分かれるのだけど、その分水嶺付近に川や湖があれば、その川や湖は両方に流れているはずだ。登山をしなくても、巡れるような川や湖を調べてみた。
(comp_nash1.html, input_bimatrix.py, comp_nash1.py)
前の記事「さくらのレンタルサーバーにPython3とNumpyをインストールする」で、見事にPython3とNumpyのインストールに成功したと思った自分だったが、pythonで書かれたcgiプログラムを動かすと、再びnumpyがimportできず「ctypeがない問題」が発生した。試行錯誤の結果、numpyのバージョンを更に下げて、動かすことに成功した。
ITやや素人の私が、ナッシュ均衡を計算するwebアプリを作るための記録。前回は「さくらのレンタルサーバーにPython3とNumpyをインストールする」で、苦労の末、遂にPython3とNumpyのインストールに成功した…と思ったのだが…。
webアプリを作るためにいろいろ試行錯誤。これについては、また改めて記事にしようと思う。とりあえず、現時点の目標「htmlからフォームでデータを送り、python3で(numpyをインポートして書かれた)cgiプログラムを動かして出力する」こと。
まず自分のPCのwindows上でやってみて、うまく行った。そこで次に、さくらのレンタルサーバー上で、動かすことに挑戦。ところがうまく動かない。Internal Server Errorになるのである。
そこでまず、以下の簡単なプログラムをファイル名 investigation2.cgi として作った。
#!$HOME/local/python/bin/python3
import cgi
import cgitb
import numpy as np
cgitb.enable()
print("Content-type: text/html <br>")
print()
print("Hello World!<br>")
print(np.zeros(5))
($HOMEは実際には正しいパス名が入る)。windowsではうまく動いたし、シェルから動かすと、以下のようにちゃんと動く
% python3 investigation2.cgi
Content-type: text/html <br>
Hello World!<br>
[0. 0. 0. 0. 0.]
そこでブラウザから http://正しいURL/investigation2.cgiとしても、うまく行かない。パーミションはきちんとしているし、だいいちここから、import numpy as npと print(np.zeros(6)) を削除し http://正しいURL/investigation2.cgiとすると
とちゃんと出てくるじゃないか。どう見ても import numpy as np が悪さをしている。しかしcgiでエラーが出るとエラーをブラウザに吐いてくれるcgitbというモジュールも、エラーを吐いてくれない。これはどうしたことだろうか?
いろいろネットでべると「import numpy を直接ではなく、関数に入れるとできる」のようなっ記事を目にしたので(ごめんなさい、どの記事か忘れてしまいました)、以下のように変更してみた。essential_mainという関数を定義し、そこでnumpyをインポートする、というものだ。
#!/home/nabepremium/local/python/bin/python3
import cgi
import cgitb
def essential_main():
import numpy as np
print("in the main function")
print(np.zeros(5))
cgitb.enable()
print("Content-type: text/html <br>")
print()
print("Hello World!<br>")
essential_main()
うーん、これでもダメだった。しかし、これだと Internal Server Errorにならず、アクセスはできていた、しかも幸いなことに、cgitbがエラーをブラウザに吐き出してくれたのである。エラーの内容は多いので、ここには記さないが、エラーを読むと
numpyのモジュールは探し出せているが、numpyをインポートするときにnumpy自身がいろんなライブラリを呼び出していて、その際に
import _ctypes_ctypes undefined
とか
ImportError: Shared object “libffi.so.6” not found, required by “_ctypes.cpython-38.so”
とかいうエラーが出ているようだ。…ん?ctypeがないって…
まだゾンビのように生き残っていたのか!ctypes問題!(詳しくは 「さくらのレンタルサーバーにPython3とNumpyをインストールする」 を参照せよ)
Shared object “libffi.so.6” not found, required by “_ctypes.cpython-38.so とあるが、この libffi.so.6 というファイルは、前回のlibffiをインストールしたときに入っている。なので、これを見つけることができないということは、環境変数かパスを通してやれば、いいんじゃないか?と考えたのだが、ここからはpythonやnumpyに通じてない、やや素人の私には無理な話。とりあえずpathとか、いろいろな環境変数にlibffi.so.6があるパスを入れたりしたのだがダメである。
自分がターミナルから動かしたときには動くのに、cgiからは動かない、というのはlibffi.so.6のある位置が、外部のnobodyだったかotherがcgiを動かすときに、これが見えなくなっていることだから、 プログラムの内部にこれを教えてやればいいんじゃないか?と推測する。でもも、ここからはpythonやnumpyに通じてない、やや素人の私にはやっぱり無理な話。
また調べてみると、プログラムがモジュールを検索するときはsys.pathというものを使うということで、プログラム内でsys.path.insertというコマンドによって、モジュールを検索する場所を教えることができるようだ。そこでこのコマンドでいろいろパスを追加するもやっぱりダメ。
そもそもnumpyというモジュールの位置は探し出していて、それをインポートするときに、numpyが呼び出すライブラリのようなものが見つからないって言っているので、上記のやり方は違う気がする。
エラーは「_ctypes.cpython-38.soによって要求されるlibffi.so.6がない」と言っている。だからpythonに教えると言うよりは、この_ctypes.cpython-38.soにlibffi.so.6の位置を教えてやらないとダメだということだろう。しかし、どうやって教えればいいのかが分からない。_ctypes.cpython-38.soは$HOME/local/python/lib/python3.8/lib-dynloadにあるので、ここに libffi.so.6 をコピーしてみたのだが、やはり動かないようだ。やや素人の私には限界である。
_ctypes.cpython-38.soやlibffi.so.6はバイナリファイルだ。いろんな記事を読み、前回の記事で見たpyproject.toml-based projectの話も考慮して、素人の私の勝手な推測は、以下のようなことだ。
Numpyの最新のバージョンは1.21.5だが、先のインストール時に1.18.4に下げている(「さくらのレンタルサーバーにPython3とNumpyをインストールする」 を参照)。どこまで下げればいいんだろう?じゃあ、思いっきり下げてバージョン1.8.1くらいにしてみよう!
ということで、一応、Pythonを再インストールしてきれいにし、
%pip3 install numpy==1.8.1
としてみた。すると
Using legacy ‘setup.py install’ for numpy, since package ‘wheel’ is not installed.
として、かなり時間がかかっている。うーん、よくわからないが「(現在はwheelという完成品のパッケージを使うんだけど)、それがないから古いやりかた(古い遺産:legacy)である setup.py によってインストールしている」と言ってるのだろう、とやや素人の私は解釈。 かなり時間がかかって、エラーが出てないのはいい兆候だ、と思い、しばらく待つも、最後には大量のエラーが吐き出され失敗。
古すぎたのだろうか。それじゃあということで、適当にバージョン 1.14.6で挑戦してみた。すると、さっきと同じで
Using legacy ‘setup.py install’ for numpy, since package ‘wheel’ is not installed.
して、かなり時間がかかっている。
「こんな当てずっぽうなやり方じゃダメだな、これで同じエラーが出たら推測もだめだってことで、もう諦めよう」と思うが、とりあえず最後と思ってずっと待つ。「もうダメだ」と思った瞬間、なんとインストールに成功したじゃないか!
びっくりした。エラーが出るかと思ったが。
次に、先の http://正しいURL/investigation2.cgi にアクセスしてみると、ちゃんと動く。
さらに、import numpyを関数内の呼び出しからメインプログラムへ移したのだが、やはりちゃんと動いている。かくしてCGIでも正しく動作したのであった。
推測は正しくないかも知れないがまとめると、Python3.8.12とNumpy 1.14.6 の組み合わせで、cgiプログラムも正しく動作したのであった。
やっとここまで来た。しかし、まだwebアプリへの道のりは続くのであった。
「さくらのレンタルサーバー」にPython3とNumpyを、やや素人の私がroot権限なしのレンタルサーバーにPython3とNumpyをインストールし、ホームページにナッシュ均衡を計算するwebアプリを作るまでの記録。「ctyesがない問題」と「Numpyのダウングレード」が鍵
ナッシュ均衡を計算するwebアプリを作るための記録。今回は、20年近く使ってきた(このサイト)「さくらのレンタルサーバー」に、<ややIT素人>の私がPythonとNumpyをインストールする話。
コンピュータやネットワークの問題を解決するのに、ネットでいろいろ検索して解決する人が多いと思うが(自分はそう)、重要なことは「問題を解決するためのやり方は、日々、変わっていて、その記事がいつ書かれたのかに注意し、古い記事ではなく新しい記事を参照すること」だ。古い記事を参考にして、ハマってしまうことも多い。今回もそれを痛感した。だいたいの場合、世の中は便利になっていて、時間が経つに連れ「インストールのやり方は簡単になっている」ことが多い。本記事は2021年12月26日のものだ。読んでいる人は、他に新しい記事がないかを、まず検討して欲しい。
さくらインターネットにもPython3の導入予定はないか問い合わせてみたところ「Python3の需要は近年高まっている事は弊社にても感じており、今回もお客様の声を頂いたという事を社内で共有させて頂き、今後のサーバアップデートの検討項目とさせて頂きたく存じます」との回答。もう皆さんがこの記事を読むころにはPython3は、さくらにはインストール済も知れない。
さくらのレンタルサーバーは、ユーザーはroot権限がないので、PythonやNumpyの導入に関する多くのネット記事は参考にならない。sudoなどのコマンドは使えない。いろいろなネット情報を試したが、現時点では、以下の記事が一番良かった。
さくらのレンタルサーバに Python3 をインストールする方法
結果的には、この通りにやったらできた。
コマンドをまとめると以下のようになる。
%mkdir -p ~/work/python3
%cd ~/work/python3
%wget --no-check-certificate https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz
%tar zxf Python-3.8.12.tgz
%cd ./Python-3.8.12
%./configure --prefix=$HOME/local/python/
% make
% make install
以上だが、間違っているかもしれないので、ぜひ元の記事のさくらのレンタルサーバに Python3 をインストールする方法 を読み、確認しながら進めて欲しい。非常にわかりやすい記事だ。
次にNumpyのインストールだが、これはとても大変だった。さくらのレンタルサーバーにPython3を導入する記事も少ないが、Numpyを導入して成功したという記事は、さらにぐっと少なくなる。私が見たのは、以下の2つ。
しかし、結果的には、この記事ではうまく行かなかった。
まず最初に
%pip3 list
で、インストールされている外部モジュールを確認しておくと、
となる。最初はpipとsetuptoolsしかインストールされていないことが分かる。そして「pipのバージョンが古いから」と警告が出るので
%pip3 install --upgrade pip
として、pipのバージョンをアップグレードしておく。さて、ここで
%pip3 install numpy
とすれば、うまくインストールできるはずだが、真っ赤なエラー文がいっぱいいっぱいいっぱい出てきて失敗する。この赤い警告文にビビり、最初はいろんなことを試し、ハマってしまった。
落ち着いて、たくさんのエラーの最後の方を見ると
とある。「_ctypesというモジュールがない!」と言っている。これが「ctypesモジュールがない問題」である。
これに対しては
【Python3】_ctypes と libffi のインストールに苦しんだ記録
というありがたい記事を発見した。詳しくは、この記事を読んでほしいが、まず最初のSTEPとしては、libffiというライブラリをインストールすることだ。このために参考にするのは、上の記事から引用されている
である。なんと先ほど参考にした「 さくらのレンタルサーバに Python3 をインストールする方法 」のnotemite.comさんの記事なんですね!ありがたや、ありがたや。
上記の記事を参照してほしいのだが、(間違っているかも知れないが)内容をまとめると、以下の通りになる。まず、以下のコマンドで 、libffiというライブラリをインストールする。、
%mkdir -p ~/work/libffi
%cd ~/work/libffi
%wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
%tar xvfz libffi-3.2.1.tar.gz
%cd libffi-3.2.1
%./configure --prefix=$HOME/local/libffi/3_2_1
% make
% make install
次に、以下のコマンドで、シンボリックリンクを貼る。
%mkdir -p ~/local/include
%ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffi.h $HOME/local/include/
%ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffitarget.h $HOME/local/include/
%mkdir -p ~/local/lib
%ln -s $HOME/local/libffi/3_2_1/lib/libffi.a $HOME/local/lib/
%ln -s $HOME/local/libffi/3_2_1/lib/libffi.la $HOME/local/lib/
%ln -s $HOME/local/libffi/3_2_1/lib/libffi.so $HOME/local/lib/
%ln -s $HOME/local/libffi/3_2_1/lib/libffi.so.6 $HOME/local/lib/
%mkdir -p ~/local/lib/pkgconfig/
%ln -s $HOME/local/libffi/3_2_1/lib/pkgconfig/libffi.pc $HOME/local/lib/pkgconfig
そして環境変数の設定をする。.cshrc の末尾に下記を追記し、
setenv LD_LIBRARY_PATH $HOME/local/lib
setenv PKG_CONFIG_PATH $HOME/local/lib/pkgconfig
.cshrc で追記した内容を反映させる。
% source ~/.cshrc
% rehash
notemite.comさんの丁寧な解説で、素人の私でも理解できた。
再び「 【Python3】_ctypes と libffi のインストールに苦しんだ記録 」の記事に戻り、ctypesのインストールに移る。ここで./configure 文を以下のように修正したうえで、pythonを再インストールする。(自分は~/work/pythonの中にPython-3.8.12をダウンロードし、解凍しインストールしたので以下のようになっているが、フォルダ、Pythonのバージョンは、各自で)
%cd ~/work/python/Python-3.8.12
%./configure --prefix=$HOME/local/python/ --with-system-ffi LDFLAGS="-L $HOME/local/lib/" CPPFLAGS="-I $HOME/local/include/"
%make
%make install
とし、さらにpipのバージョンをアップグレードしておく。
ここで再チャレンジで、pipでnumpyをインストールしようと
%pip3 install numpy
とする。ここで赤字のエラーが出るが「_ctypesがない」というエラーから、以下のようなエラーに変わっているならば、あと一歩のところまで来ているので、以下は飛ばして後述の「NumpyとPython3のバージョン問題」に進めば良い。
しかし、ここでまだ「_ctypesがない」というエラーが出ることもある。このエラーが出るときは、makeするときに
のようなエラーが観察されるようだ。この記事を書くために、何度か手順を変えてインストールを繰り返し、根本的な原因を考えてみた。しかし、すると、このエラーが出るときと出ないときがあったり、いつの間にか解消してしまって、再現できなくなることがある。
はっきり分かっていないが、これはPythonのバージョンの問題のようだ。記憶では、最初にPython3.9.2でやってみたところ、ここでも 「_ctypesがない」 エラーが出て問題は解消しなかった。そこでPython3.8.12でやると、このエラーは出なくなった。たぶん、上記のライブラリlibffi-3.2.1とPythonのバージョンの依存問題があるのだろう。
ややこしいのは、解消後に再びバージョンを上げたりすると、ctype問題が解消していることがあるということだ。これは/$HOME/localのファイルを削除せずにpython3のインストールとアンインストールを繰り返すと、新しいバージョンのPython3が古いバージョンのライブラリを参照することがあり、それで見かけ上、解決しているのではないだろうか。そして、これは、後述の「pip3ではモジュールはインストールされているが、python3内ではインストールされてない問題」が起きる原因になる。Pythonを再インストールするときは、Pythonだけではなく、これはローカルフォルダ$HOME/localにあるライブラリも削除し、きれいにしておかないとダメだ。この点はrootではなくユーザーでやっているので、あまり心配なく削除できる。
あともう1つ考えられることは環境変数の問題である。記事によっては、環境変数を、以下に設定しろというものがある。
setenv PYTHON $HOME/local
setenv PYTHONPATH $HOME/local/lib/python3.8/site-packages
setenv C_INCLUDE_PATH $HOME/local/include
setenv CPLUSE_INCLUDE_PATH $HOME/local/include
setenv LIBRARY_PATH $HOME/local/lib
いろいろやってみると、上記の環境変数は影響してないように思える。しかし少なくとも、上記の環境変数を追加してからmakeしてみるのは損はない。追加するためには既にやったように、.cshrcの末尾にこれを付け加えて、source ~/.cshrcとrehashで追記した内容を反映させる。
さて、ctypesがない問題が解決して、あと一歩まで来ている。ここでエラーをよく見ると、
ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects
とある。pyproject.toml-based projectのinstallが必要と言っている。これをインストールすれば良いのだろうか。そこでこのtomlプロジェクトを調べてみると、これは最近のモジュールの新しいインストール方法らしい。昔は、pythonはsetup.pyというものでインストールしていたが、最近はpyproject.tomlというものでインストールを行うようだ。
参考:え、まだsetup.py使ってるの? pyproject.tomlとsetup.cfgで宣言的パッケージング
正しいのは、この pyproject.toml が使えるようにすることかもしれないが、結構、大変そうだ。しろうとの私が推測したのは「pip3で最新のnumpy(このときはnumpy-1.21.5)をインストールすると この pyproject.toml を使うのでうまく行かないのだから、 numpy のバージョンを下げてみれば解決するだろう」というものだ。そこで
% pip3 install numpy==1.18.4
と低いバージョンを適当に選びインストールしてみた。すると、
となった。なんと、インストールはうまく行ったのである!確認のためpip3 listと打ってみると
となって、無事numpyがインストールされていることが分かる。
結局、PythonとNumpyのバージョンに注意し、必要に応じてバージョンを下げるということが1つの手段なんだろう。 これに加えて「ctypesがない問題」においては、ライブラリlibffiのバージョンも関連している気がする。できるだけ新しいバージョンを使うことがいいのだろうが、どんな組み合わせが最新になるのかは試行錯誤だし、そんなにたくさんはできない。今回のことをまとめると
の組み合わせはうまく行ったということだ。
さて、ここで安心してはいけない。最後にpython3に入り、
>>import numpy as numpy
と入力してみる。pip3でもnumpyがインストールされていることが確認できているので、あっさりimportされるはず...。
ここまでまっすぐに来た方は、エラーが出ずにインポートされてくれるはずだ。その人は以下の「pipの認識とpythonのバージョンがずれる問題」を見る必要はなく、最後の「まとめ?まだまだ苦難は続いた」へ。
ところが、ここまで曲がりくねって、いろいろなバージョンのpython3をインストールとアンインストールした自分には、もう一つ山が待っていた。
python3のコマンドラインに入り、import numpy as npと打つと「そんなmoduleはない」と叱られてしまったのだ。
これはPCに複数のpythonのバージョンがインストールされた際に、pipとpythonのバージョンがずれてしまう問題である。これについては以下の記事を参照にして欲しい。
Pythonのpipコマンドでうまくパッケージがインストールできない場合がある理由と対処法
自分の場合は、確認するために
%pip3 install numpy
と入力すると、
Requirement already satisfied: numpy in $HOME/local/python/lib/python3.8/site-packages
のようにpipが認識するインストール先が出てきた。次にpython3に入って
>>> import sys
>>> print(sys.path)
として、モジュールの入力先を見てみる。すると、
'$HOME/local/python/lib/python39.zip',$HOME/local/python/lib/python3.9','$HOME/local/python/lib/python3.9/lib-dynload',
$HOME/local/python/lib/python3.9/site-packages'
のようになった($HOMEは実際はパス名)。pythonのバージョンを調べてみると
% python3 --version
Python 3.9.2
tとなる。つまり、python3のバージョンは3.9.2であり、python3も、モジュールのインストール先を $HOME/local/python/lib/python3.9 と認識しているのに対し、pipはインストール先をpython3.8にしていたのである。
曲がりくねって、いろいろなバージョンのpython3をインストールとアンインストールすると、この問題が起きる。これを解決するには、local以下のファイルをすべて削除して、pythonをきれいに再インストールすることであった。
以上で、python3とnumpyのインストールは完了したと思えたが…。
長い道のりだったが、さくらのレンタルサーバーへのpython3とnumpyのインストールは成功した。python3のコマンドラインに入り、
>>> import numpy as np
と打つと今度はエラーは出ず、print(np.zeros(6))と打ってみると
>>> print(np.zeros(6))
[0. 0. 0. 0. 0. 0.]
とちゃんと動いている(なんちゅうテストだ)。そしてシェルに戻り、numpyで書かれたプログラムのファイルnumpy_test1.pyを実行しても
% python3 numpy_test1.py
[array([2, 5, 8]), array([3, 6, 9])]
方法1
[[2, 8], [3, 9]]
方法2
[[2, 8], [3, 9]]
とちゃんと動く(どんなテストプログラムかは内緒...)。
やったやった!これで万事、うまく行った!次のステップに入ろう!と喜んだのだが...。実はあの「_ctpesがない問題」は、ゾンビのように生き残っていたのである。
詳しくは
numpyを使ったcgiを、さくらのレンタルサーバーで動かす
に記したが、結論を言うとcgiプログラムにnumpyをインポートして使うためには、numpyのバージョンを(1.18.4からさらに)1.14.6まで下げなければならなかったのである。
私たち経済学者が研究の中に有用となりうる証拠を見つけると喜ぶのは、世界が数えきれないほどの問題に直面しているにもかかわらず、自分たちは意味のない研究に人生を費やしているという罪悪感に苛まれているからです。ルービンシュタイン(著)、松井彰彦(監訳)、ゲーム理論の力、東洋経済新報社
※本をTeXで書いている。各章に例題1.1、例題1.2…などの章番号をつけ、例題を挿入したい。
※例題の中に\toiと打つと、自動的に問1、問2などの番号が振られるようにしたい。
※例題の途中で \kai と打ったところで [解] という太字が挿入されて、そこから回答を書きたい。解答も終わったら (問題1.1終) と入れたい。
※labelをつけておき、あとで参照したい。
※なので、与えられたnewtheoremを使えないので、自分で環境を作る。
%%%%例題の環境の設定
\newcounter{questioncounter}[chapter] %例題のカウンター:親カウンターがchapter
\newcounter{toicounter}%問のカウンター
\renewcommand{\thequestioncounter}{\arabic{chapter}.\arabic{questioncounter}}
%ここがポイント。questioncounterの表示を、章番号も含めるように再定義
%再定義しないと、questioncounterの部分だけ参照してしまう
\newenvironment{question}[1]{ %例題の環境定義
\refstepcounter{questioncounter} %例題のカウンターを1つ進める
\setcounter{toicounter}{0} %問のカウンターは、0にリセット
\par\vspace{2mm}\noindent\textbf{例題\thequestioncounter}.
\label{#1} %ラベルをコマンドの引数としてつける。
}
{(例題\thequestioncounter 終)\vspace{2mm}}
%%%%問の設定
\newcommand{\toi}{
\refstepcounter{toicounter} \textbf{問\thetoicounter :}
}
%%%%解の定義
\newcommand{\kai}{%
\vspace{1mm}\par\textbf{[解]:}
\setcounter{toicounter}{0}
}
\begin{document}
\chapter{これは}
これは練習です。
\begin{question}{q:nash}
\toi ナッシュ均衡を求めよ。
\toi 部分ゲーム完全均衡を求めよ。
\kai
\toi ナッシュ均衡はこう。
\toi 部分ゲーム完全均衡はこう。
\end{question}
それでは、例題\ref{q:nash}をよく勉強しておきなさいよ。
\end{document}
tcolorboxパッケージを組み込み、かっこいい枠線を使おうとするとおかしな動作が!
colorパッケージ、colortblパッケージとコンフリクトするようだ。colorパッケージを外さないとダメ。
書斎にあるPCのwindows10上のkindle for PCで一部の書籍がダウンロードできずに困っていました。amazonのヘルプでも全然ダメです。調べて見ると、
ツール>オプション>コンテンツ
の「My Kindle Contents」のフォルダを、/OneDrive/Documents から移動させたら、解決しました。(自分はDドライブに、Kindle Contentsというフォルダを作ってそこを指定しました)。
保存する場所がクラウドだとダメそうなのは、まあ考えてみればそうですけど、デフォルトでそこが指定されているので(どこに保存されているか考えたことなかった)、amazonには何とかしてほしいです。
以下のページを参考にしました。ありがとうございました。
Kindle for PCで洋書がダウンロードできない問題に当たった時のTodo
レポート課題をTeXで作成するにあたり、レポート番号を自作カウンターで振っていた。各レポートの最初に出力される定形文で、カウンターが1つずつ更新される仕組みにしていた。
%宿題の定型文
\newcommand{\teikei}{
\addtocounter{reportnumber}{1}
\setcounter{problemcounter}{0}
\clearpage
\textbf{\LARGE レポート課題\arabic{reportnumber} }
\par\vspace{3mm}
\begin{shadebox}
\begin{itemize}
\item 提出課題を解きkibacoに答を入力して下さい。
\item 自習課題は提出する必要はありません。理解を深めるために自習しましょう。
\end{itemize}
\end{shadebox}
}
図表の番号は、各レポートごとに分けて出力したい。そこで
http://rexpit.blog29.fc2.com/blog-entry-99.html
などを参照して
\makeatletter
\renewcommand{\thefigure}{% 図番号の付け方
\thereportnumber.\arabic{figure}}
\@addtoreset{figure}{reportnumber}
\renewcommand{\thetable}{% 表番号の付け方
\thereportnumber.\arabic{table}}
\@addtoreset{table}{reportnumber}
\makeatother
としてみた。
ところが、これでは各レポートごとに図表番号が初期化されない。レポート1で図1.1、図1.2と出力されたあと、レポート2では図2.1と出力して欲しいのに、図2.3になってしまう。
上記の参照記事だと、カウンターはデフォルトでリセットされるはずなんだけど…
問題は
\addtocounter{reportnumber}{1}
にあった。カウンターを1つずつ進めるには
\stepcounter{reportnumber}
を使う。そうすると@addtoresetというコマンドによって、カウンター
reportnumber がstepcounterによって増えるたびにリセットされるようだ。
\@addtoreset{カウンタ}{親カウンタ}:親カウンタが増えると(子)カウンタがリセットされる。
なるほど、親カウンターと子カウンターという概念があるんだ。知らなかった。
あれ?そうすると、待てよ。problemcounterというカウンター(問題番号をカウントする)を作っているんだが...レポート番号をリセットするためにヘッダーに
カウンターの定義
\newcounter{problemcounter}
各問題ごとにカウンターを進めるとき
\addtocounter{reportnumber}{1} %これまで
\setcounter{problemcounter}{0} %ヘッダーでカウンターをリセット
としてきた。こちらも親カウンターをreportnumberと考えて
カウンターの定義
\newcounter{problemcounter}[reportnumber]
\stepcounter{reportnumber}
とすれば良くて、\setcounter{problemcounter}{0} はいらないのではないかな?
やってみるとうまく行って、その通りだった。なるほど!!
次の問題:
\label{…}、\ref{…}で親カウンターを含めて参照するにはどうしたらいいんだ??