summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/proof-at-the-end/proof-at-the-end.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/proof-at-the-end/proof-at-the-end.dtx')
-rw-r--r--macros/latex/contrib/proof-at-the-end/proof-at-the-end.dtx707
1 files changed, 592 insertions, 115 deletions
diff --git a/macros/latex/contrib/proof-at-the-end/proof-at-the-end.dtx b/macros/latex/contrib/proof-at-the-end/proof-at-the-end.dtx
index 91d02323a1..6bb4aa3265 100644
--- a/macros/latex/contrib/proof-at-the-end/proof-at-the-end.dtx
+++ b/macros/latex/contrib/proof-at-the-end/proof-at-the-end.dtx
@@ -1,12 +1,12 @@
%\iffalse
% proof-at-the-end.dtx generated using makedtx version 1.2 (c) Nicola Talbot
% Command line args:
+% -dir "/home/leo/Documents/Informatique/Programmation/LaTeX/proof-at-the-end/"
% -doc "../doc/proof-at-the-end_doc.tex"
% -author "Léo Colisson"
-% -dir "/tmp/pat/proof-at-the-end/"
% -src "proof-at-the-end\.sty=>proof-at-the-end.sty"
% proof-at-the-end
-% Created on 2019/5/22 12:52
+% Created on 2022/1/28 19:43
%\fi
%\iffalse
%<*package>
@@ -29,28 +29,33 @@
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
-% Copyright (C) 2019 Léo Colisson, all rights reserved.
+% Copyright (C) 2022 Léo Colisson, all rights reserved.
% \fi
% \iffalse
%<*driver>
-\PassOptionsToPackage{unicode=true}{hyperref} % options for packages loaded elsewhere
+% Options for packages loaded elsewhere
+\PassOptionsToPackage{unicode}{hyperref}
\PassOptionsToPackage{hyphens}{url}
%
\documentclass[
]{article}
+\title{Proof-at-the-end, or how to move proofs in appendix in LaTeX}
+\author{Léo Colisson}
+\date{}
+
+\usepackage{amsmath,amssymb}
\usepackage{lmodern}
-\usepackage{amssymb,amsmath}
-\usepackage{ifxetex,ifluatex}
-\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+\usepackage{iftex}
+\ifPDFTeX
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
- \usepackage{textcomp} % provides euro and other symbols
-\else % if luatex or xelatex
+ \usepackage{textcomp} % provide euro and other symbols
+\else % if luatex or xetex
\usepackage{unicode-math}
\defaultfontfeatures{Scale=MatchLowercase}
\defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
\fi
-% use upquote if available, for straight quotes in verbatim environments
+% Use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\IfFileExists{microtype.sty}{% use microtype if available
\usepackage[]{microtype}
@@ -72,9 +77,9 @@
\hypersetup{
pdftitle={Proof-at-the-end, or how to move proofs in appendix in LaTeX},
pdfauthor={Léo Colisson},
- pdfborder={0 0 0},
- breaklinks=true}
-\urlstyle{same} % don't use monospace font for urls
+ hidelinks,
+ pdfcreator={LaTeX via pandoc}}
+\urlstyle{same} % disable monospaced font for URLs
\usepackage{color}
\usepackage{fancyvrb}
\newcommand{\VerbBar}{|}
@@ -113,29 +118,26 @@
\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}}
\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}}
\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}}
-\setlength{\emergencystretch}{3em} % prevent overfull lines
+\usepackage{graphicx}
+\makeatletter
+\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
+\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
+\makeatother
+% Scale images if necessary, so that they will not overflow the page
+% margins by default, and it is still possible to overwrite the defaults
+% using explicit options in \includegraphics[width, height, ...]{}
+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
+% Set default figure placement to htbp
+\makeatletter
+\def\fps@figure{htbp}
+\makeatother
+\setlength{\emergencystretch}{3em} % prevent overfull lines
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
\setcounter{secnumdepth}{5}
-% Redefines (sub)paragraphs to behave more like sections
-\ifx\paragraph\undefined\else
- \let\oldparagraph\paragraph
- \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
+\ifLuaTeX
+ \usepackage{selnolig} % disable illegal ligatures
\fi
-\ifx\subparagraph\undefined\else
- \let\oldsubparagraph\subparagraph
- \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
-\fi
-
-% set default figure placement to htbp
-\makeatletter
-\def\fps@figure{htbp}
-\makeatother
-
-
-\title{Proof-at-the-end, or how to move proofs in appendix in LaTeX}
-\author{Léo Colisson}
-\date{}
\begin{document}
\DocInput{proof-at-the-end.dtx}
@@ -148,6 +150,13 @@
%\setcounter{tocdepth}{3}
%\tableofcontents
%}
+%WARNING: this package is definitely usable, but may not be as tested and
+%stable as standard packages. Note also that it may change a bit in the
+%future, but we will of course try to avoid as much as possible backward
+%incompatibilities. To ensure your document won't change when the package
+%get updates, it is always safer to copy the
+%\texttt{proof-at-the-end.sty} file at the root of your project.
+%
%\hypertarget{introduction}{%
%\section{Introduction}\label{introduction}}
%
@@ -206,50 +215,171 @@
%
%\begin{Shaded}
%\begin{Highlighting}[]
-%\FunctionTok{git}\NormalTok{ clone https://github.com/leo-colisson/proof-at-the-end.git}
-%\ExtensionTok{pdflatex}\NormalTok{ demo.tex }\KeywordTok{&&} \ExtensionTok{pdflatex}\NormalTok{ demo.tex}
+%\FunctionTok{git}\NormalTok{ clone https://github.com/leo{-}colisson/proof{-}at{-}the{-}end.git}
+%\ExtensionTok{pdflatex}\NormalTok{ demo.tex }\KeywordTok{\&\&} \ExtensionTok{pdflatex}\NormalTok{ demo.tex}
%\end{Highlighting}
%\end{Shaded}
%
%\hypertarget{quickstart}{%
%\section{Quickstart}\label{quickstart}}
%
+%\hypertarget{super-quick-quickstart}{%
+%\subsection{Super Quick QuickStart}\label{super-quick-quickstart}}
+%
+%If \texttt{proof-at-the-end} it's not installed in your CTAN
+%distribution, copy the
+%\href{https://github.com/leo-colisson/proof-at-the-end/}{\texttt{proof-at-the-end.sty}
+%file} in your project. Then, in your project, create new theorem/lemma
+%environments (using any tool you like, like asmthm, ntheorem and
+%thmtools), load the library using
+%\texttt{\textbackslash{}usepackage{[}createShortEnv{]}\{proof-at-the-end\}}
+%(note that you need the version 2022/01/28 to have
+%\texttt{createShortEnv} defined, otherwise you need to use directly
+%\texttt{theoremEnd}) and write your theorem using:
+%
+%\begin{Shaded}
+%\begin{Highlighting}[]
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{thmE}\NormalTok{\}[My title][end, restate]}
+%\NormalTok{ I am a restated theorem whose proof goes in appendix (compile me twice).}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{thmE}\NormalTok{\}}
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{proofE}\NormalTok{\}}
+%\NormalTok{ And I am a proof.}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{proofE}\NormalTok{\}}
+%\end{Highlighting}
+%\end{Shaded}
+%
+%The options (here \texttt{restate} and \texttt{end}) tells what should
+%go in appendix, how to configure the links\ldots{} Here the proof should
+%go in appendix, and the \texttt{restate} options states that the theorem
+%should be restated before the proof.
+%
+%You can find below a full example to compile which should produce this
+%output (sorry, this is a screenshot, that way I can export it easily in
+%the github page). Just make sure to compile twice to get references.
+%
+%\begin{figure}
+%\centering
+%\includegraphics{screenshot.png}
+%\caption{Screenshot of the quickstart}
+%\end{figure}
+%
+%You can directly copy them (with a more complete demo) in the github
+%page here https://github.com/leo-colisson/proof-at-the-end/.
+%
+%\begin{Shaded}
+%\begin{Highlighting}[]
+%\BuiltInTok{\textbackslash{}documentclass}\NormalTok{\{}\ExtensionTok{article}\NormalTok{\}}
+%
+%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{\{}\ExtensionTok{xparse}\NormalTok{\} }\CommentTok{\% Not needed with recent LaTeX}
+%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{\{}\ExtensionTok{amsthm}\NormalTok{\}}
+%
+%\CommentTok{\% Create new theorems, or use ntheorem/thmtools/...}
+%\FunctionTok{\textbackslash{}newtheorem}\NormalTok{\{thm\}\{Theorem\}[section]}
+%\CommentTok{\% Default uses autoref, but you can also use cleveref, see the documentation.}
+%\CommentTok{\% Say to autoref that "thm" are Theorems.}
+%\FunctionTok{\textbackslash{}newcommand}\NormalTok{\{}\ExtensionTok{\textbackslash{}thmautorefname}\NormalTok{\}\{Theorem\}}
+%
+%\CommentTok{\%\% Load the library. createShortEnv automatically creates the shortcuts}
+%\CommentTok{\%\% thmE, theoremE, lemmaE, corrolaryE, proofE. See \textbackslash{}newEndThm for more details.}
+%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{[createShortEnv]\{}\ExtensionTok{proof{-}at{-}the{-}end}\NormalTok{\}}
+%
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{document}\NormalTok{\}}
+%
+%\KeywordTok{\textbackslash{}section}\NormalTok{\{Theorems\}}
+%
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{thmE}\NormalTok{\}[My title][end]}
+%\NormalTok{ I am a theorem}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{thmE}\NormalTok{\}}
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{proofE}\NormalTok{\}}
+%\NormalTok{ And I am a proof.}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{proofE}\NormalTok{\}}
+%
+%\KeywordTok{\textbackslash{}section}\NormalTok{\{Proofs\}}
+%\FunctionTok{\textbackslash{}printProofs}
+%
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{document}\NormalTok{\}}
+%\end{Highlighting}
+%\end{Shaded}
+%
%\hypertarget{install}{%
%\subsection{Install}\label{install}}
%
-%If your CTAN distribution is recent enough, you have nothing to do.
-%Otherwise if it's not yet in your CTAN distribution, first download the
-%\texttt{proof-at-the-end.sty} file and insert it in the root of your
-%project with the following commands on unix (you can also clone this
-%repository if you prefer, or just manually download or copy/paste the
-%files on Windows). It also requires a recent version of xparse, so for
-%simplicity we included the sty file of xparse in this repository as
-%well:
+%If your CTAN distribution is recent enough, you have nothing to do (if
+%you are using overleaf, note that you can configure your project to use
+%a more recent TexLive distribution: this packages is included starting
+%from TexLive 2019). Otherwise if it's not yet in your CTAN distribution,
+%first download the \texttt{proof-at-the-end.sty} file and insert it in
+%the root of your project with the following commands on unix (you can
+%also clone this repository if you prefer, or just manually download or
+%copy/paste the files on Windows).
%
%\begin{Shaded}
%\begin{Highlighting}[]
-%\BuiltInTok{cd} \OperatorTok{<}\NormalTok{your project}\OperatorTok{>}
-%\VariableTok{repopratend=}\StringTok{"https://raw.githubusercontent.com/leo-colisson/proof-at-the-end"}
-%\FunctionTok{wget} \VariableTok{$\{repopratend\}}\NormalTok{/master/proof-at-the-end.sty}
-%\FunctionTok{wget} \VariableTok{$\{repopratend\}}\NormalTok{/master/xparse.sty}
+%\BuiltInTok{cd} \OperatorTok{\textless{}}\NormalTok{your project}\OperatorTok{\textgreater{}}
+%\VariableTok{repopratend}\OperatorTok{=}\StringTok{"https://raw.githubusercontent.com/leo{-}colisson/proof{-}at{-}the{-}end"}
+%\FunctionTok{wget} \VariableTok{$\{repopratend\}}\NormalTok{/master/proof{-}at{-}the{-}end.sty}
%\end{Highlighting}
%\end{Shaded}
%
-%If you have an old distribution of LaTeX (before 2018 basically, which
-%is the case of Overleaf), you may also need a
+%It also requires a recent version of xparse (not present in TexLive 2018
+%and before basically), otherwise you will get an error like:
+%
+%\begin{verbatim}
+%Unknown argument type 'b' replaced by 'm'
+%\end{verbatim}
+%
+%While
+%\href{https://raw.githubusercontent.com/leo-colisson/proof-at-the-end/c2150f4feba4709d47e43c00e5f8eb93ce345cab/xparse.sty}{we
+%used to provide} for simplicity a \texttt{xparse.sty} file (version
+%\texttt{2018-04-12}) in older versions of this repository, we removed it
+%to
+%\href{https://github.com/leo-colisson/proof-at-the-end/issues/6}{avoid
+%license issues and conflicts with recent LaTeX distributions that
+%already include xparse}. Nevertheless, if you are using an older
+%distribution, you can also download \texttt{xparse} manually
+%\href{http://mirrors.ctan.org/install/macros/latex/contrib/l3packages.tds.zip}{here},
+%unzip it, and copy the \texttt{.sty} files contained in
+%\texttt{tex/latex/l3packages/xparse/} at the root of your project. On
+%linux, you can do that via:
+%
+%\begin{Shaded}
+%\begin{Highlighting}[]
+%\BuiltInTok{cd} \OperatorTok{\textless{}}\NormalTok{your project}\OperatorTok{\textgreater{}}
+%\FunctionTok{wget}\NormalTok{ http://mirrors.ctan.org/install/macros/latex/contrib/l3packages.tds.zip}
+%\FunctionTok{unzip} \AttributeTok{{-}d}\NormalTok{ . }\AttributeTok{{-}j}\NormalTok{ l3packages.tds.zip }\StringTok{\textquotesingle{}tex/latex/l3packages/xparse/*\textquotesingle{}}
+%\FunctionTok{rm} \AttributeTok{{-}f}\NormalTok{ l3packages.tds.zip xparse.ltx}
+%\end{Highlighting}
+%\end{Shaded}
+%
+%If you have an old distribution of LaTeX (2017 or before basically), you
+%may also need a
%\href{https://tex.stackexchange.com/questions/489646/expl3-and-recent-xparse-on-overleaf-no-expl3-loader-detected/489649?noredirect=1\#comment1236409_489649}{more
-%recent expl3}. It is also very easy to install, just download the zip
-%file
-%\url{http://mirrors.ctan.org/install/macros/latex/contrib/l3kernel.tds.zip},
-%unzip, and copy the content of the directory
-%\texttt{tex/latex/l3kernel/} into your project. On linux it's a matter
-%of two commands in your project:
+%recent expl3} or you will get an error like:
+%
+%\begin{verbatim}
+%Package xparse Error: Support package l3kernel too old.
+%\end{verbatim}
+%
+%To install it, download the zip files
+%\url{http://mirrors.ctan.org/install/macros/latex/contrib/l3kernel.tds.zip}
+%and
+%\url{http://mirrors.ctan.org/install/macros/latex/contrib/l3backend.tds.zip}
+%(\texttt{l3backend} is
+%\href{https://tex.stackexchange.com/questions/499082/file-l3backend-pdfmode-def-not-found-when-loading-expl3}{since
+%July 1st, 2019} a dependency of l3kernel), unzip, and copy the content
+%of the directories \texttt{tex/latex/l3kernel/} (first archive) and
+%\texttt{tex/latex/l3backend/} (second archive) into your project. On
+%linux it's a matter of two commands in your project:
%
%\begin{Shaded}
%\begin{Highlighting}[]
+%\BuiltInTok{cd} \OperatorTok{\textless{}}\NormalTok{your project}\OperatorTok{\textgreater{}}
%\FunctionTok{wget}\NormalTok{ http://mirrors.ctan.org/install/macros/latex/contrib/l3kernel.tds.zip}
-%\FunctionTok{unzip}\NormalTok{ -d . -j l3kernel.tds.zip }\StringTok{'tex/latex/l3kernel/*'}
+%\FunctionTok{unzip} \AttributeTok{{-}d}\NormalTok{ . }\AttributeTok{{-}j}\NormalTok{ l3kernel.tds.zip }\StringTok{\textquotesingle{}tex/latex/l3kernel/*\textquotesingle{}}
%\FunctionTok{rm}\NormalTok{ l3kernel.tds.zip}
+%\FunctionTok{wget}\NormalTok{ http://mirrors.ctan.org/install/macros/latex/contrib/l3backend.tds.zip}
+%\FunctionTok{unzip} \AttributeTok{{-}d}\NormalTok{ . }\AttributeTok{{-}j}\NormalTok{ l3backend.tds.zip }\StringTok{\textquotesingle{}tex/latex/l3backend/*\textquotesingle{}}
+%\FunctionTok{rm}\NormalTok{ l3backend.tds.zip}
%\end{Highlighting}
%\end{Shaded}
%
@@ -259,7 +389,13 @@
%write instead a \texttt{latexmkrc} file as explained
%\href{https://www.overleaf.com/learn/latex/Questions/I_have_a_lot_of_.cls,_.sty,_.bst_files,_and_I_want_to_put_them_in_a_folder_to_keep_my_project_uncluttered._But_my_project_is_not_finding_them_to_compile_correctly}{here}.
%
-%That's all!
+%If you still have errors, it's likely that your LaTeX distribution is
+%just too old (LaTeX 2016 seems to be too old to install a recent l3exp).
+%So just upgrade to a decent version, and you should not have any
+%troubles anymore.
+%
+%You can test your install by compiling the \texttt{demo.tex} file
+%present in the repository. When it compiles, you are ready to start!
%
%\hypertarget{use-in-your-project}{%
%\subsection{Use in your project}\label{use-in-your-project}}
@@ -268,24 +404,24 @@
%
%\begin{Shaded}
%\begin{Highlighting}[]
-%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{\{}\ExtensionTok{proof-at-the-end}\NormalTok{\}}
+%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{\{}\ExtensionTok{proof{-}at{-}the{-}end}\NormalTok{\}}
%\end{Highlighting}
%\end{Shaded}
%
%Then, you can configure your theorem/lemma/\ldots{} environments as
-%usual, by using any counter you like\ldots{}:
+%usual, by using any counter you like\ldots:
%
%\begin{Shaded}
%\begin{Highlighting}[]
%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{\{}\ExtensionTok{amssymb, amsthm, amsmath}\NormalTok{\}}
-%\CommentTok{% Theorems}
+%\CommentTok{\% Theorems}
%\FunctionTok{\textbackslash{}newtheorem}\NormalTok{\{thm\}\{Theorem\}[section]}
-%\FunctionTok{\textbackslash{}newtheorem}\NormalTok{*\{thm*\}\{Theorem\}}
-%\FunctionTok{\textbackslash{}providecommand}\NormalTok{*}\FunctionTok{\textbackslash{}thmautorefname}\NormalTok{\{Theorem\}}
-%\CommentTok{% Lemmata}
+%\FunctionTok{\textbackslash{}newtheorem*}\NormalTok{\{thm*\}\{Theorem\}}
+%\FunctionTok{\textbackslash{}providecommand*\textbackslash{}thmautorefname}\NormalTok{\{Theorem\}}
+%\CommentTok{\% Lemmata}
%\FunctionTok{\textbackslash{}newtheorem}\NormalTok{\{lemma\}[thm]\{Lemma\}}
-%\FunctionTok{\textbackslash{}newtheorem}\NormalTok{*\{lemma*\}\{Lemma\}}
-%\FunctionTok{\textbackslash{}providecommand}\NormalTok{*}\FunctionTok{\textbackslash{}lemmaautorefname}\NormalTok{\{Lemma\}}
+%\FunctionTok{\textbackslash{}newtheorem*}\NormalTok{\{lemma*\}\{Lemma\}}
+%\FunctionTok{\textbackslash{}providecommand*\textbackslash{}lemmaautorefname}\NormalTok{\{Lemma\}}
%\end{Highlighting}
%\end{Shaded}
%
@@ -297,7 +433,7 @@
%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{theoremEnd}\NormalTok{\}[OPTIONS]\{THEOREM ENVIRONMENT\}[OPTIONAL TITLE]}
%\NormalTok{ YOUR THEOREM, with eventually labels like }\KeywordTok{\textbackslash{}label}\NormalTok{\{}\ExtensionTok{thm:OPTIONAL LABEL}\NormalTok{\}}
%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{theoremEnd}\NormalTok{\}}
-%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\} }\CommentTok{%% Optional environment}
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\} }\CommentTok{\%\% Optional environment}
%\NormalTok{ YOUR (OPTIONAL) PROOF}
%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\}}
%\end{Highlighting}
@@ -317,8 +453,29 @@
%\end{Highlighting}
%\end{Shaded}
%
-%And put in the place where you would like to display the theorem the
-%following code:
+%Since \texttt{theoremEnd} may be a bit verbose to use, we provide since
+%the version 2022/01/28, an option: if you load the program using
+%\texttt{\textbackslash{}usepackage{[}createShortEnv{]}\{proof-at-the-end\}},
+%you will automatically have the shortcut environments \texttt{proofE}
+%(to replace \texttt{proof}), \texttt{thmE} (to replace \texttt{thm}),
+%\texttt{theoremE} (to replace\ldots{} ok you got the pattern),
+%\texttt{lemmaE} and \texttt{corollaryE}. Note that it is your role to
+%define the initial commands \texttt{thm}\ldots, but you don't need to
+%define them all, only those that you use. Then, you can use them like:
+%
+%\begin{Shaded}
+%\begin{Highlighting}[]
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{thmE}\NormalTok{\}[My title][end, restate]}
+%\NormalTok{ I am a restated theorem whose proof goes in appendix (compile me twice).}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{thmE}\NormalTok{\}}
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{proofE}\NormalTok{\}}
+%\NormalTok{ And I am a proof.}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{proofE}\NormalTok{\}}
+%\end{Highlighting}
+%\end{Shaded}
+%
+%Finally, to display the proofs, just use
+%\texttt{\textbackslash{}printProofs} where you like:
%
%\begin{Shaded}
%\begin{Highlighting}[]
@@ -335,6 +492,25 @@
%
%Isn't it simple ?
%
+%\hypertarget{a-note-on-hyperref}{%
+%\subsection{\texorpdfstring{A note on
+%\texttt{hyperref}}{A note on hyperref}}\label{a-note-on-hyperref}}
+%
+%An older version of the package explicitely loaded \texttt{hyperref}
+%with no option, and an option clash could occur if the user wanted to
+%add options to \texttt{hyperref}. We now push the loading to the very
+%end to avoid that issue, but if you want to load packages \emph{after}
+%\texttt{hyperref} (like \texttt{cleveref}), it is your job to include
+%\texttt{hyperref}, for example by putting at the end of the preambule
+%something like:
+%
+%\begin{Shaded}
+%\begin{Highlighting}[]
+%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{[colorlinks]\{}\ExtensionTok{hyperref}\NormalTok{\}}
+%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{\{}\ExtensionTok{cleveref}\NormalTok{\}}
+%\end{Highlighting}
+%\end{Shaded}
+%
%\hypertarget{use-cases}{%
%\section{Use cases}\label{use-cases}}
%
@@ -373,7 +549,7 @@
%\NormalTok{ Each theorem can have a custom configuration!}
%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{theoremEnd}\NormalTok{\}}
%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\}}
-%\NormalTok{ Quite practical, isn't it?}
+%\NormalTok{ Quite practical, isn\textquotesingle{}t it?}
%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\}}
%\end{Highlighting}
%\end{Shaded}
@@ -396,7 +572,7 @@
%
%\begin{Shaded}
%\begin{Highlighting}[]
-%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{[conf=\{normal, one big link\}]\{}\ExtensionTok{proof-at-the-end}\NormalTok{\}}
+%\BuiltInTok{\textbackslash{}usepackage}\NormalTok{[conf=\{normal, one big link\}]\{}\ExtensionTok{proof{-}at{-}the{-}end}\NormalTok{\}}
%\end{Highlighting}
%\end{Shaded}
%
@@ -411,7 +587,7 @@
%\begin{Shaded}
%\begin{Highlighting}[]
%\FunctionTok{\textbackslash{}pgfkeys}\NormalTok{\{/prAtEnd/global custom defaults/.style=\{}
-%\NormalTok{ one big link=\{Go to proof on page~}\KeywordTok{\textbackslash{}pageref}\ErrorTok{*}\NormalTok{\{}\ExtensionTok{proof:prAtEnd\textbackslash{}pratendcountercurrent}\NormalTok{\}\}}
+%\NormalTok{ one big link=\{Go to proof on page\textasciitilde{}}\FunctionTok{\textbackslash{}pageref*}\NormalTok{\{proof:prAtEnd}\FunctionTok{\textbackslash{}pratendcountercurrent}\NormalTok{\}\}}
%\NormalTok{ \}}
%\NormalTok{\}}
%\end{Highlighting}
@@ -429,25 +605,24 @@
%\end{Shaded}
%
%Finally, it can be practical to define custom environments to avoid
-%typing always \texttt{theoremEnd}:
+%typing always \texttt{theoremEnd} using something like that
+%(\texttt{thmE} is the shortcut environment to create, and \texttt{thm}
+%is the old one):
%
%\begin{Shaded}
%\begin{Highlighting}[]
-%\FunctionTok{\textbackslash{}NewDocumentEnvironment}\NormalTok{\{thmE\}\{O\{\}O\{\}+b\}\{}\CommentTok{%}
-% \KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{theoremEnd}\NormalTok{\}[normal,#2]\{thm\}[#1]}\CommentTok{%}
-%\NormalTok{ #3}\CommentTok{%}
-% \KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{theoremEnd}\NormalTok{\}}\CommentTok{%}
-%\NormalTok{\}\{\}}
-%\CommentTok{% Do not forget the second parameter or you might get Missing \textbackslash{}begin\{document\} error}
-%\FunctionTok{\textbackslash{}NewDocumentEnvironment}\NormalTok{\{proofE\}\{O\{\}+b\}\{}\CommentTok{%}
-% \KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\}[#1]}\CommentTok{%}
-%\NormalTok{ #2}\CommentTok{%}
-% \KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\}}\CommentTok{%}
-%\NormalTok{\}\{\}}
+%\FunctionTok{\textbackslash{}newEndThm}\NormalTok{[normal]\{thmE\}\{thm\}}
+%\FunctionTok{\textbackslash{}newEndProof}\NormalTok{\{proofE\}}
%\end{Highlighting}
%\end{Shaded}
%
-%That you could use like that:
+%By default, loading the package using the \texttt{createShortEnv} option
+%automatically creates the shortcut environments \texttt{proofE} (to
+%replace \texttt{proof}), \texttt{thmE} (to replace \texttt{thm}),
+%\texttt{theoremE} (to replace\ldots{} ok you got the pattern),
+%\texttt{lemmaE} and \texttt{corollaryE}.
+%
+%Then you can use like that:
%
%\begin{Shaded}
%\begin{Highlighting}[]
@@ -676,7 +851,7 @@
%\NormalTok{ Hint: look at the alias options.}
%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{proof}\NormalTok{\}}
%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\}}
-%\NormalTok{ You just use ``see full proof'' as an option}
+%\NormalTok{ You just use \textasciigrave{}\textasciigrave{}see full proof\textquotesingle{}\textquotesingle{} as an option}
%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{proofEnd}\NormalTok{\}}
%\end{Highlighting}
%\end{Shaded}
@@ -715,7 +890,7 @@
%\item
% \texttt{text\ proof}: text displayed in place of ``Proof'' in the
% appendix. Defaults to
-% \texttt{\{Proof\ of\ \textbackslash{}string\textbackslash{}autoref\{thm:prAtEnd\textbackslash{}pratendcountercurrent\}\}}
+% \texttt{\{Proof\ of\ \textbackslash{}string\textbackslash{}pratendRef\{thm:prAtEnd\textbackslash{}pratendcountercurrent\}\}}
%\item
% \texttt{restate\ command}: name of a unique macro (without backslash)
% that will be defined as an alias to restate the theorem wherever you
@@ -762,10 +937,9 @@
% theorem, alias of \texttt{text\ proof=\{\textbackslash{}proofname\}}
%\item
% \texttt{stared} (or \texttt{no\ number}): when you use the stared
-% version of a theorem you don't have any number, so autoref fails to
-% write a nice link to the theorem. This option changes the text of
-% ``Proof'', by keeping the link but writting only \texttt{Proof}.
-% Equivalent to
+% version of a theorem you don't have any number, so cref fails to write
+% a nice link to the theorem. This option changes the text of ``Proof'',
+% by keeping the link but writting only \texttt{Proof}. Equivalent to
% \texttt{text\ proof=\{\textbackslash{}string\textbackslash{}mbox\{\textbackslash{}string\textbackslash{}hyperref{[}thm:prAtEnd\textbackslash{}pratendcountercurrent{]}\{\textbackslash{}proofname\}\}\}}
%\item
% \texttt{see\ full\ proof}: useful when you want to write in the main
@@ -787,11 +961,11 @@
%\item
% \texttt{text\ link\ section}: Put a link to the proof looking like
% ``See proof in section X''. Defaults to
-% \texttt{text\ link=\{See\ \textbackslash{}hyperref{[}proof:prAtEnd\textbackslash{}pratendcountercurrent{]}\{proof\}\ in\ \textbackslash{}autoref\{proofsection:prAtEnd\textbackslash{}pratendcountercurrent\}.\}}
+% \texttt{text\ link=\{See\ \textbackslash{}hyperref{[}proof:prAtEnd\textbackslash{}pratendcountercurrent{]}\{proof\}\ in\ \textbackslash{}pratendSectionlikeCref.\}}
%\item
% \texttt{text\ link\ section\ full\ proof}: Put a link to the proof
% looking like ``See full proof in section X''. Defaults to
-% \texttt{text\ link=\{See\ \textbackslash{}hyperref{[}proof:prAtEnd\textbackslash{}pratendcountercurrent{]}\{full\ proof\}\ in\ \textbackslash{}autoref\{proofsection:prAtEnd\textbackslash{}pratendcountercurrent\}.\}}
+% \texttt{text\ link=\{See\ \textbackslash{}hyperref{[}proof:prAtEnd\textbackslash{}pratendcountercurrent{]}\{full\ proof\}\ in\ \textbackslash{}pratendSectionlikeCref.\}}
%\item
% \texttt{default\ text\ link}: default text for the link to the proof,
% equivalent of
@@ -799,7 +973,7 @@
%\item
% \texttt{default\ text\ proof}: default text for the proof in appendix,
% equivalent of
-% \texttt{text\ proof=\{Proof\ of\ \textbackslash{}string\textbackslash{}autoref\{thm:prAtEnd\textbackslash{}pratendcountercurrent\}\}}
+% \texttt{text\ proof=\{Proof\ of\ \textbackslash{}string\textbackslash{}pratendRef\{thm:prAtEnd\textbackslash{}pratendcountercurrent\}\}}
%\item
% \texttt{text\ proof\ translated}: like \texttt{default\ text\ proof},
% but takes one argument and use it instead of \texttt{Proof\ of}.
@@ -825,6 +999,161 @@
% \texttt{bare\ defaults,\ configuration\ options,\ global\ custom\ defaults,\ local\ custom\ defaults}
%\end{itemize}
%
+%\hypertarget{package-options}{%
+%\section{Package options}\label{package-options}}
+%
+%The package comes with multiple options: - The
+%\texttt{conf=\{CONFIGURATION\}} option is used to configure the default
+%style. Usage:
+%\texttt{\textbackslash{}usepackage{[}conf=\{normal,\ text\ link\ section\}{]}\{proof-at-the-end\}}
+%- The \texttt{disablePatchSection} is useful to stop the library from
+%patching the section-like commands and chapters (by default, we
+%automatically add a \texttt{\textbackslash{}label} at the end of the
+%section which is used by \texttt{text\ link\ section} to find the
+%Appendix). If you enable this option, you can manually add the label by
+%using \texttt{\textbackslash{}pratendAddLabel} after the appendix
+%section (without any argument). - \texttt{commandRef=NAMECOMMAND}: By
+%default, theorem are referenced to using
+%\texttt{\textbackslash{}autoref\{\}}. You can change the value of
+%\texttt{NAMECOMMAND} to use another command, like
+%\texttt{commandRef=Cref} to use \texttt{\textbackslash{}Cref\{\}}. In
+%that case, make sure to load both \texttt{hyperref} and
+%\texttt{cleveref} (typically at the very end of your preambule) as
+%\texttt{cleveref} needs to be loaded after \texttt{hyperref}.
+%Internally, the library creates and uses
+%\texttt{\textbackslash{}pratendRef} instead of
+%\texttt{\textbackslash{}autoref}. - \texttt{createShortEnv}: creates
+%(using \texttt{newEndThm} and \texttt{newEndProof}) the shortcut
+%environments \texttt{proofE} (to replace \texttt{proof}), \texttt{thmE}
+%(to replace \texttt{thm}), \texttt{theoremE} (to replace\ldots{} ok you
+%got the pattern), \texttt{lemmaE} and \texttt{corollaryE}. Note that it
+%is still your job to define the \texttt{thm}, \texttt{lemma}
+%environments.
+%
+%\hypertarget{troubleshooting}{%
+%\section{Troubleshooting}\label{troubleshooting}}
+%
+%Here are some common issues you may have, with explainations to solve
+%them.
+%
+%\hypertarget{the-link-after-the-proof-does-not-mention-the-section-but-something-else-an-equation-a-figure-etc.}{%
+%\subsection{The link after the proof does not mention the section, but
+%something else (an equation, a figure,
+%etc.)}\label{the-link-after-the-proof-does-not-mention-the-section-but-something-else-an-equation-a-figure-etc.}}
+%
+%Sometimes, you may see something like
+%\texttt{See\ proof\ in\ Equation\ A} instead of
+%`\texttt{See\ proof\ in\ Appendix\ A}. This issue
+%\href{https://github.com/leo-colisson/proof-at-the-end/issues/2}{was
+%reported before} and should be solved on newer versions (starting from
+%2022/01/27) by automatically patching sections. If you have this issue,
+%just upgrade (for instance by copying the
+%\href{https://github.com/leo-colisson/proof-at-the-end}{\texttt{proof-at-the-end.sty}
+%file} at the root of your project). We proceed by patching the
+%\texttt{\textbackslash{}chapter}, \texttt{\textbackslash{}section},
+%\texttt{\textbackslash{}subsection}, \texttt{subsubsection} and
+%\texttt{\textbackslash{}paragraph} commands to add
+%\texttt{\textbackslash{}pratendAddLabel} which will help the package to
+%find the label of the current section. If you prefer the old behavior,
+%you can disable it using the \texttt{disablePatchSection} option (more
+%details in the package options).
+%
+%\hypertarget{i-get-an-error-error-file-ended-while-scanning-use-of-xverbatim.-when-using-verbatim-inside-a-theorem}{%
+%\subsection{\texorpdfstring{I get an error
+%\texttt{ERROR:\ File\ ended\ while\ scanning\ use\ of\ \textbackslash{}@xverbatim.}
+%when using verbatim inside a
+%theorem}{I get an error ERROR: File ended while scanning use of \textbackslash@xverbatim. when using verbatim inside a theorem}}\label{i-get-an-error-error-file-ended-while-scanning-use-of-xverbatim.-when-using-verbatim-inside-a-theorem}}
+%
+%I turns out that this library needs to use the \texttt{+b} option of
+%environments in order to manipulate appropriately the theorem/proof.
+%Unfortunately, it means that it is not possible to use verbatim
+%environments inside. While
+%\href{https://tex.stackexchange.com/questions/489435/use-environment-into-new-xparse-environment}{this
+%answer} suggests that it is impossible to avoid this issue, other people
+%reported that it may be possible to use catcodes to capture the
+%environment body verbatim, before using scantokens to reparse it, or to
+%use
+%\href{https://mirror.ibcp.fr/pub/CTAN/macros/latex/contrib/filecontentsdef/filecontentsdef.pdf}{filecontentsdef}
+%(see for instance
+%\href{https://tex.stackexchange.com/questions/631810/create-a-newdocumentenvironment-programmatically?noredirect=1\#comment1575605_631810}{this
+%comment}{]}, ). However, it may be possible that this make syntex
+%unusable, so it may not worth the effort.
+%
+%In anycase, there exists some workarounds, some of the are for instance
+%give in the \href{https://texfaq.org/FAQ-verbwithin}{TeX FAQ}. The
+%simplest solution, if your code is simple/short enough, is to use
+%\texttt{\textbackslash{}texttt} (you can replace backslash with
+%\texttt{\textbackslash{}textbackslash} inside etc, and include it in a
+%\texttt{verse} if you have multiple lines). If you have a longer text,
+%you may also like \texttt{lrbox} to put your content inside a box, for
+%instance like that:
+%
+%\begin{Shaded}
+%\begin{Highlighting}[]
+%\CommentTok{\%\% Create the box}
+%\FunctionTok{\textbackslash{}newsavebox}\NormalTok{\{}\FunctionTok{\textbackslash{}myEndBox}\NormalTok{\}}
+%
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{lrbox}\NormalTok{\}\{}\FunctionTok{\textbackslash{}myEndBox}\NormalTok{\}}
+% \KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{minipage}\NormalTok{\}\{1.0}\FunctionTok{\textbackslash{}linewidth}\NormalTok{\}}
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{verbatim}\NormalTok{\}}
+%\VerbatimStringTok{\textbackslash{}newEndThm[normal]\{thmE\}\{thm\}}
+%\VerbatimStringTok{\textbackslash{}newEndProof\{proofE\}\{proof\}}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{verbatim}\NormalTok{\}}
+% \KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{minipage}\NormalTok{\}}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{lrbox}\NormalTok{\}}
+%
+%\CommentTok{\%\% Create a theorem:}
+%\KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{thmE}\NormalTok{\}}
+%\NormalTok{ Insert the box:}
+%
+% \KeywordTok{\textbackslash{}begin}\NormalTok{\{}\ExtensionTok{center}\NormalTok{\}}
+% \FunctionTok{\textbackslash{}usebox}\NormalTok{\{}\FunctionTok{\textbackslash{}myEndBox}\NormalTok{\}}
+% \KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{center}\NormalTok{\}}
+%\KeywordTok{\textbackslash{}end}\NormalTok{\{}\ExtensionTok{thmE}\NormalTok{\}}
+%\end{Highlighting}
+%\end{Shaded}
+%
+%\hypertarget{changelog}{%
+%\section{Changelog}\label{changelog}}
+%
+%\begin{itemize}
+%\tightlist
+%\item
+% 2022/01/28:
+%
+% \begin{enumerate}
+% \def\labelenumi{\arabic{enumi}.}
+% \tightlist
+% \item
+% Fix the issue when using sharps in a proof
+% https://github.com/leo-colisson/proof-at-the-end/issues/7.
+% \item
+% Provide \texttt{\textbackslash{}newEndThm},
+% \texttt{\textbackslash{}newEndProof} and the option
+% \texttt{createShortEnv} to quickly create environments.
+% \end{enumerate}
+%\item
+% 2022/01/27:
+%
+% \begin{enumerate}
+% \def\labelenumi{\arabic{enumi}.}
+% \tightlist
+% \item
+% Patch chapters/sections/\ldots{} to better detect the current
+% section and fix
+% \href{https://github.com/leo-colisson/proof-at-the-end/issues/2}{issue
+% 2}. This can be disabled using the package option
+% \texttt{disablePatchSection}.
+% \item
+% Add an option \texttt{commandRef} to use other ref libraries, like
+% \texttt{cleveref} instead of \texttt{autoref}.
+% \item
+% Normal restatable theorem do not need to be restated. Fix
+% \href{https://github.com/leo-colisson/proof-at-the-end/issues/8}{issue
+% 8}.
+% \end{enumerate}
+%\end{itemize}
+%
%\hypertarget{contributions}{%
%\section{Contributions}\label{contributions}}
%
@@ -837,19 +1166,20 @@
%
%\begin{Shaded}
%\begin{Highlighting}[]
-%\ExtensionTok{%%}\NormalTok{ Compile the demo}
+%\ExtensionTok{\%\%}\NormalTok{ Compile the demo}
%\FunctionTok{make}\NormalTok{ demo}
-%\ExtensionTok{%%}\NormalTok{ Clean the project}
+%\ExtensionTok{\%\%}\NormalTok{ Clean the project}
%\FunctionTok{make}\NormalTok{ clean}
-%\ExtensionTok{%%}\NormalTok{ Generate the documentation}
+%\ExtensionTok{\%\%}\NormalTok{ Generate the documentation}
%\FunctionTok{make}\NormalTok{ doc}
-%\ExtensionTok{%%}\NormalTok{ Generate a package for CTAN}
+%\ExtensionTok{\%\%}\NormalTok{ Generate a package for CTAN}
%\FunctionTok{make}\NormalTok{ package}
%\end{Highlighting}
%\end{Shaded}
%
%
%
+%
%\StopEventually{}
%\section{The Code}
%\iffalse
@@ -858,16 +1188,18 @@
% \end{macrocode}
%\fi
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{proof-at-the-end}[2019/05/21 A package to move proofs in appendix]
+\ProvidesPackage{proof-at-the-end}[2022/01/28 A package to move proofs in appendix]
\RequirePackage{etoolbox}
-\RequirePackage{hyperref}
\RequirePackage{thmtools}
\RequirePackage{thm-restate}
\RequirePackage{catchfile}
\RequirePackage{pgfkeys}
\RequirePackage{xparse}
-
+% Load hyperref at the end
+\AtEndPreamble{%
+ \RequirePackage{hyperref}
+}%
\RequirePackage{kvoptions}
%% https://tex.stackexchange.com/questions/109747/put-all-package-options-into-one-command
@@ -876,27 +1208,56 @@
%% \usepackage[conf={normal}]{proof-at-the-end}
\SetupKeyvalOptions{
family=pratendOpt,
- prefix=pratendOpt,
+ prefix=pratendOpt, % "Namespace": Prefix of the commands, conditions....
}
\DeclareStringOption{conf}
\DeclareLocalOptions{conf}% \pratendOptdefconf contains the proof
+\DeclareBoolOption{disablePatchSection} % Use \ifpratendOptdisablePatchSection ... \else ... \fi
+\DeclareStringOption[autoref]{commandRef} % Use commandRef=cref to use cleveref. Defaults to autoref.
+\DeclareBoolOption{createShortEnv} % To create thmE, theoremE, proofE, lemmaE, corrolaryE
\ProcessKeyvalOptions*
% \DeclareOption*{\PackageWarning{proof-at-the-end}{Unknown}}
% \ProcessOptions\relax
+%% https://tex.stackexchange.com/a/13289/116348
\newwrite\appendwrite
+\newcount\pratend@count@makeallother
+
+%%% Loop to make sure all chars are normal letters, including #.
+\newcommand{\makeallother}{%
+ \pratend@count@makeallother0\relax
+ \loop\ifnum\pratend@count@makeallother<255\relax
+ \catcode\pratend@count@makeallother12\relax
+ \advance\pratend@count@makeallother by 1\relax
+ \repeat
+}
+%%% This command allows the user to append things to a file. But the content may contain macros that
+%%% will be evaluated before writing them to the file.
+%%% TODO: Efficiency may be improved by writing to the file only before the printProof.
% The first argument is the file name
% The second argument is the text to write
\NewDocumentCommand\appendtofile{m+m}{%
\begingroup
- \IfFileExists{#1}%
- {\CatchFileDef{\filecontent}{#1}{\catcode`\\=12 \endlinechar=`^^J\catcode\endlinechar=12\relax}}% keep existing end-of-lines
- {\let\filecontent\empty}%
- \immediate\openout\appendwrite=#1\relax
- \immediate\write\appendwrite{\detokenize\expandafter{\filecontent}#2}%
- \immediate\closeout\appendwrite
+ %% Read the content
+ \begingroup%
+ \IfFileExists{#1}{%
+ \newlinechar\endlinechar%
+ \makeallother% Turn all chars into normal letters.
+ \everyeof{\noexpand}%
+ \edef\fileContent{\@@input #1 }%
+ }{%
+ \let\fileContent\empty
+ }%
+ %% Open the file to write in it:
+ \immediate\openout\appendwrite #1\relax%
+ %% Write the text
+ \immediate\write\appendwrite{\fileContent}%
+ \endgroup%
+ \immediate\write\appendwrite{#2}%
+ %% Close the file
+ \immediate\closeout\appendwrite%
\endgroup
}
@@ -1012,19 +1373,19 @@
one big link={#1~\pageref*{proof:prAtEnd\pratendcountercurrent}.}
},
text link section/.style={%
- text link={See \hyperref[proof:prAtEnd\pratendcountercurrent]{proof} in \autoref{proofsection:prAtEnd\pratendcountercurrent}.}
+ text link={See \hyperref[proof:prAtEnd\pratendcountercurrent]{proof} in \pratendSectionlikeCref.}
},
text link section full proof/.style={%
- text link={See \hyperref[proof:prAtEnd\pratendcountercurrent]{full proof} in \autoref{proofsection:prAtEnd\pratendcountercurrent}.}
+ text link={See \hyperref[proof:prAtEnd\pratendcountercurrent]{full proof} in \pratendSectionlikeCref.}
},
default text link/.style={
text link={See \hyperref[proof:prAtEnd\pratendcountercurrent]{proof} on page~\pageref{proof:prAtEnd\pratendcountercurrent}.},
},
text proof translated/.style={
- text proof={#1 \string\autoref{thm:prAtEnd\pratendcountercurrent}},
+ text proof={#1 \string\pratendRef{thm:prAtEnd\pratendcountercurrent}},
},
default text proof/.style={
- text proof={Proof of \string\autoref{thm:prAtEnd\pratendcountercurrent}},
+ text proof={Proof of \string\pratendRef{thm:prAtEnd\pratendcountercurrent}},
},
%%%% Defaults
bare defaults/.style={
@@ -1116,9 +1477,13 @@
\fi%
%% Create a custom alias to restate the theorem
\expandafter\protected@xdef\csname \pratendcustomrestate\endcsname{\noexpand\csname prAtEndRestate\pratendcountercurrent\endcsname}%
- %% Restate the theorem if needed in appendix
- \ifrestatethm
- \appendtofile{\prefixPrAtEndFiles\category.tex}{\string\prAtEndRestate\pratendcountercurrent*}
+ %% Restate the theorem if needed in appendix.
+ %% As explained in https://github.com/leo-colisson/proof-at-the-end/issues/8
+ %% No need to restate of there is no proof at the end.
+ \ifproofend %
+ \ifrestatethm %
+ \appendtofile{\prefixPrAtEndFiles\category.tex}{\string\prAtEndRestate\pratendcountercurrent*}%
+ \fi%
\fi%
\fi%
%% If the theorem is not stated in the main text,
@@ -1129,7 +1494,7 @@
\protected@xdef\pratendcountercurrent{\roman{counterAllProofEnd}}
%% Create a custom alias to restate the theorem
\expandafter\protected@xdef\csname \pratendcustomrestate\endcsname{\noexpand\csname prAtEndRestate\pratendcountercurrent\endcsname}%
- \appendtofile{\prefixPrAtEndFiles\category.tex}{\string\begin{restatable}[#3]{#2}{prAtEndRestate\pratendcountercurrent}\string\label{thm:prAtEnd\pratendcountercurrent}\detokenize{#4}\string\end{restatable}}%
+ \appendtofile{\prefixPrAtEndFiles\category.tex}{\string\begin{restatable}[\detokenize{#3}]{#2}{prAtEndRestate\pratendcountercurrent}\string\label{thm:prAtEnd\pratendcountercurrent}\detokenize{#4}\string\end{restatable}}%
\fi%
}{}
@@ -1155,7 +1520,13 @@
\fi%
%% Write the proof at the end
\ifproofend%
- \appendtofile{\prefixPrAtEndFiles\category.tex}{\string\label{proofsection:prAtEnd\pratendcountercurrent}\string\begin{proof}[\pratendtextproof]\string\phantomsection\string\label{proof:prAtEnd\pratendcountercurrent}\detokenize{#2}\string\end{proof}}%
+ %% The label alone adds some space, see e.g.
+ %% https://tex.stackexchange.com/questions/600118/selectlanguage-in-the-middle-of-text-causes-extra-vertical-space/600142#600142
+ %% and https://tex.stackexchange.com/questions/600577/adding-a-label-between-two-proofs-adds-unwanted-space
+ %% The solution is to use \\Hy@SaveLastskip and \Hy@RestoreLastskip from hyperref
+ %% See also
+ %% https://tex.stackexchange.com/questions/553394/reliably-add-a-label-to-the-current-section-even-if-the-label-is-not-placed-rig/600847#600847
+ \appendtofile{\prefixPrAtEndFiles\category.tex}{\string\makeatletter\string\Hy@SaveLastskip\string\pratendChangeCurrentLabel\string\label{proofsection:prAtEnd\pratendcountercurrent}\string\Hy@RestoreLastskip\string\makeatother\string\begin{proof}[\pratendtextproof]\string\phantomsection\string\label{proof:prAtEnd\pratendcountercurrent}\detokenize{#2}\string\end{proof}}%
\fi%
}{}
@@ -1198,6 +1569,112 @@
% }
% }
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Patch sections, chapters...
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% We patch the \section, \subsection and \chapter commands to make sure that
+% the text "See proof in Section XX" points to the appropriate section/subsection.
+% We basically maintain a counter counting how many time we saw a section/subsection/... and use it to label
+% directly the section afterwards.
+\newcounter{pratend@counter@sectionlike}
+%% Command to add after a label like "prAtEnd:sectionlike10". Useful to patch \section, \chapter...
+\NewDocumentCommand\pratendAddLabel{}{%
+ %% First, we get the label
+ %% Cool explaination of expandafter, edef, noexpand:
+ %%% https://www.tug.org/TUGboat/tb09-1/tb20bechtolsheim.pdf
+ \edef\pratend@current@sectionlike@label{prAtEnd:sectionlike\thepratend@counter@sectionlike}%
+ \expandafter\label{\pratend@current@sectionlike@label}%
+ \let\pratend@sectionlike@stored@label\@currentlabel%
+}%
+\NewDocumentCommand\pratendSectionlikeCref{}{%
+ \pratendRef{proofsection:prAtEnd\pratendcountercurrent}%
+}
+\NewDocumentCommand\pratendChangeCurrentLabel{}{
+ \ifdefined\pratend@sectionlike@stored@label%
+ \let\@currentlabel\pratend@sectionlike@stored@label%
+ \fi%
+}
+\ifpratendOptdisablePatchSection
+\else
+ %% Add the above command to \chapter if the command exists
+ \ifdef{\@chapter}{
+ \ifpatchable*{\@chapter}{
+ \apptocmd{\@chapter}{\pratendAddLabel}{}{}%
+ }{\PackageWarning{proof-at-the-end}{Chapters are not patchable.}{}}
+ }{}
+ %% patch sections/subsections/paragraph/...
+ %% https://tex.stackexchange.com/questions/631713/patch-section-command-fails/631717?noredirect=1#comment1575337_631717
+ \ifdef{\@sect}{
+ % \apptocmd{\section}{\pratendAddLabel}{}{}%
+ \ifpatchable*{\@sect}{
+ \apptocmd{\@sect}{\pratendAddLabel}{}{}%
+ }{\PackageWarning{proof-at-the-end}{Sections are not patchable.}{}}
+ }{}
+\fi
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Allow cref/autoref/...
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Instead of \autoref{proof:blabla} use \pratendRef{proof:blabla}, it allows the ref command to be customized
+%% as an option of the package.
+\NewDocumentCommand\pratendRef{m}{%
+ \csname \pratendOptcommandRef\endcsname{#1}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Create automatically wrapper
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% Defines a shortcut to avoid typing the whole theoremEnd environment.
+%% Avoid to manually type \NewDocumentEnvironment...
+%% Usage: \newEndThm[default options]{new environment}{old environment}
+% E.g.: \newEndThm[normal]{thmE}{thm}{}
+\NewDocumentCommand{\newEndThm}{O{}mm}{%
+ % \expandafter\NewDocumentEnvironment{#2}{O{}O{}+b}{%
+ % \begin{theoremEnd}[#1,##2]{#3}[##1]%
+ % ##3%
+ % \end{theoremEnd}%
+ % }{}
+ \NewDocumentEnvironment{#2}{O{}O{}}{%
+ \begin{theoremEnd}[#1,##2]{#3}[##1]%
+ }{\end{theoremEnd}}
+}
+
+% \NewDocumentCommand{\newEndThm}{O{}mm}{%
+% % \expandafter\NewDocumentEnvironment{#2}{O{}O{}+b}{%
+% % \begin{theoremEnd}[#1,##2]{#3}[##1]%
+% % ##3%
+% % \end{theoremEnd}%
+% % }{}
+% \expandafter\NewDocumentEnvironment{#2}{O{}O{}+b}{%
+% \begin{theoremEnd}[#1,##2]{#3}[##1]%
+% ##3
+% \end{theoremEnd}%
+% }{}
+% }
+
+%% Avoid to manually type \NewDocumentEnvironment...
+%% Usage: \newEndProof[default options]{new proof environment}{old proof environment}
+% E.g.: \newEndProof[]{proofE}{proof}
+\NewDocumentCommand{\newEndProof}{O{}m}{%
+ \NewDocumentEnvironment{#2}{O{}+b}{%
+ \begin{proofEnd}[#1,##1]%
+ ##2%
+ \end{proofEnd}%
+ }{}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Create even more automatically wrapper with option "createShortEnv"
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifpratendOptcreateShortEnv
+ %%% We create automatically the environments.
+ \newEndProof{proofE}
+ \newEndThm{thmE}{thm}
+ \newEndThm{lemmaE}{lemmaE}
+ \newEndThm{theoremE}{theorem}
+ \newEndThm{corollaryE}{corollary}
+\fi
\endinput
%\iffalse