Wiederholen Sie die Anweisungen vor der Deklaration

Nov 23 2020

TLDR

Wie wirft man alle schmutzigen, aber notwendigen "Deckspelzen / Beweise" in den Anhang und wiederholt sie im Haupttext?


Ich hatte ein paar Versuche und es schien, dass meine Anfragen seltsam sind. Also würde ich ein bisschen erklären, bevor ich die Frage stelle.

Ich schreibe eine mathematische Arbeit. Ich betrachte das Schreiben von mathematischen Argumenten als das Schreiben von Codes: Aussagen sind "Funktionen" und Beweise sind das Fleisch. Der Vollständigkeit halber möchte ich so viele Beweise einfügen, wie ich möchte. Da die Struktur des Arguments jedoch nicht linear ist, muss dies die Lesbarkeit im Großen und Ganzen verringern. Deshalb möchte ich die schmutzigen Dinge im Anhang verstecken und das def / thm / Proof in meinem Haupttext zitieren.

Idealerweise sollte ein Pseudo-Tex-Code wie folgt aussehen.

Section 1

#call{main-theorem}
  % nothing input here.
#endcall

.
.

Section 10
.
.

Appendix
#theorem[callable]{main-theorem}
2-1=1.
#end-theorem

Um dies zu erreichen, hat @Bernard thmtoolsin [1] auf mich hingewiesen . Um das zu erreichen, was ich wirklich will, habe ich einen Fehler erhalten, aber da es dort nicht das Hauptthema ist, stelle ich hier eine neue Frage.

Minimales Beispiel

Unten sehen Sie ein (fast) funktionierendes Minimalbeispiel.

\documentclass{article}
\usepackage{thmtools, thm-restate}
\declaretheorem{theorem}
\begin{document}
%\firsteuclid*
%%% Uncommenting the above causes an error:
%%% > ! Undefined control sequence.
%%% > l.7 \firsteuclid
\begin{restatable}[Euclid]{theorem}{firsteuclid}
\label{thm:euclid}
$$1+1 = 2.$$
\end{restatable}
\firsteuclid* % This, however, works fine.
\end{document}

Es wird korrekt kompiliert. Ich hoffe jedoch, dass ich zuerst anrufen kann, \firsteuclid*bevor es angegeben wurde. Ein Versuch schlägt fehl. Sie können dies replizieren, indem Sie die kommentierte Zeile auskommentieren.

Eine Problemumgehung besteht natürlich darin, die Grenze zu akzeptieren und Anweisungen wie in [2] zu deklarieren. Ich hoffe aber auch , dass die Dirty Codes alle in der Quelldatei zusammengefasst werden können. Es wird mein Leben in Zukunft viel einfacher machen, wenn ich sie in meinem nächsten Artikel verwenden möchte. Wieder gilt die Analogie: Sie schreiben gute Codes und verwenden sie immer wieder.

Frage

Wie wirft man alle schmutzigen, aber notwendigen "Codes" in den Anhang und wiederholt sie im Haupttext?

Referenz

Antworten

1 egreg Nov 23 2020 at 23:53

Hier ist ein Proof of Concept.

\documentclass{article}
\usepackage{amsthm}

\ExplSyntaxOn

\NewDocumentCommand{\theoremstatement}{m m}
 {% #1 = label, #2 = theorem type
  \use:e
   {
    \exp_not:N \begin{#2}
    \prop_item:Nn \g_student_theorems_statements_prop { #1 }
    \exp_not:N \end{#2}
   }
  \prop_gput:Nnx \g_student_theorems_numbers_prop { #1 } { \thethm }
 }

\NewDocumentEnvironment{delayedtheorem}{m m +b}
 % #1 = label, #2 = theorem type, #3 = theorem statement
 {
  \cs_set:Npx \thethm { \prop_item:Nn \g_student_theorems_numbers_prop { #1 } }
  \begin{#2}#3\end{#2}
  \iow_now:Nn \g_student_theorems_statements_iow
   {
    \studentpropgput { g_student_theorems_statements_prop } { #1 } { #3 }
   }
 }{}

\cs_new_eq:NN \studentpropgput \prop_gput:cnn

\iow_new:N \g_student_theorems_statements_iow
\prop_new:N \g_student_theorems_statements_prop
\prop_new:N \g_student_theorems_numbers_prop

\AtBeginDocument
 {
  \file_if_exist_input:n { \c_sys_jobname_str.thm }
  \iow_open:Nn \g_student_theorems_statements_iow { \c_sys_jobname_str.thm }
 }

\ExplSyntaxOff

\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}[thm]{Lemma}

\begin{document}

\section{First}

\begin{thm}
This is a normal theorem.
\end{thm}

\begin{proof}
Which has a proof.
\end{proof}

\theoremstatement{A}{thm}

\section{Second}

\theoremstatement{B}{lem}


\appendix

\section{Statements and proofs}

\begin{delayedtheorem}{A}{thm}
This is a theorem whose proof is in the appendix.
\end{delayedtheorem}

\begin{proof}
And its proof.
\end{proof}

\begin{delayedtheorem}{B}{lem}[With name]
A boring lemma.
\end{delayedtheorem}

\begin{proof}
Even more boring proof.
\end{proof}

\end{document}