diff options
author | Norbert Preining <norbert@preining.info> | 2024-08-29 03:03:05 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-08-29 03:03:05 +0000 |
commit | 0c37cf67ade4182d382c384e595a24ebb022fa63 (patch) | |
tree | c3bb4966e80077cd13b3e075025e9190cfe45b22 /macros | |
parent | 8949f3077cb0d7b4f471e4ef1d49b8da436ebbc4 (diff) |
CTAN sync 202408290303
Diffstat (limited to 'macros')
122 files changed, 2635 insertions, 712 deletions
diff --git a/macros/latex/contrib/enverb/README.md b/macros/latex/contrib/enverb/README.md new file mode 100644 index 0000000000..2c035b8eb6 --- /dev/null +++ b/macros/latex/contrib/enverb/README.md @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +# `enverb` -- read an environment verbatim + +Version 2024-08-28 v1.0 + +Released under the LaTeX Project Public License v1.3c or later +See http://www.latex-project.org/lppl.txt + +Hosted on the Island of TeX at https://gitlab.com/islandoftex/texmf/enverb + +------------------------------------------------------------------------------- + +Copyright (C) 2023-2024 Jonathan P. Spratte + +This work may be distributed and/or modified under the conditions of the LaTeX +Project Public License (LPPL), either version 1.3c of this license or (at your +option) any later version. The latest version of this license is in the file: + + http://www.latex-project.org/lppl.txt + +This work is "maintained" (as per LPPL maintenance status) by + Jonathan P. Spratte + +------------------------------------------------------------------------------- + +## Summary of Contents + +`enverb` provides means to read the contents of a user-defined environment +verbatim. It also provides facilities to then typeset them inside a +listing-environment provided by LaTeX or another package or to evaluate them as +normal LaTeX code. This gives one the full flexibility of LaTeX to customise the +looks of documentation and examples without the need of any temporary files. +Additionally you can define your own processing of the contents, either line +oriented or processing the entire contents at once, however you see fit. diff --git a/macros/latex/contrib/enverb/doc-enverb.tex b/macros/latex/contrib/enverb/doc-enverb.tex new file mode 100644 index 0000000000..c0c578f0ef --- /dev/null +++ b/macros/latex/contrib/enverb/doc-enverb.tex @@ -0,0 +1,47 @@ +\subsection{Grabbing an Environment Verbatim} +\begin{function}{\enverb} + \begin{syntax} + \cs{enverb}\marg{key=value}\oarg{key=value} + \cs{enverb}\meta{*}\marg{key=value} + \end{syntax} + This function will store the contents of the enclosing environment verbatim + inside of \cs{enverbBody}. It should be the last thing you invoke inside the + |\begin| code of your environment and mustn't be enclosed in any nested + environment. Both the mandatory and the optional \meta{key=value} argument are + parsed by \cs{enverb} -- see \autoref{sec:keys} about the specifics of this. + The mandatory argument is meant for a package/code developer to assign the + sensible default values for the envisioned functionality and always parsed + inside the keyset of \cs{enverb}, while the optional one is meant to be used + by the user and as such should be the first thing inside the enclosing + environment (if the user wants to use an optional argument).\par + \cs{enverb} sets the special characters + \begingroup + \def\do#1% + {% + \ifx\ #1\else + , \texttt{\csname @gobble\expandafter\endcsname\string#1}% + \fi + }% + \csname @secondoftwo\expandafter\endcsname\romannumeral`\^^@\dospecials + \endgroup + \ to the category code 12 (other), and makes both spaces and tabulators active + tokens. By default each line break will be a category code 12 carriage return + (character code 13), but see the |eol| option in \autoref{sec:keys}.\par + A line that contains only whitespace on input will be output as an empty + line.\par + The \cs{enverb} syntax of the optional argument has a few peculiarities. It is + scanned for the opening bracket either on the same line as the |\begin| + statement of the enclosing environment, or on any subsequent line until a + non-whitespace character is found. The optional argument is read using the + \enquote{normal} (so surrounding) category code regime, but it is scanned for + it in a way that the first token is still read verbatim if no optional + argument was given.\par + The first non-whitespace token that's not an opening bracket must not be found + on the same line as the |\begin| statement, and if there was an optional + argument there shouldn't be any non-whitespace token trailing it in that line. + Additionally there should be no non-whitespace material following the |\end| + statement (anything preceding it in the same line is for the most part + ignored; |\begin| and |\end| are not balanced, the first |\end| with the + correct environment as argument terminates scanning).\par + The starred version of \cs{enverb} doesn't search for an optional argument. +\end{function} diff --git a/macros/latex/contrib/enverb/doc-examples.tex b/macros/latex/contrib/enverb/doc-examples.tex new file mode 100644 index 0000000000..043890dc10 --- /dev/null +++ b/macros/latex/contrib/enverb/doc-examples.tex @@ -0,0 +1,178 @@ +\subsection{Examples} + +The following preamble should work for all of the examples in this section +(except for the last one, which can be placed as is in the preamble since it +loads all the packages it needs). +\begin{ex}[no-tcb] + \documentclass{article} + + \usepackage{enverb} + \usepackage{color} + \usepackage{multicol} + \usepackage{listings} +\end{ex} + +\subsubsection{A Boxed Verbatim Display} +Defining a boxed verbatim macro is pretty simple, we just need to set up the +|bol| and |eol| hooks such that line breaks are respected, the rest of the setup +already works with \LaTeX's default definition for active spaces (and tabs). +\begin{ex}[store,no-tcb] + \newenvironment{myenv} + {\enverb{bol=\strut, eol=\strut\par}} + {% + \par + \medskip + \noindent + \fbox + {% + \parbox + {\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax} + {% + \raggedright\frenchspacing\ttfamily + \enverbBody + }% + }% + \par + \medskip + } +\end{ex} +The probably most complicated part there is the calculation of the |\parbox|'s +width, which is just a line width compensated by the space taken up by |\fbox|. + +If we now use this environment we get a nice display of our verbatim contents +(you might want to play with this and see what happens if your input lines are +longer than a |\linewidth|; also note that the spaces after |\begin| and |\end| +are optional just like within the normal category code regime, \envlogo\ will +still find the end of its scope). +\begin{ex}[restore] + \begin {myenv} + \This is a% + \begin{environment} + that looks \good + \end {myenv} +\end{ex} + +\subsubsection{A Page-Breakable Boxed Verbatim Display} +The previous example was boxed, lets put that to the next level. We can also +achieve page- (and column-)breakable boxed verbatim environments. The simple +minded trick here is to draw only line segments at the start and end of each +line using the |\vrule| primitive. As a result this will look horribly wrong for +lines longer than a single output line, but that would require too much hassle +(we just pay attention on our input formatting). + +As an added bonus this should have line counters at the start of each line. For +that we first define a little helper. +\begin{ex}[store,no-tcb] + \newcount\myline + \newcommand\linecounting + {% + \advance\myline1 + \textcolor[gray]{.7}{\footnotesize\the\myline}% + \quad + } +\end{ex} +Next we can define our environment. The |bol| and |eol| hooks look similar to +the previous example, but this time they got some added contents for the +additional formatting. Also, we borrow some code from \LaTeX's starred +\env{verbatim} to make spaces visible (since they are active in |\enverb| this +is also pretty straight forward). +\begin{ex}[store,no-tcb] + \newenvironment{myenv} + {% + \enverb + { + bol=\noindent\strut\vrule\hskip\fboxsep\linecounting + ,eol=\hfill\hskip\fboxsep\vrule\strut\par + }% + } + {% + \medskip + \hrule + \ttfamily\frenchspacing + \UseName{@setupverbvisiblespace}\UseName{@vobeyspaces}% + \enverbBody + \hrule + \medskip + } +\end{ex} +The entire result can then be used with ease. +\begin{ex}[restore,same-line=.38] + \begin{multicols}{2} + Text above + \begin{myenv} + This \is + {an} $example$ + ^of verbatim_ + input\, being + displayed boxed. + \end{myenv} + Text below + \end{multicols} +\end{ex} + +\subsubsection{The Real Deal -- Using the Body Twice} +All of the above is just pretty playthings that are easily possible with +\envlogo\ (and with relative few lines of code) though most likely better done +by more full fledged packages like \pkg{listings} or similar. The original +reason for all this was to gain control over both the listing and typeset result +for code documentation. A simple example could be the following: +\begin{ex}[store,no-tcb] + \newenvironment{myenv} + {\enverb{}} + {% + \par\noindent + \begin{minipage}{0.48\linewidth} + \enverbListing{lstlisting}{} + \end{minipage}% + \hfill + \colorbox{yellow} + {% + \begin{minipage}{\dimexpr0.48\linewidth-2\fboxsep\relax} + \enverbExecute + \end{minipage}% + }% + \par + } +\end{ex} +Which if used looks like the following (admittedly not that pretty): +\begin{ex}[restore] + \begin{myenv} + This% + is% + great.% + \end{myenv} +\end{ex} + +\subsubsection{\envlogo's Style} +And if you wondered, you guessed it, all examples in this documentation are +typeset using an \envlogo\ derived environment with a few bells and whistles +more (for instance collecting material, typesetting the verbatim listing, but +executing it together with a later code block). + +The following is a complete listing of everything that sets up the looks of this +documentation's example blocks. Note that the macros starting with |\enverb@ex@| +are not internals of \envlogo\ but exclusive to the code formatting the +examples. +\begin{exwrap}{breakable} + \footnotesize + \lstinputlisting{preamble-examples.tex} +\end{exwrap} + +And if we use that we can do all sorts of interesting things: +\begingroup + \NewEnvironmentCopy{ex2}{ex} + \begin{ex2}[same-line=.4] + We define a helper: + \begin{ex}[store,no-tcb] + \newcommand\foo{bar} + \end{ex} + And then can use it: + \begin{ex}[restore] + This is \foo + \end{ex} + A wider example: + \begin{ex}[below] + This is a wider example. + \end{ex} + \end{ex2} +\endgroup diff --git a/macros/latex/contrib/enverb/doc-keys.tex b/macros/latex/contrib/enverb/doc-keys.tex new file mode 100644 index 0000000000..6d36075d26 --- /dev/null +++ b/macros/latex/contrib/enverb/doc-keys.tex @@ -0,0 +1,111 @@ +\subsection{Available Keys\label{sec:keys}} +\begin{function}{\enverbsetup} + \begin{syntax} + \cs{enverbsetup} \marg{key=value} + \end{syntax} + This macro can be used to (locally) change the settings of \envlogo\ outside + of the |\enverb| macro. +\end{function} + +The available keys are: +\begin{function}{ignore} + \begin{syntax} + ignore = \meta{int}\keydefault{\emph{unused}} + \end{syntax} + Set up the number of tokens to ignore at the start of each line. This is only + applied after the matching |\end| was found, hence doesn't affect the + |\end|-line. A line containing any non-whitespace tokens but in total + fewer tokens (counting whitespace) than \meta{int} will lead to undefined + behaviour.\par + |ignore| and |auto-ignore| are mutually exclusive. +\end{function} + +\begin{function}{auto-ignore} + \begin{syntax} + auto-ignore\keydefault{true} + auto-ignore = \meta{bool} + \end{syntax} + If this is true (or no value is given) the number of leading tokens is + determined by the number of leading tokens found in the line with the matching + |\end|. This allows for nice nesting of indentation levels in your \LaTeX\ + sources without affecting functionality. A line containing any non-whitespace + tokens but in total fewer tokens (counting whitespace) than the leading tokens + in the |\end|-line will lead to undefined behaviour.\par + |ignore| and |auto-ignore| are mutually exclusive. +\end{function} + +\begin{function}{more-ignore} + \begin{syntax} + more-ignore = \meta{int}\keydefault{2} + \end{syntax} + If |auto-ignore| is true this specifies how many tokens in addition to the + number of leading tokens shall be ignored at the start of each line. This + allows for even the contents of the |\enverb|-environment to be further + indented than the |\begin| and |\end| statement. +\end{function} + +\begin{function}{bol} + \begin{syntax} + bol = \meta{tokens}\keydefault{\emph{empty}} + bol+ = \meta{tokens} + +bol = \meta{tokens} + \end{syntax} + Defines which \meta{tokens} are placed at the \textbf{b}egin \textbf{o}f + \textbf{l}ines. Your \meta{tokens} can be arbitrary contents and are placed as + is (so can contain macros which work as you intend when using + \cs{enverbBody}). Keep in mind that if you want to use this with + \cs{enverbExecute} or \cs{enverbListing} your tokens should be rescanned to + the same code after they got |\detokenize|d.\par + The |bol+| variant adds your \meta{tokens} after the current contents of + |bol|, while |+bol| adds them in front of the contents. +\end{function} + +\begin{function}{eol} + \begin{syntax} + eol = \meta{tokens}\keydefault{\emph{\string^\string^M\textsubscript{12}}} + eol+ = \meta{tokens} + +eol = \meta{tokens} + \end{syntax} + Defines which \meta{tokens} are placed at the \textbf{e}nd \textbf{o}f + \textbf{l}ines. Your \meta{tokens} can be arbitrary contents and are placed as + is (so can contain macros which work as you intend when using + \cs{enverbBody}). Keep in mind that if you want to use this with + \cs{enverbExecute} or \cs{enverbListing} your tokens should be rescanned to + the same code after they got |\detokenize|d.\par + The |eol+| variant adds your \meta{tokens} after the current contents of + |eol|, while |+eol| adds them in front of the contents. +\end{function} + +\begin{function}{key-handler} + \begin{syntax} + key-handler = \meta{code}\keydefault{\emph{throw an error}} + \end{syntax} + If used any undefined keys encountered while parsing the mandatory and + optional arguments of \cs{enverb} is parsed via \meta{code}. Inside your + \meta{code} use |#1| to specify where to input the list of unknown keys. This + can be used to specify additional keys to provide an interface to control your + wrapping code. This includes the handling of any unknown keys encountered + while parsing the mandatory \meta{key=value} argument of \cs{enverb}. +\end{function} + +\begin{function}{key-set} + \begin{syntax} + key-set = \meta{set} + \end{syntax} + \envlogo\ uses \pkg{expkv} for its key-parsing. This key is a special form of + |key-handler| defining a handler that parses the unknown keys as part of + \meta{set} in \pkg{expkv} (so basically a shorthand for + |key-handler = \ekvset{|\meta{set}|}{#1}|). +\end{function} + +\begin{function}{oarg-not-enverb} + \begin{syntax} + oarg-not-enverb\keydefault{false} + oarg-not-enverb = \meta{bool} + \end{syntax} + If this is true (or no value is given) the \meta{key=value} list in the + optional argument to \cs{enverb} is not parsed as keys of \envlogo\ but only + inside your defined |key-handler|. Obviously this key doesn't have any effect + if only used as part of the optional argument of \cs{enverb}. +\end{function} + diff --git a/macros/latex/contrib/enverb/doc-using-contents.tex b/macros/latex/contrib/enverb/doc-using-contents.tex new file mode 100644 index 0000000000..c3a147ab97 --- /dev/null +++ b/macros/latex/contrib/enverb/doc-using-contents.tex @@ -0,0 +1,40 @@ +\subsection{Using Verbatim Environment Contents} +\begin{function}{\enverbBody} + \begin{syntax} + \cs{enverbBody} + \end{syntax} + This macro holds the contents of the last scanned \cs{enverb}-body, + assignments to it by the package are all local. +\end{function} + +\begin{function}{\enverbExecute} + \begin{syntax} + \cs{enverbExecute} + \end{syntax} + This function executes the current contents of \cs{enverbBody} as though they + would be part of your input at this place (using |\scantokens|, it is tried as + good as possible to tackle |\scantokens|'s shortcomings; also it is assumed + that you didn't change the |eol| key, or else the newlines aren't carried over + but whatever your |eol| value set is used). The entire contents are + |\detokenize|d once before |\scantokens| does its magic (shouldn't affect the + verbatimly read material, but is deemed a sensible safety measure if something + unexpected happens; this also assumes that anything you placed inside |bol| or + |eol| is rescanned into the same stuff once |\detokenize|d).\par + The function isn't fully expandable, the contents are executed at the current + group level. +\end{function} + +\begin{function}{\enverbListing} + \begin{syntax} + \cs{enverbListing} \marg{env} \marg{args} + \end{syntax} + This function is meant to reuse the current contents of \cs{enverbBody} inside + another verbatim environment. The used mechanism is tested to work with + \env{verbatim}, and environments defined by \pkg{fancyvrb}, \pkg{listings} and + \pkg{minted} (provided you use the default |eol| setting). \meta{env} is the + environment name in which the contents should be nested, and \meta{args} is + material to be placed after the |\begin| statement (just as you input them, + with the outer braces from this argument removed).\par + Just like |\enverbExecute| this |\detokenize|s the current content of + \cs{enverbBody} as well as your \meta{args} and uses |\scantokens|. +\end{function} diff --git a/macros/latex/contrib/enverb/enverb-doc.pdf b/macros/latex/contrib/enverb/enverb-doc.pdf Binary files differnew file mode 100644 index 0000000000..fc5c35311e --- /dev/null +++ b/macros/latex/contrib/enverb/enverb-doc.pdf diff --git a/macros/latex/contrib/enverb/enverb-doc.tex b/macros/latex/contrib/enverb/enverb-doc.tex new file mode 100644 index 0000000000..985e9e03b8 --- /dev/null +++ b/macros/latex/contrib/enverb/enverb-doc.tex @@ -0,0 +1,87 @@ +\IfFileExists{enverb.sty}{\RequirePackage{enverb}}{} + +\PassOptionsToPackage{full}{textcomp} +\documentclass{l3doc} + +\usepackage[oldstylenums,nott]{kpfonts} +\usepackage{randtext,xcolor,array} +\usepackage{xistercian} +\usepackage{accsupp} +\usepackage{csquotes} +\usepackage{multicol} +%\usepackage{microtype} + +\input{preamble-logo} +\input{preamble-examples} + +\newcommand\keydefault[1]{\hfill\textcolor{enverbgrey}{default: #1}} + +\let\metaORIG\meta +\protected\def\meta #1{\texttt{\metaORIG{#1}}} +\renewcommand*\thefootnote{\cistercian{footnote}} +\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black} +\makeatletter +\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}} +\protected\def\savefootnotestuff + {% + \let\mysavethefootnote\thefootnote + \let\mysave@makefnmark\@makefnmark + \let\mysave@makefntext\@makefntext + } +\def\restorefootnotestuff{\texorpdfstring\restorefootnotestuff@{}} +\def\restorefootnotestuff@ + {% + \global\let\thefootnote\mysavethefootnote + \global\let\@makefnmark\mysave@makefnmark + \global\let\@makefntext\mysave@makefntext + } +\makeatother + +\begin{document} +\savefootnotestuff +\title + {% + \restorefootnotestuff + The \envlogo\ package\\[\medskipamount] + \Large read an environment verbatim% + } +\GetFileInfo{enverb.sty} +\date{\filedate\space\fileversion} +\author{Jonathan P. Spratte\thanks{\protect\randomize{jspratte@yahoo.de}}} + +\maketitle + +\begin{abstract} + \noindent\parfillskip=0pt + The \envlogo\ package provides a simple yet effective way to collect the + verbatim contents of an environment into a macro, which the user can then pick + up to implement additional functionality, for instance a simple output routine + or rescanning the contents into code listings or for typesetting alike. + Arbitrary contents can be placed on either end of each line allowing flexible + line-oriented processing. +\end{abstract} + +\tableofcontents + +\begin{documentation} +\section{Documentation} +Originally I was unsatisfied by the degree of freedom and customisation present +in the available verbatim-environment providing packages like \pkg{listings}, +\pkg{minted}, \emph{etc.}, when one wants to document \TeX\ code and show the +results next to it (or I didn't bother to dig through their manuals). Also I +didn't like them producing temporary files so long as that's not necessary. As a +result I implemented what was basically the first version of \envlogo\ for one +of my other packages. + +\input{doc-enverb} +\input{doc-using-contents} +\input{doc-keys} +\input{doc-examples} +\end{documentation} + +\clearpage +\begin{implementation} + \section{Implementation} + \DocInput{enverb.dtx} +\end{implementation} +\end{document} diff --git a/macros/latex/contrib/enverb/enverb.dtx b/macros/latex/contrib/enverb/enverb.dtx new file mode 100644 index 0000000000..a33dc713d7 --- /dev/null +++ b/macros/latex/contrib/enverb/enverb.dtx @@ -0,0 +1,720 @@ +% \iffalse meta-comment +% +% File: enverb.dtx Copyright (C) 2023-2024 Jonathan P. Spratte +% +% This work may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this license or +% (at your option) any later version. The latest version of this license is in +% the file: +% +% http://www.latex-project.org/lppl.txt +% +% ------------------------------------------------------------------------------ +% +%<*driver>^^A>>= +\def\nameofplainTeX{plain} +\ifx\fmtname\nameofplainTeX\else + \expandafter\begingroup +\fi +\input l3docstrip.tex +\askforoverwritefalse +\preamble + +-------------------------------------------------------------- +enverb -- read an environment verbatim +E-mail: jspratte@yahoo.de +Released under the LaTeX Project Public License v1.3c or later +See http://www.latex-project.org/lppl.txt +-------------------------------------------------------------- + +Copyright (C) 2023-2024 Jonathan P. Spratte + +This work may be distributed and/or modified under the conditions of the +LaTeX Project Public License (LPPL), either version 1.3c of this license or +(at your option) any later version. The latest version of this license is in +the file: + + http://www.latex-project.org/lppl.txt + +This work is "maintained" (as per LPPL maintenance status) by + Jonathan P. Spratte. + +This work consists of the files enverb.dtx + enverb-doc.tex +and the derived files enverb-doc.pdf + enverb.sty + +\endpreamble +\postamble +\endpostamble +\generate{\file{enverb.sty}{\from{enverb.dtx}{pkg}}} +\ifx\fmtname\nameofplainTeX + \expandafter\endbatchfile +\else + \expandafter\endgroup +\fi +%</driver>^^A=<< +% \fi +% +% \gobbledocstriptag +%<*pkg> +% +% \subsection{Who we are} +% +% \begin{macro}[internal]{\enverb@date,\enverb@version} +% We store the package version and date inside macros. +% \begin{macrocode} +\newcommand*\enverb@date{2024-08-28} +\newcommand*\enverb@version{1.0} +% \end{macrocode} +% \end{macro} +% +% And the package identification: +% \begin{macrocode} +\ProvidesPackage{enverb} + [\enverb@date\space v\enverb@version\space read an environment verbatim] +% \end{macrocode} +% +% \subsection{Some required \LaTeXe\ style argument grabbers} +% \begin{macro}[internal]{\@thirdofthree,\@firstofnine} +% This here are just two argument grabbers that aren't defined in all versions +% of \LaTeXe. +% \begin{macrocode} +\providecommand\@thirdofthree[3]{#3} +\providecommand\@firstofnine[9]{#1} +% \end{macrocode} +% \end{macro} +% +% \subsection{Borrow some code} +% \begin{macro}[internal] +% {\enverb@count,\enverb@ifxTF,\enverb@chargen,\enverb@othercr} +% We'll make use of the following two \pkg{expl3} functions, but since the +% remainder of this package is coded in \LaTeXe\ style we stick to that. +% \begin{macrocode} +\ExplSyntaxOn +\cs_new_eq:NN \enverb@count \tl_count:n +\cs_new_eq:NN \enverb@ifxTF \token_if_eq_meaning:NNTF +\cs_new_eq:NN \enverb@chargen \char_generate:nn +\cs_set:Npx \enverb@othercr { \char_generate:nn {13} {12} } +\ExplSyntaxOff +% \end{macrocode} +% \end{macro} +% +% \subsection{Key-value Setup} +% First we need to load a package to allow us defining our keys, then we define +% a bunch of keys: +% \begin{macrocode} +\RequirePackage{expkv-def} +% \end{macrocode} +% +% \begin{macrocode} +\ekvdefinekeys{enverb} + { + protect code ignore = \let\enverb@ifautoignore\@secondoftwo + ,also eint ignore = \enverb@ignore + ,boolTF auto-ignore = \enverb@ifautoignore + ,initial auto-ignore + ,eint more-ignore = \enverb@moreignore + ,initial more-ignore = 2 + ,long store bol = \enverb@bol@content + ,long code bol+ = \enverb@add\enverb@bol@content{#1} + ,long code +bol = \enverb@pre\enverb@bol@content{#1} + ,long store eol = \enverb@eol@content + ,einitial eol = \enverb@othercr + ,long code eol+ = \enverb@add\enverb@eol@content{#1} + ,long code +eol = \enverb@pre\enverb@eol@content{#1} + ,protect code key-handler = \protected\long\def\enverb@keyhandler##1{#1} + ,protect code key-set = \protected\long\ekvsetdef\enverb@keyhandler{#1} + ,unknown code = \enverb@add\enverb@unknown@kv{, {#3} = {#2} } + ,unknown noval = \enverb@add\enverb@unknown@kv{, {#2} } + ,boolTF oarg-not-enverb = \enverb@ifoargtokeyhandler + } +% \end{macrocode} +% \begin{macro}{\enverbsetup} +% We need a user facing macro to set our keys. +% \begin{macrocode} +\protected\long\ekvsetdef\enverbsetup{enverb} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@unknown@kv} +% This is a storage for all unknown keys encountered. +% \begin{macrocode} +\let\enverb@unknown@kv\@empty +% \end{macrocode} +% \end{macro} +% +% \subsection{Miscellaneous Auxiliary Functions} +% +% \begin{macro}[internal]{\enverb@stop} +% A very simple minded stop-macro, just gobble up to the eponymous mark. +% \begin{macrocode} +\long\def\enverb@stop#1\enverb@stop{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@error} +% \begin{macrocode} +\protected\def\enverb@error{\PackageError{enverb}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@misused} +% This is an error message that'd be used inside a |\lowercase| environment if +% put where it originally should've been. Hence we define it now to get +% correct formatting. +% \begin{macrocode} +\protected\def\enverb@misused + {% + \enverb@error + {Misused \string\enverb. Input already tokenised}% + {% + It seems you used the \string\enverb\space based environment + {\@currenvir} inside another\MessageBreak + macro's or a primitive's argument; that doesn't work.% + }% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@keyhandler, \enverb@keyhandler@} +% This is the initial definition of the handler for unknown keys, namely throw +% an error containing the list of unknown keys. +% \begin{macrocode} +\protected\long\def\enverb@keyhandler#1% + {% + \if\relax\detokenize{#1}\relax + \expandafter\@gobbletwo + \fi + \@firstofone + {% + \enverb@error + {% + Unknown keys encountered: + \expanded + {% + \ekvparse + {\MessageBreak\@spaces\unexpanded}% + {\MessageBreak\@spaces\enverb@keyhandler@}% + {#1}% + }% + \@gobble + }% + {% + Perhaps you misspelled some key names? Or you forgot to set up + custom key\MessageBreak + parsing.% + }% + }% + } +\long\def\enverb@keyhandler@#1{\unexpanded{#1} = \unexpanded} +% \end{macrocode} +% \end{macro} +% +% \subsection{Collector} +% +% Much of the code in this package works under a weird category code regime, +% which the following sets up. After this |~| will be an active newline +% character, |:| will be an active space, and |;| will be an active tab. +% \begin{macrocode} +\begingroup +\lccode`\~=`\^^M +\catcode`\:=13 +\lccode`\:=`\ % <- space +\catcode`\;=13 +\lccode`\;=`\^^I % <- tab +\lowercase{\endgroup +% \end{macrocode} +% +% \begin{macro}[internal] +% {\enverb@body@space,\enverb@body@tab,\enverb@body@newline,\enverb@collect} +% To quickly check whether a line contains only spaces or tabs we define them +% as empty, that way we can remove them simply by one step of |\romannumeral| +% expansion. The newlines on the other hand grab the entire next line, check +% whether the matching |\end| is encountered, and if not leave the contents +% in |\unexpanded|. This grabbing is not done by the newline characters +% directly, but instead via |\enverb@collect| so that low level errors are +% easier to understand. +% \begin{macrocode} +\def\enverb@body@space{} +\def\enverb@body@tab{} +\def\enverb@body@newline{\enverb@collect} +\def\enverb@collect#1~% + {\enverb@ifnotend{#1}{\enverb@bol\unexpanded{#1}\enverb@eol\enverb@collect}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\enverbBody} +% \begin{macro}[internal]{\enverb@body@setup} +% This function sets up the entire category code regime and initial +% assignments of special tokens. +% \begin{macrocode} +\protected\def\enverb@body@setup + {% + \let\enverbBody\@empty + \let\do\@makeother\dospecials + \endlinechar=`\^^M + \catcode`\^^M=13 \let~\enverb@body@newline + \catcode`\ =13 \let:\enverb@body@space + \catcode`\^^I=13 \let;\enverb@body@tab + \let\enverb@bol\relax + \let\enverb@eol\relax + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[internal] +% { +% \enverb@ifxanyTF, \enverb@ifxanyTF@, \enverb@ifxanyTF@ifdone, +% \enverb@ifxanyTF@F, \enverb@ifxanyTF@T +% } +% This function provides a loop to check a list of symbols whether any of them +% matches the meaning of the first argument. +% \begin{macrocode} +\long\def\enverb@ifxanyTF#1#2% + {\enverb@ifxanyTF@#1#2\enverb@ifxanyTF@} +\long\def\enverb@ifxanyTF@#1#2% + {% + \enverb@ifxanyTF@ifdone#2\enverb@ifxanyTF@F\enverb@ifxanyTF@ + \enverb@ifxTF#1#2\enverb@ifxanyTF@T{\enverb@ifxanyTF@#1}% + } +\long\def\enverb@ifxanyTF@ifdone#1\enverb@ifxanyTF@{} +\long\def\enverb@ifxanyTF@F + \enverb@ifxanyTF@\enverb@ifxTF#1\enverb@ifxanyTF@T#2#3#4% + {#4} +\long\def\enverb@ifxanyTF@T#1\enverb@ifxanyTF@#2#3{#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@search@oarg@a, \enverb@search@oarg@ifx} +% This function shall search for the optional argument. The first case is +% rather easy, namely we check for a space (remember that |:| is an active +% space character in the current context). If this isn't the first line (so +% the line containing the |\begin| statement) that space is added to the body +% and searching continues.\par +% Next repeat the same logic but for an active tab (|;|). Afterwards we check +% for an active newline (|~|) which if found sets the conditional for the +% first line to false, still applying the same logic otherwise.\par +% Lastly we check for the open bracket. If it's found we collect our optional +% argument, otherwise the body starts, which is either an illegal character +% immediately following the |\begin| line, or we normally collect the body. +% +% \begin{macrocode} +\def\enverb@search@oarg@ifx#1#2% + {% + \enverb@ifxTF#1\@let@token + {% + \ifenverb@firsteol#2\else\enverb@body@add{#1}\fi + \enverb@search@oarg@b + }% + } +\protected\def\enverb@search@oarg@a + {% + \enverb@search@oarg@ifx:{}% + {% + \enverb@search@oarg@ifx;{}% + {% + \enverb@search@oarg@ifx~\enverb@firsteolfalse + {% + \enverb@ifxTF{[}\@let@token + {\enverb@oarg}% + {% + \enverb@ifxanyTF\@let@token + {% + \@sptoken\par\bgroup\egroup$&##^_% $ + } + {% + \enverb@misused + \endgroup + }% + {% + \ifenverb@firsteol + \expandafter\enverb@body@after@begin + \else + \expandafter\enverb@body + \fi + }% + }% + }% + }% + }% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal] +% {\enverb@body, \enverb@body@after@oarg, \enverb@body@after@begin} +% The body collection works by collecting everything inside a macro in one +% sweep, and a second pass over the collected material to strip leading spaces +% if the |ignore| or |auto-ignore| feature is used. This macro starts the +% first sweep. Since during the collection of the optional argument we might +% already have collected a few tokens we place those at the start by expanding +% the current definition of |\enverbBody| once. +% \begin{macrocode} +\protected\def\enverb@body + {\edef\enverbBody{\iffalse}\fi\expandafter\enverb@collect\enverbBody} +% \end{macrocode} +% The other two macros also start collecting the body, but are only called +% after either an optional argument was found, or if the first non-ignored +% character of the optional argument search was encountered before the first +% newline. In both cases we check whether the remainder of that line can be +% considered blank, and if so collect the body. +% \begin{macrocode} +\def\enverb@body@after@oarg#1~% + {\enverb@ensure@blank{#1}{closing bracket}\enverb@body} +\def\enverb@body@after@begin#1~% + {\enverb@ensure@blank{#1}{\string\begin}\enverb@body} +% \end{macrocode} +% This is also the last place we need the strange category setup in, so we +% close the delimiting brace of the |\lowercase| above here. +% \begin{macrocode} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@ensure@blank} +% We actually need to define the check for an empty line. This check here +% works for our specifically set up regime of spaces and tabs (which both +% expand to nothing, the same trick is basically used twice, though we once +% fully expand and once use romannumeral-expansion). +% \begin{macrocode} +\newcommand\enverb@ensure@blank[2] + {% + \expandafter\enverb@ifempty\expanded{{#1}}{}% + {% + \expanded + {% + \noexpand\enverb@error + {% + Line after #2 not empty.\noexpand\MessageBreak + Contains: \detokenize\expandafter{\romannumeral`\^^@#1}% + }% + {% + \noexpand\enverb will try to ignore this. You should clean up + your input.% + }% + }% + }% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal] +% {\enverb@ifempty,\enverb@ifempty@,\enverb@ifempty@true} +% This is just a quick argument-grabbing based test for an empty argument. +% \begin{macrocode} +\newcommand\enverb@ifempty[1] + {% + \enverb@ifempty@\enverb@ifempty@A#1\enverb@ifempty@B.\enverb@ifempty@true + \enverb@ifempty@A\enverb@ifempty@B + } +\def\enverb@ifempty@#1\enverb@ifempty@A\enverb@ifempty@B#2#3{#3} +\def\enverb@ifempty@true\enverb@ifempty@A\enverb@ifempty@B#1#2{#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@add,\enverb@pre,\enverb@body@add} +% These are just two functions to add things to a token list storing macro, +% one is available for arbitrary contents, the other is used for the |body|. +% \begin{macrocode} +\protected\long\def\enverb@add#1#2{\edef#1{\unexpanded\expandafter{#1#2}}} +\protected\long\def\enverb@pre#1#2% + {\edef#1{\unexpanded{#2}\unexpanded\expandafter{#1}}} +\protected\def\enverb@body@add{\enverb@add\enverbBody} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\enverb} +% This macro is the front facing command that starts the entire grabbing +% logic. The first thing we need to do is define the auxiliary we use to check +% whether we're done collecting the body, which is dependent on the current +% environment's name. Next we store the mandatory argument in |marg| and +% initialise the |oarg|-storage, category regime, and |firsteol|-boolean. +% Finally we start searching for the optional argument. +% \begin{macrocode} +\NewDocumentCommand \enverb { s +m } + {% + \expandafter\enverb@ifnotend@setup@perhaps\expanded + {{\string{\@currenvir\string}}}% + \let\enverb@collected@oarg\@empty + \edef\enverb@collected@marg{\unexpanded{#2}}% + \begingroup + \enverb@body@setup + \IfBooleanTF{#1}% + {\enverb@body@after@begin}% + {% + \enverb@firsteoltrue + \enverb@search@oarg + }% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal] +% {\ifenverb@firsteol,\enverb@firsteoltrue,\enverb@firsteolfalse} +% A simple \TeX-style boolean to keep track whether we're in front of the +% first newline. +% \begin{macrocode} +\newif\ifenverb@firsteol +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@search@oarg, \enverb@search@oarg@b} +% The core function to search for an optional argument was already defined +% above, these are the first and third step of that functionality (starting +% and resuming to search). +% \begin{macrocode} +\protected\def\enverb@search@oarg{\futurelet\@let@token\enverb@search@oarg@a} +\protected\def\enverb@search@oarg@b{\expandafter\enverb@search@oarg\@gobble} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@oarg, \enverb@oarg@} +% This is used once the opening brace of the optional argument is found. First +% we close the group in which the body's category code regime is active, then +% we actually collect the optional argument with the normal category codes, +% restore the body's regime and collect it. +% \begin{macrocode} +\protected\def\enverb@oarg{\endgroup\enverb@oarg@} +\NewDocumentCommand\enverb@oarg@{+O{}} + {% + \enverb@add\enverb@collected@oarg{#1}% + \begingroup + \enverb@body@setup + \enverb@body@after@oarg + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@ifnotend, \enverb@ifnotend} +% These functions check whether the input contains the string representation +% |\end|. If it does they invoke \cs[no-index]{enverb@ifnotend@maybe} with the +% tokens in front of |\end| and after it as two arguments. Otherwise the third +% argument after \cs{enverb@ifnotend@}'s expansion is directly used, which is +% the second (curried) argument to \cs{enverb@ifnotend}. +% \begin{macrocode} +\newcommand\enverb@ifnotend[1]% + {% + \def\enverb@ifnotend##1% + {% + \enverb@ifnotend@ + ##1\enverb@mark\enverb@ifnotend@maybe + #1\enverb@mark\@thirdofthree + \enverb@stop + }% + \def\enverb@ifnotend@##1#1##2\enverb@mark##3##4\enverb@stop{##3{##1}{##2}}% + } +\expandafter\enverb@ifnotend\expanded{{\expandafter\@gobble\string\\end}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@ifnotend@maybe} +% This function will be used if an |\end| was encountered and should check +% whether that is indeed the end of our environment, it uses a second stage +% \cs[no-index]{enverb@ifnotend@perhaps} for that check. The |\romannumeral| +% expansion it employs will strip any leading spaces or tabs from |#2|. +% \begin{macrocode} +\newcommand\enverb@ifnotend@maybe[2] + {\expandafter\enverb@ifnotend@perhaps\expandafter{\romannumeral`\^^@#2}{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal] +% { +% \enverb@ifnotend@setup@perhaps, +% \enverb@ifnotend@perhaps, \enverb@ifnotend@perhaps@, +% \@thirdofthree +% } +% We need an expandable and fast check to see whether some input really +% contains the |\end| of our environment. Checking for |\end| itself is +% already done above, we need to check for the correct argument to it. The +% following does so by argument grabbing logic. +% \begin{macrocode} +\protected\def\enverb@ifnotend@setup@perhaps#1% + {% + \def\enverb@ifnotend@perhaps##1% + {% + \enverb@ifnotend@perhaps@\enverb@mark##1\enverb@mark\enverb@ifnotend@end + \enverb@mark#1\enverb@mark\@thirdofthree + \enverb@stop + }% + \def\enverb@ifnotend@perhaps@ + ##1\enverb@mark#1##2\enverb@mark##3##4\enverb@stop + {##3{##2}}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@ifnotend@end} +% If the correct |\end| statement was found this function will be called by +% \cs[no-index]{enverb@ifnotend@perhaps}. It's first argument will be anything +% in that line following the |\end| statement, the second argument will be the +% material in front of it. And |#3| will be whatever the argument to +% \cs[no-index]{enverb@ifnotend} was. +% +% The first thing we need to do is end the body collection by placing the +% matching closing brace. After that we throw an error on lost content after +% the |\end| if it's non-blank. And finally we need to smuggle the collected +% body outside the current group's scope. +% \begin{macrocode} +\def\enverb@ifnotend@end#1#2#3% + {% + \iffalse{\fi}% + \enverb@ensure@blank{#1}{\string\end}% + \expandafter\enverb@finalise\expandafter{\enverbBody}{#2}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@finalise} +% The finalising function closes the group containing the body's catcode +% regime. The already tokenised body is |#1|, and |#2| is the contents found +% in front of the |\end| statement, which we might use for the auto-ignore +% feature. +% +% It then does the key=val parsing, sets up the aftertreatment and assigns the +% final meaning to \cs{enverbBody}. Eventually it calls the end code of the +% enclosing environment. +% \begin{macrocode} +\protected\def\enverb@finalise#1#2% + {% + \endgroup + \expandafter\enverbsetup\expandafter{\enverb@collected@marg}% + \enverb@ifoargtokeyhandler + {% + \expandafter\enverb@keyhandler\expanded + {{% + \unexpanded\expandafter{\enverb@unknown@kv},% + \unexpanded\expandafter{\enverb@collected@oarg}% + }}% + }% + {% + \expandafter\enverbsetup\expandafter{\enverb@collected@oarg}% + \expandafter\enverb@keyhandler\expandafter{\enverb@unknown@kv}% + }% + \enverb@ifautoignore + {\enverb@setup@ignore{\enverb@count{#2}+\enverb@moreignore}}% + {\enverb@setup@ignore\enverb@ignore}% + \edef\enverb@line##1\enverb@eol + {% + \noexpand\unexpanded{##1}% + %\noexpand\detokenize{##1}% % TODO + \noexpand\unexpanded{\unexpanded\expandafter{\enverb@eol@content}}% + }% + \edef\enverbBody{#1}% + \expandafter\end\expandafter{\@currenvir}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[internal]{\enverb@setup@ignore, \enverb@setup@ignore@} +% \begin{macrocode} +\protected\def\enverb@setup@ignore#1% + {\expandafter\enverb@setup@ignore@\the\numexpr#1\relax;\enverb@line} +\protected\def\enverb@setup@ignore@#1;#2% + {% + \ifnum#1>9 + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {\expandafter\enverb@setup@ignore@\the\numexpr#1-8;{\@firstofnine{#2}}}% +% \end{macrocode} +% Just to make sure that |\renewcommand| works correctly, we ensure the macro +% exists. +% \begin{macrocode} + {% + \let\enverb@bol@gobble\@empty + \expanded + {% + \unexpanded{\renewcommand\enverb@bol@gobble}\ifnum#1>\z@[#1]\fi + {\unexpanded{#2}}% + \unexpanded{\def\enverb@bol##1\enverb@eol}% + {% + \noexpand\unexpanded + {\unexpanded\expandafter{\enverb@bol@content}}% + \unexpanded{\expandafter\enverb@ifempty\expanded}{{##1}}% + {\noexpand\enverb@line}% + {\noexpand\enverb@bol@gobble}% + ##1\noexpand\enverb@eol + }% + }% + }% + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Output Oriented Macros} +% +% \begin{macro}[internal]{\enverb@rmeol, \enverb@rmeol@} +% Many of our output routines require the |\scantokens| primitive. Since that +% one places an additional end of line at the end of its argument we need a +% way to remove it (this usually results in an additional space in the output +% otherwise). For that we place a comment character at the end of the input +% (if it's possible), if that's not available we hope that a stringified +% |\relax| will do. The code here will use \pkg{expl3} for ease of coding. +% \begin{macrocode} +\def\enverb@rmeol + {% + \ifnum\catcode`\%=14 + \enverb@chargen{`\%}{12}% + \expandafter\enverb@stop + \fi + \enverb@rmeol@0;% + \enverb@stop + } +\def\enverb@rmeol@#1;% + {% + \ifnum#1=128 + \string\relax + \expandafter\enverb@stop + \fi + \@firstofone + {% + \ifnum\catcode`\%=14 + \enverb@chargen{#1}{12}% + \expandafter\enverb@stop + \fi + \expandafter\enverb@rmeol@\the\numexpr#1+1;% + }% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\enverbExecute} +% \begin{macrocode} +\NewDocumentCommand\enverbExecute{} + {% + \begingroup + \newlinechar=`\^^M + \expandafter + \endgroup + \scantokens\expanded + {{% + \detokenize\expandafter{\enverbBody}% + \enverb@rmeol + }}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\enverbListing} +% \begin{macro}[internal]{\enverbListing@} +% \begin{macrocode} +\NewDocumentCommand \enverbListing { m m } + {% + \scantokens\expanded + {{% + \string\begin{#1}\detokenize{#2}\enverb@othercr + \detokenize\expandafter{\enverbBody}% + \string\end{#1}\enverb@othercr + \enverb@rmeol + }}% + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \gobbledocstriptag +%</pkg> diff --git a/macros/latex/contrib/enverb/preamble-examples.tex b/macros/latex/contrib/enverb/preamble-examples.tex new file mode 100644 index 0000000000..da18ed38a6 --- /dev/null +++ b/macros/latex/contrib/enverb/preamble-examples.tex @@ -0,0 +1,199 @@ +\makeatletter +\RequirePackage{enverb} +\global\let\enverb@ex@stored\@empty +\ekvdefinekeys{enverb/ex} + { + boolTF store = \enverb@ex@ifstore + ,invboolTF no-store = \enverb@ex@ifstore + ,boolTF restore = \enverb@ex@ifrestore + ,boolTF no-lst = \enverb@ex@ifnolst + ,also nmeta no-lst = below + ,nmeta undo-no-lst = {no-lst=false, undo-below} + ,boolTF no-tcb = \enverb@ex@ifnotcb + ,also nmeta no-tcb = below + ,nmeta undo-no-tcb = {no-tcb=false, undo-below} + ,boolTF same-line = \enverb@ex@ifsameline + ,unknown-choice same-line = + \let\enverb@ex@ifsameline\@firstoftwo\def\enverb@ex@codeshare{#1} + ,initial same-line = 0.6 + ,invboolTF other-line = \enverb@ex@ifsameline + ,nmeta below = {other-line} + ,nmeta undo-below = {same-line} + ,store inter = \enverb@ex@inter + ,code aboveskip = \def\enverb@ex@above{\vskip#1\relax} + ,code belowskip = \def\enverb@ex@below{\vskip#1\relax} + ,default aboveskip = \medskipamount + ,default belowskip = \medskipamount + ,initial aboveskip + ,initial belowskip + ,noval no-aboveskip = \let\enverb@ex@above\@empty + ,noval no-belowskip = \let\enverb@ex@below\@empty + % listings + ,store lst = \enverb@ex@options@lst + ,initial lst = {aboveskip=0pt, belowskip=0pt} + ,store same-line-lst = \enverb@ex@options@lst@same + ,meta slst = same-line-lst={#1} + ,store other-line-lst = \enverb@ex@options@lst@other + ,meta olst = other-line-lst={#1} + % tcolorbox + ,store tcb = \enverb@ex@options@tcb + ,initial tcb = {nobeforeafter} + ,store same-line-tcb = \enverb@ex@options@tcb@same + ,initial same-line-tcb = {box align=center} + ,meta stcb = same-line-tcb={#1} + ,store other-line-tcb = \enverb@ex@options@tcb@other + ,meta otcb = other-line-tcb={#1} + } +\newenvironment{ex} + {\enverb{key-set=enverb/ex}} + {% + \par + \enverb@ex@above + \noindent + \expanded{\noexpand\begin{exwrap}{\enverb@ex@ifsameline{}{breakable}}} + \enverb@ex@ifnolst + {}% + {% + \enverb@ex@ifsameline + {\noindent\begin{minipage}[c]{\enverb@ex@codeshare\linewidth}}% + {}% + \ExpandArgs{ne}\enverbListing{lstlisting}% + {% + [{% + \unexpanded\expandafter{\enverb@ex@options@lst},% + \enverb@ex@ifsameline + {\unexpanded\expandafter{\enverb@ex@options@lst@same}}% + {\unexpanded\expandafter{\enverb@ex@options@lst@other}}% + }]% + }% + \enverb@ex@ifsameline + {\end{minipage}}% + {}% + }% + \enverb@ex@ifstore + {% + \xdef\enverb@ex@stored + {% + \unexpanded\expandafter{\enverb@ex@stored}% + \unexpanded\expandafter{\enverbBody}% + }% + }% + {}% + \enverb@ex@ifrestore + {% + \edef\enverbBody + {% + \unexpanded\expandafter{\enverb@ex@stored}% + \unexpanded\expandafter{\enverbBody}% + }% + \global\let\enverb@ex@stored\@empty + }% + {}% + \enverb@ex@ifnotcb + {}% + {% + \enverb@ex@ifsameline{}{\medskip}% + \expanded{\noexpand\begin{exbox}% + {% + \unexpanded\expandafter{\enverb@ex@options@tcb},% + \enverb@ex@ifsameline + {\unexpanded\expandafter{\enverb@ex@options@tcb@same}}% + {\unexpanded\expandafter{\enverb@ex@options@tcb@other}}% + }}% + {\linewidth\enverb@ex@ifsameline{-\enverb@ex@codeshare\linewidth}{}}% + \enverbExecute + \end{exbox}% + }% + \end{exwrap}% + \par + \enverb@ex@below + \@endpetrue + } + +\RequirePackage{listings}% >>= +\newcommand\extexcsstyle{\exbasestyle\color{green!50!black}\bfseries} +\newcommand\exbasestyle{\ttfamily} +\lstset + { + language=[LaTeX]TeX + ,flexiblecolumns=true + ,basicstyle=\exbasestyle + ,texcsstyle=*\extexcsstyle + ,moretexcs=% + {% + UseName,ExpandArgs,textcolor,color,colorbox,expanded,unexpanded,@empty,% + @firstoftwo,@endpetrue,RequirePackage,lstset,usetikzlibrary,% + pgfmathsetseed,newtcolorbox,tcbsubskin,tikzset,dimexpr% + } + ,moretexcs=[2]{enverb,enverbBody,enverbExecute,enverbListing} + ,texcsstyle=*[2]\exbasestyle\color{enverbred}\bfseries + ,literate={\{}{{\extexcsstyle\string{\iffalse}\fi}}{1} + {\}}{{\extexcsstyle\iffalse{\fi\string}}}{1} + }% =<< +\RequirePackage[most]{tcolorbox}%>>= +\RequirePackage{tikz} +\usetikzlibrary{decorations.pathmorphing,calc} +\pgfmathsetseed{1} % To have predictable results +% Define paper style +\tikzset{ + % based on https://tex.stackexchange.com/questions/580671 + ragged border/.style={% + decoration={random steps, segment length=2mm, amplitude=0.5mm}, + decorate, + } +} +\tcbsubskin{exwrap}{standard} + {% + width=\linewidth + ,colframe=enverbgrey + ,colback=enverbred!15!white + ,title=Example + ,nobeforeafter + ,arc=5mm + ,sharp corners=northwest + ,toprule at break=-1sp + ,bottomrule at break=-1sp + } +\tcbsubskin{exwrap-first}{exwrap}{sharp corners=south} +\tcbsubskin{exwrap-mid}{exwrap}{sharp corners=all} +\tcbsubskin{exwrap-last}{exwrap}{sharp corners=north} +\newtcolorbox{exbox}[2] + {% + colback=white% + ,colframe=white% + ,geometry nodes=true + ,interior code= + {% + \fill[white] + decorate[ragged border]{ + ($(frame.south east) - (0, 1mm)$) -- + ($(frame.south west) - (0, 1mm)$) + } + -- (frame.south west) -- ++(0, 1pt) -| (frame.south east) -- cycle; + \fill[white] + decorate[ragged border]{ + ($(frame.north east) + (0, 1mm)$) -- + ($(frame.north west) + (0, 1mm)$) + } + -- (frame.north west) -- ++(0, -1pt) -| (frame.north east) -- cycle; + } + ,fontupper=\small + ,width={\dimexpr#2\relax}% + ,sharp corners=all + ,boxsep=0pt + ,top=\fboxsep + ,bottom=\fboxsep + ,left=\fboxsep + ,right=\fboxsep + ,#1% + } +\newtcolorbox{exwrap}[1] + {% + skin=exwrap + ,skin first=exwrap-first + ,skin middle=exwrap-mid + ,skin last=exwrap-last + ,#1% + } +%=<< +\makeatother diff --git a/macros/latex/contrib/enverb/preamble-logo.tex b/macros/latex/contrib/enverb/preamble-logo.tex new file mode 100644 index 0000000000..177f8f3e26 --- /dev/null +++ b/macros/latex/contrib/enverb/preamble-logo.tex @@ -0,0 +1,25 @@ +\definecolor{enverbred}{HTML}{9F393D} +\colorlet{enverbgrey}{black!75} +\newcommand\envlogo% >>= + {% + \texorpdfstring + {\envLogo}% + {enverb}% + }% =<< +\protected\def\envLogo% >>= + {% + \mbox + {% + \BeginAccSupp{ActualText=enverb}% + \href{https://gitlab.com/islandoftex/texmf/enverb}{\envLogoFormat}% + \EndAccSupp{}% + }% + }% =<< +\protected\def\envLogoFormat% >>= + {% + \begingroup + \normalfont\rmfamily\bfseries + \textcolor{enverbgrey}{en\kern-0.045em v}\kern-.485em + \textcolor{enverbred}{v\kern-0.045em erb}% + \endgroup + }% =<< diff --git a/macros/latex/contrib/l3packages/CHANGELOG.md b/macros/latex/contrib/l3packages/CHANGELOG.md index cd9143da08..a49c43396d 100644 --- a/macros/latex/contrib/l3packages/CHANGELOG.md +++ b/macros/latex/contrib/l3packages/CHANGELOG.md @@ -7,6 +7,13 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2024-08-16] + +### Fixed +- Support for optimised commands using `\GetDocumentCommandArgSpec` (issue + [\#1550](https://github.com/latex3/latex3/issues/1550)) +- Unmatched `macrocode` environment in `xtemplate` + ## [2024-05-08] ### Changed @@ -259,7 +266,8 @@ this project uses date-based 'snapshot' version identifiers. - Switch to ISO date format - Improve cross-module use of internal functions -[Unreleased]: https://github.com/latex3/latex3/compare/2024-05-08...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2024-08-16...HEAD +[2024-08-16]: https://github.com/latex3/latex3/compare/2024-05-08...2024-08-16 [2024-05-08]: https://github.com/latex3/latex3/compare/2024-03-14...2024-05-08 [2024-03-14]: https://github.com/latex3/latex3/compare/2024-02-18...2024-03-14 [2024-02-18]: https://github.com/latex3/latex3/compare/2024-02-13...2024-02-18 diff --git a/macros/latex/contrib/l3packages/README.md b/macros/latex/contrib/l3packages/README.md index 10899672d6..dfdc1135ba 100644 --- a/macros/latex/contrib/l3packages/README.md +++ b/macros/latex/contrib/l3packages/README.md @@ -1,6 +1,6 @@ # `l3packages`: Higher-level LaTeX3 Concepts (Deprecated) -Release 2024-05-08 +Release 2024-08-16 ## Overview diff --git a/macros/latex/contrib/l3packages/l3keys2e.dtx b/macros/latex/contrib/l3packages/l3keys2e.dtx index 2e5c419165..e8f6416012 100644 --- a/macros/latex/contrib/l3packages/l3keys2e.dtx +++ b/macros/latex/contrib/l3packages/l3keys2e.dtx @@ -62,7 +62,7 @@ % }^^A % } % -% \date{Released 2024-05-08} +% \date{Released 2024-08-16} % % \maketitle % @@ -154,7 +154,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3keys2e}{2024-05-08}{} +\ProvidesExplPackage{l3keys2e}{2024-08-16}{} {LaTeX2e option processing using LaTeX3 keys} % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/l3keys2e.pdf b/macros/latex/contrib/l3packages/l3keys2e.pdf Binary files differindex df3821afb8..90c356f225 100644 --- a/macros/latex/contrib/l3packages/l3keys2e.pdf +++ b/macros/latex/contrib/l3packages/l3keys2e.pdf diff --git a/macros/latex/contrib/l3packages/xfp.dtx b/macros/latex/contrib/l3packages/xfp.dtx index fe8dcd51b1..6e95e42901 100644 --- a/macros/latex/contrib/l3packages/xfp.dtx +++ b/macros/latex/contrib/l3packages/xfp.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2024-05-08} +% \date{Released 2024-08-16} % % \maketitle % @@ -171,7 +171,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfp}{2024-05-08}{} +\ProvidesExplPackage{xfp}{2024-08-16}{} {L3 Floating point unit} % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/xfp.pdf b/macros/latex/contrib/l3packages/xfp.pdf Binary files differindex 2097c2b079..8640b3600d 100644 --- a/macros/latex/contrib/l3packages/xfp.pdf +++ b/macros/latex/contrib/l3packages/xfp.pdf diff --git a/macros/latex/contrib/l3packages/xparse.dtx b/macros/latex/contrib/l3packages/xparse.dtx index 62ac19ff25..ac0ee03d3f 100644 --- a/macros/latex/contrib/l3packages/xparse.dtx +++ b/macros/latex/contrib/l3packages/xparse.dtx @@ -67,7 +67,7 @@ % }^^A % } % -% \date{Released 2024-05-08} +% \date{Released 2024-08-16} % % \maketitle % @@ -1079,7 +1079,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xparse}{2024-05-08}{} +\ProvidesExplPackage{xparse}{2024-08-16}{} {L3 Experimental document command parser} % \end{macrocode} % @@ -1436,13 +1436,30 @@ % % \begin{macro}{\@@_get_arg_spec:NTF} % If the command is not an \pkg{xparse} command, complain. If it is, -% its second \enquote{item} is the argument specification. +% its second \enquote{item} is the argument specification unless the +% command is optimised: in the latter case, we can reconstruct the +% spec. % \begin{macrocode} \cs_gset_protected:Npn \@@_get_arg_spec:NTF #1#2#3 { \__kernel_cmd_if_xparse:NTF #1 { - \tl_set:Ne \ArgumentSpecification { \tl_item:Nn #1 { 2 } } + \tl_set:Ne \ArgumentSpecification + { + \exp_args:No \tl_if_head_eq_meaning:nNTF {#1} \@@_start_optimized: + { + \prg_replicate:nn + { + \str_count:e + { + \exp_args:Nc \cs_parameter_spec:N + { \cs_to_str:N #1 \c_space_tl code } + } / 2 + } + { m } + } + { \tl_item:Nn #1 { 2 } } + } #2 } {#3} diff --git a/macros/latex/contrib/l3packages/xparse.pdf b/macros/latex/contrib/l3packages/xparse.pdf Binary files differindex bb31c0a5e6..b9c39f43c3 100644 --- a/macros/latex/contrib/l3packages/xparse.pdf +++ b/macros/latex/contrib/l3packages/xparse.pdf diff --git a/macros/latex/contrib/l3packages/xtemplate.dtx b/macros/latex/contrib/l3packages/xtemplate.dtx index 7d20c6142f..17715905ad 100644 --- a/macros/latex/contrib/l3packages/xtemplate.dtx +++ b/macros/latex/contrib/l3packages/xtemplate.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2024-05-08} +% \date{Released 2024-08-16} % % \maketitle % @@ -704,7 +704,7 @@ \endinput } {% - \ProvidesExplPackage{xtemplate}{2024-05-08}{} + \ProvidesExplPackage{xtemplate}{2024-08-16}{} {L3 Experimental prototype document functions} \long\protected\def\DeclareRestrictedTemplate#1#2#3#4{% \DeclareTemplateCopy{#1}{#3}{#2}% @@ -722,6 +722,7 @@ % \end{macro} % \end{macro} % +% \begin{macrocode} %</package> % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/xtemplate.pdf b/macros/latex/contrib/l3packages/xtemplate.pdf Binary files differindex b70bd7c991..44e90a9163 100644 --- a/macros/latex/contrib/l3packages/xtemplate.pdf +++ b/macros/latex/contrib/l3packages/xtemplate.pdf diff --git a/macros/latex/contrib/media9/ChangeLog b/macros/latex/contrib/media9/ChangeLog index a0a11296e1..712cf2598e 100644 --- a/macros/latex/contrib/media9/ChangeLog +++ b/macros/latex/contrib/media9/ChangeLog @@ -1,3 +1,10 @@ +2024-08-28 + * v1.26 : media9.sty + * v0.56 : pdfbase.sty + * fix : dvi magnification by \mag internal TeX command (pdfbase.sty); + PDF/A compliance (fixes agrahn/ocgx2#21) + * new: hooks for adding actions at begin and end of text column + 2022-08-04 * v1.25 : media9.sty * v0.55 : pdfbase.sty diff --git a/macros/latex/contrib/media9/doc/media9.pdf b/macros/latex/contrib/media9/doc/media9.pdf Binary files differindex 2b85529903..526dc37408 100644 --- a/macros/latex/contrib/media9/doc/media9.pdf +++ b/macros/latex/contrib/media9/doc/media9.pdf diff --git a/macros/latex/contrib/media9/media9.sty b/macros/latex/contrib/media9/media9.sty index c1e00febb4..9651cd0468 100644 --- a/macros/latex/contrib/media9/media9.sty +++ b/macros/latex/contrib/media9/media9.sty @@ -39,8 +39,8 @@ % % The Current Maintainer of this work is A. Grahn. -\def\g@mix@date@tl{2022/08/04} -\def\g@mix@version@tl{1.25} +\def\g@mix@date@tl{2024/08/28} +\def\g@mix@version@tl{1.26} \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage{media9}{\g@mix@date@tl}{\g@mix@version@tl} @@ -2446,8 +2446,8 @@ % % The Current Maintainer of this work is A. Grahn. -\def\g@mix@date@tl{2022/08/04} -\def\g@mix@version@tl{1.25} +\def\g@mix@date@tl{2024/08/28} +\def\g@mix@version@tl{1.26} \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage{media9}{\g@mix@date@tl}{\g@mix@version@tl} diff --git a/macros/latex/contrib/media9/pdfbase.sty b/macros/latex/contrib/media9/pdfbase.sty index 67ff708ad5..66c76fff80 100644 --- a/macros/latex/contrib/media9/pdfbase.sty +++ b/macros/latex/contrib/media9/pdfbase.sty @@ -156,8 +156,8 @@ % % The Current Maintainer of this work is A. Grahn. -\def\g@pbs@date@tl{2022/08/04} -\def\g@pbs@version@tl{0.55} +\def\g@pbs@date@tl{2024/08/28} +\def\g@pbs@version@tl{0.56} \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage{pdfbase}{\g@pbs@date@tl}{\g@pbs@version@tl} @@ -220,11 +220,11 @@ {dvipdfmx}{ \bool_gset_true:N\g_pbs_dvipdfmx_bool \bool_gset_false:N\g_pbs_dvisvgm_bool - } + } {dvisvgm}{ \bool_gset_false:N\g_pbs_dvipdfmx_bool \bool_gset_true:N\g_pbs_dvisvgm_bool - } + } }{ % otherwise let the L3 backend code decide \str_case_e:nn{\c_sys_backend_str}{ {dvisvgm}{ @@ -270,6 +270,12 @@ \seq_new:N\g_pbs_bop_seq \seq_new:N\g_pbs_eop_seq +% column (boc, eoc) hooks +\cs_new_protected:Nn\pbs_boc_action:n{\seq_gput_right:Nn\g_pbs_boc_seq{#1}} +\cs_new_protected:Nn\pbs_eoc_action:n{\seq_gput_right:Nn\g_pbs_eoc_seq{#1}} +\seq_new:N\g_pbs_boc_seq +\seq_new:N\g_pbs_eoc_seq + \bool_new:N\g_pbs_lscape_bool %if we are inside landscape env \bool_new:N\g_pbs_ocgbase_loaded_bool \AtBeginDocument{ @@ -1105,8 +1111,8 @@ \mode_leave_vertical: % resources are managed automatically %rescale box to fit within the papersize while distilling \tl_gset:cx{scale_{pbs@obj\int_use:N\g_pbs_obj_int}}{\fp_eval:n{min(1.0, - \dim_ratio:nn{\paperwidth}{\box_wd:N#5}, - \dim_ratio:nn{\paperheight}{\box_ht:N#5+\box_dp:N#5} + \dim_ratio:nn{\paperwidth}{\box_wd:N#5}/\the\mag*1000, + \dim_ratio:nn{\paperheight}{\box_ht:N#5+\box_dp:N#5}/\the\mag*1000 )}} \box_scale:Nnn#5{ \tl_use:c{scale_{pbs@obj\int_use:N\g_pbs_obj_int}} @@ -1302,33 +1308,39 @@ \tl_gput_left:Nx\g_pbs_fields_tl{#1\space} } -%modify output routine for output box insertions -\bool_new:N\l_pbs_is_vertical_bool +% modify page output routine for inserting actions at begin and end \cs_set_eq:NN\pbs_outputpage_orig:\@outputpage \cs_set_protected_nopar:Npn\@outputpage{ - \int_gincr:N\g_pbs_page_int - \box_if_vertical:cTF{@outputbox}{ - \bool_set_true:N\l_pbs_is_vertical_bool - }{ - \bool_set_false:N\l_pbs_is_vertical_bool - } - \hbox_set:Nn\@outputbox{ + \vbox_set:Nn\@outputbox{ %begin of page - \hbox_overlap_right:n{\seq_map_inline:Nn\g_pbs_bop_seq{##1}} + \seq_map_inline:Nn\g_pbs_bop_seq{##1} \box_use_drop:N\@outputbox %end of page - \hbox_overlap_right:n{\seq_map_inline:Nn\g_pbs_eop_seq{##1}} - } - \bool_if:NT\l_pbs_is_vertical_bool{ - \vbox_set:Nn\@outputbox{\box_use_drop:N\@outputbox} + \seq_map_inline:Nn\g_pbs_eop_seq{##1} } \pbs_outputpage_orig: } +% modify column making routine for inserting actions at begin and end +\cs_set_eq:NN\pbs_makecol_orig:\@makecol +\cs_set_protected_nopar:Npn\@makecol{ + \vbox_set:Nn\@cclv{ + %begin of column + \seq_map_inline:Nn\g_pbs_boc_seq{##1} + \vbox_unpack_drop:N\@cclv + %end of column + \seq_map_inline:Nn\g_pbs_eoc_seq{##1} + } + \pbs_makecol_orig: +} + +\AddToHook{shipout}{\int_gincr:N\g_pbs_page_int} + \AddToHook{shipout/foreground}{ %insert /Properties into current page's resources \put(0,0){\pbs_insert_properties_entry:} } + \AddToHook{shipout/background}{ % workaround for curious AR bug (pdf annot or link placed on % OCG remains active although OCG is hidden) @@ -1336,8 +1348,14 @@ % somewhere on the page. \bool_if:NT\g_pbs_ocgbase_loaded_bool{ \put(1,-1){ + \tl_if_exist:NF\g_pbs_blank_xform_tl{ + \hbox_set:Nn\l_tmpa_box{\phantom{\rule{1pt}{1pt}}} + \pbs_pdfxform:nnnnn{}{1}{}{}{\l_tmpa_box} + \tl_const:Ne\g_pbs_blank_xform_tl{\pbs_pdflastxform:} + } \pbs_pdfannot:nnnn{3bp}{\c_zero_dim}{3bp}{ - /Ff~65537/FT/Btn/Subtype/Widget + /Ff~65537/FT/Btn/Subtype/Widget/F~4 + /AP~<</N~<</On~\g_pbs_blank_xform_tl>>>> /T~(pbs@ARFix@\int_use:N\g_pbs_page_int) } } @@ -1435,8 +1453,8 @@ % `fstream', then % {stream attributes as PDF key-value dictionary}{file name} % -% if #3 && #1 are both empty, an object reference will be reserved for later -% use as #1 +% if #3 && #1 are both empty, an object reference will be reserved for +% later use as #1 % % \pbs_pdflastobj: % inserts object ID of PDF object created/processed during most recent call @@ -1471,9 +1489,9 @@ % -------- % % \pbs_pdfxform:nnnnn -% #1: add pgf/tikz resources (transparency, shading)? (0|1) %dvipdfmx/xetex +% #1: add pgf/tikz resources (transparency, shading)? (0|1); dvipdfmx/xetex % #2: write immediately to PDF? (0|1); eg 1 for appearances; pdftex/luatex -% #3: additional resources %all BUT dvips +% #3: additional resources; all BUT dvips % #4: additional dictionary entries % #5: savebox number % creates PDF Form XObject from savebox content @@ -1539,8 +1557,8 @@ % % The Current Maintainer of this work is A. Grahn. -\def\g@pbs@date@tl{2022/08/04} -\def\g@pbs@version@tl{0.55} +\def\g@pbs@date@tl{2024/08/28} +\def\g@pbs@version@tl{0.56} \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage{pdfbase}{\g@pbs@date@tl}{\g@pbs@version@tl} @@ -1603,11 +1621,11 @@ {dvipdfmx}{ \bool_gset_true:N\g_pbs_dvipdfmx_bool \bool_gset_false:N\g_pbs_dvisvgm_bool - } + } {dvisvgm}{ \bool_gset_false:N\g_pbs_dvipdfmx_bool \bool_gset_true:N\g_pbs_dvisvgm_bool - } + } }{ % otherwise let the L3 backend code decide \str_case_e:nn{\c_sys_backend_str}{ {dvisvgm}{ @@ -1653,8 +1671,16 @@ \seq_new:N\g_pbs_bop_seq \seq_new:N\g_pbs_eop_seq -\bool_new:N\g_pbs_lscape_bool %if we are inside landscape env +% column (boc, eoc) hooks +\cs_new_protected:Nn\pbs_boc_action:n{\seq_gput_right:Nn\g_pbs_boc_seq{#1}} +\cs_new_protected:Nn\pbs_eoc_action:n{\seq_gput_right:Nn\g_pbs_eoc_seq{#1}} +\seq_new:N\g_pbs_boc_seq +\seq_new:N\g_pbs_eoc_seq + \bool_new:N\g_pbs_ocgbase_loaded_bool +\AddToHook{package/ocgbase/after}{\bool_gset_true:N\g_pbs_ocgbase_loaded_bool} + +\bool_new:N\g_pbs_lscape_bool %if we are inside landscape env \AtBeginDocument{ \iow_now:Nx\@mainaux{ \token_to_str:N\providecommand\token_to_str:N\pbs@newkey[2]{} @@ -1666,7 +1692,6 @@ \tl_put_right:Nn\landscape{\bool_gset_true:N\g_pbs_lscape_bool} \tl_put_left:Nn\endlandscape{\bool_gset_false:N\g_pbs_lscape_bool} } - \@ifpackageloaded{ocgbase}{\bool_gset_true:N\g_pbs_ocgbase_loaded_bool}{} } % writing to core objects in the PDF, using the new pdfmanagement interface @@ -1851,7 +1876,9 @@ \xsb_addto_props:n{/rm@oc\int_use:N\g_pbs_oc_int\space#2} \int_gincr:N\g_pbs_oc_int }{ - \pdf_bdcobject:nx{#1}{\tl_use:c{g_pbs_objname_#2_tl}} + \tl_if_exist:cT{g_pbs_objname_#2_tl}{ + \exp_args:Nne\pdf_bdcobject:nn{#1}{\tl_use:c{g_pbs_objname_#2_tl}} + } } } @@ -1868,9 +1895,7 @@ %pgf + transparency related settings \bool_new:N\g_pbs_pgfloaded_bool \bool_gset_false:N\g_pbs_pgfloaded_bool - \AtBeginDocument{ - \@ifpackageloaded{pgf}{\bool_gset_true:N\g_pbs_pgfloaded_bool}{} - } + \AddToHook{package/pgf/after}{\bool_gset_true:N\g_pbs_pgfloaded_bool} \int_new:N\g_pbs_obj_int %object ID \bool_if:NTF\g_pbs_dvipdfmx_bool{ %dvipdfmx/XeTeX \AtBeginDocument{ @@ -2042,7 +2067,9 @@ } \cs_new_protected_nopar:Nn\pbs_pdfbdc:nn{ - \pdf_bdcobject:nx{#1}{\tl_use:c{g_pbs_objname_#2_tl}} + \tl_if_exist:cT{g_pbs_objname_#2_tl}{ + \exp_args:Nne\pdf_bdcobject:nn{#1}{\tl_use:c{g_pbs_objname_#2_tl}} + } } }{ \bool_if:NTF\g_pbs_dvisvgm_bool{ @@ -2436,8 +2463,8 @@ \mode_leave_vertical: % resources are managed automatically %rescale box to fit within the papersize while distilling \tl_gset:cx{scale_{pbs@obj\int_use:N\g_pbs_obj_int}}{\fp_eval:n{min(1.0, - \dim_ratio:nn{\paperwidth}{\box_wd:N#5}, - \dim_ratio:nn{\paperheight}{\box_ht:N#5+\box_dp:N#5} + \dim_ratio:nn{\paperwidth}{\box_wd:N#5}/\the\mag*1000, + \dim_ratio:nn{\paperheight}{\box_ht:N#5+\box_dp:N#5}/\the\mag*1000 )}} \box_scale:Nnn#5{ \tl_use:c{scale_{pbs@obj\int_use:N\g_pbs_obj_int}} @@ -2602,7 +2629,6 @@ } } } -\cs_generate_variant:Nn\pdf_bdcobject:nn{nx} \cs_new_eq:NN\pbs_pdfemc:\pdf_emc: \cs_new_nopar:Nn\pbs_pdflastobj:{\g_pbs_pdflastobj_tl} @@ -2610,29 +2636,34 @@ \cs_new_nopar:Nn\pbs_pdflastxform:{\g_pbs_pdflastxform_tl} \cs_new_nopar:Nn\pbs_pdflastximage:{\g_pbs_pdflastximage_tl} -%modify output routine for output box insertions -\bool_new:N\l_pbs_is_vertical_bool +% modify page output routine for inserting actions at begin and end \cs_set_eq:NN\pbs_outputpage_orig:\@outputpage \cs_set_protected_nopar:Npn\@outputpage{ - \int_gincr:N\g_pbs_page_int - \box_if_vertical:cTF{@outputbox}{ - \bool_set_true:N\l_pbs_is_vertical_bool - }{ - \bool_set_false:N\l_pbs_is_vertical_bool - } - \hbox_set:Nn\@outputbox{ + \vbox_set:Nn\@outputbox{ %begin of page - \hbox_overlap_right:n{\seq_map_inline:Nn\g_pbs_bop_seq{##1}} + \seq_map_inline:Nn\g_pbs_bop_seq{##1} \box_use_drop:N\@outputbox %end of page - \hbox_overlap_right:n{\seq_map_inline:Nn\g_pbs_eop_seq{##1}} - } - \bool_if:NT\l_pbs_is_vertical_bool{ - \vbox_set:Nn\@outputbox{\box_use_drop:N\@outputbox} + \seq_map_inline:Nn\g_pbs_eop_seq{##1} } \pbs_outputpage_orig: } +% modify column making routine for inserting actions at begin and end +\cs_set_eq:NN\pbs_makecol_orig:\@makecol +\cs_set_protected_nopar:Npn\@makecol{ + \vbox_set:Nn\@cclv{ + %begin of column + \seq_map_inline:Nn\g_pbs_boc_seq{##1} + \vbox_unpack_drop:N\@cclv + %end of column + \seq_map_inline:Nn\g_pbs_eoc_seq{##1} + } + \pbs_makecol_orig: +} + +\AddToHook{shipout}{\int_gincr:N\g_pbs_page_int} + \AddToHook{shipout/background}{ % workaround for curious AR bug (pdf annot or link placed on % OCG remains active although OCG is hidden) @@ -2640,8 +2671,14 @@ % somewhere on the page. \bool_if:NT\g_pbs_ocgbase_loaded_bool{ \put(1,-1){ + \tl_if_exist:NF\g_pbs_blank_xform_tl{ + \hbox_set:Nn\l_tmpa_box{\phantom{\rule{1pt}{1pt}}} + \pbs_pdfxform:nnnnn{}{1}{}{}{\l_tmpa_box} + \tl_const:Ne\g_pbs_blank_xform_tl{\pbs_pdflastxform:} + } \pbs_pdfannot:nnnn{3bp}{\c_zero_dim}{3bp}{ - /Ff~65537/FT/Btn/Subtype/Widget + /Ff~65537/FT/Btn/Subtype/Widget/F~4 + /AP~<</N~<</On~\g_pbs_blank_xform_tl>>>> /T~(pbs@ARFix@\int_use:N\g_pbs_page_int) } } diff --git a/macros/latex/contrib/ocgx2/ChangeLog b/macros/latex/contrib/ocgx2/ChangeLog index 65ca63a13d..2aa9c20179 100644 --- a/macros/latex/contrib/ocgx2/ChangeLog +++ b/macros/latex/contrib/ocgx2/ChangeLog @@ -1,3 +1,8 @@ +2024-08-28 + * v0.58: ocgx2.sty + * v0.23: ocgbase.sty + * fix: OCG hierarchy shown in the viewer's Layer tab + 2024-03-18 * v0.57: ocgx2.sty * fix: fixed link border in pdfmanagement-testphase version diff --git a/macros/latex/contrib/ocgx2/ocgbase.sty b/macros/latex/contrib/ocgx2/ocgbase.sty index bf4edf432b..690bd593ce 100644 --- a/macros/latex/contrib/ocgx2/ocgbase.sty +++ b/macros/latex/contrib/ocgx2/ocgbase.sty @@ -100,8 +100,8 @@ % % The Current Maintainer of this work is A. Grahn. -\def\g@ocgbase@date@tl{2022/08/04} -\def\g@ocgbase@version@tl{0.22} +\def\g@ocgbase@date@tl{2024/08/28} +\def\g@ocgbase@version@tl{0.23} \ProvidesExplPackage{ocgbase}{\g@ocgbase@date@tl}{\g@ocgbase@version@tl} {support package for ocgx2.sty} @@ -167,10 +167,8 @@ %global Order list \tl_new:N\l_ocgbase_ocgorderentry_tl \tl_new:N\l_ocgbase_ocgorder_tl - \tl_if_exist:cT{g_ocgbase_nd_0_chld_tl}{ - \ocgbase_build_order:Nn\l_ocgbase_ocgorder_tl{ - \tl_use:c{g_ocgbase_nd_0_chld_tl} - } + \seq_if_empty:NF\g_ocgbase_order_root_seq{ + \ocgbase_build_order:Nn\l_ocgbase_ocgorder_tl{root} } \tl_if_empty:NF\l_ocgbase_ocgorder_tl{ \pbs_pdfobj:nnn{}{array}{\l_ocgbase_ocgorder_tl} @@ -228,98 +226,45 @@ \cs_new_nopar:Nn\ocgbase_last_ocg:{\g_ocgbase_last_ocg_tl} -\int_new:N\g_ocgbase_nd_int %node id -\seq_new:N\g_ocgbase_tree_nd_stack_seq %stack with open ocg node id -\seq_new:N\g_ocgbase_tree_ocg_stack_seq %stack with open ocg obj number -\seq_gpush:Nn\g_ocgbase_tree_nd_stack_seq{0} %push root node -\seq_gpush:Nn\g_ocgbase_tree_ocg_stack_seq{null} %push root node +\seq_new:N\g_ocgbase_open_ocg_seq %stack with open ocg ref +\seq_new:N\g_ocgbase_order_root_seq %seq taking ocg ref /Order root -%macro for starting OCG object (and nested children) insertion into Order +%macro for starting OCG object (and nested children) insertion into order %hierarchy (shown as tree structure in the viewers `Layers' tab \cs_new_protected_nopar:Nn\ocgbase_tree_node_begin:n{ % #1: OCG obj - %get the parent node from stack - \seq_get:NN\g_ocgbase_tree_nd_stack_seq\l__ocgbase_prnt_tl - \tl_if_exist:cTF{g_ocgbase_nd_\l__ocgbase_prnt_tl _chld_tl}{ - %parent has >=1 children (i. e. my older siblings), traverse them - \tl_set:Nv\l__ocgbase_prev_sbl_tl{g_ocgbase_nd_\l__ocgbase_prnt_tl _chld_tl} - \tl_set:Nx\l__ocgbase_cur_ocg_tl{#1} - \ocgbase_traverse_siblings:NN\l__ocgbase_prev_sbl_tl\l__ocgbase_cur_ocg_tl - \str_if_empty:NTF\l__ocgbase_cur_ocg_tl{ - %I am the first child of my parent to refer to OCG #1 - \int_gincr:N\g_ocgbase_nd_int - \tl_set:Nx\l__ocgbase_cur_nd_tl{\int_use:N\g_ocgbase_nd_int} - %set myself as my next-older sibling's `next sibling' - \tl_gset:cV{ - g_ocgbase_nd_\l__ocgbase_prev_sbl_tl _sbl_tl}\l__ocgbase_cur_nd_tl - }{ - %there is already a sibling referring to OCG #1; no new node needs be - %created - \tl_set:NV\l__ocgbase_cur_nd_tl\l__ocgbase_prev_sbl_tl - } - }{ - %I am the very first child of my parent - \int_gincr:N\g_ocgbase_nd_int - \tl_set:Nx\l__ocgbase_cur_nd_tl{\int_use:N\g_ocgbase_nd_int} - %set myself as my parent's first child - \tl_gset:cV{g_ocgbase_nd_\l__ocgbase_prnt_tl _chld_tl}\l__ocgbase_cur_nd_tl + % get parent (either currently open ocg or root) + \seq_get:NNF\g_ocgbase_open_ocg_seq\l__ocgbase_prnt_tl{ + \tl_set:Nn\l__ocgbase_prnt_tl{root} } - %set the OCG I am referring to - \tl_gset:cx{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _ocg_tl}{#1} - %push current node and its associated OCG obj on the stacks - \seq_gpush:NV\g_ocgbase_tree_nd_stack_seq\l__ocgbase_cur_nd_tl - \seq_gpush:Nx\g_ocgbase_tree_ocg_stack_seq{#1} -} - -%macro that ends insertion of OCG and sub-OCGs into Order tree -\cs_new_protected:Nn\ocgbase_tree_node_end:{ - \seq_get:NN\g_ocgbase_tree_nd_stack_seq\l_tempa_tl - \seq_get:NN\g_ocgbase_tree_ocg_stack_seq\l_tempb_tl - \str_if_eq:eeT{ - \cs_if_exist_use:c{g_ocgbase_nd_\l_tempa_tl _ocg_tl} - }{ - \l_tempb_tl - }{ - \seq_gpop:NN\g_ocgbase_tree_nd_stack_seq\g_trash_tl - \seq_gpop:NN\g_ocgbase_tree_ocg_stack_seq\g_trash_tl + %push current ocg ref on stack with open ocgs + \seq_gpush:Nx\g_ocgbase_open_ocg_seq{#1} + %create seq for current ocg if not yet existing and + %append ocg ref to its parent seq + \seq_if_exist:cF{g_ocgbase_order_#1_seq}{ + \seq_new:c{g_ocgbase_order_#1_seq} + \seq_gput_right:cx{g_ocgbase_order_ \l__ocgbase_prnt_tl _seq}{#1} } } -% helper macro (recursive); traverses siblings to find either -% the node which refers to the same OCG (arg #2 remains un-modified), or -% the last sibling inserted (arg #2 is cleared); -% the node id of the sibling found is returned in arg #1 -\cs_new_protected:Nn\ocgbase_traverse_siblings:NN{ - % #1: current node (in/out), #2: OCG obj (in/out) - \str_if_eq:eeF{#2}{\tl_use:c{g_ocgbase_nd_#1_ocg_tl}}{ - \tl_if_exist:cTF{g_ocgbase_nd_#1_sbl_tl}{ - \tl_set:Nv#1{g_ocgbase_nd_#1_sbl_tl} - \ocgbase_traverse_siblings:NN#1#2 - }{ - \tl_clear:N#2 - } - } +%macro that ends insertion of current OCG into order tree +\cs_new_protected:Nn\ocgbase_tree_node_end:{ + %pop top ocg ref from stack with open ocgs + \seq_gpop:NN\g_ocgbase_open_ocg_seq\g_trash_tl } +%macro that builds global ocg order from hierarchy and saves it into tl var \cs_new_protected_nopar:Nn\ocgbase_build_order:Nn{ % (recursive macro) % #1: tl var to which the OCG order is written (output) - % #2: starting node id (input; usually `1') - \tl_set:Nx\l__ocgbase_cur_nd_tl{#2} - % first, append the OCG obj the current node is referring to - \tl_put_right:Nx#1{~\tl_use:c{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _ocg_tl}} - % second, traverse the tree starting with the first child node - \tl_if_exist:cT{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _chld_tl}{ - \seq_gpush:NV\g_ocgbase_tree_nd_stack_seq\l__ocgbase_cur_nd_tl - \tl_put_right:Nn#1{~[} - \ocgbase_build_order:Nn#1{ - \tl_use:c{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _chld_tl}} - \tl_put_right:Nn#1{~]} - \seq_gpop:NN\g_ocgbase_tree_nd_stack_seq\l__ocgbase_cur_nd_tl - } - % third, traverse the tree starting with the next sibling node - \tl_if_exist:cT{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _sbl_tl}{ - \ocgbase_build_order:Nn#1{ - \tl_use:c{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _sbl_tl}} + % #2: starting node (input; usually `root') + \seq_map_inline:cn{g_ocgbase_order_#2_seq}{ + % first, append ocg ref to result tl var + \tl_put_right:Nx#1{~##1} + \seq_if_empty:cF{g_ocgbase_order_##1_seq}{ + \tl_put_right:Nn#1{~[} + \ocgbase_build_order:Nn#1{##1} + \tl_put_right:Nn#1{~]} + } } } @@ -433,7 +378,7 @@ % \ocgbase@tree@node@end % #1: OCG PDF object % macro pair (begin and end) for inserting OCG object and its children -% into Order hierarchy (shown as tree structure in the viewers `Layers' tab +% into order hierarchy (shown as tree structure in the viewers `Layers' tab % % -------- % @@ -479,8 +424,8 @@ % % The Current Maintainer of this work is A. Grahn. -\def\g@ocgbase@date@tl{2022/08/04} -\def\g@ocgbase@version@tl{0.22} +\def\g@ocgbase@date@tl{2024/08/28} +\def\g@ocgbase@version@tl{0.23} \ProvidesExplPackage{ocgbase}{\g@ocgbase@date@tl}{\g@ocgbase@version@tl} {support package for ocgx2.sty} @@ -535,25 +480,23 @@ \AddToHook{shipout/lastpage}{ \tl_if_empty:NF\g_ocgbase_ocgs_tl{ %global OCG array - \pbs_pdfobj:nnn{}{array}{\g_ocgbase_ocgs_tl} - \tl_set:Nx\l_ocgbase_ocgarray_tl{\pbs_pdflastobj:} - \tl_new:N\l_ocgbase_offocgentry_tl + \pdf_object_unnamed_write:ne{array}{\g_ocgbase_ocgs_tl} + \tl_set:Nx\l_ocgbase_ocgarray_tl{\pdf_object_ref_last:} %global OFF list + \tl_new:N\l_ocgbase_offocgentry_tl \seq_if_empty:NF\g_ocgbase_offocgs_seq{ - \pbs_pdfobj:nnn{}{array}{\seq_use:Nn\g_ocgbase_offocgs_seq{~}} - \tl_set:Nx\l_ocgbase_offocgentry_tl{/OFF~\pbs_pdflastobj:} + \pdf_object_unnamed_write:ne{array}{\seq_use:Nn\g_ocgbase_offocgs_seq{~}} + \tl_set:Nx\l_ocgbase_offocgentry_tl{/OFF~\pdf_object_ref_last:} } %global Order list \tl_new:N\l_ocgbase_ocgorderentry_tl \tl_new:N\l_ocgbase_ocgorder_tl - \tl_if_exist:cT{g_ocgbase_nd_0_chld_tl}{ - \ocgbase_build_order:Nn\l_ocgbase_ocgorder_tl{ - \tl_use:c{g_ocgbase_nd_0_chld_tl} - } + \seq_if_empty:NF\g_ocgbase_order_root_seq{ + \ocgbase_build_order:Nn\l_ocgbase_ocgorder_tl{root} } \tl_if_empty:NF\l_ocgbase_ocgorder_tl{ - \pbs_pdfobj:nnn{}{array}{\l_ocgbase_ocgorder_tl} - \tl_set:Nx\l_ocgbase_ocgorderentry_tl{/Order~\pbs_pdflastobj:} + \pdf_object_unnamed_write:ne{array}{\l_ocgbase_ocgorder_tl} + \tl_set:Nx\l_ocgbase_ocgorderentry_tl{/Order~\pdf_object_ref_last:} } %generate RBGroups entry (radio button groups) \tl_new:N\l_ocgbase_rbtn_groups_tl @@ -566,8 +509,8 @@ } \tl_new:N\l_ocgbase_rbgroupsentry_tl \tl_if_empty:NF\l_ocgbase_rbtn_groups_tl{ - \pbs_pdfobj:nnn{}{array}{\l_ocgbase_rbtn_groups_tl} - \tl_set:Nx\l_ocgbase_rbgroupsentry_tl{/RBGroups~\pbs_pdflastobj:} + \pdf_object_unnamed_write:ne{array}{\l_ocgbase_rbtn_groups_tl} + \tl_set:Nx\l_ocgbase_rbgroupsentry_tl{/RBGroups~\pdf_object_ref_last:} } \pdfmanagement_add:nnx{Catalog/OCProperties}{OCGs}{\g_ocgbase_ocgs_tl} \pdfmanagement_add:nnx{Catalog/OCProperties}{D}{<< @@ -586,12 +529,10 @@ } %macro for inserting new OCG object -\cs_generate_variant:Nn\pdf_object_new:nn{xn} -\cs_generate_variant:Nn\pdf_object_write:nn{xx} \int_new:N\g_ocgbase_int \cs_new_protected_nopar:Nn\ocgbase_new_ocg:nnn{ - \pdf_object_new:xn{g_object_\int_use:N\g_ocgbase_int _pdf}{dict} - \pdf_object_write:xx{g_object_\int_use:N\g_ocgbase_int _pdf}{ + \exp_args:Ne\pdf_object_new:n{g_object_\int_use:N\g_ocgbase_int _pdf} + \exp_args:Neee\pdf_object_write:nnn{g_object_ \int_use:N\g_ocgbase_int _pdf}{dict}{ /Type/OCG/Name~(#1)~\str_if_eq:eeF{#2}{}{/Usage<<#2>>} } \tl_gput_right:Nx\g_ocgbase_ocgs_tl{~\pdf_object_ref_last:} @@ -612,98 +553,45 @@ \cs_new_nopar:Nn\ocgbase_last_ocg:{\g_ocgbase_last_ocg_tl} -\int_new:N\g_ocgbase_nd_int %node id -\seq_new:N\g_ocgbase_tree_nd_stack_seq %stack with open ocg node id -\seq_new:N\g_ocgbase_tree_ocg_stack_seq %stack with open ocg obj number -\seq_gpush:Nn\g_ocgbase_tree_nd_stack_seq{0} %push root node -\seq_gpush:Nn\g_ocgbase_tree_ocg_stack_seq{null} %push root node +\seq_new:N\g_ocgbase_open_ocg_seq %stack with open ocg ref +\seq_new:N\g_ocgbase_order_root_seq %seq taking ocg ref /Order root -%macro for starting OCG object (and nested children) insertion into Order +%macro for starting OCG object (and nested children) insertion into order %hierarchy (shown as tree structure in the viewers `Layers' tab \cs_new_protected_nopar:Nn\ocgbase_tree_node_begin:n{ % #1: OCG obj - %get the parent node from stack - \seq_get:NN\g_ocgbase_tree_nd_stack_seq\l__ocgbase_prnt_tl - \tl_if_exist:cTF{g_ocgbase_nd_\l__ocgbase_prnt_tl _chld_tl}{ - %parent has >=1 children (i. e. my older siblings), traverse them - \tl_set:Nv\l__ocgbase_prev_sbl_tl{g_ocgbase_nd_\l__ocgbase_prnt_tl _chld_tl} - \tl_set:Nx\l__ocgbase_cur_ocg_tl{#1} - \ocgbase_traverse_siblings:NN\l__ocgbase_prev_sbl_tl\l__ocgbase_cur_ocg_tl - \str_if_empty:NTF\l__ocgbase_cur_ocg_tl{ - %I am the first child of my parent to refer to OCG #1 - \int_gincr:N\g_ocgbase_nd_int - \tl_set:Nx\l__ocgbase_cur_nd_tl{\int_use:N\g_ocgbase_nd_int} - %set myself as my next-older sibling's `next sibling' - \tl_gset:cV{ - g_ocgbase_nd_\l__ocgbase_prev_sbl_tl _sbl_tl}\l__ocgbase_cur_nd_tl - }{ - %there is already a sibling referring to OCG #1; no new node needs be - %created - \tl_set:NV\l__ocgbase_cur_nd_tl\l__ocgbase_prev_sbl_tl - } - }{ - %I am the very first child of my parent - \int_gincr:N\g_ocgbase_nd_int - \tl_set:Nx\l__ocgbase_cur_nd_tl{\int_use:N\g_ocgbase_nd_int} - %set myself as my parent's first child - \tl_gset:cV{g_ocgbase_nd_\l__ocgbase_prnt_tl _chld_tl}\l__ocgbase_cur_nd_tl + % get parent (either currently open ocg or root) + \seq_get:NNF\g_ocgbase_open_ocg_seq\l__ocgbase_prnt_tl{ + \tl_set:Nn\l__ocgbase_prnt_tl{root} } - %set the OCG I am referring to - \tl_gset:cx{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _ocg_tl}{#1} - %push current node and its associated OCG obj on the stacks - \seq_gpush:NV\g_ocgbase_tree_nd_stack_seq\l__ocgbase_cur_nd_tl - \seq_gpush:Nx\g_ocgbase_tree_ocg_stack_seq{#1} -} - -%macro that ends insertion of OCG and sub-OCGs into Order tree -\cs_new_protected:Nn\ocgbase_tree_node_end:{ - \seq_get:NN\g_ocgbase_tree_nd_stack_seq\l_tempa_tl - \seq_get:NN\g_ocgbase_tree_ocg_stack_seq\l_tempb_tl - \str_if_eq:eeT{ - \cs_if_exist_use:c{g_ocgbase_nd_\l_tempa_tl _ocg_tl} - }{ - \l_tempb_tl - }{ - \seq_gpop:NN\g_ocgbase_tree_nd_stack_seq\g_trash_tl - \seq_gpop:NN\g_ocgbase_tree_ocg_stack_seq\g_trash_tl + %push current ocg ref on stack with open ocgs + \seq_gpush:Nx\g_ocgbase_open_ocg_seq{#1} + %create seq for current ocg if not yet existing and + %append ocg ref to its parent seq + \seq_if_exist:cF{g_ocgbase_order_#1_seq}{ + \seq_new:c{g_ocgbase_order_#1_seq} + \seq_gput_right:cx{g_ocgbase_order_ \l__ocgbase_prnt_tl _seq}{#1} } } -% helper macro (recursive); traverses siblings to find either -% the node which refers to the same OCG (arg #2 remains un-modified), or -% the last sibling inserted (arg #2 is cleared); -% the node id of the sibling found is returned in arg #1 -\cs_new_protected:Nn\ocgbase_traverse_siblings:NN{ - % #1: current node (in/out), #2: OCG obj (in/out) - \str_if_eq:eeF{#2}{\tl_use:c{g_ocgbase_nd_#1_ocg_tl}}{ - \tl_if_exist:cTF{g_ocgbase_nd_#1_sbl_tl}{ - \tl_set:Nv#1{g_ocgbase_nd_#1_sbl_tl} - \ocgbase_traverse_siblings:NN#1#2 - }{ - \tl_clear:N#2 - } - } +%macro that ends insertion of current OCG into order tree +\cs_new_protected:Nn\ocgbase_tree_node_end:{ + %pop top ocg ref from stack with open ocgs + \seq_gpop:NN\g_ocgbase_open_ocg_seq\g_trash_tl } +%macro that builds global ocg order from hierarchy and saves it into tl var \cs_new_protected_nopar:Nn\ocgbase_build_order:Nn{ % (recursive macro) % #1: tl var to which the OCG order is written (output) - % #2: starting node id (input; usually `1') - \tl_set:Nx\l__ocgbase_cur_nd_tl{#2} - % first, append the OCG obj the current node is referring to - \tl_put_right:Nx#1{~\tl_use:c{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _ocg_tl}} - % second, traverse the tree starting with the first child node - \tl_if_exist:cT{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _chld_tl}{ - \seq_gpush:NV\g_ocgbase_tree_nd_stack_seq\l__ocgbase_cur_nd_tl - \tl_put_right:Nn#1{~[} - \ocgbase_build_order:Nn#1{ - \tl_use:c{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _chld_tl}} - \tl_put_right:Nn#1{~]} - \seq_gpop:NN\g_ocgbase_tree_nd_stack_seq\l__ocgbase_cur_nd_tl - } - % third, traverse the tree starting with the next sibling node - \tl_if_exist:cT{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _sbl_tl}{ - \ocgbase_build_order:Nn#1{ - \tl_use:c{g_ocgbase_nd_\l__ocgbase_cur_nd_tl _sbl_tl}} + % #2: starting node (input; usually `root') + \seq_map_inline:cn{g_ocgbase_order_#2_seq}{ + % first, append ocg ref to result tl var + \tl_put_right:Nx#1{~##1} + \seq_if_empty:cF{g_ocgbase_order_##1_seq}{ + \tl_put_right:Nn#1{~[} + \ocgbase_build_order:Nn#1{##1} + \tl_put_right:Nn#1{~]} + } } } @@ -740,7 +628,7 @@ % OC-marked content \cs_new_protected_nopar:Nn\ocgbase_oc_bdc:n{\pbs_pdfbdc:nn{OC}{#1}} -\cs_new_protected_nopar:Nn\ocgbase_oc_emc:{\pbs_pdfemc:} +\cs_new_eq:NN\ocgbase_oc_emc:\pbs_pdfemc: %stack of PDF obj references of currently open OCGs \seq_new:N\g_ocgbase_open_stack_seq diff --git a/macros/latex/contrib/ocgx2/ocgx2.sty b/macros/latex/contrib/ocgx2/ocgx2.sty index a1081f88ac..8a45995b8c 100644 --- a/macros/latex/contrib/ocgx2/ocgx2.sty +++ b/macros/latex/contrib/ocgx2/ocgx2.sty @@ -43,8 +43,8 @@ % % The Current Maintainer of this work is A. Grahn. - \def\g@ocgxii@date@tl{2024/03/18} - \def\g@ocgxii@version@tl{0.57} + \def\g@ocgxii@date@tl{2024/08/28} + \def\g@ocgxii@version@tl{0.58} \ProvidesExplPackage{ocgx2}{\g@ocgxii@date@tl}{\g@ocgxii@version@tl} {ports `ocgx' functionality to dvips+ps2pdf, xelatex and dvipdfmx} @@ -1579,8 +1579,8 @@ % % The Current Maintainer of this work is A. Grahn. -\def\g@ocgxii@date@tl{2024/03/18} -\def\g@ocgxii@version@tl{0.57} +\def\g@ocgxii@date@tl{2024/08/28} +\def\g@ocgxii@version@tl{0.58} \ProvidesExplPackage{ocgx2}{\g@ocgxii@date@tl}{\g@ocgxii@version@tl} {ports `ocgx' functionality to dvips+ps2pdf, xelatex and dvipdfmx} @@ -1810,8 +1810,8 @@ \cs_set_eq:NN\And \ocgxii_protected_dummy_cs:n \cs_set_eq:NN\Or \ocgxii_protected_dummy_cs:n \ocgxii_ocmd_read_visbility:xN{#2}\l_ocgxii_ocmd_visibility_tl - \pdf_object_new:xn{g_object_\int_use:N\g_ocgbase_int _pdf}{dict} - \pdf_object_write:xx{g_object_\int_use:N\g_ocgbase_int _pdf}{ + \exp_args:Ne\pdf_object_new:n{g_object_\int_use:N\g_ocgbase_int _pdf} + \exp_args:Neee\pdf_object_write:nnn{g_object_\int_use:N\g_ocgbase_int _pdf}{dict}{ /Type/OCMD\l_ocgxii_ocmd_visibility_tl } \tl_gset:cx{g_pbs_objname_\pdf_object_ref_last: _tl}{ diff --git a/macros/latex/contrib/profmaquette/doc/ProfMaquette-doc.pdf b/macros/latex/contrib/profmaquette/doc/ProfMaquette-doc.pdf Binary files differdeleted file mode 100644 index 655d73fe6e..0000000000 --- a/macros/latex/contrib/profmaquette/doc/ProfMaquette-doc.pdf +++ /dev/null diff --git a/macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdf b/macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdf Binary files differnew file mode 100644 index 0000000000..17618e7120 --- /dev/null +++ b/macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdf diff --git a/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty b/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty index 9aa462bb76..f64c1bf745 100644 --- a/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty +++ b/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty @@ -2,20 +2,33 @@ % licence : Released under the LaTeX Project Public License v1.3c % or later, see http://www.latex-project.org/lppl.txtf \NeedsTeXFormat{LaTeX2e}% -\def\filedate{2024/05/02}% +\def\filedate{2024/08/27}% \let\PfMfiledate\filedate% -\def\fileversion{0.94}% +\def\fileversion{0.97b}% \let\PfMfileversion\fileversion% \ProvidesPackage{ProfMaquette}[\filedate\space v\fileversion\space Maquettage de documents]% \newif\if@Dyslexie \@Dyslexiefalse +\newif\if@CAN \@CANfalse +\newif\if@Revision \@Revisionfalse +\newif\if@AssembleCorrections \@AssembleCorrectionsfalse +\newif\if@Personnel \@Personnelfalse \DeclareOption{Dyslexie}{\@Dyslexietrue} +\DeclareOption{CAN}{\@CANtrue} +\DeclareOption{Revision}{\@Revisiontrue} +\DeclareOption{AssembleCorrections}{\@AssembleCorrectionstrue} +\DeclareOption{Personnel}{\@Personneltrue} \ProcessOptions\relax + +\if@AssembleCorrections + \AddToHook{env/document/end}[AC]{\PfMAffichageTousCorriges}% +\fi + % packages nécessaires \RequirePackage{verbatim}% - +\RequirePackage{xintexpr} \RequirePackage{calc}% \RequirePackage{xlop}% @@ -34,23 +47,25 @@ \RequirePackage{modulus}% \RequirePackage{ragged2e}% - +\RequirePackage{fontawesome5} \makeatletter \gdef\PfMFontSize{\@ptsize} %\gdef\PfMFontSize{\f@size} \makeatother %définition des clés \RequirePackage{simplekv}% -\setKVdefault[Boulot]{Dys=false,Taille=14,Cours=false,Base=false,BaseHTML=false,CAN=false,Fiche=false,DM=false,DS=false,IE=false,Kholle=false,RecapBrevet=false,PdT=false,Parcours=false,Contrat=false,FdR=false,ParcoursPerso=false,OlympiadesAPMEP=false,CorrigeInverse=false,CorrigeSeul=false,CorrigeApres=false,CorrigeFin=false,CorrigeAll=false,Brevet=false,BaremeComplet=false,BaremeGlobal=false,CorrectionColonnes=false,Epaisseur=0pt,VersSolution=false,AvecEntrainement=false,Small=false,Footnotesize=false,Scriptsize=false,AllDirect=false,AllPouce=false}%Les deux derniers pour essayer de mettre tous les exercices d'un même fichier en mode Reponse, en mode Indice. Pas implanté, pas testé +\setKVdefault[Boulot]{Dys=false,Taille=14,Cours=false,Base=false,BaseHTML=false,CAN=false,Fiche=false,DM=false,DS=false,IE=false,Kholle=false,RecapBrevet=false,PdT=false,Parcours=false,Contrat=false,FdR=false,ParcoursPerso=false,OlympiadesAPMEP=false,LivreHeros=false,CorrigeInverse=false,CorrigeSeul=false,CorrigeApres=false,CorrigeFin=false,CorrigeAll=false,Brevet=false,BaremeComplet=false,BaremeGlobal=false,CorrectionColonnes=false,EntrainementColonnes=false,Epaisseur=0pt,VersSolution=false,AvecEntrainement=false,Small=false,Footnotesize=false,Scriptsize=false,AllDirect=false,AllPouce=false,Input=false}%Les deux derniers pour essayer de mettre tous les exercices d'un même fichier en mode Reponse, en mode Indice. Pas implanté, pas testé \defKV[Boulot]{Colonnes=\setKV[Boulot]{CorrectionColonnes}}% +\defKV[Boulot]{EColonnes=\setKV[Boulot]{EntrainementColonnes}}% \setKVdefault[Cours]{Couleur=Crimson,Theme=Trace écrite,NomExercice=Exercice}% \setKVdefault[DM]{Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname}% \setKVdefault[DS]{Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname,Calculatrice=false,Sujet=A}% \setKVdefault[Fiche]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice,}% \setKVdefault[PdT]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}% \setKVdefault[FdR]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}% -\setKVdefault[Parcours]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice,Vertical=false}% +\setKVdefault[Parcours]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice,Vertical=false,Plan=false,Court=false}% \setKVdefault[Contrat]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}% +\setKVdefault[OlympiadesAPMEP]{Theme=Les nombres décimaux}% \setKVdefault[ParcoursPerso]{Fichier={}}% \setKVdefault[IE]{Nom=\'Evaluation,Sujets=false,Theme={},Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname,Calculatrice=false}% \defKV[IE]{Sujet=\setKV[IE]{Sujets}}% @@ -58,7 +73,7 @@ \setKVdefault[Kholle]{Sujet=1,Numero=1,Date=15,Niveau=TSI-1,Code=\jobname,Lieu=Lycée du Hainaut (Valenciennes),NomEleve=Albert Einstein,CR=false}% \setKVdefault[CAN]{Date=\today,Niveau=6,Duree=9,CoefQ=0.4,CoefR=0.35,CoefJ=0.1}% -\setKVdefault[ClesExercices]{NbQuestions=1,PasTitre=false,AffichageSource=false,BaremeTotal,BaremeDetaille=false,MotPoint=point,AffichageTitre=false,Calculatrice=true,Oral=false,Difficulte=0,AffichageCompetence=false,PasCorrige=false,Direct=false,Pouce=false,Parcours=false,Contrat=false,FdR=false,Routes=false,Stops=false,Background=white,Cadre=gray!50,Numerote,Ligne=false,Doublespacing=false,Onehalfspacing=false,Cadres=false,TitreSol=false,NonUtilise=false,Profile=false,PasEntrainement=false}% +\setKVdefault[ClesExercices]{NbQuestions=1,PasTitre=false,AffichageSource=false,BaremeTotal,BaremeDetaille=false,MotPoint=point,AffichageTitre=false,Calculatrice=true,Oral=false,Difficulte=0,AffichageCompetence=false,PasCorrige=false,Direct=false,Pouce=false,Parcours=false,Contrat=false,FdR=false,Routes=false,Stops=false,Background=white,Cadre=gray!50,Numerote,Ligne=false,Doublespacing=false,Onehalfspacing=false,Cadres=false,TitreSol=false,NonUtilise=false,Profile=false,AEntretenir=false,Fragile=false,AvecIndications=false,ACompleter=false,Aide=0}% \defKV[ClesExercices]{TitreSolution=\setKV[ClesExercices]{TitreSol}}% \defKV[ClesExercices]{Source=\setKV[ClesExercices]{AffichageSource}}% \defKV[ClesExercices]{Titre=\setKV[ClesExercices]{AffichageTitre}}% @@ -70,9 +85,18 @@ \defKV[ClesExercices]{Lignes=\setKV[ClesExercices]{Ligne}}% \defKV[ClesExercices]{Encart=\setKV[ClesExercices]{Cadres}}% \def\PfMTexteEncart{Indique ton travail ci-dessous.}% -\setKVdefault[SchemaParcours]{Colonnes=100,Rayon=2.5mm,Largeur=7.5mm,Couleur=LightSteelBlue,Csv=false}% +\setKVdefault[SchemaParcours]{Colonnes=100,Rayon=2.5mm,Largeur=7.5mm,Couleur=gray!70}%,Csv=false}% \setKVdefault[SchemaContrat]{Ecart=7mm,Rayon=2.5mm}% -\setKVdefault[SchemaFdR]{Ecart=7mm,Colonnes=100,Rayon=2.5mm,Largeur=7.5mm,Couleur=LightSteelBlue,Csv=false}% +\setKVdefault[SchemaFdR]{Ecart=7mm,Colonnes=100,Rayon=2.5mm,Largeur=7.5mm,Couleur=gray!70}%,Csv=false}% +% Commande pour retenir le nombre d'exercices par maquette.Utile seulement pour la clé AssembleCorrection +\xdef\PfMRetiensLienExoMa{}% +\xdef\PfMRetiensLienDefMa{}% +% Commande pour passer des options à travers la clé Input. Elle remplace \input :) +\NewDocumentCommand\Input{om}{% + \def\Relecture{\setKV[ClesExercices]{#1}} + \input{#2} + \def\Relecture{} +}% % Sucres \makeatletter% \NewDocumentCommand\PfMDotfill{}{% @@ -88,7 +112,15 @@ % \NewDocumentCommand\PfMNbLignesRestantes{}{% \edef\measurepage{\dimexpr\pagegoal-\pagetotal\relax}% + \edef\measurepagemax{\dimexpr\textheight\relax}% + % \edef\measurepage{\dimeval{\pagegoal-\pagetotal-\baselineskip}}% \xdef\PfMResteLignes{\fpeval{trunc((\the\measurepage)/(\baselineskip),0)}}% + \xdef\PfMResteLignesMax{\fpeval{trunc((\the\measurepagemax)/(\baselineskip),0)}}% + \ifnum\PfMResteLignesMax<\PfMResteLignes\relax + \xdef\PfMResteLignes{\PfMResteLignesMax} + \fi + %\xdef\PfMResteLignes{\dimeval{trunc((\the\measurepage)/(\baselineskip),0)}}% + %Il reste \PfMResteLignes{} lignes alors que le nombre maximal de lignes sur une page est \PfMResteLignesMax{}. }% \NewDocumentCommand\PfMLignesFinales{}{% @@ -123,23 +155,30 @@ \newlength\PfMLargeurJury% \newlength\PfMEspaceAvantLignes% \newlength\PfMEspaceApresLignes% -\newlength\PfMLargeurComp +\newlength\PfMLargeurComp% \newlength\CRRHauteur% \newlength\PfMEcartSupInterMots% -\setlength{\CRRHauteur}{10cm} +\newlength\PfMCoefcompetences% +\def\PfMCoefCompetences{0.85}% +\setlength{\CRRHauteur}{10cm}% \setlength{\PfMHauteurAppreciation}{5cm}% \setlength{\PfMHauteurRemarque}{5cm}% -\setlength{\PfMEspaceAvantLignes}{1em} -\setlength{\PfMEspaceApresLignes}{1em} +\setlength{\PfMEspaceAvantLignes}{1em}% +\setlength{\PfMEspaceApresLignes}{1em}% \setlength{\PfMEcartSupInterMots}{1pt}% +\setlength{\PfMCoefcompetences}{0.7\linewidth}% % définition des compteurs \newcounter{PfMMaquette}%Pour compter le nombres de "travaux" \setcounter{PfMMaquette}{0}% +\newcounter{PfMMaquetteSol}[PfMMaquette]%Pour compter le nombres de "travaux" dans les corrections +\setcounter{PfMMaquetteSol}{0}% \newcounter{PfMSection}%Pour le barème et ne pas faire obstruction à section \setcounter{PfMSection}{0}% \newcounter{PfMExo}[PfMMaquette]%Numéro des exercices \setcounter{PfMExo}{0}% -\newcounter{PfMExoSol}%Pour repérer les valeurs aléatoires construites automatiquement dans la solution +%\newcounter{PfMExoSolAlea}%Pour repérer les valeurs aléatoires construites automatiquement dans la solution +%\setcounter{PfMExoSolAlea}{0}% +\newcounter{PfMExoSol}[PfMMaquette]% \setcounter{PfMExoSol}{0}% \newcounter{PfMExoEntrai}%Pour repérer les entrainements \setcounter{PfMExoEntrai}{0}% @@ -152,12 +191,17 @@ \newcounter{RetiensSol}%Pour l'affichage des solutions \newcounter{RetiensRep}%Pour l'affichage des reponses. \newcounter{RetiensInd}%Pour l'affichage des indices. +\newcounter{RetiensIndic}%Pour l'affichage des indications. +\newcounter{PfMRetiensQr}%Pour l'affichage des entrainements \setcounter{RetiensSol}{0}% \setcounter{RetiensRep}{0}% \setcounter{RetiensInd}{0}% +\setcounter{RetiensIndic}{0}% +\setcounter{PfMRetiensQr}{0}% \newcounter{PfMNbLogo}%Pour décaler les logos sur la ligne haute de tcolorbox \setcounter{PfMNbLogo}{0}% \newcount\Orientation%Pour le schéma des parcours +\newcount\TotalParcoursTikz%Pour le total des exos à utiliser dans l'affichage des parcours tikz \newcounter{PfMCNNumQ}% \newcounter{Nbcolonnes} @@ -166,6 +210,8 @@ \newif\ifPfMDeuxColonnes \newif\ifPfMRectoVerso +\newif\ifPfMRevision + \makeatletter \if@twocolumn \PfMDeuxColonnestrue @@ -179,6 +225,11 @@ \else \PfMRectoVersofalse \fi +\if@Revision + \PfMRevisiontrue +\else + \PfMRevisionfalse +\fi \makeatother % couleurs @@ -228,6 +279,22 @@ \ifboolKV[Boulot]{CAN}{}{\end{tcolorbox}}% }% +\tcbset{% + indications/.style={ + empty, + right=0pt, + left=0mm, + top=0pt, + bottom=0pt, + frame engine=path, + % colframe=Crimson!10, + frame hidden, + notitle, + sharp corners=west, + borderline west={3pt}{0pt}{black!50} + } +} + %% Option french pour les mathématiques % By CT \NewDocumentCommand\TypoMathFrance{}{% @@ -291,7 +358,7 @@ \NewDocumentCommand\RepartirEffectifTotal{mmm}{% % #1 valeur de l'effectif total % #2 nombre de valeurs à obtenir - % #3 écart acceptable :) autour de la moyenen + % #3 écart acceptable :) autour de la moyenne \xdef\PfCSLEffectifs{}% \xdef\PfCValeurMoyenneTemp{\fpeval{floor(#1/#2)}}% \xdef\PfCRetiensRETSomme{}% @@ -882,7 +949,7 @@ } \def\buildtabcompetences{% - \[\begin{tabular}{|p{0.70\linewidth}|*{3}{>{\centering\arraybackslash}p{0.05\linewidth}|}} + \[\begin{tabular}{|p{\PfMCoefcompetences}|*{3}{>{\centering\arraybackslash}p{0.05\linewidth}|}} \cline{2-4} \multicolumn{1}{c|}{}&\PfMCompNA&\PfMCompECA&\PfMCompA\\ \hline @@ -892,7 +959,7 @@ }% \def\Buildtabcompetences#1#2{% - \setlength{\PfMLargeurComp}{\fpeval{0.85-0.05*#1}\linewidth-\fpeval{2*(#1-3)}\tabcolsep}% + \setlength{\PfMLargeurComp}{\fpeval{\PfMCoefCompetences-0.05*#1}\linewidth-\fpeval{2*(#1-3)}\tabcolsep}% \[\begin{tabular}{|p{\PfMLargeurComp}|*{#1}{>{\centering\arraybackslash}p{0.05\linewidth}|}}% \cline{2-\fpeval{1+#1}}% \multicolumn{1}{c|}{}\xintFor* ##1 in{\xintSeq{1}{#1}}\do{% @@ -914,7 +981,7 @@ \def\SolutionWrite{% \setcounter{PfMAlea}{0}% \@bsphack% - \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.sol"% + \immediate\openout \verbatim@out "\jobname-Ma\thePfMMaquette-Ex\thePfMExo.sol"% \let\do\@makeother\dospecials% \catcode`\^^M\active% \def\verbatim@processline{% @@ -924,7 +991,7 @@ \def\SolutionWritePP{% \@bsphack - \immediate\openout \verbatim@out "\jobname-PPEx\thePfMExo.sol" % + \immediate\openout \verbatim@out "\jobname-Ma\thePfMMaquette-PPEx\thePfMExo.sol" % \let\do\@makeother\dospecials \catcode`\^^M\active \def\verbatim@processline{% @@ -934,7 +1001,7 @@ \def\ReponseWrite{% \@bsphack - \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.rep" % + \immediate\openout \verbatim@out "\jobname-Ma\thePfMMaquette-Ex\thePfMExo.rep" % \let\do\@makeother\dospecials \catcode`\^^M\active \def\verbatim@processline{% @@ -944,7 +1011,7 @@ \def\IndiceWrite{% \@bsphack - \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.cdp" %coup de pouce + \immediate\openout \verbatim@out "\jobname-Ma\thePfMMaquette-Ex\thePfMExo.cdp" %coup de pouce \let\do\@makeother\dospecials \catcode`\^^M\active \def\verbatim@processline{% @@ -953,7 +1020,7 @@ \def\endIndiceWrite{\immediate\closeout\verbatim@out\@esphack} \makeatother -\def\SolutionNow{\textbf{Correction de l'exercice --}\par\nopagebreak\setcounter{PfMExoSol}{\thePfMExo}\setcounter{PfMAlea}{0}\PfMAffichageHideItemSolution} +\def\SolutionNow{\textbf{Correction de l'exercice --}\par\nopagebreak\setcounter{PfMExoSol}{\thePfMExo}\setcounter{PfMAlea}{0}\PfMAffichageHideItemSolution}%\setcounter{PfMExoSolAlea}{\thePfMExo} \def\endSolutionNow{\par\goodbreak\PfMshowitems} \def\ReponseNow{\textbf{Réponse(s) de l'exercice --}\par\nopagebreak\PfMAffichageHideItemSolution} @@ -965,6 +1032,52 @@ \NewDocumentEnvironment{Solution}{}{}{}% \NewDocumentEnvironment{Reponse}{}{}{}% \NewDocumentEnvironment{Indice}{}{}{}% +\NewDocumentEnvironment{PfMHide}{+b}{}{}% +\NewDocumentEnvironment{PfMSeek}{+b}{#1}{}% + +\NewDocumentEnvironment{AideA}{+b}{% + \ifnum\fpeval{\useKV[ClesExercices]{Aide}}>0\relax% + \begin{PfMSeek}% + \else% + \begin{PfMHide}% + \fi% + #1 +}{% + \ifnum\fpeval{\useKV[ClesExercices]{Aide}}>0\relax% + \end{PfMSeek}% + \else% + \end{PfMHide}% + \fi% +}% + +\NewDocumentEnvironment{AideB}{+b}{% + \ifnum\fpeval{\useKV[ClesExercices]{Aide}}>1\relax% + \begin{PfMSeek}% + \else% + \begin{PfMHide}% + \fi% + #1 +}{% + \ifnum\fpeval{\useKV[ClesExercices]{Aide}}>1\relax% + \end{PfMSeek}% + \else% + \end{PfMHide}% + \fi% +}% + +\NewDocumentEnvironment{Indications}{+b}{% + \ifnum\theRetiensIndic=1\relax% + \textbf{\PfMTexteDesIndications :}\par% + \else% + \begin{PfMHide}% + \fi% + #1 +}{% + \ifnum\theRetiensIndic=1\relax% + \else + \end{PfMHide}% + \fi% +}% \NewDocumentCommand\PfMChoixAffichageCorrection{}{% \ifboolKV[Boulot]{CorrigeAll}{% @@ -1050,24 +1163,40 @@ }% }% -\def\PfMTexteDuCorrige{Corrigé de l'exercice} -\def\PfMTexteDeLEntrainement{Automatisme(s) lié(s) à l'exercice} +\NewDocumentCommand\PfMChoixEntrainement{}{% + \setcounter{PfMRetiensQr}{0}% + \ifboolKV[ClesExercices]{AEntretenir}{\setcounter{PfMRetiensQr}{1}}{}% +}% + +\NewDocumentCommand\PfMChoixAffichageEntrainement{}{% + \ifnum\thePfMRetiensQr=1\relax% + \let\Entrainement\EntrainementWrite\let\endEntrainement\endEntrainementWrite% + \else% + \let\Entrainement\comment\let\endEntrainement\endcomment + \fi% +}% + +\def\PfMTexteDuCorrige{Corrigé de l'exercice}% +\def\PfMTexteDeLEntrainement{Automatisme(s) lié(s) à l'exercice}% +\def\PfMTexteDesIndications{Indications}% \NewDocumentCommand\PfMAffichageCorrige{}{% \ifboolKV[Boulot]{CAN}{% \xintFor* ##1 in{\xintSeq{1}{\PfMCANTotalExo}}\do{% \setcounter{PfMExoSol}{##1}% \setcounter{PfMAlea}{0}% - \IfFileExists{\jobname-Ex##1.sol}{\textbf{Question\ifnum\PfMCANTotalExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{TestCAN-##1}}:\fi}~\input{\jobname-Ex##1.sol}\par\goodbreak}{}%page-\thePfMMaquette-##1 + \IfFileExists{\jobname-Ma\thePfMMaquette-Ex##1.sol}{\textbf{Question\ifnum\PfMCANTotalExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{TestCAN-##1}}:\fi}~\input{\jobname-Ma\thePfMMaquette-Ex##1.sol}\par\goodbreak}{}%page-\thePfMMaquette-##1 }% }{% \setcounter{PfMExoSol}{0}% + %\setcounter{PfMExoSolAlea}{0}% \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% \refstepcounter{PfMExoSol}%{##1}% - \label{pagesol-\thePfMMaquette-\thePfMExoSol} + %\stepcounter{PfMExoSolAlea}% + \label{pagesol-\thePfMMaquette-\thePfMExoSol}% \setcounter{PfMAlea}{0}% - \IfFileExists{\jobname-Ex##1.sol}{\PfMAffichageHideItemSolution\textbf{\PfMTexteDuCorrige\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-\thePfMMaquette-##1}}\fi\PfMAffichageTitreSolution}\par\nopagebreak\input{\jobname-Ex##1.sol}\par\goodbreak}{\IfFileExists{\jobname-Ex##1.rep}{\PfMAffichageHideItemSolution\textbf{Réponse(s) seule(s) de l'exercice\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-\thePfMMaquette-##1}}\fi}\par\nopagebreak\input{\jobname-Ex##1.rep}\par\goodbreak}{% - \IfFileExists{\jobname-Ex##1.cdp}{\PfMAffichageHideItemSolution\textbf{Indice(s) pour l'exercice\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-\thePfMMaquette-##1}}\fi}\par\nopagebreak\input{\jobname-Ex##1.cdp}\par\goodbreak}{}% + \IfFileExists{\jobname-Ma\thePfMMaquette-Ex##1.sol}{\PfMAffichageHideItemSolution\textbf{\PfMTexteDuCorrige\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-\thePfMMaquette-##1}}\fi\PfMAffichageTitreSolution}\par\nopagebreak\input{\jobname-Ma\thePfMMaquette-Ex##1.sol}\par\goodbreak}{\IfFileExists{\jobname-Ma\thePfMMaquette-Ex##1.rep}{\PfMAffichageHideItemSolution\textbf{Réponse(s) seule(s) de l'exercice\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-\thePfMMaquette-##1}}\fi}\par\nopagebreak\input{\jobname-Ma\thePfMMaquette-Ex##1.rep}\par\goodbreak}{% + \IfFileExists{\jobname-Ma\thePfMMaquette-Ex##1.cdp}{\PfMAffichageHideItemSolution\textbf{Indice(s) pour l'exercice\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-\thePfMMaquette-##1}}\fi}\par\nopagebreak\input{\jobname-Ma\thePfMMaquette-Ex##1.cdp}\par\goodbreak}{}% }% }% \PfMshowitems% @@ -1075,33 +1204,73 @@ }% }% +% Tous les corrigés +\NewDocumentCommand\PfMAffichageTousCorriges{}{% + \setsepchar{,}\ignoreemptyitems% + \readlist*\ListeNombreExoMq{\PfMRetiensLienExoMa}% + \reademptyitems% + \xintFor* ##2 in{\xintSeq{1}{\thePfMMaquette}}\do{% + \refstepcounter{PfMMaquetteSol}% + \setcounter{PfMExoSol}{0}% + %\setcounter{PfMExoSolAlea}{0}% + \ifPfMRectoVerso% + \cleardoublepage% + \else% + \clearpage% + \fi% + \input{\jobname-DefiMq-##2} + \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% + \xintFor* ##1 in{\xintSeq{1}{\ListeNombreExoMq[##2]}}\do{% + \stepcounter{PfMExoSol}% + %\stepcounter{PfMExoSolAlea}% + \label{pagesol-\thePfMMaquetteSol-\thePfMExoSol}% + \setcounter{PfMAlea}{0}% + \IfFileExists{\jobname-Ma##2-Ex##1.sol}{\PfMAffichageHideItemSolution\textbf{\PfMTexteDuCorrige\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-##2-##1}}\fi\PfMAffichageTitreSolution}\par\nopagebreak\input{\jobname-Ma##2-Ex##1.sol}\par\goodbreak}{\IfFileExists{\jobname-Ma##2-Ex##1.rep}{\PfMAffichageHideItemSolution\textbf{Réponse(s) seule(s) de l'exercice\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-##2-##1}}\fi}\par\nopagebreak\input{\jobname-Ma##2-Ex##1.rep}\par\goodbreak}{% + \IfFileExists{\jobname-Ma##2-Ex##1.cdp}{\PfMAffichageHideItemSolution\textbf{Indice(s) pour l'exercice\ifnum\thePfMExo=1\relax\else~\ifboolKV[Boulot]{CorrigeSeul}{##1}{\ref{page-##2-##1}}\fi}\par\nopagebreak\input{\jobname-Ma##2-Ex##1.cdp}\par\goodbreak}{}% + }% + }% + \PfMshowitems% + }% + \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% + }% +}% + \NewDocumentEnvironment{Entrainement}{}{}{}% \makeatletter \def\EntrainementWrite{% \@bsphack% - \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.qrc"% + \immediate\openout \verbatim@out "\jobname-Ma\thePfMMaquette-Ex\thePfMExo.qrc"% \let\do\@makeother\dospecials% \catcode`\^^M\active% \def\verbatim@processline{% \immediate\write\verbatim@out{\the\verbatim@line}}% \verbatim@start}% \def\endEntrainementWrite{\immediate\closeout\verbatim@out\@esphack}% - -\let\Entrainement\EntrainementWrite\let\endEntrainement\endEntrainementWrite% \makeatother \NewDocumentCommand\PfMAffichageEntrainement{}{% - \clearpage + \ifPfMDeuxColonnes + \newpage + \else + \ifPfMRectoVerso + \cleardoublepage + \else + \clearpage + \fi + \fi \TikzAutomatismes + \ifboolKV[Boulot]{EntrainementColonnes}{\begin{multicols}{\useKV[Boulot]{EColonnes}}}{}% \setcounter{PfMExoEntrai}{0}% \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% \refstepcounter{PfMExoEntrai}% - \IfFileExists{\jobname-Ex##1.qrc}{% + \IfFileExists{\jobname-Ma\thePfMMaquette-Ex##1.qrc}{% \begin{center} - \label{pageentrai-\thePfMMaquette-\thePfMExoEntrai}% - \textbf{\PfMTexteDeLEntrainement\ifnum\thePfMExo=1\relax\else~\ref{page-\thePfMMaquette-##1}\fi}\par\nopagebreak\input{\jobname-Ex##1.qrc}\end{center}}{}% + \label{pageentrai-\thePfMMaquette-\thePfMExoEntrai}% + \textbf{\PfMTexteDeLEntrainement\ifnum\thePfMExo=1\relax\else~\ref{page-\thePfMMaquette-##1}\fi}\par\nopagebreak\input{\jobname-Ma\thePfMMaquette-Ex##1.qrc}\end{center}% + }{}% }% + \ifboolKV[Boulot]{EntrainementColonnes}{\end{multicols}}{}% }% \NewDocumentCommand\TikzAutomatismes{}{% @@ -1128,17 +1297,23 @@ \newcommand*\brm[1]{% \ifboolKV[Boulot]{Fiche}{}{% - \immediate\write\@auxout{% - \string\opadd*{#1}% - {total\the\c@PfMSection-\the\c@PfMExo}% - {total\the\c@PfMSection-\the\c@PfMExo}% - \string\opcopy{\thePfMExo}{TotalExo}% + \ifboolKV[Boulot]{FdR}{}{% + \ifboolKV[Boulot]{Contrat}{}{% + \ifboolKV[Boulot]{Parcours}{}{% + \immediate\write\@auxout{% + \string\opadd*{#1}% + {total\the\c@PfMSection-\the\c@PfMExo}% + {total\the\c@PfMSection-\the\c@PfMExo}% + \string\opcopy{\thePfMExo}{TotalExo}% + }% + \ifboolKV[ClesExercices]{BaremeDetaille}{% + \setlength{\brouillon}{\BaremeEspace@Marge-\linewidth+\textwidth}% + \makebox[0pt][r]{\footnotesize\FranPt{#1}\hspace*{\brouillon}}% + \ignorespaces% + }{}% + }% + }% }% - \ifboolKV[ClesExercices]{BaremeDetaille}{% - \setlength{\brouillon}{\BaremeEspace@Marge-\linewidth+\textwidth}% - \makebox[0pt][r]{\footnotesize\FranPt{#1}\hspace*{\brouillon}}% - \ignorespaces% - }{}% }% }% @@ -1251,12 +1426,12 @@ \NewDocumentCommand{\PfMLienVersEntrainement}{}{% \ifboolKV[Boulot]{AvecEntrainement}{% - \ifboolKV[ClesExercices]{PasEntrainement}{}{% + \ifboolKV[ClesExercices]{AEntretenir}{% \node[% fill=tcbcolback,% anchor=center,rotate=45% ] at ($(frame.north east)!0.75!(frame.south east)$){\hyperref[pageentrai-\thePfMMaquette-\thePfMExo]{\faDumbbell}};% - }% + }{}% }{}% }% @@ -1307,7 +1482,6 @@ %%% Base des exercices DM \tcbset{% tikzdm/.style={% - %lowerbox=ignored, enhanced, breakable, colback=white, @@ -1346,21 +1520,23 @@ }% }% -\NewDocumentEnvironment{exerciceDM}{so+b}{% +\NewDocumentEnvironment{exerciceDM}{so}{% \setcounter{PfMAlea}{0}% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#2}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \ifboolKV[ClesExercices]{NonUtilise}{% % Mettre la correction hors-jeu \setKV[ClesExercices]{PasCorrige}% \PfMChoixCorrection% + \begin{PfMHide} }{% \IfBooleanTF{#1}{% \setKV[ClesExercices]{Numerote=false}% }{}% - \refstepcounter{PfMSection}% - \PfMChoixCorrection% - \refstepcounter{PfMExo}% + \PfMAvantLesExercices% \ifboolKV[Boulot]{CorrigeSeul}{}{% \PfMChoixTitreSolution% \immediate\write\@auxout{% @@ -1376,12 +1552,11 @@ label=page-\thePfMMaquette-\thePfMExo,% ]% \ifboolKV[Boulot]{Dys}{\raggedright}{}% - #3 }% }% }{% - \ifboolKV[ClesExercices]{NonUtilise}{}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{ + \ifboolKV[ClesExercices]{NonUtilise}{\end{PfMHide}}{% + \ifboolKV[Boulot]{CorrigeSeul}{}{ \end{tcolorbox}% \PfMApresLesExercices% }% @@ -1509,23 +1684,25 @@ }% -\NewDocumentEnvironment{exerciceContrat}{so+b}{% +\NewDocumentEnvironment{exerciceContrat}{so}{% \setcounter{PfMAlea}{0}% \setcounter{PfMNbLogo}{1}% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#2}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \ifboolKV[ClesExercices]{NonUtilise}{% % Mettre la correction hors-jeu \setKV[ClesExercices]{PasCorrige}% \PfMChoixCorrection% + \begin{PfMHide} }{% \IfBooleanTF{#1}{% \setKV[ClesExercices]{Numerote=false}% }{}% \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}% - \refstepcounter{PfMSection}% - \PfMChoixCorrection% - \refstepcounter{PfMExo}% + \PfMAvantLesExercices% \ifboolKV[Boulot]{CorrigeSeul}{}{% \PfMChoixTitreSolution% \immediate\write\@auxout{\string\opcopy{\thePfMExo}{\Roman{PfMMaquette}-ContratTotalExo}}% @@ -1546,11 +1723,10 @@ label=page-\thePfMMaquette-\thePfMExo ] \ifboolKV[Boulot]{Dys}{\raggedright}{}% - #3 }% }% }{% - \ifboolKV[ClesExercices]{NonUtilise}{}{% + \ifboolKV[ClesExercices]{NonUtilise}{\end{PfMHide}}{% \ifboolKV[Boulot]{CorrigeSeul}{}{% \end{tcolorbox} \PfMApresLesExercices% @@ -1799,7 +1975,7 @@ \xdef\RetiensLeDepart{0}% \xdef\RetiensLesReponses{0}% \xdef\RetiensNonAffichees{0}% - \xdef\RetiensEtage{0} + \xdef\RetiensEtage{0}% \xintFor* ##1 in{\xintSeq{1}{\ListeRouteHautelen}}\do{% \xintifboolexpr{\ListeRouteHaute[##1]==0}{% \xdef\RetiensEtage{\fpeval{\RetiensEtage+1}}% @@ -1814,7 +1990,7 @@ \xintifboolexpr{\fpeval{\RetiensLesReponses-1}==\RetiensNonAffichees}{% % % }{% - \xintFor* ##2 in{\xintSeq{\fpeval{\RetiensLeDepart+1}}{\fpeval{\RetiensLeDepart+\RetiensLesReponses}}}\do{ + \xintFor* ##2 in{\xintSeq{\fpeval{\RetiensLeDepart+1}}{\fpeval{\RetiensLeDepart+\RetiensLesReponses}}}\do{% \xintifboolexpr{\ListeRouteHaute[##2]<0}{% \draw (B-##2) to (B-\fpeval{##2+1});% }{% @@ -1863,24 +2039,28 @@ \fi \immediate\write\@auxout{\noexpand\expandafter\gdef\noexpand\csname \Roman{PfMMaquette}FdR#1\endcsname{\csname \Roman{PfMMaquette}route#1\endcsname}}% }% - -\NewDocumentEnvironment{exerciceFdR}{so+b}{% + +\def\Relecture{}% + +\NewDocumentEnvironment{exerciceFdR}{so}{% \setcounter{PfMAlea}{0}% \setcounter{PfMNbLogo}{1}% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#2}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \ifboolKV[ClesExercices]{NonUtilise}{% % Mettre la correction hors-jeu \setKV[ClesExercices]{PasCorrige}% \PfMChoixCorrection% + \begin{PfMHide} }{% \IfBooleanTF{#1}{% \setKV[ClesExercices]{Numerote=false}% }{}% \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}% - \stepcounter{PfMSection}% - \PfMChoixCorrection% - \refstepcounter{PfMExo}% + \PfMAvantLesExercices% \ifboolKV[Boulot]{CorrigeSeul}{}{% \PfMChoixTitreSolution% \immediate\write\@auxout{\string\opcopy{\thePfMExo}{\Roman{PfMMaquette}-FdRTotalExo}}% @@ -1914,11 +2094,10 @@ label=page-\thePfMMaquette-\thePfMExo ] \ifboolKV[Boulot]{Dys}{\raggedright}{}% - #3 }% }% }{% - \ifboolKV[ClesExercices]{NonUtilise}{}{% + \ifboolKV[ClesExercices]{NonUtilise}{\end{PfMHide}}{% \ifboolKV[Boulot]{CorrigeSeul}{}{% \end{tcolorbox} \PfMApresLesExercices% @@ -1945,7 +2124,7 @@ \string\opcopy{\thePfMExo}{TotalExo}% }% \@bsphack% - \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.can"% + \immediate\openout \verbatim@out "\jobname-Ma\thePfMMaquette-Ex\thePfMExo.can"% \let\do\@makeother\dospecials% \catcode`\^^M\active% \def\verbatim@processline{\immediate\write\verbatim@out{\the\verbatim@line}}% @@ -1970,7 +2149,6 @@ \tcbset{% usercan/.style={% enhanced, - % spread upwards=-1cm,colback=gray!5% frame hidden, colback=white, middle=24pt, @@ -2030,7 +2208,6 @@ \Large\sffamily Course aux nombres (Correction) \end{center} \hfill\useKV[CAN]{Niveau}% - %\par{\tiny\useKV[CAN]{Code}}\hfill{\scriptsize\useKV[CAN]{Date}}% \end{tcolorbox}% } %%% FdR %%% @@ -2112,19 +2289,33 @@ \reademptyitems% \xdef\PfMFooTestA{\ListeExercicesPA[1]}% \ifnum\ListeExercicesPAlen>1\relax% - \xintFor* ##1 in{\xintSeq{2}{\ListeExercicesPAlen}}\do{% - \xdef\PfMFooTestA{\PfMFooTestA,\ListeExercicesPA[##1]}% - }% + \xintFor* ##1 in{\xintSeq{2}{\ListeExercicesPAlen}}\do{% + \xdef\PfMFooTestA{\PfMFooTestA,\ListeExercicesPA[##1]}% + }% \fi% - \ifboolKV[Parcours]{Vertical}{% - \BuildParcoursTikzV{\ParcoursTotalExo}{\PfMFooTestA}% + \ifboolKV[Parcours]{Plan}{% + \BuildParcoursPlan{\ParcoursTotalExo}{\PfMFooTestA}% }{% - \BuildParcoursTikz{\ParcoursTotalExo}{\PfMFooTestA}% + \ifboolKV[Parcours]{Vertical}{% + \BuildParcoursTikzV{\ParcoursTotalExo}{\PfMFooTestA}% + }{% + \BuildParcoursTikz{\ParcoursTotalExo}{\PfMFooTestA}% + }% }% }% }% %\makeatother +\NewDocumentCommand\BuildParcoursPlan{mm}{% + \setsepchar{,}% + \readlist*\ListeRetiens{#2}% + \begin{enumerate} + \foreachitem\compteur\in\ListeRetiens{% + \item[$\square$] Exercice \ref{page-\thePfMMaquette-\ListeRetiens[\compteurcnt]}% + }% + \end{enumerate} +}% + \NewDocumentCommand\BuildParcoursTikzV{mm}{% \setsepchar{,}% \readlist*\ListeRetiens{#2}% @@ -2155,8 +2346,13 @@ \begin{tikzpicture}[anchor=center,baseline=-1.25mm] % On place les points \Orientation=1\relax + \ifboolKV[Parcours]{Court}{% + \TotalParcoursTikz=\ListeRetienslen% + }{% + \TotalParcoursTikz=#1% + }% \coordinate[anchor=base,baseline=-1.25mm] (A-1) at (0,0);% - \xintFor* ##1 in{\xintSeq{2}{\fpeval{#1+1}}}\do{% + \xintFor* ##1 in{\xintSeq{2}{\fpeval{\the\TotalParcoursTikz+1}}}\do{% \modulo{##1}{\useKV[SchemaParcours]{Colonnes}}% \ifnum\remainder=0\relax% \Orientation=\numexpr\Orientation*(-1)\relax% @@ -2165,17 +2361,23 @@ \coordinate[xshift=\the\Orientation*\PfMLargeurSchemaParcours] (A-##1) at (A-\fpeval{##1-1});% \fi% }% - \foreach\i in{2,...,#1}{% - \draw[line width=1pt] (A-\fpeval{\i-1}) -- (A-\i);% - }% - % - \draw[line width=1pt,>=latex,->] (A-#1)--(A-\fpeval{#1+1}); - % - \xintFor* ##1 in{\xintSeq{1}{#1}}\do{% - \draw[fill=white,dashed](A-##1) circle (2.5mm) node{##1};% + \foreach\i in{1,...,\the\TotalParcoursTikz}{% + \draw[line width=1pt] (A-\i) -- (A-\fpeval{\i+1});% }% - \foreachitem\compteur\in\ListeRetiens{% - \draw[fill=PfMCouleurSP](A-\ListeRetiens[\compteurcnt]) circle (2.5mm) node{\ref{page-\thePfMMaquette-\ListeRetiens[\compteurcnt]}};% +% % + \draw[line width=1pt,>=latex,->] (A-\the\TotalParcoursTikz)--(A-\fpeval{\the\TotalParcoursTikz+1}); +% % + \ifboolKV[Parcours]{Court}{% + \foreachitem\compteur\in\ListeRetiens{% + \draw[fill=PfMCouleurSP](A-\compteurcnt) circle (2.5mm) node{\ref{page-\thePfMMaquette-\ListeRetiens[\compteurcnt]}};% + }% + }{% + \xintFor* ##1 in{\xintSeq{1}{\the\TotalParcoursTikz}}\do{% + \draw[fill=white,dashed](A-##1) circle (2.5mm) node{##1};% + }% + \foreachitem\compteur\in\ListeRetiens{% + \draw[fill=PfMCouleurSP](A-\ListeRetiens[\compteurcnt]) circle (2.5mm) node{\ref{page-\thePfMMaquette-\ListeRetiens[\compteurcnt]}};% + }% }% \end{tikzpicture}% }% @@ -2195,7 +2397,7 @@ \stepcounter{PfMExo}% \PfMChoixCorrection% \@bsphack% - \immediate\openout \verbatim@out "\jobname-PPEx\thePfMExo.tex" % + \immediate\openout \verbatim@out "\jobname-Ma\thePfMMaquette-PPEx\thePfMExo.tex" % \immediate\write\verbatim@out{\string\begin{exercice}} \let\do\@makeother\dospecials% \catcode`\^^M\active% @@ -2205,23 +2407,25 @@ \def\endexerciceParcoursPerso{\immediate\write\verbatim@out{\string\end{exercice}}\immediate\closeout\verbatim@out\@esphack}% -\NewDocumentEnvironment{exerciceParcours}{so+b}{% +\NewDocumentEnvironment{exerciceParcours}{so}{% \setcounter{PfMAlea}{0}% \setcounter{PfMNbLogo}{1}% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#2}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \ifboolKV[ClesExercices]{NonUtilise}{% % Mettre la correction hors-jeu \setKV[ClesExercices]{PasCorrige}% \PfMChoixCorrection% + \begin{PfMHide} }{% \IfBooleanTF{#1}{% \setKV[ClesExercices]{Numerote=false}% }{}% \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}% - \refstepcounter{PfMSection}% - \PfMChoixCorrection% - \refstepcounter{PfMExo}% + \PfMAvantLesExercices% \ifboolKV[Boulot]{CorrigeSeul}{}{% \PfMChoixTitreSolution% \immediate\write\@auxout{\string\opcopy{\thePfMExo}{\Roman{PfMMaquette}-ParcoursTotalExo}}% @@ -2242,11 +2446,10 @@ label=page-\thePfMMaquette-\thePfMExo ] \ifboolKV[Boulot]{Dys}{\raggedright}{}% - #3 }% }% }{% - \ifboolKV[ClesExercices]{NonUtilise}{}{% + \ifboolKV[ClesExercices]{NonUtilise}{\end{PfMHide}}{% \ifboolKV[Boulot]{CorrigeSeul}{}{% \end{tcolorbox} \PfMApresLesExercices% @@ -2312,15 +2515,24 @@ \NewDocumentCommand\PfMApresLesExercices{}{% \ifboolKV[ClesExercices]{Ligne}{% - % \vspace{\PfMEspaceAvantLignes} - \PfMSetStretch\PfMLignespointilles{\useKV[ClesExercices]{Lignes}}% + \vspace*{\PfMEspaceAvantLignes}% + \PfMSetStretch\PfMLignespointilles{\useKV[ClesExercices]{Lignes}}% \par\vspace*{\PfMEspaceApresLignes}\par% }{}% \par% \ifboolKV[ClesExercices]{Cadres}{% - \begin{PfMtcbEncart}% - % - \end{PfMtcbEncart}% + \begin{PfMtcbEncart}% + % + \end{PfMtcbEncart}% + }{}% + \ifboolKV[ClesExercices]{Profile}{\PfMshowitems}{}% + \ifboolKV[ClesExercices]{ACompleter}{% + \IfHookExistsTF{env/center/begin}{\RemoveFromHook{env/center/begin}[*]}{}% + \IfHookExistsTF{env/center/end}{\RemoveFromHook{env/center/after}[*]}{}% + \IfHookExistsTF{env/itemize/begin}{\RemoveFromHook{env/itemize/begin}[*]}{}% + \IfHookExistsTF{env/itemize/end}{\RemoveFromHook{env/itemize/after}[*]}{}% + \IfHookExistsTF{env/description/begin}{\RemoveFromHook{env/description/begin}[*]}{}% + \IfHookExistsTF{env/description/end}{\RemoveFromHook{env/description/after}[*]}{}% }{}% }% @@ -2329,7 +2541,7 @@ \expandafter\xdef\csname PfMEcrireTitreSol\endcsname{\csname PfMTSol\Roman{PfMExoSol}\endcsname}% \ifx\bla\PfMEcrireTitreSol\bla% \else - \PfMEcrireTitreSol% + ~:~\PfMEcrireTitreSol% \fi% }% @@ -2361,68 +2573,105 @@ \fi% }% -\newbox\PfMBoxSauvegarde% +\NewDocumentCommand\PfMAvantLesExercices{}{% + \ifboolKV[ClesExercices]{AvecIndications}{\setcounter{RetiensIndic}{1}}{}% + \ifboolKV[ClesExercices]{Profile}{\PfMhideitems}{}% + \refstepcounter{PfMSection}% + \PfMChoixCorrection% + \PfMChoixEntrainement% + \refstepcounter{PfMExo}% + \ifboolKV[ClesExercices]{ACompleter}{% + \let\oldenumerate\enumerate% + \let\oldendenumerate\endenumerate% + \let\enumerate\autoenumerate% + \let\endenumerate\endautoenumerate% + \AddToHook{env/center/begin}[Bcenter]{\let\item\olditem}% + \AddToHook{env/center/end}[Ecenter]{\let\item\litem}% + \AddToHook{env/description/begin}[Bdescription]{\let\item\olditem}% + \AddToHook{env/description/end}[Edescription]{\let\item\litem}% + \AddToHook{env/itemize/begin}[Bitemize]{\let\item\olditem}% + \AddToHook{env/itemize/end}[Eitemize]{\let\item\litem}% + }{}% +}% -\NewDocumentEnvironment{exerciceFiche}{so+b}{% +\NewDocumentEnvironment{exerciceFiche}{so}{% \setcounter{PfMAlea}{0}% \setcounter{PfMNbLogo}{1}% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#2}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \ifboolKV[ClesExercices]{NonUtilise}{% % Mettre la correction hors-jeu \setKV[ClesExercices]{PasCorrige}% \PfMChoixCorrection% + \begin{PfMHide} }{% \IfBooleanTF{#1}{% \setKV[ClesExercices]{Numerote=false}% }{}% - \ifboolKV[ClesExercices]{Profile}{\PfMhideitems}{}% \colorlet{ColExoFiche}{\useKV[ClesExercices]{Background}}% \colorlet{PfMCadreFiche}{\useKV[ClesExercices]{Cadre}}% \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}% - \refstepcounter{PfMSection}% - \PfMChoixCorrection% - \refstepcounter{PfMExo}% + \PfMAvantLesExercices% \ifboolKV[Boulot]{CorrigeSeul}{}{% - \PfMChoixTitreSolution% - \PfMChoixHideItemSolution% - \begin{tcolorbox}[% - tikzfiche, - label is label, - label=page-\thePfMMaquette-\thePfMExo - ] - \ifboolKV[Boulot]{Dys}{\raggedright}{}% - % - #3 + \PfMChoixTitreSolution% + \PfMChoixHideItemSolution% + \begin{tcolorbox}[% + tikzfiche, + label is label, + label=page-\thePfMMaquette-\thePfMExo + ] + \ifboolKV[Boulot]{Dys}{\raggedright}{}% }% }% }{% - \ifboolKV[ClesExercices]{NonUtilise}{}{% + \ifboolKV[ClesExercices]{NonUtilise}{\end{PfMHide}}{% \ifboolKV[Boulot]{CorrigeSeul}{}{ \end{tcolorbox}% - \ifboolKV[ClesExercices]{Profile}{\PfMshowitems}{}% + % \ifboolKV[ClesExercices]{Profile}{\PfMshowitems}{}% \PfMApresLesExercices% }% }% }% +%\makeatletter +\NewDocumentCommand\TikzOlympiadesAPMEPCor{m}{% + \ifPfMRectoVerso% + \cleardoublepage% + \else% + \clearpage% + \fi% + \setKV[OlympiadesAPMEP]{#1}% + \begin{tcolorbox}[colback=colLogo] + \begin{Dispo}*{\normalsize\logoapmep{\scale@logo}} + \Large\sffamily \useKV[OlympiadesAPMEP]{Theme} + + (Correction)% + \end{Dispo} + \end{tcolorbox}% +}% +%\makeatother + \NewDocumentEnvironment{exerciceOlympiadesAPMEP}{so}{% \setcounter{PfMAlea}{0}% \setcounter{PfMNbLogo}{1}% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#2}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \ifboolKV[ClesExercices]{NonUtilise}{% % Mettre la correction hors-jeu \setKV[ClesExercices]{PasCorrige}% \PfMChoixCorrection% + \begin{PfMHide} }{% \IfBooleanTF{#1}{% \setKV[ClesExercices]{Numerote=false}% }{}% - \ifboolKV[ClesExercices]{Profile}{\PfMhideitems}{}% - \colorlet{ColExoFiche}{\useKV[ClesExercices]{Background}}% - \colorlet{PfMCadreFiche}{\useKV[ClesExercices]{Cadre}}% - \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}% + \PfMAvantLesExercices% \refstepcounter{PfMSection}% \PfMChoixCorrection% \refstepcounter{PfMExo}% @@ -2438,29 +2687,30 @@ }% }% }{% - \ifboolKV[ClesExercices]{NonUtilise}{}{% + \ifboolKV[ClesExercices]{NonUtilise}{\end{PfMHide}}{% \end{tcolorbox}% - \ifboolKV[ClesExercices]{Profile}{\PfMshowitems}{}% + %\ifboolKV[ClesExercices]{Profile}{\PfMshowitems}{}% \PfMApresLesExercices% - } + }% }% -\NewDocumentEnvironment{exerciceDS}{so+b}{% +\NewDocumentEnvironment{exerciceDS}{so}{% \setcounter{PfMAlea}{0}% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#2}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \ifboolKV[ClesExercices]{NonUtilise}{% % Mettre la correction hors-jeu \setKV[ClesExercices]{PasCorrige}% \PfMChoixCorrection% + \begin{PfMHide} }{% \IfBooleanTF{#1}{% \setKV[ClesExercices]{Numerote=false}% }{}% - \ifboolKV[ClesExercices]{Profile}{\PfMhideitems}{}% - \refstepcounter{PfMSection}% - \PfMChoixCorrection% - \refstepcounter{PfMExo}% + \PfMAvantLesExercices \ifboolKV[Boulot]{CorrigeSeul}{}{% \PfMChoixTitreSolution% \immediate\write\@auxout{% @@ -2476,11 +2726,10 @@ label=page-\thePfMMaquette-\thePfMExo ] \ifboolKV[Boulot]{Dys}{\raggedright}{}% - #3 }% }% }{% - \ifboolKV[ClesExercices]{NonUtilise}{}{% + \ifboolKV[ClesExercices]{NonUtilise}{\end{PfMHide}}{% \ifboolKV[Boulot]{CorrigeSeul}{}{% \end{tcolorbox}% \PfMApresLesExercices% @@ -2490,8 +2739,11 @@ \NewDocumentEnvironment{ExerciceRecapBrevet}{so}{% \setcounter{PfMAlea}{0}% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#2}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \IfBooleanTF{#1}{% \setKV[ClesExercices]{Numerote=false}% }{}% @@ -2655,8 +2907,11 @@ \newenvironment{exercicePdT}[1][]{% \setcounter{PfMAlea}{0}% \setcounter{PfMNbLogo}{1} + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#1}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}% \refstepcounter{PfMSection}% \PfMChoixCorrection% @@ -2704,6 +2959,17 @@ \end{tikzpicture}% }% +\NewDocumentCommand\CheminNeutre{m}{% + \setsepchar[*]{,*/}% + \readlist*\ListeCheminVrai{#1}% + \setsepchar{,}% + \begin{tikzpicture}[remember picture,overlay]% + \foreachitem\compteur\in\ListeCheminVrai{% + \draw[cheminPdT] (\ListeCheminVrai[\compteurcnt,1]) to (\ListeCheminVrai[\compteurcnt,2]);% + }% + \end{tikzpicture}% +}% + \NewDocumentCommand\CheminFaux{m}{% \setsepchar[*]{,*/}% \readlist*\ListeCheminVrai{#1}% @@ -2785,8 +3051,11 @@ }% \NewDocumentEnvironment{exerciceKholle}{o}{% + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices]% \setKV[ClesExercices]{#1}% + \ifboolKV[Boulot]{Input}{\Relecture}{}% \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}% \PfMChoixCorrection% \refstepcounter{PfMExo}% @@ -2803,8 +3072,11 @@ \newenvironment{exerciceBase}[1][]{% \setcounter{PfMAlea}{0}% \setcounter{PfMNbLogo}{1} + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices] \setKV[ClesExercices]{#1} + \ifboolKV[Boulot]{Input}{\Relecture}{}% \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false} \refstepcounter{PfMExo} \tcolorbox[% @@ -2816,8 +3088,11 @@ \newenvironment{exerciceBaseHTML}[1][]{% \setcounter{PfMAlea}{0}% \setcounter{PfMNbLogo}{1} + % Mettre les indications hors-jeu + \setcounter{RetiensIndic}{0} \useKVdefault[ClesExercices] \setKV[ClesExercices]{#1} + \ifboolKV[Boulot]{Input}{\Relecture}{}% \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false} \refstepcounter{PfMExo} \tcolorbox[% @@ -3083,7 +3358,7 @@ % colframe=PfMCadreFiche, frame hidden, overlay unbroken and first={% - \draw[colLogo,line width=1pt] ([yshift=-10pt]frame.north west)--([yshift=-10pt]frame.north east); + \draw[colLogo,line width=1pt] ([yshift=-12pt]frame.north west)--([yshift=-12pt]frame.north east); \node[% name=A, fill=ColExoFiche, @@ -3311,13 +3586,13 @@ \ifnum\fpeval{\ListeExerciceslen}=1\relax{} \setKVdefault[ClesExercices]{Numerote=false} % \begin{exercice}* - \input{\jobname-PPEx\ListeExercices[1].tex}% + \input{\jobname-Ma\thePfMMaquette-PPEx\ListeExercices[1].tex}% % \end{exercice}% \setKVdefault[ClesExercices]{Numerote} \else \foreach\i in{1,...,\ListeExerciceslen}{% % \begin{exercice} - \input{\jobname-PPEx\ListeExercices[\i].tex}% + \input{\jobname-Ma\thePfMMaquette-PPEx\ListeExercices[\i].tex}% % \end{exercice}% } \fi @@ -3327,10 +3602,10 @@ \TikzFicheCor{#1,Code=\normalsize\Prenom~\Nom}% \readlist*\ListeExercices{\RecapListeExo}% \ifnum\fpeval{\ListeExerciceslen}=1\relax{} - \textbf{Corrigé de l'exercice} : \input{\jobname-PPEx\ListeExercices[1].sol}\par\goodbreak% + \textbf{Corrigé de l'exercice} : \input{\jobname-Ma\thePfMMaquette-PPEx\ListeExercices[1].sol}\par\goodbreak% \else \foreach\i in{1,...,\ListeExerciceslen}{% - \textbf{Corrigé de l'exercice \i} : \input{\jobname-PPEx\ListeExercices[\i].sol}\par\goodbreak% + \textbf{Corrigé de l'exercice \i} : \input{\jobname-Ma\thePfMMaquette-PPEx\ListeExercices[\i].sol}\par\goodbreak% }% \fi% \fi% @@ -3344,7 +3619,7 @@ \TikzFicheCor{#1,Code=\normalsize\Prenom~\Nom}% \readlist*\ListeExercices{\RecapListeExo}% \foreach\i in{1,...,\ListeExerciceslen}{% - \IfFileExists{\jobname-PPEx\ListeExercices[\i].sol}{\textbf{Corrigé de l'exercice \i} : \input{\jobname-PPEx\ListeExercices[\i].sol}\par\goodbreak}{}% + \IfFileExists{\jobname-PPEx\ListeExercices[\i].sol}{\textbf{Corrigé de l'exercice \i} : \input{\jobname-Ma\thePfMMaquette-PPEx\ListeExercices[\i].sol}\par\goodbreak}{}% }% }% }% @@ -3363,14 +3638,6 @@ }{% \ifnum\thePfMMaquette=1\relax% \else% - %\ifnum\PfMFontSize=0\relax% - % \fontsize{10}{\fpeval{1.2*10}}% - %\else\ifnum\PfMFontSize=1\relax% - % \fontsize{11}{\fpeval{1.2*11}}% - % \else% - % \fontsize{12}{\fpeval{1.2*12}}% - % \fi% - %\fi% \fontsize{\fpeval{10+\PfMFontSize}}{\fpeval{1.2*(10+\PfMFontSize)}}% \selectfont% \renewcommand{\JustifyingParindent}{\parindent} @@ -3395,9 +3662,17 @@ }% %% Pour factoriser l'appel aux corrections dans l'environnement Maquette +\makeatletter \NewDocumentCommand\PfMPrepareCorrection{m}{% \useKVdefault[Boulot]% \setKV[Boulot]{#1}% + \if@CAN + \ifnum\thepage<5\relax + \xintFor* ##1 in{\xintSeq{1}{\fpeval{5-\thepage}}}\do{% + ~\clearpage% + }% + \fi% + \fi% \if@Dyslexie% \setKV[Boulot]{Dys}% \fi% @@ -3405,6 +3680,7 @@ \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}% \PfMChangerTailleCorrection% }% +\makeatletter \NewDocumentCommand\PfMAffichageCorrectionColonnes{}{% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% @@ -3418,9 +3694,63 @@ \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% }% +% GameBook +\tcbset{% + userlivreheros/.style={% + spread upwards=-1cm,colback=Ivory,colframe=black!25!Ivory% + }% +}% + +\setKVdefault[LivreHeros]{Theme=Les nombres décimaux} + +\NewDocumentCommand\vaen{m}{\ref{#1}}% + +\NewDocumentCommand\TikzLivreHeros{}{% + \begin{tcolorbox}[userlivreheros]% + \begin{center} + \Large\sffamily \useKV[LivreHeros]{Theme} + \end{center} + \end{tcolorbox}% +}% + +\tcbset{% + tikzLH/.style={% + before skip=1em, + enhanced, + coltitle=black, + colbacktitle=black!10!Ivory, + colframe=white, + colback=white, + attach boxed title to top center={yshift=-2mm}, + label is label + }% +}% + +\newcounter{PfMGameBook}[PfMMaquette] +\setcounter{PfMGameBook}{0} + +\makeatletter +\def\ExoGBWrite{% + \setcounter{PfMAlea}{0}% + \PfMChoixCorrection% + \stepcounter{PfMExo}% + \immediate\write\@auxout{% + \string\opcopy{\thePfMExo}{TotalExo}% + }% + \@bsphack% + \immediate\openout \verbatim@out "\jobname-Ma\thePfMMaquette-Ex\thePfMExo.gb"% + \let\do\@makeother\dospecials% + \catcode`\^^M\active% + \def\verbatim@processline{\immediate\write\verbatim@out{\the\verbatim@line}}% + \verbatim@start}% +\def\endExoGBWrite{\immediate\closeout\verbatim@out\@esphack}% +\makeatother +%%%% + %%%%%%%%%%%%%%% Debut Maquette %%%%%%% % Environnement englobant le tout. \makeatletter +\newwrite\PfMfile@out% \NewDocumentEnvironment{Maquette}{om}{% % on remet à zéro les compteurs de solutions : inutile ? \setcounter{RetiensSol}{0}% @@ -3431,10 +3761,17 @@ \setcounter{PfMSOS}{0}% % nouvelles valeurs. \stepcounter{PfMMaquette}% + \if@AssembleCorrections + \immediate\openout\PfMfile@out \jobname-DefiMq-\thePfMMaquette.tex% + \immediate\write\PfMfile@out{\unexpanded{\useKVdefault[Boulot]}}% + \immediate\write\PfMfile@out{\unexpanded{\setKV[Boulot]{#1}}}% + \immediate\write\PfMfile@out{\TikzFicheCor{\unexpanded{#2}}}% + \immediate\closeout\PfMfile@out% + \fi % options de boulot \IfHookExistsTF{env/Maquette/after}{\RemoveFromHook{env/Maquette/after}[*]}{}% - %\IfHookExistsTF{env/exercice/after}{\RemoveFromHook{env/exercice/after}[*]}{}% - % \AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}% + \AddToHook{env/Maquette/after}[RetiensExo]{\xdef\PfMRetiensLienExoMa{\PfMRetiensLienExoMa,\thePfMExo}} + %-------------- \useKVdefault[Boulot]% \setKV[Boulot]{#1}% \ifboolKV[Boulot]{CorrigeSeul}{\setKV[Boulot]{CorrigeFin}}{}% @@ -3442,32 +3779,34 @@ \setKV[Boulot]{Dys} \fi \PfMBasculeDys% - \IfHookExistsTF{env/exercice/after}{\RemoveFromHook{env/exercice/after}[*]\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}}{\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}}% + \IfHookExistsTF{env/exercice/after}{\RemoveFromHook{env/exercice/after}[*]\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection\PfMChoixAffichageEntrainement}}{\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection\PfMChoixAffichageEntrainement}}% % Test \IfHookExistsTF{env/exercice/begin}{\RemoveFromHook{env/exercice/begin}[*]}{}% \IfHookExistsTF{env/Maquette/end}{\RemoveFromHook{env/Maquette/end}[*]}{}% \ifboolKV[Boulot]{OlympiadesAPMEP}{% - \setKV[OlympiadesAPMEP]{#2}%\TikzOlympiadesAPMEP% - \let\exercice\exerciceOlympiadesAPMEP\let\endexercice\endexerciceOlympiadesAPMEP% - \ifboolKV[Boulot]{CorrigeFin}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1}% - \PfMAffichageCorrectionColonnes% - }% - }{}% - }{% - \ifboolKV[Boulot]{CAN}{% + % \input{PfMMaquetteOlympAPMEP}% + \setKV[OlympiadesAPMEP]{#2}%\TikzOlympiadesAPMEP% + \let\exercice\exerciceOlympiadesAPMEP\let\endexercice\endexerciceOlympiadesAPMEP% + \ifboolKV[Boulot]{CorrigeFin}{% + \AddToHook{env/Maquette/after}[Correction]{% + \PfMPrepareCorrection{#1}% + \TikzOlympiadesAPMEPCor{#2}% + \PfMAffichageCorrectionColonnes% + }% + }{}% + }{% + \ifboolKV[Boulot]{CAN}{% + % \input{PfMMaquetteCAN.tex} \setKV[CAN]{#2}% - %\ifboolKV[Boulot]{CorrigeSeul}{}{\TikzCAN}% \setcounter{PfMCNNumQ}{0}% \setlength{\PfMLargeurQuestion}{\useKV[CAN]{CoefQ}\linewidth}\setlength{\PfMLargeurReponse}{\useKV[CAN]{CoefR}\linewidth}\setlength{\PfMLargeurJury}{\useKV[CAN]{CoefJ}\linewidth}% \let\exercice\ExoCANWrite\let\endexercice\endExoCANWrite% \AddToHook{env/exercice/begin}{\setcounter{PfMAlea}{0}}% \AddToHook{env/Maquette/end}{% - \xdef\PfMAncienneGraine{\PfMChoisisGraineAlea{123456789}} + \xdef\PfMAncienneGraine{\PfMChoisisGraineAlea{123456789}}% \xdef\PfMCANTotalExo{\thePfMExo}% \setbox\PfMSauvegardeBox\vbox{% - \PfMGraineAlea{\thePfMMaquette} + \PfMGraineAlea{\thePfMMaquette}% \setcounter{PfMExo}{0}% \renewcommand{\arraystretch}{2}% \begin{longtable}{|c|m{\PfMLargeurQuestion}|>{\centering\arraybackslash}m{\PfMLargeurReponse}|m{\PfMLargeurJury}|}% @@ -3476,21 +3815,21 @@ \hline% \endhead% \xintFor* ##1 in {\xintSeq{1}{\PfMCANTotalExo}}\do{% - \refstepcounter{PfMCNNumQ}\ttfamily{\thePfMCNNumQ}\label{TestCAN-\thePfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ex##1.can}&\CNReponse&\\ + \refstepcounter{PfMCNNumQ}\ttfamily{\thePfMCNNumQ}\label{TestCAN-\thePfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ma\thePfMMaquette-Ex##1.can}&\CNReponse&\\ \hline% }% \end{longtable}% \renewcommand{\arraystretch}{1}% - } + }% \ifboolKV[Boulot]{CorrigeInverse}{% - \PfMPrepareCorrection{#1}% - \TikzCANCor{#2}% - \PfMAffichageCorrectionColonnes% - \clearpage - \normalsize% - \TikzCAN% - \PfMGraineAlea{\thePfMMaquette}% - \setcounter{PfMCNNumQ}{0}% + \PfMPrepareCorrection{#1}% + \TikzCANCor{#2}% + \PfMAffichageCorrectionColonnes% + \clearpage + \normalsize% + \TikzCAN% + \PfMGraineAlea{\thePfMMaquette}% + \setcounter{PfMCNNumQ}{0}% \setcounter{PfMExo}{0}% \renewcommand{\arraystretch}{2}% \begin{longtable}{|c|m{\PfMLargeurQuestion}|>{\centering\arraybackslash}m{\PfMLargeurReponse}|m{\PfMLargeurJury}|}% @@ -3499,7 +3838,7 @@ \hline% \endhead% \xintFor* ##1 in {\xintSeq{1}{\PfMCANTotalExo}}\do{% - \refstepcounter{PfMCNNumQ}\ttfamily{\thePfMCNNumQ}\label{TestCAN-\thePfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ex##1.can}&\CNReponse&\\ + \refstepcounter{PfMCNNumQ}\ttfamily{\thePfMCNNumQ}\label{TestCAN-\thePfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ma\thePfMMaquette-Ex##1.can}&\CNReponse&\\ \hline% }% \end{longtable}% @@ -3508,7 +3847,7 @@ \PfMGraineAlea{\PfMAncienneGraine}% \TikzCAN% \setcounter{PfMCNNumQ}{0}% - \setcounter{PfMExo}{0}% + \setcounter{PfMExo}{0}% \renewcommand{\arraystretch}{2}% \begin{longtable}{|c|m{\PfMLargeurQuestion}|>{\centering\arraybackslash}m{\PfMLargeurReponse}|m{\PfMLargeurJury}|}% \hhline{~---}% @@ -3516,233 +3855,276 @@ \hline% \endhead% \xintFor* ##1 in {\xintSeq{1}{\PfMCANTotalExo}}\do{% - \refstepcounter{PfMCNNumQ}\ttfamily{\thePfMCNNumQ}\label{TestCAN-\thePfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ex##1.can}&\CNReponse&\\ + \refstepcounter{PfMCNNumQ}\ttfamily{\thePfMCNNumQ}\label{TestCAN-\thePfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ma\thePfMMaquette-Ex##1.can}&\CNReponse&\\ \hline% }% \end{longtable}% \renewcommand{\arraystretch}{1}% - \ifboolKV[Boulot]{CorrigeFin}{\ifboolKV[Boulot]{CorrigeInverse}{}{\clearpage - \PfMPrepareCorrection{#1}% - \TikzCANCor{#2}% - \PfMAffichageCorrectionColonnes% - } - }{} - } + \ifboolKV[Boulot]{CorrigeFin}{% + \ifboolKV[Boulot]{CorrigeInverse}{}{% + \clearpage + \PfMPrepareCorrection{#1}% + \TikzCANCor{#2}% + \PfMAffichageCorrectionColonnes% + }% + }{}% + }% }% }{% \ifboolKV[Boulot]{FdR}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{% - \setKV[FdR]{#2}\TikzFdR% - } - \let\exercice\exerciceFdR\let\endexercice\endexerciceFdR% - \ifboolKV[Boulot]{AvecEntrainement}{% - \AddToHook{env/Maquette/end}[Haltere]{% - \PfMAffichageEntrainementColonnes% - }% - }{}% - \ifboolKV[Boulot]{CorrigeFin}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1}% - \TikzFdRCor{#2}% - \PfMAffichageCorrectionColonnes + % \input{PfMMaquetteFdR.tex}% + \ifboolKV[Boulot]{CorrigeSeul}{}{% + \setKV[FdR]{#2}\TikzFdR% }% - }{}% - }{% - \ifboolKV[Boulot]{Contrat}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{% - \setKV[Contrat]{#2}\TikzContrat% - } - \let\exercice\exerciceContrat\let\endexercice\endexerciceContrat% - \ifboolKV[Boulot]{AvecEntrainement}{% - \AddToHook{env/Maquette/end}[Haltere]{% - \PfMAffichageEntrainementColonnes% - }% - }{}% - \ifboolKV[Boulot]{CorrigeFin}{% + \let\exercice\exerciceFdR\let\endexercice\endexerciceFdR% + \ifboolKV[Boulot]{AvecEntrainement}{% + \AddToHook{env/Maquette/end}[Haltere]{% + \PfMAffichageEntrainementColonnes% + }% + }{}% + \ifboolKV[Boulot]{CorrigeFin}{% \AddToHook{env/Maquette/after}[Correction]{% \PfMPrepareCorrection{#1}% - \TikzContratCor{#2}% - \PfMAffichageCorrectionColonnes% - }% - }{}% - }{% - \ifboolKV[Boulot]{Cours}{% - \setKV[Cours]{#2}% - \TikzCours% - \let\exercice\exerciceFiche\let\endexercice\endexerciceFiche% - \ifboolKV[Boulot]{CorrigeFin}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1}% - \TikzFicheCor{#2}% - \PfMAffichageCorrectionColonnes - }% - }{}% - }{% - \ifboolKV[Boulot]{RecapBrevet}{% - \setKV[RecapBrevet]{#2}% - \TikzRecapBrevet% - \let\exercice\ExerciceRecapBrevet\let\endexercice\endExerciceRecapBrevet% - \ifboolKV[Boulot]{CorrigeFin}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1}% - \TikzRecapBrevetCor{#2}% - \PfMAffichageCorrectionColonnes% - }% - }{}% - }{% - \ifboolKV[Boulot]{ParcoursPerso}{% - \setKV[ParcoursPerso]{#2}% - \DTLloaddb[noheader,keys={PrenomEleve,NomEleve,ListeExo}]{dataperso}{\useKV[ParcoursPerso]{Fichier}.csv}% - \let\exercice\exerciceParcoursPerso\let\endexercice\endexerciceParcoursPerso% - \ifboolKV[Boulot]{CorrigeFin}{\setcounter{PfMCorrigeParcoursPerso}{1}}{}% - \setcounter{PfMExo}{0}% - \AtEndDocument{% - \Recapitulatif{#1}{#2}% - }% - }{% - \ifboolKV[Boulot]{Parcours}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{% - \setKV[Parcours]{#2}\TikzParcours% - } - \let\exercice\exerciceParcours\let\endexercice\endexerciceParcours% - \ifboolKV[Boulot]{AvecEntrainement}{% - \AddToHook{env/Maquette/end}[Haltere]{% - \PfMAffichageEntrainementColonnes% - }% - }{}% - \ifboolKV[Boulot]{CorrigeFin}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1}% - \TikzParcoursCor{#2} - \PfMAffichageCorrectionColonnes - }% + \TikzFdRCor{#2}% + \PfMAffichageCorrectionColonnes% + }% }{}% }{% - \ifboolKV[Boulot]{PdT}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{% - \setKV[PdT]{#2}\TikzPdT% - } - \let\exercice\exercicePdT\let\endexercice\endexercicePdT% + \ifboolKV[Boulot]{Contrat}{% + % \input{PfMMaquetteContrat.tex}% + \ifboolKV[Boulot]{CorrigeSeul}{}{% + \setKV[Contrat]{#2}\TikzContrat% + }% + \let\exercice\exerciceContrat\let\endexercice\endexerciceContrat% + \ifboolKV[Boulot]{AvecEntrainement}{% + \AddToHook{env/Maquette/end}[Haltere]{% + \PfMAffichageEntrainementColonnes% + }% + }{}% \ifboolKV[Boulot]{CorrigeFin}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1}% - \TikzPdTCor{#2}% - \PfMAffichageCorrectionColonnes% + \AddToHook{env/Maquette/after}[Correction]{% + \PfMPrepareCorrection{#1}% + \TikzContratCor{#2}% + \PfMAffichageCorrectionColonnes% }% }{}% }{% - \ifboolKV[Boulot]{DM}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{% - \setKV[DM]{#2}\TikzDM% - } - \let\exercice\exerciceDM\let\endexercice\endexerciceDM% + \ifboolKV[Boulot]{Cours}{% + % \input{PfMMaquetteCours.tex}% + \setKV[Cours]{#2}% + \TikzCours% + \let\exercice\exerciceFiche\let\endexercice\endexerciceFiche% \ifboolKV[Boulot]{CorrigeFin}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1}% - \TikzDMCor{#2}% - \PfMAffichageCorrectionColonnes% + \AddToHook{env/Maquette/after}[Correction]{% + \PfMPrepareCorrection{#1}% + \TikzFicheCor{#2}% + \PfMAffichageCorrectionColonnes% }% }{}% }{% - \ifboolKV[Boulot]{Fiche}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{% - \setKV[Fiche]{#2}% - \TikzFiche% + \ifboolKV[Boulot]{RecapBrevet}{% + % \input{PfMMaquetteRecapBrevet.tex}% + \setKV[RecapBrevet]{#2}% + \TikzRecapBrevet% + \let\exercice\ExerciceRecapBrevet\let\endexercice\endExerciceRecapBrevet% + \ifboolKV[Boulot]{CorrigeFin}{% + \AddToHook{env/Maquette/after}[Correction]{% + \PfMPrepareCorrection{#1}% + \TikzRecapBrevetCor{#2}% + \PfMAffichageCorrectionColonnes% + }% + }{}% + }{% + \ifboolKV[Boulot]{ParcoursPerso}{% + % \input{PfMMaquetteParcoursPerso.tex}% + \setKV[ParcoursPerso]{#2}% + \DTLloaddb[noheader,keys={PrenomEleve,NomEleve,ListeExo}]{dataperso}{\useKV[ParcoursPerso]{Fichier}.csv}% + \let\exercice\exerciceParcoursPerso\let\endexercice\endexerciceParcoursPerso% + \ifboolKV[Boulot]{CorrigeFin}{\setcounter{PfMCorrigeParcoursPerso}{1}}{}% + \setcounter{PfMExo}{0}% + \AtEndDocument{% + \Recapitulatif{#1}{#2}% }% - \let\exercice\exerciceFiche\let\endexercice\endexerciceFiche% - \ifboolKV[Boulot]{AvecEntrainement}{% + }{% + \ifboolKV[Boulot]{Parcours}{% + % \input{PfMMaquetteParcours.tex}% + \ifboolKV[Boulot]{CorrigeSeul}{}{% + \setKV[Parcours]{#2}\TikzParcours% + }% + \let\exercice\exerciceParcours\let\endexercice\endexerciceParcours% + \ifboolKV[Boulot]{AvecEntrainement}{% \AddToHook{env/Maquette/end}[Haltere]{% \PfMAffichageEntrainementColonnes% }% }{}% - \ifboolKV[Boulot]{CorrigeFin}{% - \ifboolKV[Boulot]{CorrigeAll}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1}% - \TikzFicheCor{#2}% - \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% - \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% - \IfFileExists{\jobname-Ex##1.sol}{\textbf{Corrigé de l'exercice ##1}\par\nopagebreak\input{\jobname-Ex##1.sol}\par\goodbreak}{}% - }% - \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% - \TikzFicheCorRep{#2}% - \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% - \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% - \IfFileExists{\jobname-Ex##1.rep}{\textbf{Réponse(s) de l'exercice ##1}\par\nopagebreak\input{\jobname-Ex##1.rep}\par\goodbreak}{}% - }% - \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% - \TikzFicheCorInd{#2}% - \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% - \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% - \IfFileExists{\jobname-Ex##1.cdp}{\textbf{Indice(s) pour l'exercice ##1}\par\nopagebreak\input{\jobname-Ex##1.cdp}\par\goodbreak}{}% - }% - \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% - }% - }{% - \AddToHook{env/Maquette/after}[Correction]{% - \useKVdefault[Boulot]% - \setKV[Boulot]{#1}% - %% - \if@Dyslexie - \setKV[Boulot]{Dys} - \fi - \PfMBasculeDys% - \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}% - \TikzFicheCor{#2}% - \PfMChangerTailleCorrection% - \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% - \PfMAffichageCorrige% - \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% - }% - }% - }{}% - }{% - \ifboolKV[Boulot]{DS}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{% - \setKV[DS]{#2}\TikzDS% - }% - \let\exercice\exerciceDS\let\endexercice\endexerciceDS% - \ifboolKV[Boulot]{BaremeComplet}{% - \begin{center} - \TableauRecapitulatif - \end{center} - }{}% - \ifboolKV[Boulot]{CorrigeFin}{% + \ifboolKV[Boulot]{CorrigeFin}{% \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1} - \TikzDSCor{#2}% + \PfMPrepareCorrection{#1}% + \TikzParcoursCor{#2}% \PfMAffichageCorrectionColonnes% - }% - }{}% - }{% - \ifboolKV[Boulot]{IE}{% - \ifboolKV[Boulot]{CorrigeSeul}{}{% - \setKV[IE]{#2}\TikzIE% - } - \let\exercice\exerciceDS\let\endexercice\endexerciceDS%On garde exerciceDS - \ifboolKV[Boulot]{CorrigeFin}{% - \AddToHook{env/Maquette/after}[Correction]{% - \PfMPrepareCorrection{#1} - \TikzIECor{#2}% - \PfMAffichageCorrectionColonnes }% }{}% }{% - \ifboolKV[Boulot]{Kholle}{% - \setKV[Kholle]{#2}% - \TikzKholle% - \let\exercice\exerciceKholle\let\endexercice\endexerciceKholle% - \ifboolKV[Kholle]{CR}{}{% + \ifboolKV[Boulot]{PdT}{% + % \input{PfMMaquettePdT.tex}% + \ifboolKV[Boulot]{CorrigeSeul}{}{% + \setKV[PdT]{#2}\TikzPdT% + }% + \let\exercice\exercicePdT\let\endexercice\endexercicePdT% + \ifboolKV[Boulot]{CorrigeFin}{% + \AddToHook{env/Maquette/after}[Correction]{% + \PfMPrepareCorrection{#1}% + \TikzPdTCor{#2}% + \PfMAffichageCorrectionColonnes% + }% + }{}% + }{% + \ifboolKV[Boulot]{DM}{% + % \input{PfMMaquetteDM.tex}% + \ifboolKV[Boulot]{CorrigeSeul}{}{% + \setKV[DM]{#2}\TikzDM% + }% + \let\exercice\exerciceDM\let\endexercice\endexerciceDM% \ifboolKV[Boulot]{CorrigeFin}{% \AddToHook{env/Maquette/after}[Correction]{% - \TikzKholleCor{#2}% - \TikzKholleCor{#2}% - \TikzKholleCor{#2}% - \PfMAffichageCorrige% + \PfMPrepareCorrection{#1}% + \TikzDMCor{#2}% + \PfMAffichageCorrectionColonnes% }% }{}% + }{% + \ifboolKV[Boulot]{Fiche}{% + \ifboolKV[Boulot]{CorrigeSeul}{}{% + \setKV[Fiche]{#2}% + \TikzFiche% + }% + \let\exercice\exerciceFiche\let\endexercice\endexerciceFiche% + \ifboolKV[Boulot]{AvecEntrainement}{% + \AddToHook{env/Maquette/end}[Haltere]{% + \PfMAffichageEntrainementColonnes% + }% + }{}% + \ifboolKV[Boulot]{CorrigeFin}{% + \ifboolKV[Boulot]{CorrigeAll}{% + \AddToHook{env/Maquette/after}[Correction]{% + \PfMPrepareCorrection{#1}% + \TikzFicheCor{#2}% + \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% + \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% + \IfFileExists{\jobname-Ma\thePfMMaquette-Ex##1.sol}{\textbf{Corrigé de l'exercice ##1}\par\nopagebreak\input{\jobname-Ma\thePfMMaquette-Ex##1.sol}\par\goodbreak}{}% + }% + \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% + \TikzFicheCorRep{#2}% + \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% + \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% + \IfFileExists{\jobname-Ma\thePfMMaquette-Ex##1.rep}{\textbf{Réponse(s) de l'exercice ##1}\par\nopagebreak\input{\jobname-Ma\thePfMMaquette-Ex##1.rep}\par\goodbreak}{}% + }% + \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% + \TikzFicheCorInd{#2}% + \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}% + \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% + \IfFileExists{\jobname-Ma\thePfMMaquette-Ex##1.cdp}{\textbf{Indice(s) pour l'exercice ##1}\par\nopagebreak\input{\jobname-Ma\thePfMMaquette-Ex##1.cdp}\par\goodbreak}{}% + }% + \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}% + }% + }{% + \AddToHook{env/Maquette/after}[Correction]{% +% \useKVdefault[Boulot]% +% \setKV[Boulot]{#1}% +% %% +% \if@Dyslexie +% \setKV[Boulot]{Dys}% +% \fi +% \PfMBasculeDys% +% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}% + \if@AssembleCorrections + \else + \PfMPrepareCorrection{#1}% + \TikzFicheCor{#2}% + \PfMAffichageCorrectionColonnes% + \fi% + }% + }% + }{}% + }{% + \ifboolKV[Boulot]{DS}{% + % \input{PfMMaquetteDS.tex}% + \ifboolKV[Boulot]{CorrigeSeul}{}{% + \setKV[DS]{#2}\TikzDS% + }% + \let\exercice\exerciceDS\let\endexercice\endexerciceDS% + \ifboolKV[Boulot]{BaremeComplet}{% + \begin{center} + \TableauRecapitulatif + \end{center} + }{}% + \ifboolKV[Boulot]{CorrigeFin}{% + \AddToHook{env/Maquette/after}[Correction]{% + \PfMPrepareCorrection{#1}% + \TikzDSCor{#2}% + \PfMAffichageCorrectionColonnes% + }% + }{}% + }{% + \ifboolKV[Boulot]{IE}{% + % \input{PfMMaquetteIE.tex}% + \ifboolKV[Boulot]{CorrigeSeul}{}{% + \setKV[IE]{#2}\TikzIE% + }% + \let\exercice\exerciceDS\let\endexercice\endexerciceDS%On garde exerciceDS + \ifboolKV[Boulot]{CorrigeFin}{% + \AddToHook{env/Maquette/after}[Correction]{% + \PfMPrepareCorrection{#1}% + \TikzIECor{#2}% + \PfMAffichageCorrectionColonnes% + }% + }{}% + }{% + \ifboolKV[Boulot]{Kholle}{% + % \input{PfMMaquetteKholle.tex}% + \setKV[Kholle]{#2}% + \TikzKholle% + \let\exercice\exerciceKholle\let\endexercice\endexerciceKholle% + \ifboolKV[Kholle]{CR}{}{% + \ifboolKV[Boulot]{CorrigeFin}{% + \AddToHook{env/Maquette/after}[Correction]{% + \TikzKholleCor{#2}% + \TikzKholleCor{#2}% + \TikzKholleCor{#2}% + \PfMAffichageCorrige% + }% + }{}% + }% + }{% + \ifboolKV[Boulot]{LivreHeros}{% + \setKV[LivreHeros]{#2}% + \TikzLivreHeros% + \let\exercice\ExoGBWrite\let\endexercice\endExoGBWrite% + \AddToHook{env/Maquette/end}{% + \xdef\PfMListeExoGB{}% + \xintFor* ##1 in{\xintSeq{2}{\thePfMExo}}\do{% + \xdef\PfMListeExoGB{\PfMListeExoGB,##1}% + }% + \MelangeListe{\PfMListeExoGB}{\fpeval{\thePfMExo-1}}% + \xdef\PfMFooMelange{1,\faa}% + \setsepchar{,}\ignoreemptyitems\readlist*\ListePerm{\PfMFooMelange}\reademptyitems% + \phantomsection{} + \addcontentsline{toc}{section}{\useKV[LivreHeros]{Theme}}% + \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{% + \itemtomacro\ListePerm[##1]\PfMPermute% + \begin{tcolorbox}[tikzLH,title=##1]% + \refstepcounter{PfMGameBook}% + \input{\jobname-Ma\thePfMMaquette-Ex\PfMPermute.gb}% + \end{tcolorbox}% + }% + }% + }{}% + }% + }% + }% + }% }% - }{}% + }% }% }% }% @@ -3751,11 +4133,6 @@ }% }% }% -}% -}% -}% -}% -}% }{}% \makeatother %D'après JCC @@ -4391,8 +4768,9 @@ \BaremeEspaceMarge{-82pt} } -\AddToHook{env/multicols/begin}{\setcounter{Nbcolonnes}{2}}% -\AddToHook{env/multicols/after}{\setcounter{Nbcolonnes}{4}}% +%\AddToHook{env/multicols/begin}{\setcounter{Nbcolonnes}{2}}% +%\AddToHook{env/multicols/after}{\setcounter{Nbcolonnes}{4}}% + \NewDocumentEnvironment{Dispo}{sm+b}{% \ifPfMDeuxColonnes \IfBooleanTF{#1}{% @@ -4468,4 +4846,114 @@ }% \fi% \end{align*} +}{}% + +\def\RetiensEchelle{1cm} +\def\ChoixNbQuestions{3} +\makeatletter +\if@CAN + \AddToHook{env/document/before}{% + \ProvidesPackage{ProfMaquette}[Mode CAN (CP)]% + \RequirePackage{pgfmorepages} + \pgfmorepagesloadextralayouts + \pgfpagesuselayout{4 on 2, book format}[a4paper,landscape] + } +\fi + +\if@Revision + \AddToHook{env/document/before}{% + \ProvidesPackage{ProfMaquette}[Mode Revision (CP)]% + \setcounter{Nbcolonnes}{2}% + \def\RetiensEchelle{0.5cm} + \RequirePackage{pgfmorepages} + \pgfmorepagesloadextralayouts + \pgfpagesuselayout{4 on 2, book format}[a4paper] + } +\fi + +\if@Personnel + \input{PfMPerso.cfg} +\fi +\makeatother + +% enumitem obligatoire ^^ +\RequirePackage{enumitem} +% d'après https://tex.stackexchange.com/questions/164613/adding-code-at-the-end-of-each-list-item +\newif\iffirstlegal\firstlegalfalse% We need a toggle to track whether the item is first in the list or not + +\newlist{Test}{enumerate}{3} + +\def\PfMPar{\par} + +\NewDocumentCommand\litem{}{} + +\let\olditem\item% save the standard definition of \item in a macro, \olditem + +\setlist[Test,1]{% + leftmargin=*, + label=\arabic*., + before={% + \setcounter{PfMProfondeur}{1}% + \setcounter{PfMNbLignesFinitem}{0} + \firstlegaltrue% set the toggle for first item in the list to true + \def\Primeitem{\iffirstlegal\olditem\stepcounter{PfMNbLignesFinitem}% + \firstlegalfalse + \else + \ifnum\PfMListeDesAjoutsdeLignes[\thePfMNbLignesFinitem]>1\relax\PfMPar\Lignespointilles{\PfMListeDesAjoutsdeLignes[\thePfMNbLignesFinitem]}\else\ifnum\PfMListeDesAjoutsdeLignes[\thePfMNbLignesFinitem]=1\relax\PfMPar\pointilles\fi\fi% + \olditem\stepcounter{PfMNbLignesFinitem}% + \fi + }% new, temporary defition of \item + \let\litem\Primeitem + \let\item\litem + }, + after={% + \ifnum\PfMListeDesAjoutsdeLignes[\thePfMNbLignesFinitem]>0\relax\PfMPar\Lignespointilles{\PfMListeDesAjoutsdeLignes[\thePfMNbLignesFinitem]}\else\ifnum\PfMListeDesAjoutsdeLignes[\thePfMNbLignesFinitem]=1\relax\PfMPar\pointilles\fi\fi% + % fill for final item in list + \let\litem\olditem% restore standard definition of \item + \let\item\olditem + \setcounter{PfMProfondeur}{0}% + }% +}% + +\setlist[Test,2]{% + leftmargin=*, + label=(\alph*), + before={% + \setcounter{PfMProfondeur}{2}% + \setcounter{PfMNbLignesFinitemi}{0} + \firstlegaltrue% + \def\Seconditem{\iffirstlegal\olditem\stepcounter{PfMNbLignesFinitemi}\firstlegalfalse\else% + \ifnum\PfMListeDesAjoutsdeLignesi[\thePfMNbLignesFinitemi]>1\relax\PfMPar\Lignespointilles{\PfMListeDesAjoutsdeLignesi[\thePfMNbLignesFinitemi]}\else\ifnum\PfMListeDesAjoutsdeLignesi[\thePfMNbLignesFinitemi]=1\relax\PfMPar\pointilles\fi + \fi% + \olditem\stepcounter{PfMNbLignesFinitemi} + \fi + }% new, temporary defition of \item + \let\litem\Seconditem + \let\item\litem + }, + after={% + \ifnum\PfMListeDesAjoutsdeLignesi[\thePfMNbLignesFinitemi]>1\relax\PfMPar\Lignespointilles{\PfMListeDesAjoutsdeLignesi[\thePfMNbLignesFinitemi]}\else\ifnum\PfMListeDesAjoutsdeLignesi[\thePfMNbLignesFinitemi]=1\relax\PfMPar\pointilles\fi + \fi% +% % fill for final item in list + \let\litem\Primeitem% + \let\item\litem + \setcounter{PfMProfondeur}{1}% + }% +} + +\newcounter{PfMNbLignesFinitem} +\newcounter{PfMNbLignesFinitemi} +\newcounter{PfMProfondeur} +\setcounter{PfMProfondeur}{0}% + +\NewDocumentEnvironment{autoenumerate}{O{}m +b}{% + \setsepchar{,}\ignoreemptyitems% + \ifnum\thePfMProfondeur=0\relax% + \readlist*\PfMListeDesAjoutsdeLignes{#2}% + \else% + \readlist*\PfMListeDesAjoutsdeLignesi{#2}% + \fi% + \begin{Test}[#1]% + #3 + \end{Test}% }{}%
\ No newline at end of file diff --git a/macros/latex/required/l3kernel/CHANGELOG.md b/macros/latex/required/l3kernel/CHANGELOG.md index 76ee35a0f1..fff85488a7 100644 --- a/macros/latex/required/l3kernel/CHANGELOG.md +++ b/macros/latex/required/l3kernel/CHANGELOG.md @@ -7,6 +7,12 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2024-08-16] + +### Added +- Add quark (`\q_`) and scan mark (`\s_`) prefixes to naming scheme + (issue \#1565) + ## [2024-07-20] ### Fixed @@ -1753,7 +1759,8 @@ this project uses date-based 'snapshot' version identifiers. - Step functions have been added for dim variables, e.g. `\dim_step_inline:nnnn` -[Unreleased]: https://github.com/latex3/latex3/compare/2024-07-20...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2024-08-16...HEAD +[2024-08-16]: https://github.com/latex3/latex3/compare/2024-07-20...2024-08-16 [2024-07-20]: https://github.com/latex3/latex3/compare/2024-06-19...2024-07-20 [2024-06-19]: https://github.com/latex3/latex3/compare/2024-05-27...2024-06-19 [2024-05-27]: https://github.com/latex3/latex3/compare/2024-05-08...2024-05-27 diff --git a/macros/latex/required/l3kernel/README.md b/macros/latex/required/l3kernel/README.md index 0afb38a9ba..5807a75274 100644 --- a/macros/latex/required/l3kernel/README.md +++ b/macros/latex/required/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2024-07-20 +Release 2024-08-16 Overview -------- diff --git a/macros/latex/required/l3kernel/expl3.dtx b/macros/latex/required/l3kernel/expl3.dtx index 64c65d0ff7..ad5cb365dd 100644 --- a/macros/latex/required/l3kernel/expl3.dtx +++ b/macros/latex/required/l3kernel/expl3.dtx @@ -24,7 +24,7 @@ % %<*driver|generic|package|2ekernel> %</driver|generic|package|2ekernel> -\def\ExplFileDate{2024-07-20}% +\def\ExplFileDate{2024-08-16}% %<*driver> \documentclass[full]{l3doc} \usepackage{graphicx} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % @@ -454,6 +454,15 @@ % implementation in \LaTeX3 means that |toks| are not required, and that % all operations for storing tokens can use the |tl| variable type. % +% There are two more special types of constants: +% \begin{arg-description} +% \item[q] constants of quark type; +% \item[s] constants of scan mark type. +% \end{arg-description} +% The \meta{type} part of quark and scan mark constants is omitted, and +% the \meta{module} part of general quarks and scan marks is often +% omitted too. +% % Experienced \TeX{} programmers will notice that some of the variable % types listed are native \TeX{} registers whilst others are not. In % general, the underlying \TeX{} implementation for a data structure may diff --git a/macros/latex/required/l3kernel/expl3.pdf b/macros/latex/required/l3kernel/expl3.pdf Binary files differindex 650e6999f9..0c0ef88180 100644 --- a/macros/latex/required/l3kernel/expl3.pdf +++ b/macros/latex/required/l3kernel/expl3.pdf diff --git a/macros/latex/required/l3kernel/interface3.pdf b/macros/latex/required/l3kernel/interface3.pdf Binary files differindex 1b89f2f257..b632b9b9e9 100644 --- a/macros/latex/required/l3kernel/interface3.pdf +++ b/macros/latex/required/l3kernel/interface3.pdf diff --git a/macros/latex/required/l3kernel/interface3.tex b/macros/latex/required/l3kernel/interface3.tex index 0219809dab..1a5cc9564f 100644 --- a/macros/latex/required/l3kernel/interface3.tex +++ b/macros/latex/required/l3kernel/interface3.tex @@ -58,7 +58,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2024-07-20} +\date{Released 2024-08-16} \pagenumbering{roman} \maketitle diff --git a/macros/latex/required/l3kernel/l3basics.dtx b/macros/latex/required/l3kernel/l3basics.dtx index ad15d79653..8ef1f6a5be 100644 --- a/macros/latex/required/l3kernel/l3basics.dtx +++ b/macros/latex/required/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3bitset.dtx b/macros/latex/required/l3kernel/l3bitset.dtx index 2b62c68b4a..5fc681a677 100644 --- a/macros/latex/required/l3kernel/l3bitset.dtx +++ b/macros/latex/required/l3kernel/l3bitset.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3bootstrap.dtx b/macros/latex/required/l3kernel/l3bootstrap.dtx index 7f4eba752b..b3c8536420 100644 --- a/macros/latex/required/l3kernel/l3bootstrap.dtx +++ b/macros/latex/required/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3box.dtx b/macros/latex/required/l3kernel/l3box.dtx index 532ec6a7d8..abe1ce302a 100644 --- a/macros/latex/required/l3kernel/l3box.dtx +++ b/macros/latex/required/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3cctab.dtx b/macros/latex/required/l3kernel/l3cctab.dtx index 92f134aa93..56f831becf 100644 --- a/macros/latex/required/l3kernel/l3cctab.dtx +++ b/macros/latex/required/l3kernel/l3cctab.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3clist.dtx b/macros/latex/required/l3kernel/l3clist.dtx index f8d1eeaea8..cfad9ac5a3 100644 --- a/macros/latex/required/l3kernel/l3clist.dtx +++ b/macros/latex/required/l3kernel/l3clist.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % @@ -352,7 +352,7 @@ % Reverses the order of items stored in the \meta{clist~var}. % \end{function} % -% \begin{function}[added = 2014-07-18]{\clist_reverse:n} +% \begin{function}[added = 2014-07-18, EXP]{\clist_reverse:n} % \begin{syntax} % \cs{clist_reverse:n} \Arg{comma list} % \end{syntax} diff --git a/macros/latex/required/l3kernel/l3coffins.dtx b/macros/latex/required/l3kernel/l3coffins.dtx index afbd1bd394..82f234799e 100644 --- a/macros/latex/required/l3kernel/l3coffins.dtx +++ b/macros/latex/required/l3kernel/l3coffins.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3color.dtx b/macros/latex/required/l3kernel/l3color.dtx index 117a468d21..e973fb5e7c 100644 --- a/macros/latex/required/l3kernel/l3color.dtx +++ b/macros/latex/required/l3kernel/l3color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3debug.dtx b/macros/latex/required/l3kernel/l3debug.dtx index 4e578ee9b6..41456cf8da 100644 --- a/macros/latex/required/l3kernel/l3debug.dtx +++ b/macros/latex/required/l3kernel/l3debug.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % @@ -69,7 +69,7 @@ % % Standard file identification. % \begin{macrocode} -\ProvidesExplFile{l3debug.def}{2024-07-20}{}{L3 Debugging support} +\ProvidesExplFile{l3debug.def}{2024-08-16}{}{L3 Debugging support} % \end{macrocode} % % \begin{variable}{\s_@@_stop} diff --git a/macros/latex/required/l3kernel/l3deprecation.dtx b/macros/latex/required/l3kernel/l3deprecation.dtx index 697f235311..21d96b8f9c 100644 --- a/macros/latex/required/l3kernel/l3deprecation.dtx +++ b/macros/latex/required/l3kernel/l3deprecation.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3doc.dtx b/macros/latex/required/l3kernel/l3doc.dtx index 751d4f4e14..ecd473b837 100644 --- a/macros/latex/required/l3kernel/l3doc.dtx +++ b/macros/latex/required/l3kernel/l3doc.dtx @@ -71,7 +71,7 @@ and all files in that bundle must be distributed together. % This isn't included in the typeset documentation because it's a bit % ugly: %<*class> -\ProvidesExplClass{l3doc}{2024-07-20}{} +\ProvidesExplClass{l3doc}{2024-08-16}{} {L3 Experimental documentation class} %</class> % \fi @@ -84,7 +84,7 @@ and all files in that bundle must be distributed together. % require you to do updates, if the class changes.}} % % \author{\Team} -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % \maketitle % \tableofcontents % diff --git a/macros/latex/required/l3kernel/l3doc.pdf b/macros/latex/required/l3kernel/l3doc.pdf Binary files differindex 0d5a3494c0..e0a3169c1d 100644 --- a/macros/latex/required/l3kernel/l3doc.pdf +++ b/macros/latex/required/l3kernel/l3doc.pdf diff --git a/macros/latex/required/l3kernel/l3docstrip.dtx b/macros/latex/required/l3kernel/l3docstrip.dtx index 199801ff3b..29503b2d55 100644 --- a/macros/latex/required/l3kernel/l3docstrip.dtx +++ b/macros/latex/required/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3docstrip.pdf b/macros/latex/required/l3kernel/l3docstrip.pdf Binary files differindex 07f24848e3..b37e4f8ef8 100644 --- a/macros/latex/required/l3kernel/l3docstrip.pdf +++ b/macros/latex/required/l3kernel/l3docstrip.pdf diff --git a/macros/latex/required/l3kernel/l3expan.dtx b/macros/latex/required/l3kernel/l3expan.dtx index 499c94587e..714af5dc27 100644 --- a/macros/latex/required/l3kernel/l3expan.dtx +++ b/macros/latex/required/l3kernel/l3expan.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3file.dtx b/macros/latex/required/l3kernel/l3file.dtx index 039c4eecb8..9074a65921 100644 --- a/macros/latex/required/l3kernel/l3file.dtx +++ b/macros/latex/required/l3kernel/l3file.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3flag.dtx b/macros/latex/required/l3kernel/l3flag.dtx index 690347426f..a25a02a2ca 100644 --- a/macros/latex/required/l3kernel/l3flag.dtx +++ b/macros/latex/required/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-assign.dtx b/macros/latex/required/l3kernel/l3fp-assign.dtx index e1b3bc788b..2c988e21b4 100644 --- a/macros/latex/required/l3kernel/l3fp-assign.dtx +++ b/macros/latex/required/l3kernel/l3fp-assign.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % \maketitle % % \begin{documentation} diff --git a/macros/latex/required/l3kernel/l3fp-aux.dtx b/macros/latex/required/l3kernel/l3fp-aux.dtx index 4c39e81f46..06c5304064 100644 --- a/macros/latex/required/l3kernel/l3fp-aux.dtx +++ b/macros/latex/required/l3kernel/l3fp-aux.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-basics.dtx b/macros/latex/required/l3kernel/l3fp-basics.dtx index a93ff90291..5c8ee332b9 100644 --- a/macros/latex/required/l3kernel/l3fp-basics.dtx +++ b/macros/latex/required/l3kernel/l3fp-basics.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-convert.dtx b/macros/latex/required/l3kernel/l3fp-convert.dtx index 9b5b66f815..49d25cc51b 100644 --- a/macros/latex/required/l3kernel/l3fp-convert.dtx +++ b/macros/latex/required/l3kernel/l3fp-convert.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-expo.dtx b/macros/latex/required/l3kernel/l3fp-expo.dtx index e9dcdf6646..ea6a3015cf 100644 --- a/macros/latex/required/l3kernel/l3fp-expo.dtx +++ b/macros/latex/required/l3kernel/l3fp-expo.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-extended.dtx b/macros/latex/required/l3kernel/l3fp-extended.dtx index 24f1e5c127..be1137c0d4 100644 --- a/macros/latex/required/l3kernel/l3fp-extended.dtx +++ b/macros/latex/required/l3kernel/l3fp-extended.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-functions.dtx b/macros/latex/required/l3kernel/l3fp-functions.dtx index 2c5eb9602f..7b28783cfa 100644 --- a/macros/latex/required/l3kernel/l3fp-functions.dtx +++ b/macros/latex/required/l3kernel/l3fp-functions.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-logic.dtx b/macros/latex/required/l3kernel/l3fp-logic.dtx index 9d39f4f67e..c1b9f68b9d 100644 --- a/macros/latex/required/l3kernel/l3fp-logic.dtx +++ b/macros/latex/required/l3kernel/l3fp-logic.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-parse.dtx b/macros/latex/required/l3kernel/l3fp-parse.dtx index 191ab2755c..8f8cc99ac4 100644 --- a/macros/latex/required/l3kernel/l3fp-parse.dtx +++ b/macros/latex/required/l3kernel/l3fp-parse.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-random.dtx b/macros/latex/required/l3kernel/l3fp-random.dtx index dd40704719..14a780a392 100644 --- a/macros/latex/required/l3kernel/l3fp-random.dtx +++ b/macros/latex/required/l3kernel/l3fp-random.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-round.dtx b/macros/latex/required/l3kernel/l3fp-round.dtx index ad20934215..d6097c3258 100644 --- a/macros/latex/required/l3kernel/l3fp-round.dtx +++ b/macros/latex/required/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-symbolic.dtx b/macros/latex/required/l3kernel/l3fp-symbolic.dtx index 8223419f66..387d582d99 100644 --- a/macros/latex/required/l3kernel/l3fp-symbolic.dtx +++ b/macros/latex/required/l3kernel/l3fp-symbolic.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-traps.dtx b/macros/latex/required/l3kernel/l3fp-traps.dtx index 7f22a2d137..f2967021e3 100644 --- a/macros/latex/required/l3kernel/l3fp-traps.dtx +++ b/macros/latex/required/l3kernel/l3fp-traps.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % \maketitle % % \begin{documentation} diff --git a/macros/latex/required/l3kernel/l3fp-trig.dtx b/macros/latex/required/l3kernel/l3fp-trig.dtx index b7b67c9445..297deb2449 100644 --- a/macros/latex/required/l3kernel/l3fp-trig.dtx +++ b/macros/latex/required/l3kernel/l3fp-trig.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp-types.dtx b/macros/latex/required/l3kernel/l3fp-types.dtx index d969f76bdc..b48c37d453 100644 --- a/macros/latex/required/l3kernel/l3fp-types.dtx +++ b/macros/latex/required/l3kernel/l3fp-types.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fp.dtx b/macros/latex/required/l3kernel/l3fp.dtx index 8e37a55799..d970d631eb 100644 --- a/macros/latex/required/l3kernel/l3fp.dtx +++ b/macros/latex/required/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3fparray.dtx b/macros/latex/required/l3kernel/l3fparray.dtx index 9592671ae3..b20483a583 100644 --- a/macros/latex/required/l3kernel/l3fparray.dtx +++ b/macros/latex/required/l3kernel/l3fparray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3int.dtx b/macros/latex/required/l3kernel/l3int.dtx index 4b0d251cab..d9698e8516 100644 --- a/macros/latex/required/l3kernel/l3int.dtx +++ b/macros/latex/required/l3kernel/l3int.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3intarray.dtx b/macros/latex/required/l3kernel/l3intarray.dtx index 4be0ca6be6..48b5b83ad1 100644 --- a/macros/latex/required/l3kernel/l3intarray.dtx +++ b/macros/latex/required/l3kernel/l3intarray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3kernel-functions.dtx b/macros/latex/required/l3kernel/l3kernel-functions.dtx index 5d5758a6af..cc6d8f6909 100644 --- a/macros/latex/required/l3kernel/l3kernel-functions.dtx +++ b/macros/latex/required/l3kernel/l3kernel-functions.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3keys.dtx b/macros/latex/required/l3kernel/l3keys.dtx index db580c525c..9225e1042d 100644 --- a/macros/latex/required/l3kernel/l3keys.dtx +++ b/macros/latex/required/l3kernel/l3keys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3legacy.dtx b/macros/latex/required/l3kernel/l3legacy.dtx index b5ef896827..667b15003a 100644 --- a/macros/latex/required/l3kernel/l3legacy.dtx +++ b/macros/latex/required/l3kernel/l3legacy.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3luatex.dtx b/macros/latex/required/l3kernel/l3luatex.dtx index aa7724a8ce..963fdcb032 100644 --- a/macros/latex/required/l3kernel/l3luatex.dtx +++ b/macros/latex/required/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3msg.dtx b/macros/latex/required/l3kernel/l3msg.dtx index 66e7ac8282..c8569dd7ac 100644 --- a/macros/latex/required/l3kernel/l3msg.dtx +++ b/macros/latex/required/l3kernel/l3msg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3names.dtx b/macros/latex/required/l3kernel/l3names.dtx index 1cb0d132ae..9231f409c1 100644 --- a/macros/latex/required/l3kernel/l3names.dtx +++ b/macros/latex/required/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3news.pdf b/macros/latex/required/l3kernel/l3news.pdf Binary files differindex eb4c42d8c5..a37482f334 100644 --- a/macros/latex/required/l3kernel/l3news.pdf +++ b/macros/latex/required/l3kernel/l3news.pdf diff --git a/macros/latex/required/l3kernel/l3news01.pdf b/macros/latex/required/l3kernel/l3news01.pdf Binary files differindex 21997cf980..2a2f19457c 100644 --- a/macros/latex/required/l3kernel/l3news01.pdf +++ b/macros/latex/required/l3kernel/l3news01.pdf diff --git a/macros/latex/required/l3kernel/l3news02.pdf b/macros/latex/required/l3kernel/l3news02.pdf Binary files differindex db1ac5b85b..146556e785 100644 --- a/macros/latex/required/l3kernel/l3news02.pdf +++ b/macros/latex/required/l3kernel/l3news02.pdf diff --git a/macros/latex/required/l3kernel/l3news03.pdf b/macros/latex/required/l3kernel/l3news03.pdf Binary files differindex 6630201b1f..af48654a63 100644 --- a/macros/latex/required/l3kernel/l3news03.pdf +++ b/macros/latex/required/l3kernel/l3news03.pdf diff --git a/macros/latex/required/l3kernel/l3news04.pdf b/macros/latex/required/l3kernel/l3news04.pdf Binary files differindex c74f9f0a7c..bb18f756c3 100644 --- a/macros/latex/required/l3kernel/l3news04.pdf +++ b/macros/latex/required/l3kernel/l3news04.pdf diff --git a/macros/latex/required/l3kernel/l3news05.pdf b/macros/latex/required/l3kernel/l3news05.pdf Binary files differindex 18d4df3290..0c286452f1 100644 --- a/macros/latex/required/l3kernel/l3news05.pdf +++ b/macros/latex/required/l3kernel/l3news05.pdf diff --git a/macros/latex/required/l3kernel/l3news06.pdf b/macros/latex/required/l3kernel/l3news06.pdf Binary files differindex 643b8f1f68..986ad4d58b 100644 --- a/macros/latex/required/l3kernel/l3news06.pdf +++ b/macros/latex/required/l3kernel/l3news06.pdf diff --git a/macros/latex/required/l3kernel/l3news07.pdf b/macros/latex/required/l3kernel/l3news07.pdf Binary files differindex b457fd6033..edfce03b2c 100644 --- a/macros/latex/required/l3kernel/l3news07.pdf +++ b/macros/latex/required/l3kernel/l3news07.pdf diff --git a/macros/latex/required/l3kernel/l3news08.pdf b/macros/latex/required/l3kernel/l3news08.pdf Binary files differindex a5b4744d28..1efb7d184b 100644 --- a/macros/latex/required/l3kernel/l3news08.pdf +++ b/macros/latex/required/l3kernel/l3news08.pdf diff --git a/macros/latex/required/l3kernel/l3news09.pdf b/macros/latex/required/l3kernel/l3news09.pdf Binary files differindex a2242937d2..1a24b2e13c 100644 --- a/macros/latex/required/l3kernel/l3news09.pdf +++ b/macros/latex/required/l3kernel/l3news09.pdf diff --git a/macros/latex/required/l3kernel/l3news10.pdf b/macros/latex/required/l3kernel/l3news10.pdf Binary files differindex 1775167008..37c75d8fe9 100644 --- a/macros/latex/required/l3kernel/l3news10.pdf +++ b/macros/latex/required/l3kernel/l3news10.pdf diff --git a/macros/latex/required/l3kernel/l3news11.pdf b/macros/latex/required/l3kernel/l3news11.pdf Binary files differindex 8e14906f03..c1db8425f1 100644 --- a/macros/latex/required/l3kernel/l3news11.pdf +++ b/macros/latex/required/l3kernel/l3news11.pdf diff --git a/macros/latex/required/l3kernel/l3news12.pdf b/macros/latex/required/l3kernel/l3news12.pdf Binary files differindex 15a8332f07..c4890bac7b 100644 --- a/macros/latex/required/l3kernel/l3news12.pdf +++ b/macros/latex/required/l3kernel/l3news12.pdf diff --git a/macros/latex/required/l3kernel/l3pdf.dtx b/macros/latex/required/l3kernel/l3pdf.dtx index 34118c371a..e827001e9f 100644 --- a/macros/latex/required/l3kernel/l3pdf.dtx +++ b/macros/latex/required/l3kernel/l3pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3prefixes.csv b/macros/latex/required/l3kernel/l3prefixes.csv index 339f6625fd..47cd011a5c 100644 --- a/macros/latex/required/l3kernel/l3prefixes.csv +++ b/macros/latex/required/l3kernel/l3prefixes.csv @@ -79,6 +79,7 @@ etex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https: etl,etl,Jonathan P. Spratte,https://github.com/Skillmon/ltx_etl,git@github.com:Skillmon/ltx_etl.git,https://github.com/Skillmon/ltx_etl/issues,2021-08-16,2021-08-16, exp,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, expl,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, +expltools,expltools,Vít Starý Novotný,https://github.com/witiko/expltools/,https://github.com/witiko/expltools.git,https://github.com/witiko/expltools/issues,2024-06-26,2024-06-26,Development tools for expl3 programmers exsheets,exsheets,Clemens Niederberger,https://bitbucket.org/cgnieder/exsheets/,git@bitbucket.org:cgnieder/exsheets.git,https://bitbucket.org/cgnieder/exsheets/issues,2013-03-16,2013-03-16, extblx,biblatex-ext,Moritz Wemheuer,https://github.com/moewew/biblatex-ext/,https://github.com/moewew/biblatex-ext.git,https://github.com/moewew/biblatex-ext/issues,2020-02-09,2020-02-09, exwf,exwrapfig,Takuto Asakura,https://github.com/wtsnjp/exwrapfig,https://github.com/wtsnjp/exwrapfig.git,https://github.com/wtsnjp/exwrapfig/issues,2018-06-07,2018-06-07, @@ -162,6 +163,7 @@ minibox,minibox,Will Robertson,,https://github.com/wspr/will2e.git,https://githu minus,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, mix,media9,Alexander Grahn,,https://gitlab.com/agrahn/media9,https://gitlab.com/agrahn/media9/issues,2013-01-18,2020-04-15, mode,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, +moremath,moremath,Marcel Ilg,https://github.com/Mister00X/moremath,https://github.com/Mister00X/moremath.git,https://github.com/Mister00X/moremath/issues,2024-07-27,2024-07-27, morewrites,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrites,https://github.com/blefloch/latex-morewrites.git,https://github.com/blefloch/latex-morewrites/issues,2013-03-16,2015-09-22, msg,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, msvg,media4svg,Alexander Grahn,,https://gitlab.com/agrahn/media4svg,https://gitlab.com/agrahn/media4svg/issues,2020-04-15,2020-04-15, diff --git a/macros/latex/required/l3kernel/l3prefixes.pdf b/macros/latex/required/l3kernel/l3prefixes.pdf Binary files differindex ab4d18e916..1898163d39 100644 --- a/macros/latex/required/l3kernel/l3prefixes.pdf +++ b/macros/latex/required/l3kernel/l3prefixes.pdf diff --git a/macros/latex/required/l3kernel/l3prg.dtx b/macros/latex/required/l3kernel/l3prg.dtx index ac6131d6ff..69c66057d4 100644 --- a/macros/latex/required/l3kernel/l3prg.dtx +++ b/macros/latex/required/l3kernel/l3prg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3prop.dtx b/macros/latex/required/l3kernel/l3prop.dtx index fd0d8e167d..5f60f31b81 100644 --- a/macros/latex/required/l3kernel/l3prop.dtx +++ b/macros/latex/required/l3kernel/l3prop.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3quark.dtx b/macros/latex/required/l3kernel/l3quark.dtx index ad78a12bd2..d4558e216b 100644 --- a/macros/latex/required/l3kernel/l3quark.dtx +++ b/macros/latex/required/l3kernel/l3quark.dtx @@ -32,7 +32,7 @@ % % \title{^^A % The \pkg{l3quark} module\\ Quarks and scan marks^^A -% } +% }\ifdefined\thechapter\label{sec:l3quarks}\fi % % \author{^^A % The \LaTeX{} Project\thanks @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3regex.dtx b/macros/latex/required/l3kernel/l3regex.dtx index c3d5de27cb..b6ca0d5d2c 100644 --- a/macros/latex/required/l3kernel/l3regex.dtx +++ b/macros/latex/required/l3kernel/l3regex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3seq.dtx b/macros/latex/required/l3kernel/l3seq.dtx index 413e20f8ca..2f0b223753 100644 --- a/macros/latex/required/l3kernel/l3seq.dtx +++ b/macros/latex/required/l3kernel/l3seq.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3skip.dtx b/macros/latex/required/l3kernel/l3skip.dtx index 9bea4c7b14..788abaf20c 100644 --- a/macros/latex/required/l3kernel/l3skip.dtx +++ b/macros/latex/required/l3kernel/l3skip.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3sort.dtx b/macros/latex/required/l3kernel/l3sort.dtx index a86f916d24..6c997672de 100644 --- a/macros/latex/required/l3kernel/l3sort.dtx +++ b/macros/latex/required/l3kernel/l3sort.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3str-convert.dtx b/macros/latex/required/l3kernel/l3str-convert.dtx index 4061895896..4da5cf1302 100644 --- a/macros/latex/required/l3kernel/l3str-convert.dtx +++ b/macros/latex/required/l3kernel/l3str-convert.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3str.dtx b/macros/latex/required/l3kernel/l3str.dtx index 2be2b105ce..787bbf6d87 100644 --- a/macros/latex/required/l3kernel/l3str.dtx +++ b/macros/latex/required/l3kernel/l3str.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3styleguide.pdf b/macros/latex/required/l3kernel/l3styleguide.pdf Binary files differindex 31ff7889ff..5c51125210 100644 --- a/macros/latex/required/l3kernel/l3styleguide.pdf +++ b/macros/latex/required/l3kernel/l3styleguide.pdf diff --git a/macros/latex/required/l3kernel/l3styleguide.tex b/macros/latex/required/l3kernel/l3styleguide.tex index 985f20a68c..0500ec57cd 100644 --- a/macros/latex/required/l3kernel/l3styleguide.tex +++ b/macros/latex/required/l3kernel/l3styleguide.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-07-20} +\date{Released 2024-08-16} \begin{document} diff --git a/macros/latex/required/l3kernel/l3syntax-changes.pdf b/macros/latex/required/l3kernel/l3syntax-changes.pdf Binary files differindex 515a9eb803..766d21a8a6 100644 --- a/macros/latex/required/l3kernel/l3syntax-changes.pdf +++ b/macros/latex/required/l3kernel/l3syntax-changes.pdf diff --git a/macros/latex/required/l3kernel/l3syntax-changes.tex b/macros/latex/required/l3kernel/l3syntax-changes.tex index b9ffcb011a..8631fe09b8 100644 --- a/macros/latex/required/l3kernel/l3syntax-changes.tex +++ b/macros/latex/required/l3kernel/l3syntax-changes.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-07-20} +\date{Released 2024-08-16} \newcommand{\TF}{\textit{(TF)}} diff --git a/macros/latex/required/l3kernel/l3sys.dtx b/macros/latex/required/l3kernel/l3sys.dtx index 1db09f9550..861865c677 100644 --- a/macros/latex/required/l3kernel/l3sys.dtx +++ b/macros/latex/required/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3term-glossary.pdf b/macros/latex/required/l3kernel/l3term-glossary.pdf Binary files differindex d1a2058e9f..2f4e0d80ff 100644 --- a/macros/latex/required/l3kernel/l3term-glossary.pdf +++ b/macros/latex/required/l3kernel/l3term-glossary.pdf diff --git a/macros/latex/required/l3kernel/l3term-glossary.tex b/macros/latex/required/l3kernel/l3term-glossary.tex index fca2886337..b150aee1e9 100644 --- a/macros/latex/required/l3kernel/l3term-glossary.tex +++ b/macros/latex/required/l3kernel/l3term-glossary.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-07-20} +\date{Released 2024-08-16} \newcommand{\TF}{\textit{(TF)}} diff --git a/macros/latex/required/l3kernel/l3text-case.dtx b/macros/latex/required/l3kernel/l3text-case.dtx index 134e2508b7..2a3702df85 100644 --- a/macros/latex/required/l3kernel/l3text-case.dtx +++ b/macros/latex/required/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3text-map.dtx b/macros/latex/required/l3kernel/l3text-map.dtx index e3586164c5..431e033707 100644 --- a/macros/latex/required/l3kernel/l3text-map.dtx +++ b/macros/latex/required/l3kernel/l3text-map.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3text-purify.dtx b/macros/latex/required/l3kernel/l3text-purify.dtx index d22ee1bc3e..051933eb9b 100644 --- a/macros/latex/required/l3kernel/l3text-purify.dtx +++ b/macros/latex/required/l3kernel/l3text-purify.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3text.dtx b/macros/latex/required/l3kernel/l3text.dtx index 9a4c4f244e..0680c19fed 100644 --- a/macros/latex/required/l3kernel/l3text.dtx +++ b/macros/latex/required/l3kernel/l3text.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3tl-analysis.dtx b/macros/latex/required/l3kernel/l3tl-analysis.dtx index 600da3985d..aa4ccae287 100644 --- a/macros/latex/required/l3kernel/l3tl-analysis.dtx +++ b/macros/latex/required/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3tl-build.dtx b/macros/latex/required/l3kernel/l3tl-build.dtx index e484c5b1c5..a1e5b27ec8 100644 --- a/macros/latex/required/l3kernel/l3tl-build.dtx +++ b/macros/latex/required/l3kernel/l3tl-build.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3tl.dtx b/macros/latex/required/l3kernel/l3tl.dtx index 84f2c36798..2c8de13fd3 100644 --- a/macros/latex/required/l3kernel/l3tl.dtx +++ b/macros/latex/required/l3kernel/l3tl.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3token.dtx b/macros/latex/required/l3kernel/l3token.dtx index c028310326..cf0f998103 100644 --- a/macros/latex/required/l3kernel/l3token.dtx +++ b/macros/latex/required/l3kernel/l3token.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/l3unicode.dtx b/macros/latex/required/l3kernel/l3unicode.dtx index 532eb315d3..89450e18fe 100644 --- a/macros/latex/required/l3kernel/l3unicode.dtx +++ b/macros/latex/required/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-07-20} +% \date{Released 2024-08-16} % % \maketitle % diff --git a/macros/latex/required/l3kernel/source3.pdf b/macros/latex/required/l3kernel/source3.pdf Binary files differindex 26c62e620d..03bbce81fc 100644 --- a/macros/latex/required/l3kernel/source3.pdf +++ b/macros/latex/required/l3kernel/source3.pdf diff --git a/macros/latex/required/l3kernel/source3.tex b/macros/latex/required/l3kernel/source3.tex index 228d3ca93c..9abacf7762 100644 --- a/macros/latex/required/l3kernel/source3.tex +++ b/macros/latex/required/l3kernel/source3.tex @@ -57,7 +57,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2024-07-20} +\date{Released 2024-08-16} \pagenumbering{roman} \maketitle diff --git a/macros/latex/required/l3kernel/source3body.tex b/macros/latex/required/l3kernel/source3body.tex index 8471296227..db5b907e7b 100644 --- a/macros/latex/required/l3kernel/source3body.tex +++ b/macros/latex/required/l3kernel/source3body.tex @@ -344,6 +344,19 @@ are never used by the core code. The nature of \TeX{} grouping means that as with any other scratch variable, these should only be set and used with no intervening third-party code. +There are two more special types of constants: +\begin{description} + \item[\texttt{q}] Quark constants. + \item[\texttt{s}] Scan mark constants. +\end{description} +Similarly, each quark or scan mark name starts with the module name, +but doesn't end with a variable type, because the type is already +marked by the prefix \texttt{q} or \texttt{s}. +Some general quarks and scan marks provided by \LaTeX3 don't start +with a module name, for example \cs{s_stop}. +See documentation of quarks and scan marks in Chapter~\ref{sec:l3quarks} +for more info. + \subsection{Terminological inexactitude} A word of warning. In this document, and others referring to the \pkg{expl3} |