
内部カウンタに従うのではなく、手動で番号付けできる定理環境を定義したい。調べてみると、これ回答。そこでは解決策として次のコードが提案されています。
\newtheorem{innercustomthm}{Theorem}
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
コードは期待どおりに動作しますが、少し調整したい場合(およびドキュメントに何を入れているかを知りたい場合)に備えて、コード内のすべての内容を理解しようとしましたが、少し行き詰まってしまいました。
まず、\newenvironment の構造は次のようになります。
\newenvironment{<env-name>}[<n-args>][<default>]{<begin-code>}{<end-code>}
3 番目の引数は空のままにしておくのは理解しています。問題ありません。次に、\renew コマンドが続きます。これは次の構造を持ちます。
\renewcommand{<cmd>}[<n-args>][<default>]{<text>}
ここでは中括弧が使用されていないため、何が起こっているのか理解できません。コマンドで中括弧を省略できるのではないかと考えましたが、これに関する情報は見つかりませんでした。その後、コマンド \theinnercustomthm、\innercustomthm、および \endinnercustomthm がこの特定のソリューション用にカスタム メイドされているように見えるため、さらに混乱しますが、これらがどのように機能するのかわかりません。
たとえば、環境の名前を変更すると (customthm ではなく mytheo など)、コードが壊れることに気づきました。
何が起こっているのか説明していただける方、または何が起こっているのか理解できるマニュアルやウェブページを教えていただける方は、大変ありがたく思います。
答え1
まず注目すべきは
\newtheorem{innercustomthm}{Theorem}
内部的には似たようなことをする
\newenvironment{innercustomthm}[1][]{<begin>}{<end>}
ここで、<begin>
および<end>
コードはここでは問題になりません。環境はオプションの引数 (定理の注釈または帰属) を探すことに注意してください。また、環境と同じ名前のカウンターも設定します。
選択された名前は意図的に長くて魅力のないものです。このような名前が既存または想像上の環境と競合する可能性はほとんどありません。
私たちが考えているアプリケーションでは、実際に必要なのはカウンタではなく、 の呼び出しによってinnercustomthm
カウンタがステップされ、次のコマンドがカウンタの値を使用するために必要なものが設定されるという\label
事実です。ただし、LaTeX は値自体を参照せず、 の現在の意味 (\the<counter>
この場合は )を使用します\theinnercustomthm
。 の意味は、\theinnercustomthm
環境に番号を付ける場合にも使用されます。
私たちのアイデアは、定理に手動で番号を付けることです。定理を別の出版物と同じ番号で引用する必要があるため、自動番号付けは問題外です。そこで、innercustomthm
ステートメントに付けたい番号を引数として受け取るラッパーを作成します。
したがって、アイデアは、(ローカルに)再定義して\theinnercustomthm
ステートメントをタイプセットする「内部」環境を呼び出すために使用される引数を取る環境を開始することです。
の定義customthm
は
\newenvironment{customthm}[1]
{\renewcommand{\theinnercustomthm}{#1}\begin{innercustomthm}}
{\end{innercustomthm}}
しかし、これには小さな欠点があります。 を忘れると、ではなく「 がありません」\end{customthm}
というエラーが発生します。そのため、\end
innercustomthm
customthm
マッチョなプログラマーこの場合は、内部環境用のルーチンの内部バージョンを使用します。記録は既に実行されており\begin
、繰り返す必要はありません。したがって、\end
\begin{customthm}
\newenvironment{customthm}[1]
{\renewcommand{\theinnercustomthm}{#1}\innercustomthm}
{\endinnercustomthm}
まあ、あなたが引用した実際のコードは
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
なぜ歯列矯正器具がないのか?もう一つの(悪い)習慣マッチョなプログラマーこれらの歯列矯正器具は不要であり、いずれにせよ取り外されるものであることを知っている人たち。
疑問がある場合は、それらを使用してください。
答え2
まず、\newvironment{myenv}{..start code...}{...end code...}
実際に何が行われているのかを尋ねる必要があります。少し単純化すると、 が と の\newenvironment
2 つのコマンドを定義し\myenv
、が に展開され\endmyenv
、がに展開されます。 と記述すると、LaTeX はこの環境を と (ほぼ) 同等のコードに置き換えます。(舞台裏ではもう少し処理が行われます。)\myenv
...start code...
\endmyenv
...end code...
\begin{myenv}...\end{myenv}
{\myenv ... \endmyend}
次に、 行は、環境をカウンターを使用する「定理」環境として\newtheorem{innercustomthm}{Theorem}
定義します。特に、この環境の「定理番号」は を使用して印刷されます。innercustomthm
innercustomthm
\theinnercustomthm
ここで考えてみましょう:
\newenvironment{customthm}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
これはcustomthm
、1 つの引数を取る環境を定義します#1
。上記の最初の段落により、次\begin{customthm}[X]...\end{customthm}
のように展開されます。
{\renewcommand\theinnercustomthm{X}\innercustomthm ... \endinnercustomthm}
つまり、 は\theinnercustomthm
と等しくなるように再定義され、X
その後innercustomthm
環境が適用されます。したがって、環境は、 が と等しく最初に設定される点を除いて、customthm
環境と本質的に同じです。ここで、 は環境への引数です。したがって、最終的な効果は、この環境が「定理 X」を印刷することです...innercustomthm
\theinnercustomthm
X
X
customthm
最後に、あなたは言いました環境名を変更すると(mytheo
の代わりになどcustomthm
)、コードが壊れる私が言ったことが正しければ、これは真実ではありません! 実際、次のコードが示すように、環境の名前を変更してもコードはまったく同じように動作します。
\documentclass{article}
\newtheorem{innercustomthm}{Theorem}
\newenvironment{mytheo}[1]
{\renewcommand\theinnercustomthm{#1}\innercustomthm}
{\endinnercustomthm}
\begin{document}
\begin{innercustomthm}Hi
\end{innercustomthm}
\begin{mytheo}Hi
\end{mytheo}
\end{document}