diff options
Diffstat (limited to 'macros')
38 files changed, 1594 insertions, 729 deletions
diff --git a/macros/latex/contrib/colorist/colorart.cls b/macros/latex/contrib/colorist/colorart.cls index 4153a79860..289de77adc 100644 --- a/macros/latex/contrib/colorist/colorart.cls +++ b/macros/latex/contrib/colorist/colorart.cls @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplClass {colorart} - {2023/09/26} {} + {2023/09/28} {} {A colorful article style} \tl_const:Nn \l__colorclass_base_class_tl { article } diff --git a/macros/latex/contrib/colorist/colorbook.cls b/macros/latex/contrib/colorist/colorbook.cls index 9a27ceb896..51dacaee11 100644 --- a/macros/latex/contrib/colorist/colorbook.cls +++ b/macros/latex/contrib/colorist/colorbook.cls @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplClass {colorbook} - {2023/09/26} {} + {2023/09/28} {} {A colorful book style} \tl_const:Nn \l__colorclass_base_class_tl { book } diff --git a/macros/latex/contrib/colorist/colorist-fancy.sty b/macros/latex/contrib/colorist/colorist-fancy.sty index 5323c9b881..75e8f0eecd 100644 --- a/macros/latex/contrib/colorist/colorist-fancy.sty +++ b/macros/latex/contrib/colorist/colorist-fancy.sty @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {colorist-fancy} - {2023/09/26} {} + {2023/09/28} {} {The fancy style of colorist} \IfPackageLoadedTF { colorist } {} @@ -696,6 +696,19 @@ heading_suffix "}\n" \RequirePackage { mathtools } \RequirePackage { amsthm } +\tl_const:Nn \c_colorist_l_mathparen_latin_tl { $($ } +\tl_const:Nn \c_colorist_r_mathparen_latin_tl { $)$ } +\tl_const:Nn \c_colorist_l_mathparen_cjk_tl { \!\,( } +\tl_const:Nn \c_colorist_r_mathparen_cjk_tl { )\!\, } +\cs_new:Nn \colorist_insert_l_mathparen: + { + \tl_use:c { c_colorist_l_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } +\cs_new:Nn \colorist_insert_r_mathparen: + { + \tl_use:c { c_colorist_r_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } + \def\tagform@#1{\maketag@@@{\textcolor{.!39!paper}{(\ignorespaces#1\unskip\@@italiccorr)}}} \PassOptionsToPackage { nopatch = eqnum } { microtype } @@ -710,7 +723,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \colorist_insert_l_mathparen: #3 \colorist_insert_r_mathparen: }} }}\hbox{\strut}\vspace{0pt}}} } \newtheoremstyle{simple-var} @@ -721,7 +734,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \colorist_insert_l_mathparen: #3 \colorist_insert_r_mathparen: }} }}\hbox{\strut}\vspace{0pt}}} } } @@ -732,14 +745,14 @@ heading_suffix "}\n" {\normalfont}{} {0pt} {{\thmname{#1}\nobreakspace\thmnumber{#2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \colorist_insert_l_mathparen: #3 \colorist_insert_r_mathparen: }}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace} \newtheoremstyle{simple-var} {}{} { \bool_if:NTF \l__colorist_emphasis_theorem_bool { \itshape } { \normalfont } }{} {\normalfont}{} {0pt} {{\thmname{#1}\nobreakspace\thmnumber{#2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \colorist_insert_l_mathparen: #3 \colorist_insert_r_mathparen: }}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace} } \newcommand{\customqedsymbol}{ @@ -756,7 +769,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\nobreakspace\thmnumber{\textup{#2}}} - \thmnote{\normalfont\sffamily\color{main-text}\nobreakspace(#3)} + \thmnote{\normalfont\sffamily\color{main-text}\nobreakspace \colorist_insert_l_mathparen: #3 \colorist_insert_r_mathparen: } }}\hbox{\strut}\vspace{0pt}}} } \newtheoremstyle{basic-var} @@ -767,7 +780,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\nobreakspace\thmnumber{\textup{#2}}} - \thmnote{\normalfont\sffamily\color{main-text}\nobreakspace(#3)} + \thmnote{\normalfont\sffamily\color{main-text}\nobreakspace \colorist_insert_l_mathparen: #3 \colorist_insert_r_mathparen: } }}\hbox{\strut}\vspace{0pt}}} } } @@ -777,13 +790,13 @@ heading_suffix "}\n" {\normalfont}{0pt} {}{\;}{0.25em} {{\thmname{#1}\nobreakspace\thmnumber{\textup{#2}}} - \thmnote{\normalfont\sffamily\color{main-text}\nobreakspace(#3)}} + \thmnote{\normalfont\sffamily\color{main-text}\nobreakspace \colorist_insert_l_mathparen: #3 \colorist_insert_r_mathparen: }} \newtheoremstyle{basic-var} {0pt}{0pt} { \bool_if:NTF \l__colorist_emphasis_theorem_bool { \itshape } { \normalfont } }{0pt} {}{\;}{0.25em} {{\thmname{#1}\nobreakspace\thmnumber{\textup{#2}}} - \thmnote{\normalfont\sffamily\color{main-text}\nobreakspace(#3)}} + \thmnote{\normalfont\sffamily\color{main-text}\nobreakspace \colorist_insert_l_mathparen: #3 \colorist_insert_r_mathparen: }} } \theoremstyle{basic} diff --git a/macros/latex/contrib/colorist/colorist.sty b/macros/latex/contrib/colorist/colorist.sty index d9019557c2..6a89f9d6e7 100644 --- a/macros/latex/contrib/colorist/colorist.sty +++ b/macros/latex/contrib/colorist/colorist.sty @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {colorist} - {2023/09/26} {} + {2023/09/28} {} {A colorful style for articles and books} \keys_define:nn { colorist } diff --git a/macros/latex/contrib/homework/README.md b/macros/latex/contrib/homework/README.md index c580a03fa8..28cdf8b29a 100644 --- a/macros/latex/contrib/homework/README.md +++ b/macros/latex/contrib/homework/README.md @@ -10,21 +10,42 @@ The current document class is for writing homework. It has the following feature - Multilingual support: currently supporting Chinese (both simplified and traditional), English, French, German, Italian, Japanese, Portuguese (European and Brazilian), Russian and Spanish. - Page numbers are of the form `Page [current] of [total]`, which can help you ensure that there are no missing pages when you print your homework for submission. - Support writing problem statements and solutions (or proofs) in different colors. -- Every statement and solution has its own QED symbol, in hollow or solid shape, respectively. +- Every statement and solution has its own Q.E.D. symbol, in hollow or solid shape, respectively. - You may mark unfinished parts with `\DNF` or `\DNF<⟨remark⟩>` (meaning "did not finish") for reminding — this will give you a clickable report on the unfinished parts at the end of your document. +## Installation and preparation + +### How to install this package + +If you are using TeX Live 2024 or newer, or the most recent version of MikTeX, then this package should already be included, and you don't need to do anything. + +Otherwise, you need to check for package update to see if you can receive it. In case not, you can always go to [the CTAN page](https://ctan.org/pkg/homework) to download the `.zip` file with all related files included. + +### Regarding the fonts + +If you are using a Unicode TeX engine, then the current document class requires the following open-source fonts that are not included in the standard TeX collection: + +- The Source Han font series at [Adobe Fonts](https://github.com/adobe-fonts). More specifically: + - Source Han Serif, [go to its Release page](https://github.com/adobe-fonts/source-han-serif/releases). + - Source Han Sans, [go to its Release page](https://github.com/adobe-fonts/source-han-sans/releases). + - Source Han Mono, [go to its Release page](https://github.com/adobe-fonts/source-han-mono/releases). + > It is recommended to download the Super-OTC version, so that the total download size would be smaller, and the installation would be easier. + +These are necessary if you wish to write your document in Chinese (either simplified or traditional) or Japanese. Also, without these fonts installed, the compilation speed might be much slower if you use XeLaTeX or LuaLaTeX to compile your document. + ## Usage A typical homework document looks like this: ```latex -\documentclass[11pt, +\documentclass[a4paper, 11pt, logo = {image-file-of-your-university-logo}, % Remove this line if you don't want logo presented. % logo height = 1cm, % In case you are not satisfied with the default logo size. title in boldface, title in sffamily, theorem in new line, + % twoside, ]{homework} \UseLanguage{...} % If you wish to write your homework in languages other than English. @@ -59,7 +80,6 @@ A typical homework document looks like this: % If you prefer "Proof" instead of "Solution"... \begin{solution}[Proof] - ... or a proof like this one... % You may write claims, lemmas, propositions, etc. inside your solution. \begin{lemma}\label{lem} Some auxiliary result. @@ -68,26 +88,66 @@ A typical homework document looks like this: The proof of \cref{lem}, where we use the following formula: \[ \infty = \infty + 1. - \qedhere % For placing the QED symbol in the right place. + \qedhere % For placing the Q.E.D. symbol in the right place. \] \end{proof} + \begin{fact}[This statement requires no proof] + \proofless % To change the hollow box marking the end of a theorem-type environment into a solid one. + Some statement. + \end{fact} ... and the rest steps... \end{solution} +% If you wish to answer each sub-question of a problem separately... + +\begin{problem}[A problem with many sub-questions] + \begin{enumerate}[itemsep=.5\baselineskip] + \item First question. + \begin{solution} + The solution of the first question. + \end{solution} + \item Second question. + \begin{enumerate}[itemsep=.3\baselineskip] + \item First sub-question. + \begin{solution} + The solution of the first sub-question. + \end{solution} + \item Second sub-question. + \begin{solution} + The solution of the second sub-question. + \end{solution} + \end{enumerate} + \item Third question. + \begin{solution} + The solution of the third question. + \end{solution} + \end{enumerate} + \noQED % Use \noqed or \noQED at the end to suppress the Q.E.D. symbol that marks the end of the current problem. +\end{problem} + + +% If there is a question that you can't figure out how to solve at the moment... + +\DNF<some description> + + \end{document} ``` > You may refer to the demo documents for more examples. -A few remarks: +Regarding some of the class options: 1) The logo image can be included via the class option `logo = {⟨image file name⟩}`, and if you are not satisfied with its default size, then you may manually specify the size via the option `logo height = {⟨height⟩}`. If you do not want to show any logo in the title bar, you may simply remove the option `logo = {⟨image file name⟩}`. 1) The options `title in boldface`, `title in sffamily` or even `title in scshape` are for configuring the text effect of the title line, the sectional titles and theorem names. 1) The option `theorem in new line` is for showing the problem / theorem name, numbering and description in a separate line, for the sake of clarity. +1) The option `twoside` is for double-sided printing. + +A few extra remarks: 1) `\title`, `\author` and `\date` should be placed before `\begin{document}`. -1) Since the problem, solution and other theorem-type environments have a QED symbol at the end, if your text ends with a displayed equation or a `itemize`/`enumerate`/`description` list, then you would need to add a `\qedhere` so that the QED symbol is placed in the right place. +1) Since the problem, solution and other theorem-type environments have a Q.E.D. symbol at the end, if your text ends with a displayed equation or a `itemize`/`enumerate`/`description` list, then you would need to add a `\qedhere` so that the Q.E.D. symbol is placed in the right place. There are also `\proofless` and `\noQED` for controlling the Q.E.D. symbol, see the demo documents for their usage. 1) Every theorem-type environment has a starred unnumbered version, for instance, `claim*` for unnumbered `claim`, `lemma*` for unnumbered `lemma`, etc. -1) It is recommended to use clever reference, such as `\cref`. For languages such as French and German, to ensure that the generated referencing text is grammatically correct, you may write the definite article and/or declension as optional argument for the referencing commands, for instance, `\cref[à]{⟨label⟩}` or `\cref[de]{⟨label⟩}` for French, `\cref[nom.]{⟨label⟩}` or `\cref[von,dat.]{⟨label⟩}` for German, etc. +1) It is recommended to use clever reference, such as `\cref`, `\Cref` and `\namecref`, etc. For languages such as French and German, to ensure that the generated referencing text is grammatically correct, you may write the definite article and/or declension as optional argument for the referencing commands, for instance, `\cref[à]{⟨label⟩}` or `\cref[de]{⟨label⟩}` for French, `\cref[nom.]{⟨label⟩}` or `\cref[von,dat.]{⟨label⟩}` for German, etc. ## TeXnical details @@ -96,11 +156,13 @@ A few remarks: - With pdfLaTeX, the base class is `minimart`. - With XeLaTeX or LuaLaTeX, the base class is `einfart`. -### Regarding `\maketitle` +### Some other aspects + +#### Regarding `\maketitle` The `\maketitle` has been automatically added just after `\begin{document}`, thus you don't need to write it by yourself. Note, however, that this also means that you cannot place `\title`, `author` and `\date` after `\begin{document}`. -### Regarding the numbering +#### Regarding the numbering A new counter named `homework` is defined, which is shared by the environments `problem`, `question` and `exercise`, thus you would see them numbered as `1`, `2`, `3`, etc. The other theorem-type environments are numbered within this counter `homework`, thus within, say, `Problem 1`, you would see them numbered as `Theorem 1.1`, `Lemma 1.2` and `Claim 1.3`, etc. diff --git a/macros/latex/contrib/homework/homework-demo-cn.pdf b/macros/latex/contrib/homework/homework-demo-cn.pdf Binary files differindex a3f96f3fad..cab3b09986 100644 --- a/macros/latex/contrib/homework/homework-demo-cn.pdf +++ b/macros/latex/contrib/homework/homework-demo-cn.pdf diff --git a/macros/latex/contrib/homework/homework-demo-cn.tex b/macros/latex/contrib/homework/homework-demo-cn.tex index 9585ebc126..44bc036e2c 100644 --- a/macros/latex/contrib/homework/homework-demo-cn.tex +++ b/macros/latex/contrib/homework/homework-demo-cn.tex @@ -4,8 +4,16 @@ title in boldface, % title in sffamily, theorem in new line, + % twoside, ]{homework} +%% For highlighting the code in this document +\usepackage{newverbs} +\newverbcommand{\cverb}{\color{red!50!orange}}{} + +%% Below is the main document + + \UseLanguage{Chinese} @@ -44,13 +52,17 @@ 一些辅助结果。 \end{lemma} \begin{proof} - \Cref{lem}的证明,其中用到下面的公式: + 这是\cref{lem}的证明,其中用到下面的公式(注意使用 \cverb|\qedhere|): \[ \infty = \infty + 1 \makebox[0pt][l]{\,。} % 句尾的句号 - \qedhere % 用来把 QED 放在正确的位置 + \qedhere % 用来把 Q.E.D. 符号放在正确的位置 \] \end{proof} + \begin{fact}[这个结论无需证明] + \proofless + 使用 \cverb|\proofless| 可以将标记定理结束的空心方框变为实心方框。 + \end{fact} …剩余的步骤…… \end{solution} @@ -68,6 +80,47 @@ \end{proof} +\bigskip\textcolor{gray!55}{(如果你想为一个大问题中的每个小问题分别撰写解答…)} + +\begin{problem}[一个由很多小问题构成的大问题] + \begin{enumerate}[itemsep=.5\baselineskip] + \item 第一个问题。 + + \begin{solution} + 第一个问题的解答。 + \end{solution} + + \item 第二个问题。 + + \begin{enumerate}[itemsep=.3\baselineskip] + \item 第一个小问。 + + \begin{solution} + 第一个小问的解答。 + \end{solution} + + \item 第二个小问。 + + \begin{solution} + 第二个小问的解答。 + \end{solution} + + \end{enumerate} + + \item 第三个问题。 + + \begin{solution} + 第三个问题的解答。 + \end{solution} + + \end{enumerate} + 在末尾使用 \cverb|\noqed|(或 \cverb|\noQED|)可以取消标记用于当前问题结束的方框。 + \noQED +\end{problem} + + +\bigskip\textcolor{gray!55}{(如果你有暂时解决不出来的问题…)} + \DNF<一些描述> diff --git a/macros/latex/contrib/homework/homework-demo-de.pdf b/macros/latex/contrib/homework/homework-demo-de.pdf Binary files differindex 9d61979cc5..dc4051f0bb 100644 --- a/macros/latex/contrib/homework/homework-demo-de.pdf +++ b/macros/latex/contrib/homework/homework-demo-de.pdf diff --git a/macros/latex/contrib/homework/homework-demo-de.tex b/macros/latex/contrib/homework/homework-demo-de.tex index 0efb6739d8..d81f2cc5a6 100644 --- a/macros/latex/contrib/homework/homework-demo-de.tex +++ b/macros/latex/contrib/homework/homework-demo-de.tex @@ -4,8 +4,16 @@ title in boldface, % title in sffamily, theorem in new line, + % twoside, ]{homework} +%% For highlighting the code in this document +\usepackage{newverbs} +\newverbcommand{\cverb}{\color{red!50!orange}}{} + +%% Below is the main document + + \UseLanguage{German} @@ -44,12 +52,16 @@ Einige zusätzlich Ergebnisse. \end{lemma} \begin{proof} - Der Beweis \cref[gen.]{lem}, wobei wir die folgende Formel verwenden: % oder der Beweis \cref[von]{lem}, oder der Beweis \cref[von, dat.]{lem} + Der Beweis \cref[gen.]{lem}, wobei wir die folgende Formel verwenden (beachten Sie die Verwendung von \cverb|\qedhere|): % oder der Beweis \cref[von]{lem}, oder der Beweis \cref[von, dat.]{lem} \[ \infty = \infty + 1. - \qedhere % Um das QED-Symbol an der richtigen Stelle zu stellen + \qedhere % Um das Q.E.D.-Symbol an der richtigen Stelle zu stellen. \] \end{proof} + \begin{fact}[Für dieses Ergebnis ist kein Beweis erforderlich] + \proofless + Verwenden Sie \cverb|\proofless| um den hohlen Kasten, der das Ende einer Theorem-artigen Umgebung markiert, in einen festen Kasten umwandeln. + \end{fact} ... und die übrigen Schritte ... \end{solution} @@ -68,6 +80,47 @@ \end{proof} +\bigskip\textcolor{gray!55}{(Wenn Sie jede Unterfrage eines Problems einzeln beantworten möchten ...)} + +\begin{problem}[Ein Problem mit vielen Unterfragen] + \begin{enumerate}[itemsep=.5\baselineskip] + \item Die erste Frage. + + \begin{solution} + Die Lösung der ersten Frage. + \end{solution} + + \item Die zweite Frage. + + \begin{enumerate}[itemsep=.3\baselineskip] + \item Die erste Unterfrage. + + \begin{solution} + Die Lösung der ersten Unterfrage. + \end{solution} + + \item Die zweite Unterfrage. + + \begin{solution} + Die Lösung der zweiten Unterfrage. + \end{solution} + + \end{enumerate} + + \item Die dritte Frage. + + \begin{solution} + Die Lösung der dritten Frage. + \end{solution} + + \end{enumerate} + Verwenden Sie \cverb|\noqed| (oder \cverb|\noQED|) am Ende, um das Q.E.D.-Symbol zu unterdrücken, das das Ende des aktuellen Problems markiert. + \noQED +\end{problem} + + +\bigskip\textcolor{gray!55}{(Wenn es eine Frage gibt, für die Sie im Moment keine Lösung finden können ...)} + \DNF<etwas Beschreibung> diff --git a/macros/latex/contrib/homework/homework-demo-en.pdf b/macros/latex/contrib/homework/homework-demo-en.pdf Binary files differindex 317b090c69..5d0834762c 100644 --- a/macros/latex/contrib/homework/homework-demo-en.pdf +++ b/macros/latex/contrib/homework/homework-demo-en.pdf diff --git a/macros/latex/contrib/homework/homework-demo-en.tex b/macros/latex/contrib/homework/homework-demo-en.tex index ac618af0aa..40585d77ef 100644 --- a/macros/latex/contrib/homework/homework-demo-en.tex +++ b/macros/latex/contrib/homework/homework-demo-en.tex @@ -4,8 +4,15 @@ title in boldface, % title in sffamily, theorem in new line, + % twoside, ]{homework} +%% For highlighting the code in this document +\usepackage{newverbs} +\newverbcommand{\cverb}{\color{red!50!orange}}{} + +%% Below is the main document + \title{The Subject, Week 1} \author{Author NAME} @@ -42,12 +49,16 @@ Some auxiliary result. \end{lemma} \begin{proof} - The proof of \cref{lem}, where we use the following formula: + The proof of \cref{lem}, where we use the following formula (note the use of \cverb|\qedhere|): \[ \infty = \infty + 1. - \qedhere % To place the QED symbol in the right place + \qedhere % To place the Q.E.D. symbol in the right place. \] \end{proof} + \begin{fact}[This statement requires no proof] + \proofless + Use \cverb|\proofless| to change the hollow box marking the end of a theorem-type environment into a solid one. + \end{fact} ... and the rest steps... \end{solution} @@ -59,6 +70,9 @@ \end{answer} +\pagebreak + + \bigskip\textcolor{gray!55}{(If you prefer the classical proof style...)} \begin{proof} @@ -66,6 +80,47 @@ \end{proof} +\bigskip\textcolor{gray!55}{(If you wish to answer each sub-question of a problem separately...)} + +\begin{problem}[A problem with many sub-questions] + \begin{enumerate}[itemsep=.5\baselineskip] + \item First question. + + \begin{solution} + The solution of the first question. + \end{solution} + + \item Second question. + + \begin{enumerate}[itemsep=.3\baselineskip] + \item First sub-question. + + \begin{solution} + The solution of the first sub-question. + \end{solution} + + \item Second sub-question. + + \begin{solution} + The solution of the second sub-question. + \end{solution} + + \end{enumerate} + + \item Third question. + + \begin{solution} + The solution of the third question. + \end{solution} + + \end{enumerate} + Use \cverb|\noqed| (or \cverb|\noQED|) at the end to suppress the Q.E.D. symbol that marks the end of the current problem. + \noQED +\end{problem} + + +\bigskip\textcolor{gray!55}{(If there is a question that you can't figure out how to solve at the moment...)} + \DNF<some description> diff --git a/macros/latex/contrib/homework/homework-demo-es.pdf b/macros/latex/contrib/homework/homework-demo-es.pdf Binary files differindex 2b46b9b98b..3dd42d5e30 100644 --- a/macros/latex/contrib/homework/homework-demo-es.pdf +++ b/macros/latex/contrib/homework/homework-demo-es.pdf diff --git a/macros/latex/contrib/homework/homework-demo-es.tex b/macros/latex/contrib/homework/homework-demo-es.tex index e905034442..d73a1207c2 100644 --- a/macros/latex/contrib/homework/homework-demo-es.tex +++ b/macros/latex/contrib/homework/homework-demo-es.tex @@ -4,8 +4,16 @@ title in boldface, % title in sffamily, theorem in new line, + % twoside, ]{homework} +%% For highlighting the code in this document +\usepackage{newverbs} +\newverbcommand{\cverb}{\color{red!50!orange}}{} + +%% Below is the main document + + \UseLanguage{Spanish} @@ -44,12 +52,16 @@ Algún resultado auxiliar. \end{lemma} \begin{proof} - La prueba \cref[de]{lem}, donde usamos la siguiente fórmula: + La prueba \cref[de]{lem}, donde usamos la siguiente fórmula (tenga en cuenta el uso de \cverb|\qedhere|): \[ \infty = \infty + 1. - \qedhere % Para colocar el símbolo QED en el lugar correcto. + \qedhere % Para colocar el símbolo Q.E.D. en el lugar correcto. \] \end{proof} + \begin{fact}[Este resultado no requiere prueba] + \proofless + Utilice \cverb|\proofless| para cambiar la caja hueca que marca el final de un entorno de tipo teorema en una caja sólida. + \end{fact} ... y el resto pasos... \end{solution} @@ -61,6 +73,9 @@ \end{answer} +\pagebreak + + \bigskip\textcolor{gray!55}{(Si prefieres el estilo clásico de prueba...)} \begin{proof} @@ -68,6 +83,47 @@ \end{proof} +\bigskip\textcolor{gray!55}{(Si desea responder cada subpregunta de un problema individualmente...)} + +\begin{problem}[Un problema con muchas subpreguntas] + \begin{enumerate}[itemsep=.5\baselineskip] + \item La primera pregunta. + + \begin{solution} + La solución de la primera pregunta. + \end{solution} + + \item La segunda pregunta. + + \begin{enumerate}[itemsep=.3\baselineskip] + \item La primera subpregunta. + + \begin{solution} + La solución de la primera subpregunta. + \end{solution} + + \item La segunda subpregunta. + + \begin{solution} + La solución de la segunda subpregunta. + \end{solution} + + \end{enumerate} + + \item La tercera pregunta. + + \begin{solution} + La solución de la tercera pregunta. + \end{solution} + + \end{enumerate} + Utilice \cverb|\noqed| (o \cverb|\noQED|) al final para suprimir el símbolo Q.E.D. que marca el final del problema actual. + \noQED +\end{problem} + + +\bigskip\textcolor{gray!55}{(Si hay alguna pregunta que no sabes cómo resolver en este momento...)} + \DNF<alguna descripción> diff --git a/macros/latex/contrib/homework/homework-demo-fr.pdf b/macros/latex/contrib/homework/homework-demo-fr.pdf Binary files differindex 784bea5489..eff533c39e 100644 --- a/macros/latex/contrib/homework/homework-demo-fr.pdf +++ b/macros/latex/contrib/homework/homework-demo-fr.pdf diff --git a/macros/latex/contrib/homework/homework-demo-fr.tex b/macros/latex/contrib/homework/homework-demo-fr.tex index 642278fbff..9c90e8b261 100644 --- a/macros/latex/contrib/homework/homework-demo-fr.tex +++ b/macros/latex/contrib/homework/homework-demo-fr.tex @@ -4,16 +4,24 @@ title in boldface, % title in sffamily, theorem in new line, + % twoside, ]{homework} +%% For highlighting the code in this document +\usepackage{newverbs} +\newverbcommand{\cverb}{\color{red!50!orange}}{} + +%% Below is the main document + + \UseLanguage{French} \title{Le sujet, semaine 1} \author{Prénom NOM} -% \date{\today, Location} -% \date{\today[only-year-month], Location} -\date{\TheDate{2023-12-25}, Location} +% \date{\today, Lieu} +% \date{\today[only-year-month], Lieu} +\date{\TheDate{2023-12-25}, Lieu} \begin{document} @@ -44,12 +52,16 @@ Un résultat auxiliaire. \end{lemma} \begin{proof} - La preuve \cref[de]{lem}, où l'on utilise la formule suivante : + La preuve \cref[de]{lem}, où l'on utilise la formule suivante (notez l'utilisation de \cverb|\qedhere|) : \[ \infty = \infty + 1. - \qedhere % pour placer le symbole QED au bon endroit + \qedhere % pour placer le symbole Q.E.D. au bon endroit \] \end{proof} + \begin{fact}[Cet énoncé ne requiert aucune preuve] + \proofless + Utilisez \cverb|\proofless| pour transformer la boîte creuse marquant la fin d'un environnement de type théorème en une boîte solide. + \end{fact} ... et les étapes restantes... \end{solution} @@ -68,6 +80,47 @@ \end{proof} +\bigskip\textcolor{gray!55}{(Si vous souhaitez répondre individuellement à chaque sous-question d'un problème...)} + +\begin{problem}[Un problème avec de nombreuses sous-questions] + \begin{enumerate}[itemsep=.5\baselineskip] + \item La première question. + + \begin{solution} + La réponse à la première question. + \end{solution} + + \item La deuxième question. + + \begin{enumerate}[itemsep=.3\baselineskip] + \item La première sous-question. + + \begin{solution} + La réponse à la première sous-question. + \end{solution} + + \item La deuxième sous-question. + + \begin{solution} + La réponse à la deuxième sous-question. + \end{solution} + + \end{enumerate} + + \item La troisième question. + + \begin{solution} + La réponse à la troisième question. + \end{solution} + + \end{enumerate} + Utilisez \cverb|\noqed| (ou \cverb|\noQED|) à la fin pour supprimer le Q.E.D. symbole qui marque la fin du problème actuel. + \noQED +\end{problem} + + +\bigskip\textcolor{gray!55}{(S'il y a une question que vous n'arrivez pas à résoudre pour le moment...)} + \DNF<la description> diff --git a/macros/latex/contrib/homework/homework-demo-jp.pdf b/macros/latex/contrib/homework/homework-demo-jp.pdf Binary files differindex b3a118c9d5..f0f294cbf1 100644 --- a/macros/latex/contrib/homework/homework-demo-jp.pdf +++ b/macros/latex/contrib/homework/homework-demo-jp.pdf diff --git a/macros/latex/contrib/homework/homework-demo-jp.tex b/macros/latex/contrib/homework/homework-demo-jp.tex index 2c72ee81e3..15839ef40a 100644 --- a/macros/latex/contrib/homework/homework-demo-jp.tex +++ b/macros/latex/contrib/homework/homework-demo-jp.tex @@ -4,8 +4,16 @@ title in boldface, % title in sffamily, theorem in new line, + % twoside, ]{homework} +%% For highlighting the code in this document +\usepackage{newverbs} +\newverbcommand{\cverb}{\color{red!50!orange}}{} + +%% Below is the main document + + \UseLanguage{Japanese} @@ -44,16 +52,24 @@ いくつかの補助的な結果。 \end{lemma} \begin{proof} - これが\cref{lem}の証明です。次の式が使用されます: + これが\cref{lem}の証明です。次の式が使用されます(\cverb|\qedhere| の使用に注意してください): \[ \infty = \infty + 1 \makebox[0pt][l]{\,。} % 文末のピリオド - \qedhere % QED シンボルを正しい位置に配置するために使用されます + \qedhere % Q.E.D. シンボルを正しい位置に配置するために使用されます \] \end{proof} + \begin{fact}[この結果には証明の必要はない] + \proofless + \cverb|\proofless| を使用して、定理タイプの環境の終わりを示す中空のボックスを中実のボックスに変更します。 + \end{fact} …そして残りのステップ… \end{solution} + +\enlargethispage*{\baselineskip} + + \bigskip\textcolor{gray!55}{(\texttt{answer} 環境を使用することもできます…)} \begin{answer} @@ -68,6 +84,47 @@ \end{proof} +\bigskip\textcolor{gray!55}{(問題の各小問に個別に回答したい場合は…)} + +\begin{problem}[多くの小問がある問題] + \begin{enumerate}[itemsep=.5\baselineskip] + \item 一番目の問題。 + + \begin{solution} + 一番目の問題の解答。 + \end{solution} + + \item 二番目の問題。 + + \begin{enumerate}[itemsep=.3\baselineskip] + \item 一番目の小問。 + + \begin{solution} + 一番目の小問の解答。 + \end{solution} + + \item 二番目の小問。 + + \begin{solution} + 二番目の小問の解答。 + \end{solution} + + \end{enumerate} + + \item 三番目の問題。 + + \begin{solution} + 三番目の問題の解答。 + \end{solution} + + \end{enumerate} + 現在の問題の終わりを示す Q.E.D. シンボルを表示しないようにするには、最後に \cverb|\noqed|(または \cverb|\noQED|)を使う。 + \noQED +\end{problem} + + +\bigskip\textcolor{gray!55}{(一時的に解決できない問題がある場合は…)} + \DNF<いくつかの説明> diff --git a/macros/latex/contrib/homework/homework-demo-tc.pdf b/macros/latex/contrib/homework/homework-demo-tc.pdf Binary files differindex f9f67a70f1..2901b5d592 100644 --- a/macros/latex/contrib/homework/homework-demo-tc.pdf +++ b/macros/latex/contrib/homework/homework-demo-tc.pdf diff --git a/macros/latex/contrib/homework/homework-demo-tc.tex b/macros/latex/contrib/homework/homework-demo-tc.tex index 9c56aae43e..4fda4f0049 100644 --- a/macros/latex/contrib/homework/homework-demo-tc.tex +++ b/macros/latex/contrib/homework/homework-demo-tc.tex @@ -4,8 +4,16 @@ title in boldface, % title in sffamily, theorem in new line, + % twoside, ]{homework} +%% For highlighting the code in this document +\usepackage{newverbs} +\newverbcommand{\cverb}{\color{red!50!orange}}{} + +%% Below is the main document + + \UseLanguage{Traditional Chinese} @@ -44,13 +52,17 @@ 一些輔助結果。 \end{lemma} \begin{proof} - \Cref{lem}的證明,其中用到下面的公式: + 這是\cref{lem}的證明,其中用到下面的公式(注意使用 \cverb|\qedhere|): \[ \infty = \infty + 1 \makebox[0pt][l]{\,。} % 句尾的句號 - \qedhere % 用來把 QED 放在正確的位置 + \qedhere % 用來把 Q.E.D. 符號放在正確的位置 \] \end{proof} + \begin{fact}[這個結論無須證明] + \proofless + 使用 \cverb|\proofless| 可以將標記定理結束的空心方框變成實心方框。 + \end{fact} …剩餘的步驟… \end{solution} @@ -68,6 +80,47 @@ \end{proof} +\bigskip\textcolor{gray!55}{(如果你想為一個大問題中的每個小問題分別撰寫解答…)} + +\begin{problem}[一個由許多小問題構成的大問題] + \begin{enumerate}[itemsep=.5\baselineskip] + \item 第一個問題。 + + \begin{solution} + 第一個問題的解答。 + \end{solution} + + \item 第二個問題。 + + \begin{enumerate}[itemsep=.3\baselineskip] + \item 第一個小問。 + + \begin{solution} + 第一個小問的解答。 + \end{solution} + + \item 第二個小問。 + + \begin{solution} + 第二個小問的解答。 + \end{solution} + + \end{enumerate} + + \item 第三個問題。 + + \begin{solution} + 第三個問題的解答。 + \end{solution} + + \end{enumerate} + 在末尾使用 \cverb|\noqed|(或 \cverb|\noQED|)可以取消用於標記當前問題結束的方框。 + \noQED +\end{problem} + + +\bigskip\textcolor{gray!55}{(如果你有暫時解決不出來的問題…)} + \DNF<一些描述> diff --git a/macros/latex/contrib/homework/homework.cls b/macros/latex/contrib/homework/homework.cls index a130b17103..eabf109563 100644 --- a/macros/latex/contrib/homework/homework.cls +++ b/macros/latex/contrib/homework/homework.cls @@ -12,7 +12,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplClass {homework} - {2023/09/25a} {} + {2023/09/28} {} {Document class for writing homework} \keys_define:nn { homework } @@ -98,7 +98,11 @@ \RequirePackage { lastpage } \fancypagestyle { fancy } { - \rfoot{\small\color{main-text!27!paper} \l__homework_page_of_total_tl } + \if@twoside + \fancyfoot[RO,LE]{\small\color{main-text!27!paper} \l__homework_page_of_total_tl } + \else + \fancyfoot[R]{\small\color{main-text!27!paper} \l__homework_page_of_total_tl } + \fi } \pagestyle { fancy } @@ -139,10 +143,6 @@ \newcommand\soluline{\bgroup\markoverwith{\rule[-.45ex]{1pt}{.75pt}}\ULon} \NewDocumentEnvironment { solution } { O{ \l__homework_solution_tl } } { - \setlength\abovedisplayskip{.3\baselineskip} - \setlength\belowdisplayskip{.3\baselineskip} - \setlength\abovedisplayshortskip{.3\baselineskip} - \setlength\belowdisplayshortskip{.3\baselineskip} \par\noindent \color{cyan!50!blue!90!main-text} \soluline{#1}\nobreakspace\nobreakspace @@ -166,9 +166,17 @@ %% Configuration of the theorems %%================================ -\newcounter{homework} -\SetTheorem{problem,question,exercise}{shared counter=homework} -\SetTheorem{definition,lemma,theorem,proposition,corollary,example,fact,remark,assertion,assumption,claim,conclusion,conjecture,construction,convention,notation,observation,property,recall}{number within=homework} +\newcounter { homework } +\SetTheorem { problem, question, exercise } { shared counter = homework } +\SetTheorem { definition, lemma, theorem, proposition, corollary, example, fact, remark, assertion, assumption, claim, conclusion, conjecture, construction, convention, notation, observation, property, recall } { number within = homework } + +%%================================ +%% Special cases for the QED +%%================================ + +\def\noQED{\let\popQED\relax} +\let\noqed\noQED +\def\proofless{\let\qedsymbol\customqedsymbol\let\simpleqedsymbol\customqedsymbol} \endinput %% diff --git a/macros/latex/contrib/jwjournal/README.md b/macros/latex/contrib/jwjournal/README.md index 20f9f77307..26caffafbf 100644 --- a/macros/latex/contrib/jwjournal/README.md +++ b/macros/latex/contrib/jwjournal/README.md @@ -118,6 +118,19 @@ With a few more for icing on the cake: >> (Some remark) >> (Another remark) ``` +- `~~`: If you use `>>` or `>>>` inside a Note block (i.e. lines start with `[...]`), then there would no way to get out of the centered or boxed area and then continue the indented text; in such cases, you may start a new paragraph that start with `~~`, this will continue the indented text block: + ``` + [Test] Here is some text. + || {some-image} <.4> + >> (Centered text) + + ~~ + Some more text. + >>> Text in color box. + + ~~ + And more text. + ``` - `->` and `<-`: Skip or retrieve certain vertical space, by default half of `\baselineskip`. You may specify the exact spacing in the unit of `\baselineskip`: for example, `-> <0.3>` would be skipping `0.3\baselineskip`, while `<- <.75>` means retrieving `0.75\baselineskip`. - `+++`: If a single sentence or a few words fall to the next page, you may write a `+++` before that entry to enlarge the current page by one line. > You may write this `+++` several times if necessary, but do make sure that the number of the `+` sign is a multiple of 3. @@ -168,6 +181,18 @@ Indentations are not important, but paragraphs need to be separated by a blank l - With pdfLaTeX, the base class is `minimart`. - With XeLaTeX or LuaLaTeX, the base class is `einfart`. +### Regarding the fonts + +If you are using XeLaTeX or LuaLaTeX to compile your document, then the current document class requires the following open-source fonts that are not included in the standard TeX collection: + +- The Source Han font series at [Adobe Fonts](https://github.com/adobe-fonts). More specifically: + - Source Han Serif, [go to its Release page](https://github.com/adobe-fonts/source-han-serif/releases). + - Source Han Sans, [go to its Release page](https://github.com/adobe-fonts/source-han-sans/releases). + - Source Han Mono, [go to its Release page](https://github.com/adobe-fonts/source-han-mono/releases). + > It is recommended to download the Super-OTC version, so that the total download size would be smaller, and the installation would be easier. + +These are necessary if you wish to write your document in Chinese (either simplified or traditional) or Japanese. Also, without these fonts installed, the compilation speed might be much slower — the compilation would still passing, but the system shall spend (quite) some time verifying that the fonts are indeed missing before switching to the fallback fonts. + ### Colors The colors from Monday to Sunday have the internal names `jwjournal-color-1`, ..., `jwjournal-color-7`. Currently they are defined as: ```latex diff --git a/macros/latex/contrib/jwjournal/jwjournal.cls b/macros/latex/contrib/jwjournal/jwjournal.cls index 9b1e23804f..9c208c88a8 100644 --- a/macros/latex/contrib/jwjournal/jwjournal.cls +++ b/macros/latex/contrib/jwjournal/jwjournal.cls @@ -12,7 +12,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplClass {jwjournal} - {2023/09/01} {} + {2023/09/28} {} {JW's journal class} \keys_define:nn { jwjournal } @@ -105,6 +105,8 @@ \RequirePackage { enumitem } \setlist [ description ] { font = \normalfont\sffamily, leftmargin = 3em, topsep = 0pt, labelsep = 1em } +\newlist { jwjournal-continued-text } { itemize } { 1 } +\setlist [ jwjournal-continued-text ] { leftmargin = 3em, topsep = 0pt, label = {} } \dim_new:N \l_jwjournal_labelsep_dim \dim_set:Nn \l_jwjournal_labelsep_dim { \labelsep } \setlist [ 2 ] { labelsep = \l_jwjournal_labelsep_dim, labelwidth = !} @@ -124,6 +126,12 @@ \item[#1] #2 \end{description} } +\NewDocumentCommand \JWJournalContinue { m } + { + \begin{jwjournal-continued-text} + \item #1 + \end{jwjournal-continued-text} + } \NewDocumentCommand \JWJournalNote { m } { @@ -338,7 +346,7 @@ { \c{hfill} } \l_jwjournal_tmp_tl \regex_replace_all:nnN - { // } + { [^\:]// } { \c{c_jwjournal_new_line_with_skip_tl} } \l_jwjournal_tmp_tl @@ -423,6 +431,11 @@ { \c{JWJournalItem} {\1} {\2} } \l_jwjournal_tmp_tl + \regex_replace_once:nnN + { ❄️ \ *? \~\~ \ *? (.*) } + { \c{JWJournalContinue} {\1} } + \l_jwjournal_tmp_tl + \regex_replace_once:nnN { ❄️ } { } \l_jwjournal_tmp_tl \tl_gput_right:NV \g_jwjournal_content_tl \l_jwjournal_tmp_tl diff --git a/macros/latex/contrib/minimalist/minimalist-classical.sty b/macros/latex/contrib/minimalist/minimalist-classical.sty index b338b662d4..928ce7ccd0 100644 --- a/macros/latex/contrib/minimalist/minimalist-classical.sty +++ b/macros/latex/contrib/minimalist/minimalist-classical.sty @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {minimalist-classical} - {2023/09/27} {} + {2023/09/28} {} {The "classical" style of minimalist} \IfPackageLoadedTF { minimalist } {} @@ -725,6 +725,19 @@ heading_suffix "}\n" \RequirePackage { mathtools } \RequirePackage { amsthm } +\tl_const:Nn \c_minimalist_l_mathparen_latin_tl { $($ } +\tl_const:Nn \c_minimalist_r_mathparen_latin_tl { $)$ } +\tl_const:Nn \c_minimalist_l_mathparen_cjk_tl { \!\,( } +\tl_const:Nn \c_minimalist_r_mathparen_cjk_tl { )\!\, } +\cs_new:Nn \minimalist_insert_l_mathparen: + { + \tl_use:c { c_minimalist_l_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } +\cs_new:Nn \minimalist_insert_r_mathparen: + { + \tl_use:c { c_minimalist_r_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } + \def\tagform@#1{\maketag@@@{\textcolor{.!39!paper}{(\ignorespaces#1\unskip\@@italiccorr)}}} \PassOptionsToPackage { nopatch = eqnum } { microtype } @@ -741,7 +754,7 @@ heading_suffix "}\n" { \global\let\qedsymbol\simpleqedsymbol \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\thmnumber{\nobreakspace #2}} - \thmnote{\hspace{.4em}\color{.!50!paper}$($#3$)$} + \thmnote{\hspace{.4em}\color{.!50!paper} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: } }}\hbox{\strut}\vspace{0pt}}}\vspace{-2\parskip} \pushQED{\qed} } @@ -753,7 +766,7 @@ heading_suffix "}\n" { \global\let\qedsymbol\simpleqedsymbol \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\thmnumber{\nobreakspace #2}} - \thmnote{\hspace{.4em}\color{.!50!paper}$($#3$)$} + \thmnote{\hspace{.4em}\color{.!50!paper} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: } }}\hbox{\strut}\vspace{0pt}}}\vspace{-2\parskip} \pushQED{\qed} } @@ -767,7 +780,7 @@ heading_suffix "}\n" { \global\let\qedsymbol\simpleqedsymbol {\thmname{#1}\thmnumber{\nobreakspace #2}}\hspace{.4em} \textcolor{.!27!paper}{ \l_minimalist_sep_bar }\hspace{.4em} - \color{.!50!paper}\thmnote{$($#3$)$\nobreakspace\nobreakspace} + \color{.!50!paper}\thmnote{ \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: \nobreakspace\nobreakspace} \pushQED{\qed} } \newtheoremstyle{simple-var} @@ -778,7 +791,7 @@ heading_suffix "}\n" { \global\let\qedsymbol\simpleqedsymbol {\thmname{#1}\thmnumber{\nobreakspace #2}}\hspace{.4em} \textcolor{.!27!paper}{ \l_minimalist_sep_bar }\hspace{.4em} - \color{.!50!paper}\thmnote{$($#3$)$\nobreakspace\nobreakspace} + \color{.!50!paper}\thmnote{ \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: \nobreakspace\nobreakspace} \pushQED{\qed} } } diff --git a/macros/latex/contrib/minimalist/minimalist-default.sty b/macros/latex/contrib/minimalist/minimalist-default.sty index 88380dabbd..0e29cd936c 100644 --- a/macros/latex/contrib/minimalist/minimalist-default.sty +++ b/macros/latex/contrib/minimalist/minimalist-default.sty @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {minimalist-default} - {2023/09/27} {} + {2023/09/28} {} {The default style of minimalist} \IfPackageLoadedTF { minimalist } {} @@ -704,6 +704,19 @@ heading_suffix "}\n" \RequirePackage { mathtools } \RequirePackage { amsthm } +\tl_const:Nn \c_minimalist_l_mathparen_latin_tl { $($ } +\tl_const:Nn \c_minimalist_r_mathparen_latin_tl { $)$ } +\tl_const:Nn \c_minimalist_l_mathparen_cjk_tl { \!\,( } +\tl_const:Nn \c_minimalist_r_mathparen_cjk_tl { )\!\, } +\cs_new:Nn \minimalist_insert_l_mathparen: + { + \tl_use:c { c_minimalist_l_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } +\cs_new:Nn \minimalist_insert_r_mathparen: + { + \tl_use:c { c_minimalist_r_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } + \def\tagform@#1{\maketag@@@{\textcolor{.!39!paper}{(\ignorespaces#1\unskip\@@italiccorr)}}} \PassOptionsToPackage { nopatch = eqnum } { microtype } @@ -722,7 +735,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} }}\hbox{\strut}\vspace{0pt}}} } \newtheoremstyle{simple-var} @@ -737,7 +750,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} }}\hbox{\strut}\vspace{0pt}}} } } @@ -752,7 +765,7 @@ heading_suffix "}\n" {\normalfont}{} {0pt} {{\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} \minimalist_bfseries:\minimalist_sffamily: . \nobreakspace\nobreakspace} % {\normalfont\textcolor{main-text!27!paper}{---}} @@ -766,7 +779,7 @@ heading_suffix "}\n" {\normalfont}{} {0pt} {{\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} \minimalist_bfseries:\minimalist_sffamily: . \nobreakspace\nobreakspace} % {\normalfont\textcolor{main-text!27!paper}{---}} diff --git a/macros/latex/contrib/minimalist/minimalist-flow.sty b/macros/latex/contrib/minimalist/minimalist-flow.sty index caaf9e51af..9f3e52f939 100644 --- a/macros/latex/contrib/minimalist/minimalist-flow.sty +++ b/macros/latex/contrib/minimalist/minimalist-flow.sty @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {minimalist-flow} - {2023/09/27} {} + {2023/09/28} {} {The "flow" style of minimalist} \IfPackageLoadedTF { minimalist } {} @@ -715,6 +715,19 @@ heading_suffix "}\n" \RequirePackage { mathtools } \RequirePackage { amsthm } +\tl_const:Nn \c_minimalist_l_mathparen_latin_tl { $($ } +\tl_const:Nn \c_minimalist_r_mathparen_latin_tl { $)$ } +\tl_const:Nn \c_minimalist_l_mathparen_cjk_tl { \!\,( } +\tl_const:Nn \c_minimalist_r_mathparen_cjk_tl { )\!\, } +\cs_new:Nn \minimalist_insert_l_mathparen: + { + \tl_use:c { c_minimalist_l_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } +\cs_new:Nn \minimalist_insert_r_mathparen: + { + \tl_use:c { c_minimalist_r_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } + \def\tagform@#1{\maketag@@@{\textcolor{.!39!paper}{(\ignorespaces#1\unskip\@@italiccorr)}}} \PassOptionsToPackage { nopatch = eqnum } { microtype } @@ -733,7 +746,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmnumber{ \minimalist_apply_title_numbering_style:n { #2 } \hspace{.75em} }\thmname{#1}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} }}\hbox{\strut}\vspace{0pt}}} } \newtheoremstyle{simple-var} @@ -748,7 +761,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmnumber{ \minimalist_apply_title_numbering_style:n { #2 } \hspace{.75em} }\thmname{#1}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} }}\hbox{\strut}\vspace{0pt}}} } } @@ -763,7 +776,7 @@ heading_suffix "}\n" {\normalfont}{} {0pt} {{\thmnumber{ \minimalist_apply_title_numbering_style:n { #2 } \hspace{.75em} }\thmname{#1}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace} \newtheoremstyle{simple-var} {}{} { @@ -774,7 +787,7 @@ heading_suffix "}\n" {\normalfont}{} {0pt} {{\thmnumber{ \minimalist_apply_title_numbering_style:n { #2 } \hspace{.75em} }\thmname{#1}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }}\nobreakspace\nobreakspace{\normalfont\textcolor{main-text!27!paper}{---}}\nobreakspace\nobreakspace} } \theoremstyle{simple} diff --git a/macros/latex/contrib/minimalist/minimalist-plain.sty b/macros/latex/contrib/minimalist/minimalist-plain.sty index e67289587c..0d27d27c40 100644 --- a/macros/latex/contrib/minimalist/minimalist-plain.sty +++ b/macros/latex/contrib/minimalist/minimalist-plain.sty @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {minimalist-plain} - {2023/09/27} {} + {2023/09/28} {} {The "plain" style of minimalist} \IfPackageLoadedTF { minimalist } {} @@ -678,6 +678,19 @@ heading_suffix "}\n" \RequirePackage { mathtools } \RequirePackage { amsthm } +\tl_const:Nn \c_minimalist_l_mathparen_latin_tl { $($ } +\tl_const:Nn \c_minimalist_r_mathparen_latin_tl { $)$ } +\tl_const:Nn \c_minimalist_l_mathparen_cjk_tl { \!\,( } +\tl_const:Nn \c_minimalist_r_mathparen_cjk_tl { )\!\, } +\cs_new:Nn \minimalist_insert_l_mathparen: + { + \tl_use:c { c_minimalist_l_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } +\cs_new:Nn \minimalist_insert_r_mathparen: + { + \tl_use:c { c_minimalist_r_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } + \def\tagform@#1{\maketag@@@{\textcolor{.!39!paper}{(\ignorespaces#1\unskip\@@italiccorr)}}} \PassOptionsToPackage { nopatch = eqnum } { microtype } @@ -696,7 +709,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} }}\hbox{\strut}\vspace{0pt}}} } \newtheoremstyle{simple-var} @@ -711,7 +724,7 @@ heading_suffix "}\n" { \rlap{\vbox{\hbox{\parbox{\linewidth}{ {\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} }}\hbox{\strut}\vspace{0pt}}} } } @@ -726,7 +739,7 @@ heading_suffix "}\n" {\normalfont}{} {0pt} {{\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} \minimalist_bfseries:\minimalist_sffamily: . \nobreakspace\nobreakspace} % {\normalfont\textcolor{main-text!27!paper}{---}} @@ -740,7 +753,7 @@ heading_suffix "}\n" {\normalfont}{} {0pt} {{\thmname{#1}\thmnumber{\nobreakspace #2}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} \minimalist_bfseries:\minimalist_sffamily: . \nobreakspace\nobreakspace} % {\normalfont\textcolor{main-text!27!paper}{---}} diff --git a/macros/latex/contrib/minimalist/minimalist-stream.sty b/macros/latex/contrib/minimalist/minimalist-stream.sty index 19f236637f..afe534e03c 100644 --- a/macros/latex/contrib/minimalist/minimalist-stream.sty +++ b/macros/latex/contrib/minimalist/minimalist-stream.sty @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {minimalist-stream} - {2023/09/27} {} + {2023/09/28} {} {The "stream" style of minimalist} \IfPackageLoadedTF { minimalist } {} @@ -784,6 +784,19 @@ heading_suffix "}\n" \RequirePackage { mathtools } \RequirePackage { amsthm } +\tl_const:Nn \c_minimalist_l_mathparen_latin_tl { $($ } +\tl_const:Nn \c_minimalist_r_mathparen_latin_tl { $)$ } +\tl_const:Nn \c_minimalist_l_mathparen_cjk_tl { \!\,( } +\tl_const:Nn \c_minimalist_r_mathparen_cjk_tl { )\!\, } +\cs_new:Nn \minimalist_insert_l_mathparen: + { + \tl_use:c { c_minimalist_l_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } +\cs_new:Nn \minimalist_insert_r_mathparen: + { + \tl_use:c { c_minimalist_r_mathparen_ \l_projlib_language_current_languagetype_tl _tl } + } + \def\tagform@#1{\maketag@@@{\textcolor{.!39!paper}{(\ignorespaces#1\unskip\@@italiccorr)}}} \PassOptionsToPackage { nopatch = eqnum } { microtype } @@ -802,7 +815,7 @@ heading_suffix "}\n" } \vspace*{-\baselineskip} {\thmname{#1}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} \phantom{q} % To provide something below the baseline }}\hbox{\strut}\vspace{0pt}}} } @@ -820,7 +833,7 @@ heading_suffix "}\n" } \vspace*{-\baselineskip} {\thmname{#1}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} \phantom{q} % To provide something below the baseline }}\hbox{\strut}\vspace{0pt}}} } @@ -847,7 +860,7 @@ heading_suffix "}\n" } % \minimalist_bfseries:\minimalist_sffamily: {\thmname{#1}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} . \hspace{.5em} } \newtheoremstyle{simple-inline-var} @@ -863,7 +876,7 @@ heading_suffix "}\n" } % \minimalist_bfseries:\minimalist_sffamily: {\thmname{#1}} - {\color{main-text!50!paper}\thmnote{\hspace{.4em}$($#3$)$}} + {\color{main-text!50!paper}\thmnote{\hspace{.4em} \minimalist_insert_l_mathparen: #3 \minimalist_insert_r_mathparen: }} . \hspace{.5em} } diff --git a/macros/latex/contrib/minimalist/minimalist.sty b/macros/latex/contrib/minimalist/minimalist.sty index 7f457fb0d8..960bbb1501 100644 --- a/macros/latex/contrib/minimalist/minimalist.sty +++ b/macros/latex/contrib/minimalist/minimalist.sty @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {minimalist} - {2023/09/27} {} + {2023/09/28} {} {A simple and clear style for articles and books} \keys_define:nn { minimalist } diff --git a/macros/latex/contrib/minimalist/minimart.cls b/macros/latex/contrib/minimalist/minimart.cls index d1119cb09d..73108bd5fb 100644 --- a/macros/latex/contrib/minimalist/minimart.cls +++ b/macros/latex/contrib/minimalist/minimart.cls @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplClass {minimart} - {2023/09/27} {} + {2023/09/28} {} {A simple and clear article style} \tl_const:Nn \l__minimclass_base_class_tl { article } diff --git a/macros/latex/contrib/minimalist/minimbook.cls b/macros/latex/contrib/minimalist/minimbook.cls index 2fc4e1dffd..9463eee17b 100644 --- a/macros/latex/contrib/minimalist/minimbook.cls +++ b/macros/latex/contrib/minimalist/minimbook.cls @@ -18,7 +18,7 @@ \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplClass {minimbook} - {2023/09/27} {} + {2023/09/28} {} {A simple and clear book style} \tl_const:Nn \l__minimclass_base_class_tl { book } diff --git a/macros/latex/contrib/nicematrix/nicematrix-code.dtx b/macros/latex/contrib/nicematrix/nicematrix-code.dtx index 9a4e6cc863..8246cffbd8 100644 --- a/macros/latex/contrib/nicematrix/nicematrix-code.dtx +++ b/macros/latex/contrib/nicematrix/nicematrix-code.dtx @@ -17,11 +17,11 @@ % % \fi % \iffalse -\def\myfileversion{6.23} -\def\myfiledate{2023/09/02} +\def\myfileversion{6.24} +\def\myfiledate{2023/09/28} % % -%<*batchfile> +%<*batchfile> \begingroup \input l3docstrip.tex \keepsilent @@ -708,40 +708,6 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% \textbf{The column S of siunitx}\par\nobreak -% -% The command |\@@_renew_NC@rewrite@S:| will be used in each environment of -% \pkg{nicematrix} in order to ``rewrite'' the |S| column in each environment. -% \begin{macrocode} -\hook_gput_code:nnn { begindocument } { . } - { - \IfPackageLoadedTF { siunitx } - { - \cs_new_protected:Npn \@@_renew_NC@rewrite@S: - { - \renewcommand*{\NC@rewrite@S}[1][] - { -% \end{macrocode} -% |\@temptokena| is a toks (not supported by the L3 programming layer). -% \begin{macrocode} - \tl_if_empty:nTF { ##1 } - { - \@temptokena \exp_after:wN - { \tex_the:D \@temptokena \@@_S: } - } - { - \@temptokena \exp_after:wN - { \tex_the:D \@temptokena \@@_S: [ ##1 ] } - } - \NC@find - } - } - } - { \cs_set_eq:NN \@@_renew_NC@rewrite@S: \prg_do_nothing: } - } -% \end{macrocode} -% -% \bigskip % \begin{macrocode} \cs_new_protected:Npn \@@_rescan_for_spanish:N #1 { @@ -965,6 +931,13 @@ version 2005/12/01 or later. % \begin{macrocode} \dim_new:N \l_@@_rule_width_dim % \end{macrocode} +% +% \bigskip +% The key |color| in a command of rule such as |\Hline| (or the specifier +% ``\verb+|+'' in the preamble of an environment). +% \begin{macrocode} +\tl_new:N \l_@@_rule_color_tl +% \end{macrocode} % % \bigskip % The following boolean will be raised when the command |\rotate| is used. @@ -1017,21 +990,32 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_new:N \g_@@_left_delim_tl \tl_new:N \g_@@_right_delim_tl +% \end{macrocode} +% +% \bigskip +% The token list |\g_@@_user_preamble_tl| will contain the preamble provided by +% the the final user of \pkg{nicematrix} (eg the preamble of an environment +% |{NiceTabular}|). +% \begin{macrocode} +\tl_new:N \g_@@_user_preamble_tl +% \end{macrocode} +% The token list |\g_@@_array_preamble_tl| will contain the preamble constructed +% by \pkg{nicematrix} for the environment |{array}| (of \pkg{array}). +% \begin{macrocode} +\tl_new:N \g_@@_array_preamble_tl +% \end{macrocode} +% For |\multicolumn|. +% \begin{macrocode} \tl_new:N \g_@@_preamble_tl % \end{macrocode} % % \bigskip % The following parameter corresponds to the key |columns-type| of the % environments |{NiceMatrix}|, |{pNiceMatrix}|, etc. and also the key -% |matrix / columns-type| of |\NiceMatrixOptions|. However, it does \emph{not} -% contain the value provided by the final user. Indeed, a transformation is done -% in order to have a preamble (for the package \pkg{array}) which is -% nicematrix-aware. That transformation is done with the command -% |\@@_set_preamble:Nn|. +% |matrix / columns-type| of |\NiceMatrixOptions|. % \begin{macrocode} \tl_new:N \l_@@_columns_type_tl -\hook_gput_code:nnn { begindocument } { . } - { \@@_set_preamble:Nn \l_@@_columns_type_tl { c } } +\tl_set:Nn \l_@@_columns_type_tl { c } % \end{macrocode} % % \bigskip @@ -1432,6 +1416,15 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_new:N \l_@@_color_tl % \end{macrocode} +% +% \medskip +% In the key |tikz| of a command |\Block| or in the argument of a command +% |\TikzEveryCell|, the final user puts a list of tikz keys. But, you have added +% another key, named |offset| (which means that an offset will be used for the +% frame of the block or the cell). The following parameter corresponds to that key. +% \begin{macrocode} +\dim_new:N \l_@@_offset_dim +% \end{macrocode} % % \medskip % Here is the dimension for the width of the rule when a block (created by @@ -2363,8 +2356,7 @@ version 2005/12/01 or later. \bool_new:N \l_@@_delimiters_max_width_bool % \end{macrocode} % -% \bigskip -% \begin{macrocode} +% % \bigskip % \begin{macrocode} \keys_define:nn { NiceMatrix / xdots } @@ -2663,6 +2655,7 @@ version 2005/12/01 or later. SubMatrix / rules .inherit:n = NiceMatrix / rules , CodeAfter / xdots .inherit:n = NiceMatrix / xdots , CodeBefore / sub-matrix .inherit:n = NiceMatrix / sub-matrix , + CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix , NiceMatrix .inherit:n = { NiceMatrix / Global , @@ -2759,8 +2752,7 @@ version 2005/12/01 or later. notes .value_required:n = true , sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , sub-matrix .value_required:n = true , - matrix / columns-type .code:n = - \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 }, + matrix / columns-type .tl_set:N = \l_@@_columns_type_tl , matrix / columns-type .value_required:n = true , caption-above .bool_set:N = \l_@@_caption_above_bool , caption-above .default:n = true , @@ -2794,7 +2786,7 @@ version 2005/12/01 or later. \int_set:Nn \l_@@_last_col_int { -1 } } { \int_set:Nn \l_@@_last_col_int { #1 } } , - columns-type .code:n = \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 } , + columns-type .tl_set:N = \l_@@_columns_type_tl , columns-type .value_required:n = true , l .meta:n = { columns-type = l } , r .meta:n = { columns-type = r } , @@ -2892,6 +2884,31 @@ version 2005/12/01 or later. } % \end{macrocode} % +% +% \bigskip +% The |\CodeAfter| (inserted with the key |code-after| or after the keyword +% |\CodeAfter|) may always begin with a list of pairs \textsl{key=value} between +% square brackets. Here is the corresponding set of keys. +% +% We \emph{must} put the following instructions \emph{after} the : +% +% \begin{verbatim} +% CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix +% \end{verbatim} +% +% \begin{macrocode} +\keys_define:nn { NiceMatrix / CodeAfter } + { + delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , + delimiters / color .value_required:n = true , + rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , + rules .value_required:n = true , + xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } , + sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , + sub-matrix .value_required:n = true , + unknown .code:n = \@@_error:n { Unknown~key~for~CodeAfter } + } +% \end{macrocode} % % \bigskip % \section{Important code used by \{NiceArrayWithDelims\} } @@ -3459,19 +3476,6 @@ version 2005/12/01 or later. } % \end{macrocode} % -% \bigskip -% The command |\@@_newcolumntype| is the command |\newcolumntype| of -% \pkg{array} without the warnings for redefinitions of columns types (we will -% use it to redefine the columns types |w| and |W|). -% \begin{macrocode} -\cs_set_protected:Npn \@@_newcolumntype #1 - { - \cs_set:cpn { NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } } - \peek_meaning:NTF [ - { \newcol@ #1 } - { \newcol@ #1 [ 0 ] } - } -% \end{macrocode} % % % \bigskip @@ -3712,10 +3716,6 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_set_eq:NN \@ifnextchar \new@ifnextchar % \end{macrocode} -% -% \begin{macrocode} - \@@_renew_NC@rewrite@S: -% \end{macrocode} % % \begin{macrocode} \bool_gset_false:N \g_@@_last_col_found_bool @@ -3998,6 +3998,7 @@ version 2005/12/01 or later. \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors \cs_set_eq:NN \SubMatrix \@@_SubMatrix_in_code_before \cs_set_eq:NN \ShowCellNames \@@_ShowCellNames + \cs_set_eq:NN \TikzEveryCell \@@_TikzEveryCell } % \end{macrocode} % @@ -4231,7 +4232,7 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_gset:Nn \g_@@_left_delim_tl { #1 } \tl_gset:Nn \g_@@_right_delim_tl { #2 } - \tl_gset:Nn \g_@@_preamble_tl { #4 } + \tl_gset:Nn \g_@@_user_preamble_tl { #4 } % \end{macrocode} % % @@ -4611,20 +4612,17 @@ version 2005/12/01 or later. % \vspace{1cm} % \section{We construct the preamble of the array} % -% \bigskip -% The transformation of the preamble is an operation in several -% steps.\footnote{Be careful: the transformation of the preamble may also have -% by-side effects, for example, the boolean |\g_@@_delims_bool| will be set -% to |true| if we detect in the preamble a delimiter at the beginning or at the -% end.} +% \bigskip +% The final user provides a preamble, but we must convert that preamble into a +% preamble that will be given to |{array}| (of the package \pkg{array}). % % \bigskip -% The preamble given by the final user is in |\g_@@_preamble_tl| and the modified -% version will be stored in |\g_@@_preamble_tl| also. +% The preamble given by the final user is stored in |\g_@@_user_preamble_tl|. +% The modified version will be stored in |\g_@@_array_preamble_tl| also. % \begin{macrocode} \cs_new_protected:Npn \@@_transform_preamble: { - \bool_if:NT \l_@@_preamble_bool \@@_transform_preamble_i: + \@@_transform_preamble_i: \@@_transform_preamble_ii: } % \end{macrocode} @@ -4632,97 +4630,50 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_transform_preamble_i: { -% \end{macrocode} -% First, we will do an ``expansion'' of the preamble with the tools of the -% package \pkg{array} itself. This ``expansion'' will expand all the constructions -% with |*| and all column types (defined by the user or by various packages -% using |\newcolumntype|). -% -% Since we use the tools of \pkg{array} to do this expansion, we will have a -% programmation which is not in the style of the L3 programming layer. -% -% -% \bigskip -% We redefine the column types |w| and |W|. We use |\@@_newcolumntype| instead -% of |\newcolumtype| because we don't want warnings for column types already -% defined. These redefinitions are in fact \emph{protections} of the letters |w| -% and |W|. We don't want these columns type expanded because we will do the -% patch ourselves after. We want to be able to use the standard column types |w| -% and |W| in potential |{tabular}| of \pkg{array} in some cells of our array. -% That's why we do those redefinitions in a TeX group. -% \begin{macrocode} + \int_gzero:N \c@jCol \group_begin: - \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } } - \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } } -% \end{macrocode} -% -% \bigskip -% If the package \pkg{varwidth} has defined the column type |V|, we protect from -% expansion by redefining it to |\@@_V:| (which will be catched by our system). -% \begin{macrocode} - \cs_if_exist:NT \NC@find@V { \@@_newcolumntype V { \@@_V: } } % \end{macrocode} -% -% First, we have to store our preamble in the token register |\@temptokena| -% (those ``token registers'' are \emph{not} supported by the L3 programming layer). +% The sequence |\g_@@_cols_vlsim_seq| will contain the numbers of the columns +% where you will to have to draw vertical lines in the potential sub-matrices +% (hence the name |vlism|). % \begin{macrocode} - \exp_args:NV \@temptokena \g_@@_preamble_tl + \seq_gclear:N \g_@@_cols_vlism_seq % \end{macrocode} -% Initialisation of a flag used by \pkg{array} to detect the end of the expansion. +% |\g_tmpb_bool| will be raised if you have a \verb+|+ at the end of the +% preamble provided by the final user. % \begin{macrocode} - \@tempswatrue + \bool_gset_false:N \g_tmpb_bool % \end{macrocode} -% The following line actually does the expansion (it's has been copied from -% |array.sty|). The expanded version is still in |\@temptokena|. +% +% The following sequence will store the arguments of the successive |>| in the +% preamble. % \begin{macrocode} - \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list } - \int_gzero:N \c@jCol - \tl_gclear:N \g_@@_preamble_tl + \tl_gclear_new:N \g_@@_pre_cell_tl % \end{macrocode} -% |\g_tmpb_bool| will be raised if you have a \verb+|+ at the end of the preamble. +% The counter |\l_tmpa_int| will count the number of consecutive occurrences +% of the symbol \verb+|+. % \begin{macrocode} - \bool_gset_false:N \g_tmpb_bool + \int_zero:N \l_tmpa_int + \tl_gclear:N \g_@@_array_preamble_tl \tl_if_eq:NnTF \l_@@_vlines_clist { all } { - \tl_gset:Nn \g_@@_preamble_tl + \tl_gset:Nn \g_@@_array_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } { \clist_if_in:NnT \l_@@_vlines_clist 1 { - \tl_gset:Nn \g_@@_preamble_tl + \tl_gset:Nn \g_@@_array_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } } % \end{macrocode} -% The sequence |\g_@@_cols_vlsim_seq| will contain the numbers of the columns -% where you will to have to draw vertical lines in the potential sub-matrices -% (hence the name |vlism|). -% \begin{macrocode} - \seq_clear:N \g_@@_cols_vlism_seq -% \end{macrocode} -% -% \bigskip -% The following sequence will store the arguments of the successive |>| in the -% preamble. +% Now, we actually make the preamble (which will be given to |{array}|). It will +% be stored in |\g_@@_array_preamble_tl|. % \begin{macrocode} - \tl_gclear_new:N \g_@@_pre_cell_tl -% \end{macrocode} -% -% The counter |\l_tmpa_int| will count the number of consecutive occurrences -% of the symbol \verb+|+. -% \begin{macrocode} - \int_zero:N \l_tmpa_int -% \end{macrocode} -% Now, we actually patch the preamble (and it is constructed in -% |\g_@@_preamble_tl|). -% \begin{macrocode} - \exp_after:wN \@@_patch_preamble:n \the \@temptokena \q_stop + \exp_last_unbraced:NV \@@_make_preamble:n \g_@@_user_preamble_tl \q_stop \int_gset_eq:NN \g_@@_static_num_of_col_int \c@jCol % \end{macrocode} -% Remark that |\g_@@_static_num_of_col_int| will stay equel to zero in the -% environments without preamble since we are in a code that is executed only -% in the environments \emph{with} preamble. % % \medskip % Now, we replace |\columncolor| by |\@@_columncolor_preamble|. @@ -4732,28 +4683,18 @@ version 2005/12/01 or later. \regex_replace_all:NnN \c_@@_columncolor_regex { \c { @@_columncolor_preamble } } - \g_@@_preamble_tl + \g_@@_array_preamble_tl } % \end{macrocode} % % \medskip -% Now, we can close the TeX group which was opened for the redefinition of -% the columns of type |w| and~|W|. +% We are not sure that the following TeX group is still necessary. % \begin{macrocode} \group_end: } % \end{macrocode} % -% -% % \bigskip -% Now, we have to ``patch'' that preamble by transforming some columns. -% We will insert in the TeX flow the preamble in its actual form (that is to say -% after the ``expansion'') following by a marker |\q_stop| and we will consume -% these tokens constructing the (new form of the) preamble in -% |\g_@@_preamble_tl|. This is done recursively with the command -% |\@@_patch_preamble:n|. In the same time, we will count the columns with the -% counter |\c@jCol|. % \begin{macrocode} \cs_new_protected:Npn \@@_transform_preamble_ii: { @@ -4779,7 +4720,7 @@ version 2005/12/01 or later. % We complete the preamble with the potential ``exterior columns'' (on both sides). % \begin{macrocode} \int_compare:nNnTF \l_@@_first_col_int = 0 - { \tl_gput_left:NV \g_@@_preamble_tl \c_@@_preamble_first_col_tl } + { \tl_gput_left:NV \g_@@_array_preamble_tl \c_@@_preamble_first_col_tl } { \bool_lazy_all:nT { @@ -4788,10 +4729,10 @@ version 2005/12/01 or later. { \tl_if_empty_p:N \l_@@_vlines_clist } { \bool_not_p:n \l_@@_exterior_arraycolsep_bool } } - { \tl_gput_left:Nn \g_@@_preamble_tl { @ { } } } + { \tl_gput_left:Nn \g_@@_array_preamble_tl { @ { } } } } \int_compare:nNnTF \l_@@_last_col_int > { -1 } - { \tl_gput_right:NV \g_@@_preamble_tl \c_@@_preamble_last_col_tl } + { \tl_gput_right:NV \g_@@_array_preamble_tl \c_@@_preamble_last_col_tl } { \bool_lazy_all:nT { @@ -4800,7 +4741,7 @@ version 2005/12/01 or later. { \tl_if_empty_p:N \l_@@_vlines_clist } { \bool_not_p:n \l_@@_exterior_arraycolsep_bool } } - { \tl_gput_right:Nn \g_@@_preamble_tl { @ { } } } + { \tl_gput_right:Nn \g_@@_array_preamble_tl { @ { } } } } % \end{macrocode} % We add a last column to raise a good error message when the user puts more @@ -4810,61 +4751,31 @@ version 2005/12/01 or later. % \begin{macrocode} \dim_compare:nNnT \l_@@_tabular_width_dim = \c_zero_dim { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_error_too_much_cols: } l } } } % \end{macrocode} % % \bigskip -% The command |\@@_patch_preamble:n| is the main function for the transformation +% The command |\@@_make_preamble:n| is the main function for the creation % of the preamble. It is recursive. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble:n #1 +\cs_new_protected:Npn \@@_make_preamble:n #1 { - \str_case:nnF { #1 } + \str_if_eq:nnF { #1 } { \q_stop } { - c { \@@_patch_preamble_i:n #1 } - l { \@@_patch_preamble_i:n #1 } - r { \@@_patch_preamble_i:n #1 } - > { \@@_patch_preamble_xiv:n } - ! { \@@_patch_preamble_ii:nn #1 } - @ { \@@_patch_preamble_ii:nn #1 } - | { \@@_patch_preamble_iii:n #1 } - p { \@@_patch_preamble_iv:n #1 } - b { \@@_patch_preamble_iv:n #1 } - m { \@@_patch_preamble_iv:n #1 } - \@@_V: { \@@_patch_preamble_v:n } - V { \@@_patch_preamble_v:n } - \@@_w: { \@@_patch_preamble_vi:nnnn { } #1 } - \@@_W: { \@@_patch_preamble_vi:nnnn { \@@_special_W: } #1 } - \@@_S: { \@@_patch_preamble_vii:n } - ( { \@@_patch_preamble_viii:nn #1 } - [ { \@@_patch_preamble_viii:nn #1 } - \{ { \@@_patch_preamble_viii:nn #1 } - \left { \@@_patch_preamble_viii:nn } - ) { \@@_patch_preamble_ix:nn #1 } - ] { \@@_patch_preamble_ix:nn #1 } - \} { \@@_patch_preamble_ix:nn #1 } - \right { \@@_patch_preamble_ix:nn } - X { \@@_patch_preamble_x:n } -% \end{macrocode} -% When \pkg{tabularx} is loaded, a local redefinition of the specifier |X| is -% done to replace |X| by |\@@_X|. Thus, our column type |X| will be used in the -% |{NiceTabularX}|. -% \begin{macrocode} - \@@_X { \@@_patch_preamble_x:n } - \q_stop { } - } - { - \str_if_eq:nVTF { #1 } \l_@@_letter_vlism_tl + \cs_if_exist:cTF { @@ \token_to_str:N #1 } + { \use:c { @@ \token_to_str:N #1 } { #1 } } { - \seq_gput_right:Nx \g_@@_cols_vlism_seq - { \int_eval:n { \c@jCol + 1 } } - \tl_gput_right:Nx \g_@@_preamble_tl - { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } } - \@@_patch_preamble:n - } + \str_if_eq:nVTF { #1 } \l_@@_letter_vlism_tl + { + \seq_gput_right:Nx \g_@@_cols_vlism_seq + { \int_eval:n { \c@jCol + 1 } } + \tl_gput_right:Nx \g_@@_array_preamble_tl + { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } } + \@@_make_preamble:n + } % \end{macrocode} % Now the case of a letter set by the final user for a customized rule. Such % customized rule is defined by using the key |custom-line| in @@ -4876,35 +4787,72 @@ version 2005/12/01 or later. % keys of that set of keys won't never be used as keys by the final user (he % will use, instead, letters in the preamble of its array). % \begin{macrocode} - { - \keys_if_exist:nnTF { NiceMatrix / ColumnTypes } { #1 } - { - \keys_set:nn { NiceMatrix / ColumnTypes } { #1 } - \@@_patch_preamble:n - } { - \tl_if_eq:nnT { #1 } { S } - { \@@_fatal:n { unknown~column~type~S } } - { \@@_fatal:nn { unknown~column~type } { #1 } } + \keys_if_exist:nnTF { NiceMatrix / ColumnTypes } { #1 } + { + \keys_set:nn { NiceMatrix / ColumnTypes } { #1 } + \@@_make_preamble:n + } + { + \cs_if_exist:cTF { NC @ find @ #1 } + { + \tl_set_eq:Nc \l_tmpb_tl { NC @ rewrite @ #1 } + \exp_last_unbraced:NV \@@_make_preamble:n \l_tmpb_tl + } + { + \tl_if_eq:nnT { #1 } { S } + { \@@_fatal:n { unknown~column~type~S } } + { \@@_fatal:nn { unknown~column~type } { #1 } } + } + } } } } } % \end{macrocode} % -% % \bigskip % Now, we will list all the auxiliary functions for the different types of % entries in the preamble of the array. +% \begin{macrocode} +\cs_new:cpn { @@ \string c } { \@@_make_preamble_i:n } +\cs_new:cpn { @@ \string l } { \@@_make_preamble_i:n } +\cs_new:cpn { @@ \string r } { \@@_make_preamble_i:n } +\cs_new:cpn { @@ \string > } { \@@_make_preamble_xiv:nn } +\cs_new:cpn { @@ \string ! } { \@@_make_preamble_ii:nn } +\cs_new:cpn { @@ \string @ } { \@@_make_preamble_ii:nn } +\cs_new:cpn { @@ \string | } { \@@_make_preamble_iii:n } +\cs_new:cpn { @@ \string p } { \@@_make_preamble_iv:n } +\cs_new:cpn { @@ \string b } { \@@_make_preamble_iv:n } +\cs_new:cpn { @@ \string m } { \@@_make_preamble_iv:n } +\cs_new:cpn { @@ \string V } { \@@_make_preamble_v:nn } +\cs_new:cpn { @@ \string w } { \@@_make_preamble_vi:nnnn { } } +\cs_new:cpn { @@ \string W } { \@@_make_preamble_vi:nnnn { \@@_special_W: } } +\cs_new:cpn { @@ \string S } { \@@_make_preamble_vii:nn } +\cs_new:cpn { @@ \string ( } { \@@_make_preamble_viii:nn } +\cs_new:cpn { @@ \string [ } { \@@_make_preamble_viii:nn } +\cs_new:cpn { @@ \string \{ } { \@@_make_preamble_viii:nn } +\cs_new:cpn { @@ \string \left } { \@@_make_preamble_viii_ii:n } +\cs_new:cpn { @@ \string ) } { \@@_make_preamble_ix:nn } +\cs_new:cpn { @@ \string ] } { \@@_make_preamble_ix:nn } +\cs_new:cpn { @@ \string \} } { \@@_make_preamble_ix:nn } +\cs_new:cpn { @@ \string \right } { \@@_make_preamble_ix_ii:n } +\cs_new:cpn { @@ \string X } { \@@_make_preamble_x:nn } +\cs_new:cpn { @@ \string * } { \@@_make_preamble_xvi:nnn } +\cs_new:cpn { @@ \string \NC@find } { \@@_make_preamble_xx:n } +% \end{macrocode} +% The token |\NC@find| is at the head of the definition of the columns type done +% by |\newcolumntype|. We wan't that token to be no-op here. +% % -% \medskip +% \bigskip % For |c|, |l| and |r| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_i:n #1 +\cs_new_protected:Npn \@@_make_preamble_i:n #1 { - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_cell_begin:w \str_set:Nn \l_@@_hpos_cell_str { #1 } } #1 @@ -4915,17 +4863,17 @@ version 2005/12/01 or later. % We increment the counter of columns and then we test for the presence of a |<|. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } % \end{macrocode} % % \medskip % For |>|, |!| and |@| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_ii:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_ii:nn #1 #2 { - \tl_gput_right:Nn \g_@@_preamble_tl { #1 { #2 } } - \@@_patch_preamble:n + \tl_gput_right:Nn \g_@@_array_preamble_tl { #1 { #2 } } + \@@_make_preamble:n } % \end{macrocode} % @@ -4933,34 +4881,41 @@ version 2005/12/01 or later. % \medskip % For \verb+|+ % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iii:n #1 +\cs_new_protected:Npn \@@_make_preamble_iii:n #1 { % \end{macrocode} % |\l_tmpa_int| is the number of successive occurrences of \verb+|+ % \begin{macrocode} \int_incr:N \l_tmpa_int - \@@_patch_preamble_iii_i:n + \@@_make_preamble_iii_i:n } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iii_i:n #1 +\cs_new_protected:Npn \@@_make_preamble_iii_i:n #1 { \str_if_eq:nnTF { #1 } | - { \@@_patch_preamble_iii:n | } - { - \str_if_eq:nnTF { #1 } [ - { \@@_patch_preamble_iii_ii:nw { } [ } - { \@@_patch_preamble_iii_ii:nw { #1 } [ ] } - } + { \@@_make_preamble_iii:n | } + { \@@_make_preamble_iii_ii:nn { } #1 } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iii_ii:nw #1 [ #2 ] +\cs_new_protected:Npn \@@_make_preamble_iii_ii:nn #1 #2 + { + \str_if_eq:nnTF { #2 } [ + { \@@_make_preamble_iii_ii:nw { #1 } [ } + { \@@_make_preamble_iii_iii:nn { #2 } { #1 } } + } +\cs_new_protected:Npn \@@_make_preamble_iii_ii:nw #1 [ #2 ] + { \@@_make_preamble_iii_ii:nn { #1 , #2 } } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_make_preamble_iii_iii:nn #1 #2 { \@@_compute_rule_width:n { multiplicity = \l_tmpa_int , #2 } - \tl_gput_right:Nx \g_@@_preamble_tl + \tl_gput_right:Nx \g_@@_array_preamble_tl { % \end{macrocode} % Here, the command |\dim_eval:n| is mandatory. @@ -4984,15 +4939,15 @@ version 2005/12/01 or later. } \int_zero:N \l_tmpa_int \str_if_eq:nnT { #1 } { \q_stop } { \bool_gset_true:N \g_tmpb_bool } - \@@_patch_preamble:n #1 + \@@_make_preamble:n #1 } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_xiv:n #1 +\cs_new_protected:Npn \@@_make_preamble_xiv:nn #1 #2 { - \tl_gput_right:Nn \g_@@_pre_cell_tl { > { #1 } } - \@@_patch_preamble:n + \tl_gput_right:Nn \g_@@_pre_cell_tl { > { #2 } } + \@@_make_preamble:n } % \end{macrocode} % @@ -5053,29 +5008,29 @@ version 2005/12/01 or later. % \medskip % For |p|, |b| and |m|. The argument |#1| is that value : |p|, |b| or |m|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv:n #1 +\cs_new_protected:Npn \@@_make_preamble_iv:n #1 { \str_set:Nn \l_@@_vpos_col_str { #1 } % \end{macrocode} % Now, you look for a potential character |[| after the letter of the specifier % (for the options). % \begin{macrocode} - \@@_patch_preamble_iv_i:n + \@@_make_preamble_iv_i:n } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_i:n #1 +\cs_new_protected:Npn \@@_make_preamble_iv_i:n #1 { \str_if_eq:nnTF { #1 } { [ } - { \@@_patch_preamble_iv_ii:w [ } - { \@@_patch_preamble_iv_ii:w [ ] { #1 } } + { \@@_make_preamble_iv_ii:w [ } + { \@@_make_preamble_iv_ii:w [ ] { #1 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_ii:w [ #1 ] - { \@@_patch_preamble_iv_iii:nn { #1 } } +\cs_new_protected:Npn \@@_make_preamble_iv_ii:w [ #1 ] + { \@@_make_preamble_iv_iii:nn { #1 } } % \end{macrocode} % % \medskip @@ -5084,7 +5039,7 @@ version 2005/12/01 or later. % % |#2| is the mandatory argument of the specifier: the width of the column. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_iii:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_iv_iii:nn #1 #2 { % \end{macrocode} % The possible values of |\l_@@_hpos_col_str| are |j| (for \emph{justified} which is @@ -5093,9 +5048,8 @@ version 2005/12/01 or later. % \begin{macrocode} \str_set:Nn \l_@@_hpos_col_str { j } \tl_set:Nn \l_tmpa_tl { #1 } - \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S } \@@_keys_p_column:V \l_tmpa_tl - \@@_patch_preamble_iv_iv:nn { #2 } { minipage } + \@@_make_preamble_iv_iv:nn { #2 } { minipage } } % \end{macrocode} % @@ -5109,11 +5063,11 @@ version 2005/12/01 or later. % The first argument is the width of the column. The second is the type of % environment: |minipage| or |varwidth|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_iv:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_iv_iv:nn #1 #2 { \use:x { - \@@_patch_preamble_iv_v:nnnnnnnn + \@@_make_preamble_iv_v:nnnnnnnn { \str_if_eq:VnTF \l_@@_vpos_col_str { p } { t } { b } } { \dim_eval:n { #1 } } { @@ -5160,7 +5114,7 @@ version 2005/12/01 or later. % We increment the counter of columns, and then we test for the presence of a |<|. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } % \end{macrocode} % @@ -5189,14 +5143,14 @@ version 2005/12/01 or later. % |#8| is the letter |c| or |r| or |l| which is the basic specificier of column % which is used \emph{in fine}. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_v:nnnnnnnn #1 #2 #3 #4 #5 #6 #7 #8 +\cs_new_protected:Npn \@@_make_preamble_iv_v:nnnnnnnn #1 #2 #3 #4 #5 #6 #7 #8 { \str_if_eq:VnTF \l_@@_hpos_col_str { si } - { \tl_gput_right:Nn \g_@@_preamble_tl { > { \@@_test_if_empty_for_S: } } } - { \tl_gput_right:Nn \g_@@_preamble_tl { > { \@@_test_if_empty: } } } - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + { \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_test_if_empty_for_S: } } } + { \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_test_if_empty: } } } + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { % \end{macrocode} @@ -5324,26 +5278,25 @@ version 2005/12/01 or later. % \medskip % For |V| (similar to the |V| of \pkg{varwidth}). % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_v:n #1 +\cs_new_protected:Npn \@@_make_preamble_v:nn #1 #2 { - \str_if_eq:nnTF { #1 } { [ } - { \@@_patch_preamble_v_i:w [ } - { \@@_patch_preamble_v_i:w [ ] { #1 } } + \str_if_eq:nnTF { #2 } { [ } + { \@@_make_preamble_v_i:w [ } + { \@@_make_preamble_v_i:w [ ] { #2 } } } -\cs_new_protected:Npn \@@_patch_preamble_v_i:w [ #1 ] - { \@@_patch_preamble_v_ii:nn { #1 } } -\cs_new_protected:Npn \@@_patch_preamble_v_ii:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_v_i:w [ #1 ] + { \@@_make_preamble_v_ii:nn { #1 } } +\cs_new_protected:Npn \@@_make_preamble_v_ii:nn #1 #2 { \str_set:Nn \l_@@_vpos_col_str { p } \str_set:Nn \l_@@_hpos_col_str { j } \tl_set:Nn \l_tmpa_tl { #1 } - \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S } \@@_keys_p_column:V \l_tmpa_tl \IfPackageLoadedTF { varwidth } - { \@@_patch_preamble_iv_iv:nn { #2 } { varwidth } } + { \@@_make_preamble_iv_iv:nn { #2 } { varwidth } } { \@@_error_or_warning:n { varwidth~not~loaded } - \@@_patch_preamble_iv_iv:nn { #2 } { minipage } + \@@_make_preamble_iv_iv:nn { #2 } { minipage } } } % \end{macrocode} @@ -5360,11 +5313,11 @@ version 2005/12/01 or later. % |#4| is the width of the column. % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vi:nnnn #1 #2 #3 #4 +\cs_new_protected:Npn \@@_make_preamble_vi:nnnn #1 #2 #3 #4 { \str_if_eq:nnTF { #3 } { s } - { \@@_patch_preamble_vi_i:nnnn { #1 } { #4 } } - { \@@_patch_preamble_vi_ii:nnnn { #1 } { #2 } { #3 } { #4 } } + { \@@_make_preamble_vi_i:nnnn { #1 } { #4 } } + { \@@_make_preamble_vi_ii:nnnn { #1 } { #2 } { #3 } { #4 } } } % \end{macrocode} % @@ -5376,11 +5329,11 @@ version 2005/12/01 or later. % % |#2| is the width of the column. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vi_i:nnnn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_vi_i:nnnn #1 #2 { - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \dim_set:Nn \l_@@_col_width_dim { #2 } @@ -5396,7 +5349,7 @@ version 2005/12/01 or later. } } \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } % \end{macrocode} % @@ -5404,11 +5357,11 @@ version 2005/12/01 or later. % Then, the most important version, for the horizontal alignments types of |c|, % |l| and |r| (and not |s|). % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vi_ii:nnnn #1 #2 #3 #4 +\cs_new_protected:Npn \@@_make_preamble_vi_ii:nnnn #1 #2 #3 #4 { - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { % \end{macrocode} @@ -5434,7 +5387,7 @@ version 2005/12/01 or later. % We increment the counter of columns and then we test for the presence of a |<|. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } % \end{macrocode} % @@ -5448,31 +5401,29 @@ version 2005/12/01 or later. % \end{macrocode} % % \medskip -% For |\@@_S:|. If the user has used |S[...]|, |S| has been replaced by |\@@_S:| -% during the first expansion of the preamble (done with the tools of standard -% LaTeX and \pkg{array}). +% For |S| (of \pkg{siunitx}). % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vii:n #1 +\cs_new_protected:Npn \@@_make_preamble_vii:nn #1 #2 { - \str_if_eq:nnTF { #1 } { [ } - { \@@_patch_preamble_vii_i:w [ } - { \@@_patch_preamble_vii_i:w [ ] { #1 } } + \str_if_eq:nnTF { #2 } { [ } + { \@@_make_preamble_vii_i:w [ } + { \@@_make_preamble_vii_i:w [ ] { #2 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vii_i:w [ #1 ] - { \@@_patch_preamble_vii_ii:n { #1 } } +\cs_new_protected:Npn \@@_make_preamble_vii_i:w [ #1 ] + { \@@_make_preamble_vii_ii:n { #1 } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vii_ii:n #1 +\cs_new_protected:Npn \@@_make_preamble_vii_ii:n #1 { \IfPackageAtLeastTF { siunitx } { 2022/01/01 } { - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_cell_begin:w @@ -5486,7 +5437,7 @@ version 2005/12/01 or later. % We increment the counter of columns and then we test for the presence of a |<|. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } { \@@_fatal:n { Version~of~siunitx~too~old } } } @@ -5496,7 +5447,7 @@ version 2005/12/01 or later. % \medskip % For |(|, |[| and |\{|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_viii:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_viii:nn #1 #2 { \bool_if:NT \l_@@_small_bool { \@@_fatal:n { Delimiter~with~small } } % \end{macrocode} @@ -5513,30 +5464,35 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_gset:Nn \g_@@_left_delim_tl { #1 } \tl_gset:Nn \g_@@_right_delim_tl { . } - \@@_patch_preamble:n #2 + \@@_make_preamble:n #2 } { - \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } - \@@_patch_preamble_viii_i:nn { #1 } { #2 } + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } + \@@_make_preamble_viii_i:nn { #1 } { #2 } } } - { \@@_patch_preamble_viii_i:nn { #1 } { #2 } } + { \@@_make_preamble_viii_i:nn { #1 } { #2 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_viii_i:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_viii_i:nn #1 #2 { \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_eval:n { \c@jCol + 1 } } \c_true_bool } \tl_if_in:nnTF { ( [ \{ ) ] \} \left \right } { #2 } { \@@_error:nn { delimiter~after~opening } { #2 } - \@@_patch_preamble:n + \@@_make_preamble:n } - { \@@_patch_preamble:n #2 } + { \@@_make_preamble:n #2 } } % \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_make_preamble_viii_ii:n #1 + { \@@_make_preamble_viii:nn } +% \end{macrocode} % % \bigskip % For the closing delimiters. We have two arguments for the following command because @@ -5546,48 +5502,48 @@ version 2005/12/01 or later. % considered as the right delimiter of the environment if the environment is % |{NiceArray}|). % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_ix:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_ix:nn #1 #2 { \bool_if:NT \l_@@_small_bool { \@@_fatal:n { Delimiter~with~small } } \tl_if_in:nnTF { ) ] \} } { #2 } - { \@@_patch_preamble_ix_i:nnn #1 #2 } + { \@@_make_preamble_ix_i:nnn #1 #2 } { \tl_if_eq:nnTF { \q_stop } { #2 } { \str_if_eq:VnTF \g_@@_right_delim_tl { . } { \tl_gset:Nn \g_@@_right_delim_tl { #1 } } { - \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } - \@@_patch_preamble:n #2 + \@@_make_preamble:n #2 } } { \tl_if_in:nnT { ( [ \{ \left } { #2 } - { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } } + { \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } - \@@_patch_preamble:n #2 + \@@_make_preamble:n #2 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_ix_i:nnn #1 #2 #3 +\cs_new_protected:Npn \@@_make_preamble_ix_i:nnn #1 #2 #3 { \tl_if_eq:nnTF { \q_stop } { #3 } { \str_if_eq:VnTF \g_@@_right_delim_tl { . } { - \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } \tl_gset:Nn \g_@@_right_delim_tl { #2 } } { - \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } \@@_error:nn { double~closing~delimiter } { #2 } @@ -5597,27 +5553,32 @@ version 2005/12/01 or later. \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } \@@_error:nn { double~closing~delimiter } { #2 } - \@@_patch_preamble:n #3 + \@@_make_preamble:n #3 } } % \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_make_preamble_ix_ii:n #1 + { \@@_make_preamble_ix:nn } +% \end{macrocode} % % \bigskip % For the case of a letter |X|. This specifier may take in an optional argument % (between square brackets). That's why we test whether there is a |[| after the % letter |X|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_x:n #1 +\cs_new_protected:Npn \@@_make_preamble_x:nn #1 #2 { - \str_if_eq:nnTF { #1 } { [ } - { \@@_patch_preamble_x_i:w [ } - { \@@_patch_preamble_x_i:w [ ] #1 } + \str_if_eq:nnTF { #2 } { [ } + { \@@_make_preamble_x_i:w [ } + { \@@_make_preamble_x_i:w [ ] #2 } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_x_i:w [ #1 ] - { \@@_patch_preamble_x_ii:n { #1 } } +\cs_new_protected:Npn \@@_make_preamble_x_i:w [ #1 ] + { \@@_make_preamble_x_ii:n { #1 } } % \end{macrocode} % |#1| is the optional argument of the |X| specifier (a list of % \emph{key}-\emph{value} pairs). @@ -5636,7 +5597,7 @@ version 2005/12/01 or later. % \medskip % In the following command, |#1| is the list of the options of the specifier |X|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_x_ii:n #1 +\cs_new_protected:Npn \@@_make_preamble_x_ii:n #1 { % \end{macrocode} % The possible values of |\l_@@_hpos_col_str| are |j| (for \emph{justified} which is @@ -5661,7 +5622,6 @@ version 2005/12/01 or later. \int_zero_new:N \l_@@_weight_int \int_set:Nn \l_@@_weight_int { 1 } \tl_set:Nn \l_tmpa_tl { #1 } - \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S } \@@_keys_p_column:V \l_tmpa_tl \keys_set:nV { WithArrows / X-column } \l_tmpa_tl \int_compare:nNnT \l_@@_weight_int < 0 @@ -5679,12 +5639,12 @@ version 2005/12/01 or later. \bool_if:NTF \l_@@_X_columns_aux_bool { \exp_args:Nnx - \@@_patch_preamble_iv_iv:nn + \@@_make_preamble_iv_iv:nn { \l_@@_weight_int \l_@@_X_columns_dim } { minipage } } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_cell_begin:w @@ -5715,7 +5675,7 @@ version 2005/12/01 or later. } } \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } } % \end{macrocode} @@ -5727,38 +5687,38 @@ version 2005/12/01 or later. % |!{\skip_horizontal:N ...}| when the key |vlines| is used. In fact, we have % also to test whether there is, after the |<{...}|, a |@{...}|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_xi:n #1 +\cs_new_protected:Npn \@@_make_preamble_xi:n #1 { \str_if_eq:nnTF { #1 } { < } - \@@_patch_preamble_xiii:n + \@@_make_preamble_xiii:n { \str_if_eq:nnTF { #1 } { @ } - \@@_patch_preamble_xv:n + \@@_make_preamble_xv:n { \tl_if_eq:NnTF \l_@@_vlines_clist { all } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } { \exp_args:NNx \clist_if_in:NnT \l_@@_vlines_clist { \int_eval:n { \c@jCol + 1 } } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } } - \@@_patch_preamble:n { #1 } + \@@_make_preamble:n { #1 } } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_xiii:n #1 +\cs_new_protected:Npn \@@_make_preamble_xiii:n #1 { - \tl_gput_right:Nn \g_@@_preamble_tl { < { #1 } } - \@@_patch_preamble_xi:n + \tl_gput_right:Nn \g_@@_array_preamble_tl { < { #1 } } + \@@_make_preamble_xi:n } % \end{macrocode} % @@ -5766,43 +5726,41 @@ version 2005/12/01 or later. % draw a vertical rule, we have to add in that |@{...}| a |\hskip| corresponding % to the width of the vertical rule. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_xv:n #1 +\cs_new_protected:Npn \@@_make_preamble_xv:n #1 { \tl_if_eq:NnTF \l_@@_vlines_clist { all } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { @ { #1 \skip_horizontal:N \arrayrulewidth } } } { \exp_args:NNx \clist_if_in:NnTF \l_@@_vlines_clist { \int_eval:n { \c@jCol + 1 } } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { @ { #1 \skip_horizontal:N \arrayrulewidth } } } - { \tl_gput_right:Nn \g_@@_preamble_tl { @ { #1 } } } + { \tl_gput_right:Nn \g_@@_array_preamble_tl { @ { #1 } } } } - \@@_patch_preamble:n + \@@_make_preamble:n } % \end{macrocode} % +% \begin{macrocode} +\cs_new_protected:Npn \@@_make_preamble_xx:n #1 { \@@_make_preamble:n } +% \end{macrocode} +% % \bigskip % \begin{macrocode} -\cs_new_protected:Npn \@@_set_preamble:Nn #1 #2 - { - \group_begin: - \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } } - \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } } - \@temptokena { #2 } - \@tempswatrue - \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list } - \tl_gclear:N \g_@@_preamble_tl - \exp_after:wN \@@_patch_m_preamble:n \the \@temptokena \q_stop - \group_end: - \tl_set_eq:NN #1 \g_@@_preamble_tl +\cs_new_protected:Npn \@@_make_preamble_xvi:nnn #1 #2 #3 + { + \tl_clear:N \l_tmpa_tl + \int_step_inline:nn { #2 } { \tl_put_right:Nn \l_tmpa_tl { #3 } } + \exp_last_unbraced:NV \@@_make_preamble:n \l_tmpa_tl } % \end{macrocode} % +% % \bigskip % \section{The redefinition of \textbackslash multicolumn} % @@ -5823,25 +5781,12 @@ version 2005/12/01 or later. \cs_set:Npn \@addamp { \if@firstamp \@firstampfalse \else \@preamerr 5 \fi } % \end{macrocode} % -% \begin{macrocode} - \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } } - \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } } -% \end{macrocode} -% -% \medskip -% You do the expansion of the (small) preamble with the tools of \pkg{array}. -% \begin{macrocode} - \@temptokena = { #2 } - \@tempswatrue - \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list } -% \end{macrocode} -% % \medskip % Now, we patch the (small) preamble as we have done with the main preamble of % the array. % \begin{macrocode} \tl_gclear:N \g_@@_preamble_tl - \exp_after:wN \@@_patch_m_preamble:n \the \@temptokena \q_stop + \@@_make_m_preamble:n #2 \q_stop % \end{macrocode} % % \medskip @@ -5905,28 +5850,40 @@ version 2005/12/01 or later. % All those commands have a |m| in their name to recall that they deal with the % redefinition of |\multicolumn|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble:n #1 +\cs_new_protected:Npn \@@_make_m_preamble:n #1 { \str_case:nnF { #1 } { - c { \@@_patch_m_preamble_i:n #1 } - l { \@@_patch_m_preamble_i:n #1 } - r { \@@_patch_m_preamble_i:n #1 } - > { \@@_patch_m_preamble_ii:nn #1 } - ! { \@@_patch_m_preamble_ii:nn #1 } - @ { \@@_patch_m_preamble_ii:nn #1 } - | { \@@_patch_m_preamble_iii:n #1 } - p { \@@_patch_m_preamble_iv:nnn t #1 } - m { \@@_patch_m_preamble_iv:nnn c #1 } - b { \@@_patch_m_preamble_iv:nnn b #1 } - \@@_w: { \@@_patch_m_preamble_v:nnnn { } #1 } - \@@_W: { \@@_patch_m_preamble_v:nnnn { \@@_special_W: } #1 } + c { \@@_make_m_preamble_i:n #1 } + l { \@@_make_m_preamble_i:n #1 } + r { \@@_make_m_preamble_i:n #1 } + > { \@@_make_m_preamble_ii:nn #1 } + ! { \@@_make_m_preamble_ii:nn #1 } + @ { \@@_make_m_preamble_ii:nn #1 } + | { \@@_make_m_preamble_iii:n #1 } + p { \@@_make_m_preamble_iv:nnn t #1 } + m { \@@_make_m_preamble_iv:nnn c #1 } + b { \@@_make_m_preamble_iv:nnn b #1 } + w { \@@_make_m_preamble_v:nnnn { } #1 } + W { \@@_make_m_preamble_v:nnnn { \@@_special_W: } #1 } \q_stop { } +% \end{macrocode} +% The token |\NC@find| is at the head of the definition of the columns type done +% by |\newcolumntype|. We wan't that token to no-op here. +% \begin{macrocode} + \NC@find { \@@_make_preamble:n } } { - \tl_if_eq:nnT { #1 } { S } - { \@@_fatal:n { unknown~column~type~S } } - { \@@_fatal:nn { unknown~column~type } { #1 } } + \cs_if_exist:cTF { NC @ find @ #1 } + { + \tl_set_eq:Nc \l_tmpa_tl { NC @ rewrite @ #1 } + \exp_last_unbraced:NV \@@_make_m_preamble:n \l_tmpa_tl + } + { + \tl_if_eq:nnT { #1 } { S } + { \@@_fatal:n { unknown~column~type~S } } + { \@@_fatal:nn { unknown~column~type } { #1 } } + } } } % \end{macrocode} @@ -5934,7 +5891,7 @@ version 2005/12/01 or later. % \medskip % For |c|, |l| and |r| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_i:n #1 +\cs_new_protected:Npn \@@_make_m_preamble_i:n #1 { \tl_gput_right:Nn \g_@@_preamble_tl { @@ -5946,17 +5903,17 @@ version 2005/12/01 or later. % % We test for the presence of a |<|. % \begin{macrocode} - \@@_patch_m_preamble_x:n + \@@_make_m_preamble_x:n } % \end{macrocode} % % \medskip % For |>|, |!| and |@| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_ii:nn #1 #2 +\cs_new_protected:Npn \@@_make_m_preamble_ii:nn #1 #2 { \tl_gput_right:Nn \g_@@_preamble_tl { #1 { #2 } } - \@@_patch_m_preamble:n + \@@_make_m_preamble:n } % \end{macrocode} % @@ -5964,17 +5921,17 @@ version 2005/12/01 or later. % \medskip % For \verb+|+ % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_iii:n #1 +\cs_new_protected:Npn \@@_make_m_preamble_iii:n #1 { \tl_gput_right:Nn \g_@@_preamble_tl { #1 } - \@@_patch_m_preamble:n + \@@_make_m_preamble:n } % \end{macrocode} % % \medskip % For |p|, |m| and |b| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_iv:nnn #1 #2 #3 +\cs_new_protected:Npn \@@_make_m_preamble_iv:nnn #1 #2 #3 { \tl_gput_right:Nn \g_@@_preamble_tl { @@ -5995,14 +5952,14 @@ version 2005/12/01 or later. % \end{macrocode} % We test for the presence of a |<|. % \begin{macrocode} - \@@_patch_m_preamble_x:n + \@@_make_m_preamble_x:n } % \end{macrocode} % % \medskip % For |w| and |W| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_v:nnnn #1 #2 #3 #4 +\cs_new_protected:Npn \@@_make_m_preamble_v:nnnn #1 #2 #3 #4 { \tl_gput_right:Nn \g_@@_preamble_tl { @@ -6025,7 +5982,7 @@ version 2005/12/01 or later. % \end{macrocode} % We test for the presence of a |<|. % \begin{macrocode} - \@@_patch_m_preamble_x:n + \@@_make_m_preamble_x:n } % \end{macrocode} % @@ -6033,19 +5990,19 @@ version 2005/12/01 or later. % After a specifier of column, we have to test whether there is one or several % |<{..}|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_x:n #1 +\cs_new_protected:Npn \@@_make_m_preamble_x:n #1 { \str_if_eq:nnTF { #1 } { < } - \@@_patch_m_preamble_ix:n - { \@@_patch_m_preamble:n { #1 } } + \@@_make_m_preamble_ix:n + { \@@_make_m_preamble:n { #1 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_ix:n #1 +\cs_new_protected:Npn \@@_make_m_preamble_ix:n #1 { \tl_gput_right:Nn \g_@@_preamble_tl { < { #1 } } - \@@_patch_m_preamble_x:n + \@@_make_m_preamble_x:n } % \end{macrocode} % @@ -6521,7 +6478,7 @@ version 2005/12/01 or later. % Here is the call to |\array| (we have a dedicated macro |\@@_array:n| because % of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}). % \begin{macrocode} - \@@_array:V \g_@@_preamble_tl + \@@_array:V \g_@@_array_preamble_tl } } } @@ -6656,7 +6613,7 @@ version 2005/12/01 or later. % |\@@_array:n| because of compatibility with the classes \cls{revtex4-1} and % \cls{revtex4-2}). % \begin{macrocode} - \@@_array:V \g_@@_preamble_tl \l_@@_new_body_tl + \@@_array:V \g_@@_array_preamble_tl \l_@@_new_body_tl } % \end{macrocode} % @@ -7273,31 +7230,11 @@ version 2005/12/01 or later. { \endNiceArray } % \end{macrocode} % -% \bigskip -% \begin{macrocode} -\cs_set_protected:Npn \@@_newcolumntype #1 - { - \cs_if_free:cT { NC @ find @ #1 } - { \NC@list \expandafter { \the \NC@list \NC@do #1 } } - \cs_set:cpn {NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } } - \peek_meaning:NTF [ - { \newcol@ #1 } - { \newcol@ #1 [ 0 ] } - } -% \end{macrocode} % % \bigskip % \begin{macrocode} \NewDocumentEnvironment { NiceTabularX } { m O { } m ! O { } } { -% \end{macrocode} -% The following code prevents the expansion of the `X` columns with the -% definition of that columns in \pkg{tabularx} (this would result in an error in -% |{NiceTabularX}|). -% \begin{macrocode} - \IfPackageLoadedTF { tabularx } - { \newcolumntype { X } { \@@_X } } - { } \str_gset:Nn \g_@@_name_env_str { NiceTabularX } \dim_zero_new:N \l_@@_width_dim \dim_set:Nn \l_@@_width_dim { #1 } @@ -7305,7 +7242,11 @@ version 2005/12/01 or later. \bool_set_true:N \l_@@_tabular_bool \NiceArray { #3 } } - { \endNiceArray } + { + \endNiceArray + \int_compare:nNnT \g_@@_total_X_weight_int = \c_zero_int + { \@@_error:n { NiceTabularX~without~X } } + } % \end{macrocode} % % \bigskip @@ -7578,6 +7519,7 @@ version 2005/12/01 or later. \cs_set_eq:NN \UnderBrace \@@_UnderBrace \cs_set_eq:NN \OverBrace \@@_OverBrace \cs_set_eq:NN \ShowCellNames \@@_ShowCellNames + \cs_set_eq:NN \TikzEveryCell \@@_TikzEveryCell \cs_set_eq:NN \line \@@_line \g_@@_pre_code_after_tl \tl_gclear:N \g_@@_pre_code_after_tl @@ -10608,7 +10550,7 @@ version 2005/12/01 or later. { \peek_remove_spaces:n { - \tl_gput_right:Nx \g__nicematrix_pre_code_before_tl + \tl_gput_right:Nx \g_@@_pre_code_before_tl { \@@_rowlistcolors [ #1 ] { \int_use:N \c@iRow } { #2 } @@ -10754,7 +10696,17 @@ version 2005/12/01 or later. dotted .bool_set:N = \l_@@_dotted_bool , dotted .initial:n = false , dotted .default:n = true , - color .code:n = \@@_set_CT@arc@:n { #1 } , +% \end{macrocode} +% We want that, even when the rule has been defined with TikZ by the key |tikz|, +% the user has still the possibility to change the color of the rule with the key +% |color| (in the command |\Hline|, not in the key |tikz| of the command +% |\Hline|). The main use is, when the user has defined its own command +% |\MyDashedLine| by |\newcommand{\MyDashedRule}{\Hline[tikz=dashed]}|, to give +% the ability to write |\MyDashedRule[color=red]|. +% \begin{macrocode} + color .code:n = + \@@_set_CT@arc@:n { #1 } + \tl_set:Nn \l_@@_rule_color_tl { #1 } , color .value_required:n = true , sep-color .code:n = \@@_set_CT@drsc@:n { #1 } , sep-color .value_required:n = true , @@ -10763,9 +10715,11 @@ version 2005/12/01 or later. % sub-rules since a rule may be broken by blocks or others) will be drawn with % Tikz. % \begin{macrocode} - tikz .tl_set:N = \l_@@_tikz_rule_tl , + tikz .code:n = + \IfPackageLoadedTF { tikz } + { \clist_put_right:Nn \l_@@_tikz_rule_tl { #1 } } + { \@@_error:n { tikz~without~tikz } } , tikz .value_required:n = true , - tikz .initial:n = , total-width .dim_set:N = \l_@@_rule_width_dim , total-width .value_required:n = true , width .meta:n = { total-width = #1 } , @@ -10887,6 +10841,7 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_vline_ii: { + \tl_clear:N \l_@@_tikz_rule_tl \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl \bool_if:NTF \l_@@_dotted_bool \@@_vline_iv: @@ -10983,12 +10938,21 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% The following code is for the case when the user uses the key |tikz| (in the -% definition of a customized rule by using the key |custom-line|). +% The following code is for the case when the user uses the key |tikz|. % \begin{macrocode} \cs_new_protected:Npn \@@_vline_v: { \begin {tikzpicture } + % added 2023/09/25 +% \end{macrocode} +% By default, the color defined by |\arrayrulecolor| or by |rules/color| will be +% used, but it's still possible to change the color by using the key |color| or, +% of course, the key |color| inside the key |tikz| (that is to say the key +% |color| provided by \textsc{pgf}. +% \begin{macrocode} + \CT@arc@ + \tl_if_empty:NF \l_@@_rule_color_tl + { \tl_put_right:Nx \l_@@_tikz_rule_tl { , color = \l_@@_rule_color_tl } } \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \@@_qpoint:n { row - \int_use:N \l_@@_local_start_int } @@ -11142,6 +11106,7 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_hline_ii: { + \tl_clear:N \l_@@_tikz_rule_tl \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl \bool_if:NTF \l_@@_dotted_bool \@@_hline_iv: @@ -11304,6 +11269,16 @@ version 2005/12/01 or later. \cs_new_protected:Npn \@@_hline_v: { \begin { tikzpicture } + % added 2023/09/25 +% \end{macrocode} +% By default, the color defined by |\arrayrulecolor| or by |rules/color| will be +% used, but it's still possible to change the color by using the key |color| or, +% of course, the key |color| inside the key |tikz| (that is to say the key +% |color| provided by \textsc{pgf}. +% \begin{macrocode} + \CT@arc@ + \tl_if_empty:NF \l_@@_rule_color_tl + { \tl_put_right:Nx \l_@@_tikz_rule_tl { , color = \l_@@_rule_color_tl } } \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \@@_qpoint:n { col - \int_use:N \l_@@_local_start_int } @@ -11481,7 +11456,7 @@ version 2005/12/01 or later. { \IfPackageLoadedTF { tikz } { } - { \@@_error:n { tikz~in~custom-line~without~tikz }} + { \@@_error:n { tikz~in~custom-line~without~tikz } } \bool_if:NT \l_@@_color_bool { \@@_error:n { color~in~custom-line~with~tikz } } } @@ -11589,25 +11564,10 @@ version 2005/12/01 or later. { % \end{macrocode} % We use |\cs_set:cpn| and not |\cs_new:cpn| because we want a local definition. -% Moreover, the command must \emph{not} be protected since it begins with |\noalign|. +% Moreover, the command must \emph{not} be protected since it begins with +% |\noalign| (which is in |\Hline|). % \begin{macrocode} - \cs_set:cpn { nicematrix - \l_@@_command_str } - { - \noalign - { - \@@_compute_rule_width:n { #1 } - \skip_vertical:n { \l_@@_rule_width_dim } - \tl_gput_right:Nx \g_@@_pre_code_after_tl - { - \@@_hline:n - { - #1 , - position = \int_eval:n { \c@iRow + 1 } , - total-width = \dim_use:N \l_@@_rule_width_dim - } - } - } - } + \cs_set:cpn { nicematrix - \l_@@_command_str } { \Hline [ #1 ] } \seq_put_left:NV \l_@@_custom_line_commands_seq \l_@@_command_str } % \end{macrocode} @@ -11697,7 +11657,7 @@ version 2005/12/01 or later. % \end{macrocode} % In the following line, the |\dim_use:N| is mandatory since we do an expansion. % \begin{macrocode} - \tl_gput_right:Nx \g_@@_preamble_tl + \tl_gput_right:Nx \g_@@_array_preamble_tl { \exp_not:N ! { \skip_horizontal:n { \dim_use:N \l_@@_rule_width_dim } } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { @@ -12365,9 +12325,7 @@ version 2005/12/01 or later. % |\multicolumn{|$n$|}{...}{...}| with $n$>1 was issued and in % |\g_@@_multicolumn_sizes_seq| the correspondant values of $n$. % \begin{macrocode} - \cs_if_exist_use:NF \seq_map_pairwise_function:NNN - \seq_mapthread_function:NNN \g_@@_multicolumn_cells_seq \g_@@_multicolumn_sizes_seq \@@_node_for_multicolumn:nn @@ -13839,7 +13797,7 @@ version 2005/12/01 or later. borders .clist_set:N = \l_@@_borders_clist , rounded-corners .dim_set:N = \l_@@_rounded_corners_dim , rounded-corners .default:n = 4 pt , - line-width .dim_set:N = \l_@@_line_width_dim , + line-width .dim_set:N = \l_@@_line_width_dim } % \end{macrocode} % @@ -13847,21 +13805,44 @@ version 2005/12/01 or later. % The following command will be used if the key |tikz| has been used for the % command |\Block|. The arguments |#1| and |#2| are the coordinates of the first % cell and |#3| and |#4| the coordinates of the last cell of the block. |#5| is -% a comma-separated list of the Tikz keys used with the path. +% a comma-separated list of the Tikz keys used with the path. However, among +% those keys, you have added in \pkg{nicematrix} a special key |offset| (an +% offset for the rectangle of the block). That's why we have to extract that key +% first. % \begin{macrocode} -\cs_new_protected:Npn \@@_block_tikz:nnnnn #1 #2 #3 #4 #5 +\cs_new_protected:Npn \@@_block_tikz:nnnnn #1 #2 #3 #4 #5 { \begin { tikzpicture } \@@_clip_with_rounded_corners: \clist_map_inline:nn { #5 } { - \path [ ##1 ] - ( #1 -| #2 ) + \keys_set_known:nnN { NiceMatrix / SpecialOffset } { ##1 } \l_tmpa_tl + \use:x { \exp_not:N \path [ \l_tmpa_tl ] } + ( + [ + xshift = \dim_use:N \l_@@_offset_dim , + yshift = - \dim_use:N \l_@@_offset_dim + ] + #1 -| #2 + ) rectangle - ( \int_eval:n { #3 + 1 } -| \int_eval:n { #4 + 1 } ) ; + ( + [ + xshift = - \dim_use:N \l_@@_offset_dim , + yshift = \dim_use:N \l_@@_offset_dim + ] + \int_eval:n { #3 + 1 } -| \int_eval:n { #4 + 1 } + ) ; } \end { tikzpicture } } +\cs_generate_variant:Nn \@@_block_tikz:nnnnn { n n n n V } +% \end{macrocode} +% +% \medskip +% \begin{macrocode} +\keys_define:nn { NiceMatrix / SpecialOffset } + { offset .dim_set:N = \l_@@_offset_dim } % \end{macrocode} % % @@ -13898,7 +13879,7 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_define:nn { NiceMatrix / Auto } { - columns-type .code:n = \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 } , + columns-type .tl_set:N = \l_@@_columns_type_tl , columns-type .value_required:n = true , l .meta:n = { columns-type = l } , r .meta:n = { columns-type = r } , @@ -13934,7 +13915,7 @@ version 2005/12/01 or later. % preamble which is yet transformed (by using |\l_@@_columns_type_tl| which is % yet nicematrix-ready). % \begin{macrocode} - \bool_set_false:N \l_@@_preamble_bool + % \bool_set_false:N \l_@@_preamble_bool \use:x { \exp_not:N \begin { NiceArrayWithDelims } { #1 } { #2 } @@ -14133,27 +14114,6 @@ version 2005/12/01 or later. % \section{The keyword \textbackslash CodeAfter} % % -% The |\CodeAfter| (inserted with the key |code-after| or after the keyword -% |\CodeAfter|) may always begin with a list of pairs \textsl{key=value} between -% square brackets. Here is the corresponding set of keys. -% \begin{macrocode} -\keys_define:nn { NiceMatrix } - { - CodeAfter / rules .inherit:n = NiceMatrix / rules , - CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix - } -\keys_define:nn { NiceMatrix / CodeAfter } - { - sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , - sub-matrix .value_required:n = true , - delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , - delimiters / color .value_required:n = true , - rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , - rules .value_required:n = true , - xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } , - unknown .code:n = \@@_error:n { Unknown~key~for~CodeAfter } - } -% \end{macrocode} % % \medskip % In fact, in this subsection, we define the user command |\CodeAfter| for the @@ -14334,13 +14294,11 @@ version 2005/12/01 or later. vlines .clist_set:N = \l_@@_submatrix_vlines_clist , vlines .default:n = all , hvlines .meta:n = { hlines, vlines } , - hvlines .value_forbidden:n = true , + hvlines .value_forbidden:n = true } \keys_define:nn { NiceMatrix } { SubMatrix .inherit:n = NiceMatrix / sub-matrix , - CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix , - NiceMatrix / sub-matrix .inherit:n = NiceMatrix / sub-matrix , NiceArray / sub-matrix .inherit:n = NiceMatrix / sub-matrix , pNiceArray / sub-matrix .inherit:n = NiceMatrix / sub-matrix , NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix , @@ -14385,6 +14343,8 @@ version 2005/12/01 or later. } % \end{macrocode} % +% +% % \bigskip % \begin{macrocode} \NewDocumentCommand \@@_SubMatrix_in_code_before { m m m m ! O { } } @@ -15133,6 +15093,109 @@ version 2005/12/01 or later. { } } % \end{macrocode} +% +% \bigskip +% \section{The command TikzEveryCell} +% +% \begin{macrocode} + + +\bool_new:N \l_@@_not_empty_bool +\bool_new:N \l_@@_empty_bool + +\keys_define:nn { NiceMatrix / TikzEveryCell } + { + not-empty .code:n = + \bool_lazy_or:nnTF + \l_@@_in_code_after_bool + \g_@@_recreate_cell_nodes_bool + { \bool_set_true:N \l_@@_not_empty_bool } + { \@@_error:n { detection~of~empty~cells } } , + not-empty .value_forbidden:n = true , + empty .code:n = + \bool_lazy_or:nnTF + \l_@@_in_code_after_bool + \g_@@_recreate_cell_nodes_bool + { \bool_set_true:N \l_@@_empty_bool } + { \@@_error:n { detection~of~empty~cells } } , + empty .value_forbidden:n = true , + unknown .code:n = \@@_error:n { Unknown~key~for~TikzEveryCell } + } + + +\NewDocumentCommand { \@@_TikzEveryCell } { O { } m } + { + \IfPackageLoadedTF { tikz } + { + \group_begin: + \keys_set:nn { NiceMatrix / TikzEveryCell } { #1 } + \tl_set:Nn \l_tmpa_tl { #2 } + \seq_map_inline:Nn \g_@@_pos_of_blocks_seq + { \@@_for_a_block:nnnnn ##1 } + \@@_all_the_cells: + \group_end: + } + { \@@_error:n { TikzEveryCell~without~tikz } } + } + +\tl_new:N \@@_i_tl +\tl_new:N \@@_j_tl + +\cs_new_protected:Nn \@@_all_the_cells: + { + \int_step_variable:nNn { \int_use:c { c@iRow } } \@@_i_tl + { + \int_step_variable:nNn { \int_use:c { c@jCol } } \@@_j_tl + { + \cs_if_exist:cF { cell - \@@_i_tl - \@@_j_tl } + { + \exp_args:NNx \seq_if_in:NnF \l_@@_corners_cells_seq + { \@@_i_tl - \@@_j_tl } + { + \bool_set_false:N \l_tmpa_bool + \cs_if_exist:cTF + { pgf @ sh @ ns @ \@@_env: - \@@_i_tl - \@@_j_tl } + { + \bool_if:NF \l_@@_empty_bool + { \bool_set_true:N \l_tmpa_bool } + } + { + \bool_if:NF \l_@@_not_empty_bool + { \bool_set_true:N \l_tmpa_bool } + } + \bool_if:NT \l_tmpa_bool + { + \@@_block_tikz:nnnnV + \@@_i_tl \@@_j_tl \@@_i_tl \@@_j_tl \l_tmpa_tl + } + } + } + } + } + } + +\cs_new_protected:Nn \@@_for_a_block:nnnnn + { + \bool_if:NF \l_@@_empty_bool + { + \@@_block_tikz:nnnnV + { #1 } { #2 } { #3 } { #4 } \l_tmpa_tl + } + \@@_mark_cells_of_block:nnnn { #1 } { #2 } { #3 } { #4 } + } + +\cs_new_protected:Nn \@@_mark_cells_of_block:nnnn + { + \int_step_inline:nnn { #1 } { #3 } + { + \int_step_inline:nnn { #2 } { #4 } + { \cs_set:cpn { cell - ##1 - ####1 } { } } + } + } + + +% \end{macrocode} +% % % \bigskip % \section{The command \textbackslash ShowCellNames} @@ -15494,27 +15557,7 @@ version 2005/12/01 or later. } } } - { - \IfPackageLoadedTF { tabularx } - { - \str_if_eq:VnTF \g_@@_name_env_str { NiceTabularX } - { - \int_compare:nNnTF \c@iRow = \c_zero_int - { \@@_fatal:n { X~columns~with~tabularx } } - { - \@@_fatal:nn { too~much~cols~for~array } - { - However,~this~message~may~be~erroneous:~ - maybe~you~have~used~X~columns~while~'tabularx'~is~loaded,~ - ~which~is~forbidden~(however,~it's~still~possible~to~use~ - X~columns~in~{NiceTabularX}). - } - } - } - { \@@_fatal:nn { too~much~cols~for~array } { } } - } - { \@@_fatal:nn { too~much~cols~for~array } { } } - } + { \@@_fatal:nn { too~much~cols~for~array } } } % \end{macrocode} % @@ -15593,22 +15636,11 @@ version 2005/12/01 or later. ~you~try~to~use~more~columns~than~allowed~by~your~ \@@_full_name_env:.\@@_message_hdotsfor:\ The~maximal~number~of~columns~is~ \int_use:N \g_@@_static_num_of_col_int\ - ~(plus~the~potential~exterior~ones).~#1 + ~(plus~the~potential~exterior~ones). This~error~is~fatal. } % \end{macrocode} % -% \medskip -% \begin{macrocode} -\@@_msg_new:nn { X~columns~with~tabularx } - { - There~is~a~problem.\\ - You~have~probably~used~X~columns~in~your~environment~{\g_@@_name_env_str}.~ - That's~not~allowed~because~'tabularx'~is~loaded~(however,~you~can~use~X~columns~ - in~an~environment~{NiceTabularX}).\\ - This~error~is~fatal. - } -% \end{macrocode} % % \begin{macrocode} \@@_msg_new:nn { columns~not~used } @@ -15735,6 +15767,16 @@ version 2005/12/01 or later. % \end{macrocode} % % \begin{macrocode} +\@@_msg_new:nn { Unknown~key~for~TikzEveryCell } + { + Unknown~key.\\ + There~is~only~two~keys~available~here:~ + 'empty'~and~'not-empty'.\\ + Your~key~'\l_keys_key_str'~will~be~ignored. + } +% \end{macrocode} +% +% \begin{macrocode} \@@_msg_new:nn { Unknown~key~for~rotate } { Unknown~key.\\ @@ -15876,6 +15918,17 @@ version 2005/12/01 or later. % \end{macrocode} % % \begin{macrocode} +\@@_msg_new:nn { detection~of~empty~cells } + { + Problem~with~'not-empty'\\ + For~technical~reasons,~you~must~activate~ + 'recreate-cell-nodes'~in~\token_to_str:N \CodeBefore\ + in~order~to~use~the~key~'\l_keys_key_str'.\\ + That~key~will~be~ignored. + } +% \end{macrocode} +% +% \begin{macrocode} \@@_msg_new:nn { ragged2e~not~loaded } { You~have~to~load~'ragged2e'~in~order~to~use~the~key~'\l_keys_key_str'~in~ @@ -16066,9 +16119,19 @@ version 2005/12/01 or later. % \end{macrocode} % % \begin{macrocode} +\@@_msg_new:nn { TikzEveryCell~without~tikz } + { + TikZ~not~loaded.\\ + You~can't~use~\token_to_str:N \TikzEveryCell\ + because~you~have~not~loaded~tikz.~ + This~command~will~be~ignored. + } +% \end{macrocode} +% +% \begin{macrocode} \@@_msg_new:nn { tikz~key~without~tikz } { - Tikz~not~loaded.\\ + TikZ~not~loaded.\\ You~can't~use~the~key~'tikz'~for~the~command~'\token_to_str:N \Block'~because~you~have~not~loaded~tikz.~ This~key~will~be~ignored. @@ -16190,6 +16253,15 @@ version 2005/12/01 or later. % \end{macrocode} % % \begin{macrocode} +\@@_msg_new:nn { tikz~without~tikz } + { + Tikz~not~loaded.\\ + You~can't~use~the~key~'tikz'~here~because~Tikz~is~not~ + loaded.~If~you~go~on,~that~key~will~be~ignored. + } +% \end{macrocode} +% +% \begin{macrocode} \@@_msg_new:nn { tikz~in~custom-line~without~tikz } { Tikz~not~loaded.\\ @@ -16714,6 +16786,15 @@ version 2005/12/01 or later. } % \end{macrocode} % +% \begin{macrocode} +\@@_msg_new:nn { NiceTabularX~without~X } + { + NiceTabularX~without~X.\\ + You~should~not~use~{NiceTabularX}~without~X~columns.\\ + However,~you~can~go~on. + } +% \end{macrocode} +% % \newpage % \tableofcontents % diff --git a/macros/latex/contrib/nicematrix/nicematrix-code.pdf b/macros/latex/contrib/nicematrix/nicematrix-code.pdf Binary files differindex 558543af0d..a946462d28 100644 --- a/macros/latex/contrib/nicematrix/nicematrix-code.pdf +++ b/macros/latex/contrib/nicematrix/nicematrix-code.pdf diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.pdf b/macros/latex/contrib/nicematrix/nicematrix-french.pdf Binary files differindex 786f5acc72..b8847116e0 100644 --- a/macros/latex/contrib/nicematrix/nicematrix-french.pdf +++ b/macros/latex/contrib/nicematrix/nicematrix-french.pdf diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.tex b/macros/latex/contrib/nicematrix/nicematrix-french.tex index 688885eee9..a677a35681 100644 --- a/macros/latex/contrib/nicematrix/nicematrix-french.tex +++ b/macros/latex/contrib/nicematrix/nicematrix-french.tex @@ -1,6 +1,6 @@ % -*- coding: utf-8 ; -*- % Ce fichier doit être compilé avec xelatex uniquement. -\documentclass[dvipsnames]{article}% dvipsnames is for xcolor (loaded by Tikz, loaded by nicematrix) +\documentclass[dvipsnames]{article}% dvipsnames is for xcolor (loaded by TikZ, loaded by nicematrix) \usepackage{xltxtra} \usepackage[french]{babel} \frenchsetup{og = « , fg = »} @@ -533,13 +533,16 @@ $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin] \interitem La commande |\Block| accepte en premier argument optionnel (entre crochets) une -liste de couples \textsl{clé=valeur}. Les clés sont les suivantes : +liste de couples \textsl{clé=valeur}. + +\smallskip +Les premières clés sont des outils rapides pour contrôler l'apparence du bloc : + \begin{itemize} \item \index{fill (clé de \texttt{\textbackslash Block})} la clé \Definition{fill} prend en argument une couleur et remplit le bloc avec cette couleur ; \item \index{opacity! (clé de la commande \texttt{\textbackslash Block})} -\colorbox{yellow!50}{\bfseries Nouveau 6.22}\enskip la clé \Definition{opacity} fixe l'opacité de la couleur de remplissage donnée par |fill| ; \item \index{draw (clé de \texttt{\textbackslash Block})} @@ -566,15 +569,46 @@ la clé \Definition{rounded-corners} impose des coins arrondis (pour le cadre dessiné par |draw| et le fond dessiné par |fill|) avec un rayon égal à la valeur de cette clé (la valeur par défaut est 4~pt\footnote{Cette valeur par défaut est la valeur initiale des \emph{rounded - corners} de TikZ.}) ; + corners} de TikZ.}). +\end{itemize} + +\medskip +Ces outils ne sont parfois pas suffisants pour contrôler l'apparence du bloc. +Les clés suivantes sont plus puissantes, mais plus difficiles d'utilisation. +Elles nécessitent également que TikZ soit chargé (par |\usepackage{tikz}|). Par +défaut, \pkg{nicematrix} ne charge pas TikZ mais uniquement \textsc{pgf}, qui +est une sous-couche de TikZ. +\begin{itemize} +\item \index{borders (clé de \texttt{\textbackslash Block})} \index{tikzz@tikz!clé de «borders» de \texttt{\textbackslash Block}} +La clé \Definition{borders} permet de ne tracer que certaines des bordures +du bloc : cette clé prend comme valeur une liste d'éléments parmi les suivants : +|left|, |right|, |top| et |bottom| ; on peut en fait, dans la liste qui est la +valeur de la clé |borders| mettre une entrée de la forme +|tikz={|\textsl{liste}|}| où \textsl{liste} est une liste de couples +\textsl{clé=valeur} de TikZ spécifiant les caractéristiques graphiques des +traits qui seront dessinés (pour un exemple, voir p.~\pageref{tiretes}). + \item \index{tikzz@tikz!clé de \texttt{\textbackslash Block}} -quand la clé \Definition{tikz} est utilisée, le chemin TikZ correspondant +Quand la clé \Definition{tikz} est utilisée, le chemin TikZ correspondant au rectangle délimitant le bloc est exécuté avec TikZ\footnote{TikZ doit être chargé préalablement (par défaut, \pkg{nicematrix} ne charge que \textsc{pgf}), faute de quoi, une erreur sera levée.} en utilisant comme options la valeur de cette clé |tikz| (qui doit donc être une liste de clés TikZ applicables à un chemin de TikZ). Pour des exemples d'utilisation de cette clé -|tikz|, voir p.~\pageref{tikz-key-examples} ; +|tikz|, voir p.~\pageref{tikz-key-examples}. + +\colorbox{yellow!50}{\textbf{Nouveau 6.24}}\enskip En fait, dans la liste des +clés fournies à |tikz|, on peut mettre une clé |offset|. Cette clé n'est pas +fournie par TikZ mais par \pkg{nicematrix}. Elle réduit le rectangle +correspondant au bloc par une marge (horizontalement et verticalement) égale à +la valeur (passée à |offset|). C'est ce rectangle réduit qui sera le chemin +exécuté par TikZ avec comme options les autres clés passées à la clé |tikz|. +\end{itemize} + + +\medskip +Enfin, il existe quelque clés techniques : +\begin{itemize} \item \index{name!clé de \texttt{\textbackslash Block}} la clé \Definition{name} donne un nom au nœud TikZ rectangulaire correspondant au bloc ; on peut utiliser ce nom avec TikZ dans le |\CodeAfter| @@ -582,22 +616,18 @@ correspondant au bloc ; on peut utiliser ce nom avec TikZ dans le |\CodeAfter| \item \index{respect-arraystretch (clé de \texttt{\textbackslash Block})} la clé \Definition{respect-arraystretch} évite la remise à $1$ de |\arraystretch| en début de bloc (qui a lieu par défaut) ; -\item \index{borders (clé de \texttt{\textbackslash Block})} \index{tikzz@tikz!clé de «borders» de \texttt{\textbackslash Block}} -la clé \Definition{borders} permet de ne tracer que certaines des bordures -du bloc : cette clé prend comme valeur une liste d'éléments parmi les suivants : -|left|, |right|, |top| et |bottom| ; on peut en fait, dans la liste qui est la -valeur de la clé |borders| mettre une entrée de la forme -|tikz={|\textsl{liste}|}| où \textsl{liste} est une liste de couples -\textsl{clé=valeur} de TikZ spécifiant les caractéristiques graphiques des -traits qui seront dessinés (pour un exemple, voir p.~\pageref{tiretes}). \item \index{transparent (clé de \texttt{\textbackslash Block})} Par défaut, les filets ne sont pas tracés dans les blocs (voir à ce sujet la partie sur les filets, section~\ref{rules} p.~\pageref{rules}). Néanmoins, si -la clé \Definition{transparent} est utilisée, les filets seront tracés. Pour un -example, voir la section~\ref{tikz-key-examples}, -page~\pageref{tikz-key-examples}. Attention : cette clé n'implique pas du tout -que le contenu du bloc sera transparent. +la clé \Definition{transparent} est utilisée, les filets seront tracés.\footnote{Par +ailleurs, la commande |\TikzEveryCell| disponible dans le |\CodeAfter|, ne +s'applique aux blocs avec la clé |transparent|).} +Pour un exemple, voir la section~\ref{tikz-key-examples}, +page~\pageref{tikz-key-examples}. + +Attention : cette clé n'implique pas du tout que le contenu du bloc sera +transparent. \end{itemize} Il existe aussi des clés de positionnement horizontal et vertical du bloc qui @@ -885,9 +915,9 @@ impliquées dans le bloc. \item Avec la clé \Definition{T}, le contenu du bloc est calé vers le haut. -\colorbox{yellow!50}{Modification 6.18}\enskip Il n'y a plus de marge verticale. -Néanmoins, le contenu du bloc est (toujours) composé en interne dans une |{minipage}|, un -|{tabular}| ou un |{array}|, ce qui fait qu'il y souvent déjà une marge. +Il n'y a pas de marge verticale. Néanmoins, le contenu du bloc est (toujours) +composé en interne dans une |{minipage}|, un |{tabular}| ou un |{array}|, ce qui +fait qu'il y souvent déjà une marge. \item Avec la clé \Definition{B}, le contenu du bloc est calé vers le bas. \end{itemize} @@ -1146,20 +1176,21 @@ Dans les environnements de \pkg{nicematrix}, une instruction Les environnements de \pkg{nicematrix} proposent une clé |rules/width| pour fixer la largeur (on devrait plutôt dire l'épaisseur) des filets dans l'environnement. En fait, cette clé ne fait que fixer la valeur du paramètre -dimensionnel |\arrayrulewidth|. +dimensionnel de LaTeX |\arrayrulewidth|. \smallskip On sait que \pkg{colortbl} propose la commande |\arrayrulecolor| pour spécifier la couleur de ces filets. \smallskip -\indexcommand{arrayrulecolor} +\indexcommand{arrayrulecolor} Avec \pkg{nicematrix}, il est possible de spécifier une couleur même si \pkg{colortbl} n'est pas chargé. Par souci de compatibilité, la commande est -nommée également |\arrayrulecolor|. Les environnements de \pkg{nicematrix} -proposent également une clé |rules/color| qui permet de fixer cette couleur pour -l'environnement en question. Cette clé fixe localement la couleur des filets -(alors que la commande |\arrayrulecolor| agit globalement !). +nommée également |\arrayrulecolor|. Néanmoins, \pkg{nicematrix} propose aussi +une clé |rules/color|, disponible dans |\NiceMatrixOptions| ou dans un +environnement individuel, pour fixer la couleur des filets. Cette clé fixe +localement la couleur des filets (alors que la commande |\arrayrulecolor| agit +globalement !). Elle est à privilégier. \medskip \begin{scope} @@ -1182,6 +1213,11 @@ muguet & dahlia & souci \\ \end{NiceTabular} \end{scope} +\medskip +En fait, dans cet exemple, au lieu de |\hline|, il aurait mieux valu utiliser la +commande |\Hline|, fournie par \pkg{nicematrix} et décrite ci-dessous, car elle +garantit un meilleur résultat dans les lecteurs de PDF aux bas niveaux de zoom. + \medskip @@ -1218,21 +1254,19 @@ p.~\pageref{corners}. \item Pour les rangées et colonnes extérieures, cf. p.~\pageref{exterior}. \end{itemize} -En particulier, cette remarque explique la différence entre la commande standard -|\hline| et la commande |\Hline| proposée par \pkg{nicematrix}. +En particulier, cette remarque montre déjà une différence entre la commande +standard |\hline| et la commande |\Hline| proposée par \pkg{nicematrix}. -La commande |\Hline| admet entre crochets un argument optionnel qui est une -liste de couples \textsl{clé=valeur} qui décrivent un filet. Pour la description -de ces clés, voir |custom-line| p.~\pageref{custom-line}.\footnote{Remarque - technique. Si l'utilisateur définit une commande par-dessus la commande - |\Hline|, il doit veiller à ce qu'elle soit \emph{développable} au sens de - TeX (en utilisant |\NewExpandableDocumentCommand| de LaTeX3, |\newcommand| de - LaTeX ou même |\def| de TeX). Exemple : - |\newcommand{\RedLine}{\Hline{color=red}}|} +Par ailleurs, la commande |\Hline| admet entre crochets un argument optionnel +qui est une liste de couples \textsl{clé=valeur} qui décrivent un filet. Pour la +description de ces clés, voir |custom-line| +p.~\pageref{custom-line}.\footnote{Remarque technique. Si l'utilisateur définit + une commande par-dessus la commande |\Hline|, il doit veiller à ce qu'elle + soit \emph{développable} au sens de TeX (en utilisant + |\NewExpandableDocumentCommand| de LaTeX3, |\newcommand| de LaTeX ou même + |\def| de TeX). Exemple : |\newcommand{\RedLine}{\Hline[color=red]}|} \bigskip -\colorbox{yellow!50}{\textbf{Nouveau 6.23}}\enskip - De même que la commande |\Hline|, le specificateur «\verb+|+» admet entre crochets des options qui caractérisent le filet à tracer. @@ -1516,9 +1550,11 @@ utilisée par l'utilisateur dans le préambule d'un environnement à préambule \bigskip On traite maintenant de la description du filet elle-même. Les options qui -suivent peuvent aussi s'utiliser dans l'argument optionnel d'une |\Hline| -individuelle. +suivent peuvent aussi s'utiliser dans l'argument optionnel d'une commande +|\Hline| individuelle ou dans l'argument optionnel d'un spécificateur «\verb+|+» +dans un préambule d'environnement. +\bigskip Il y a trois possibilités. @@ -1731,7 +1767,7 @@ $\begin{pNiceArray}{cccc:c} Rappelons que l'extension \pkg{colortbl} peut être chargée directement par |\usepackage{colortbl}| ou en chargeant l'extension \pkg{xcolor} avec l'option -|table| : |\usepackage[table]{xcolor}|. +\texttt{table} : |\usepackage[table]{xcolor}|. \medskip Comme l'extension \pkg{nicematrix} est fondée sur \pkg{array}, il est possible @@ -1828,6 +1864,8 @@ De nouvelles commandes sont disponibles dans ce |\CodeBefore|: |\cellcolor|, \index{arraycolor@\texttt{\textbackslash arraycolor} (commande du \texttt{\textbackslash CodeBefore)}} +Les noms de ces commandes sont inspirés des noms des commandes de \pkg{colortbl}. + \medskip Ces commandes ne colorient pas les cases qui se trouvent dans les «coins» si la @@ -2327,13 +2365,13 @@ que la commande éponyme de \pkg{colortbl} (néanmoins, contrairement à la commande |\columncolor| de \pkg{colortbl}, celle de \pkg{nicematrix} peut apparaître à l'intérieur d'une autre commande, elle-même utilisée dans le préambule) ; -\item \colorbox{yellow!50}{\textbf{Nouveau 6.21}}\enskip |\rowcolors| qui prend pour arguments deux couleurs et colorie la suite du +\item |\rowcolors| qui prend pour arguments deux couleurs et colorie la suite du tableau avec ces deux couleurs ; -\item \colorbox{yellow!50}{\textbf{Nouveau 6.21}}\enskip |\rowlistcolors| qui prend pour argument une liste de couleurs et colorie +\item |\rowlistcolors| qui prend pour argument une liste de couleurs et colorie la suite du tableau avec ces couleurs.\footnote{Quand la commande |\rowlistcolors| (ou la commande |\rowcolors|) est utilisée dans une case de - la colonne~$j$, le coloriage ne s'applique que les colonnes au-delà de~$j$ - (à dessein).} + la colonne~$j$, le coloriage ne s'applique que les colonnes au-delà de~$j$ (à + dessein).} \end{itemize} \medskip @@ -2399,7 +2437,7 @@ La clé \Definition{rowcolor} fixe la couleur de fond et la clé \Definition{col fixe la couleur du texte.\footnote{La clé |color| utilise la commande |\color| mais insère aussi une instruction |\leavevmode| devant. Cela évite un espace vertical parasite dans les cases qui correspondent à des colonnes de type - |p|, |b|, |m|, |X| et |V| (qui débutent en mode vertical de LateX).} + |p|, |b|, |m|, |X| et |V| (qui débutent en mode vertical de LaTeX).} \item \index{bold (clé de \texttt{\textbackslash RowStyle})} La clé \Definition{bold} impose des caractères gras aux éléments de la rangée, qu'ils @@ -2590,10 +2628,7 @@ initiale de ce paramètre est |\linewidth| (et non |\textwidth|). Pour se rapprocher davantage de l'environnement |{tabularx}|, \pkg{nicematrix} propose aussi un environnement |{NiceTabularX}| avec une syntaxe similaire à celle de |{tabularx}|, c'est-à-dire que la largeur voulue pour le tableau est -spécifiée en premier argument (obligatoire).\footnote{Si \pkg{tabularx} est - chargé, on doit obligatoirement utiliser |{NiceTabularX}| pour utiliser les - colonnes |X| (cela est dû à un problème de conflit de définition des - spécificateurs de colonne |X|).} +spécifiée en premier argument (obligatoire). Comme avec les extensions \pkg{tabu}\footnote{L'extension \pkg{tabu} est @@ -3270,10 +3305,10 @@ au-dessous et au-dessus de la ligne. Les arguments sont composés en mode mathématique avec |\scriptstyle|. \smallskip -\colorbox{yellow!50}{\textbf{Nouveau 6.22}}\enskip La version 6.22 introduit un -nouveau label spécifié par le caractère~«|:|» pour un label situé \emph{sur} la ligne -elle-même. Ce label est en fait composé sur un fond blanc qui est superposé sur -la ligne en pointillés (voir un exemple p.~\pageref{ex:colon}). +La version 6.22 de \pkg{nicematrix} a introduit un nouveau label spécifié par le +caractère~«|:|» pour un label situé \emph{sur} la ligne elle-même. Ce label est +en fait composé sur un fond blanc qui est superposé sur la ligne en pointillés +(voir un exemple p.~\pageref{ex:colon}). \bigskip \begin{BVerbatim}[baseline=c,boxwidth=10cm] @@ -3355,7 +3390,7 @@ Pour la clarté, dans la suite, on utilisera ces noms-là. \bigskip La clé \Definition{xdots/horizontal-labels} demande que les labels (introduits -par |_| et |^|) restent horizontaux. +par |_|, |^| et |:|) restent horizontaux. \medskip L'option \Definition{xdots/color} indique bien entendu la couleur de la ligne @@ -3477,10 +3512,9 @@ $\begin{bNiceMatrix}[margin,hvlines] \index{blkarray@\pkg{blkarray} (extension)} -\colorbox{yellow!50}{\textbf{Modifié 6.16}}\enskip Pour les environnements à -préambule (|{NiceArray}|, |{pNiceArray}|, etc.), il est possible de placer des -délimiteurs verticaux directement dans le préambule.\footnote{Cette syntaxe est - inspirée de l'extension \pkg{blkarray}.} +Pour les environnements à préambule (|{NiceArray}|, |{pNiceArray}|, etc.), il +est possible de placer des délimiteurs verticaux directement dans le +préambule.\footnote{Cette syntaxe est inspirée de l'extension \pkg{blkarray}.} \label{delimiters-in-preamble}% \smallskip @@ -3581,9 +3615,9 @@ PGF-TikZ créés par \pkg{nicematrix} dans le |\CodeAfter|. Ces nœuds sont déc à partir de la page \pageref{PGF-nodes}. \medskip -Par ailleurs, plusieurs commandes spéciales sont disponibles dans le |\CodeAfter| : -|\line|, |\SubMatrix|, |\OverBrace| et |\UnderBrace|. On va maintenant détailler -ces commandes. +Par ailleurs, plusieurs commandes spéciales sont disponibles dans le +|\CodeAfter| : |\line|, |\SubMatrix|, |\OverBrace|, |\UnderBrace| et +|\TikzEveryCell|. On va maintenant détailler ces commandes. \subsection{La commande \textbackslash line dans le \textbackslash CodeAfter} @@ -4007,7 +4041,7 @@ $\begin{pNiceMatrix} \bigskip Attention : Aucun espace vertical n'est réservé par \pkg{nicematrix} pour ces -accolades.\footnote{Voir à ce sujet: \url{https://tex.stackexchange.com/questions/685755}} +accolades, ni pour leurs labels.\footnote{Voir à ce sujet: \url{https://tex.stackexchange.com/questions/685755}} \bigskip \index{color!clé de \texttt{\textbackslash OverBrace} et \texttt{\textbackslash @@ -4053,6 +4087,77 @@ $\begin{pNiceMatrix} \OverBrace[shorten,yshift=3pt]{1-4}{2-6}{B} \end{pNiceMatrix}$ + +\subsection{La commande \textbackslash TikzEveryCell dans le \textbackslash CodeAfter} + +\index{SubMatrix@\texttt{\textbackslash TikzEveryCell} (commande du +\texttt{\textbackslash CodeAfter}\newline et du +\texttt{\textbackslash CodeBefore})|textbf} + + +\colorbox{yellow!50}{\textbf{Nouveau 6.24}}\enskip La commande |\TikzEveryCell| +exécute avec TikZ le chemin rectangulaire qui correspond à chaque case du tableau, +avec comme paramètres TikZ l'argument de |\TikzEveryCell|. Cet argument doit +être une liste de couples \textsl{clé=valeur} applicables à un chemin +TikZ. En fait, cette commande s'applique à chaque cellule du tableau, exceptées +celles situées dans les rangées et colonnes extérieures (cf.~p.~\pageref{exterior})o et celles situées dans +les coins vides (quand la clé |corners| est utilisée: cf.~p.~\pageref{corners}). Elle s'applique en fait à +chaque bloc (sauf ceux qui ont la clé |transparent|) et ne s'applique pas aux +cellules situées dans ces blocs. + +\medskip +En fait, dans la liste des clés passée en argument on peut mettre une clé +|offset|. Cette clé n'est pas fournie par TikZ mais par \pkg{nicematrix}. Elle +réduit le rectangle correspondant au bloc par une marge (horizontalement et +verticalement) égale à la valeur (passée à |offset|). C'est ce rectangle réduit +qui sera le chemin exécuté par TikZ avec comme options les autres clés de +l'argument de |\TikzEveryCell|. + + +\medskip +\begingroup +\bigskip +\begin{BVerbatim}[baseline=c,boxwidth=9cm] + +\renewcommand{\arraystretch}{1.3} +\begin{NiceTabular}{ccc}[corners] + & \Block{1-2}{columns} \\ + \Block{2-1}{rows} + & cell 1 1 & cell 1 2 \\ + & cell 2 1 & cell 2 2 +\CodeAfter + ~emphase#\TikzEveryCell{offset=1pt,draw}@ +\end{NiceTabular} +\end{BVerbatim} +\renewcommand{\arraystretch}{1.3} +\begin{NiceTabular}{ccc}[corners] + & \Block{1-2}{columns} \\ + \Block{2-1}{rows} + & cell 1 1 & cell 1 2 \\ + & cell 2 1 & cell 2 2 +\CodeAfter + \TikzEveryCell{offset=1pt,draw} +\end{NiceTabular} +\endgroup + + +\medskip +La commande |\TikzEveryCell| possède deux clés : +\begin{itemize} +\item avec la clé \Definition{empty}, la commande ne s'applique qu'aux cellules +vides ; +\item avec la clé \Definition{non-empty}, la commande ne s'applique qu'aux +cellules non vides. +\end{itemize} + + +\medskip +La commande |\TikzEveryCell| est en fait aussi disponible dans le |\CodeBefore|. + + + + + \index{CodeAfter@\texttt{\textbackslash CodeAfter}|)} \section{Les légendes et les notes dans les tableaux} @@ -4204,7 +4309,7 @@ les notes de pied de page). \item Si une commande |\tabularnote{...}| se trouve exactement à la fin d'une case (sans aucun espace après), l'appel de note est composé en débordement vers la droite (cela peut permettre de mieux conserver l'alignement des contenus d'une -colonne). Depuis la version 6.20a, ce comportement n'a lieu que le mode +colonne). Depuis la version 6.20a, ce comportement n'a lieu que si le mode l'alignement de la case est |c| ou |r| (alignement horizontal centré ou en butée à droite). @@ -4524,9 +4629,9 @@ avec des coins arrondis.\footnote{Bien sûr, lorsqu'il s'agit d'un environnement \end{itemize} \bigskip -\colorbox{yellow!50}{\textbf{Nouveau 6.21}} Cette clé est disponible dans tous -les environnements et commandes de \pkg{nicematrix} (comme -|\pAutoNiceMatrix|) et également dans |\NiceMatrixOptions|. +Cette clé est disponible dans tous les environnements et commandes de +\pkg{nicematrix} (comme par exemple |\pAutoNiceMatrix|) et également dans +|\NiceMatrixOptions|. \bigskip \begin{BVerbatim}[baseline=c,boxwidth=9.5cm] @@ -4715,11 +4820,10 @@ $A = \begin{pNiceMatrix}[last-row,last-col=4] \end{varwidth} \bigskip -\colorbox{yellow!50}{\textbf{Nouveau 6.21}}\enskip La commande |\rotate| accepte -une option |c| entre crochets : |\rotate[c]| (les espaces sont supprimés après -|\rotate[c]|). Quand cette clé est utilisée, le contenu, après rotation, est -composé dans une |\vcenter|, ce qui fait que, le plus souvent, on obtiendra un -centrage vertical. +La commande |\rotate| accepte une option |c| entre crochets : |\rotate[c]| (les +espaces sont supprimés après |\rotate[c]|). Quand cette clé est utilisée, le +contenu, après rotation, est composé dans une |\vcenter|, ce qui fait que, le +plus souvent, on obtiendra un centrage vertical. \medskip diff --git a/macros/latex/contrib/nicematrix/nicematrix.pdf b/macros/latex/contrib/nicematrix/nicematrix.pdf Binary files differindex 1c8fbe1e24..7865c622af 100644 --- a/macros/latex/contrib/nicematrix/nicematrix.pdf +++ b/macros/latex/contrib/nicematrix/nicematrix.pdf diff --git a/macros/latex/contrib/nicematrix/nicematrix.tex b/macros/latex/contrib/nicematrix/nicematrix.tex index b2da527927..cec4b584ca 100644 --- a/macros/latex/contrib/nicematrix/nicematrix.tex +++ b/macros/latex/contrib/nicematrix/nicematrix.tex @@ -511,16 +511,17 @@ $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin] \interitem In fact, the command |\Block| accepts as first optional argument (between -square brackets) a list of couples \textsl{key=value}. The available keys are as -follows: +square brackets) a list of couples \textsl{key=value}. + +First, there are keys which are quick tools to control the apperance of the block. + \begin{itemize} \item \index{fill (key of \texttt{\textbackslash Block})} the key \Definition{fill} takes in as value a color and fills the block with that color; \item \index{opacity (key of \texttt{\textbackslash Block})} -\colorbox{yellow!50}{\bfseries New 6.22}\enskip the key -\Definition{opacity} sets the opacity of -the filling color specified by |fill|; +the key \Definition{opacity} sets the opacity of the filling color specified by +|fill|; \item \index{draw (key of \texttt{\textbackslash Block})} the key \Definition{draw} takes in as value a color and strokes the frame of the block with that color (the default value of that key is the @@ -546,14 +547,50 @@ only when one of the keys |draw|, |hvlines|, |vlines| and |hlines| is used); the key \Definition{rounded-corners} requires rounded corners (for the frame drawn by |draw| and the shape drawn by |fill|) with a radius equal to the value of that key (the default value is 4~pt\footnote{This value is the -initial value of the \emph{rounded corners} of Tikz.}); +initial value of the \emph{rounded corners} of Tikz.}). +\end{itemize} + +\medskip +Sometimes, these tools are not sufficient to control the appearance of the +block. The following keys are more powerful but also more difficult to use. +Moreover, the require the loading of TikZ by the user (with +|\usepackage{tikz}|). By default, \pkg{nicematrix} does not load TikZ but only +\textsc{pgf}, which is a sublayer of TikZ. + +\begin{itemize} +\item \index{borders (key of \texttt{\textbackslash Block})} +\index{tikzz@tikz!key of ``borders'' de \texttt{\textbackslash Block}} +The key \Definition{borders} provides the ability to draw only some +borders of the blocks; the value of that key is a (comma-separated) list of +elements covered by |left|, |right|, |top| and |bottom|; it's possible, in +fact, in the list which is the value of the key |borders|, to add an entry of +the form |tikz={|\textsl{list}|}| where \textsl{list} is a list of couples +\textsl{key=value} of Tikz specifying the graphical characteristics of the +lines that will be drawn (for an example, see p.~\pageref{dashed}). + \item \index{tikzz@tikz!key of \texttt{\textbackslash Block}} -when the key \Definition{tikz} is used, the Tikz path corresponding of +When the key \Definition{tikz} is used, the Tikz path corresponding of the rectangle which delimits the block is executed with Tikz\footnote{Tikz should be loaded (by default, \pkg{nicematrix} only loads \textsc{pgf}) and, if it's not, an error will be raised.} by using as options the value of that -key |tikz| (which must be a list of keys allowed for a Tikz path). For -examples, cf. p.~\pageref{tikz-key-examples}; +key |tikz| (which must be a list of keys allowed for a Tikz path). + +\colorbox{yellow!50}{\textbf{New 6.24}}\enskip In fact, in the list of the keys +provided by the user as value of |tikz|, it's possible to put a key |offset|. +That key is not provided by TikZ but by \pkg{nicematrix}. It will narrow the +rectangular frame corresponding to the block by a margin (horizontally and +vertically) equal to the value (of that key |offset|). That new frame, a bit +narrower, will be executed by TikZ with options which are the other keys in the +list of keys provided as value to the key |tikz| of |\Block|. + +For examples, cf. p.~\pageref{tikz-key-examples}. +\end{itemize} + + +\medskip +There is also some technical keys: + +\begin{itemize} \item \index{name!key of \texttt{\textbackslash Block}} the key \Definition{name} provides a name to the rectangular Tikz node corresponding to the block; it's possible to use that name with Tikz in the @@ -562,15 +599,6 @@ corresponding to the block; it's possible to use that name with Tikz in the the key \Definition{respect-arraystretch} prevents the setting of |\arraystretch| to $1$ at the beginning of the block (which is the behaviour by default) ; -\item \index{borders (key of \texttt{\textbackslash Block})} -\index{tikzz@tikz!key of ``borders'' de \texttt{\textbackslash Block}} -the key \Definition{borders} provides the ability to draw only some -borders of the blocks; the value of that key is a (comma-separated) list of -elements covered by |left|, |right|, |top| and |bottom|; it's possible, in -fact, in the list which is the value of the key |borders|, to add an entry of -the form |tikz={|\textsl{list}|}| where \textsl{list} is a list of couples -\textsl{key=value} of Tikz specifying the graphical characteristics of the -lines that will be drawn (for an example, see p.~\pageref{dashed}). \item \index{transparent (key of \texttt{\textbackslash Block})} By default, the rules are not drawn in the blocks (see the section about the rules: section~\ref{rules} p.~\pageref{rules}). However, if the key @@ -1112,7 +1140,8 @@ is equivalent to |\cline{|\textsl{\texttt{i}}|-|\textsl{\texttt{i}}|}|. The environments of \pkg{nicematrix} provide a key |rules/width| to set the width (in fact the thickness) of the rules in the current environment. In -fact, this key merely sets the value of the length |\arrayrulewidth|. +fact, this key merely sets the value of the standard LaTeX length +|\arrayrulewidth|. \smallskip It's well known that \pkg{colortbl} provides the command |\arrayrulecolor| in @@ -1120,12 +1149,12 @@ order to specify the color of the rules. \smallskip \indexcommand{arrayrulecolor} -With \pkg{nicematrix}, it's possible to specify the color of the rules even -when \pkg{colortbl} is not loaded. For sake of compatibility, the command is -also named |\arrayrulecolor|. The environments of \pkg{nicematrix} also -provide a key |rules/color| to fix the color of the rules in the current -environment. This key sets the value locally (whereas |\arrayrulecolor| acts -globally!). +With \pkg{nicematrix}, it's possible to specify the color of the rules even when +\pkg{colortbl} is not loaded. For sake of compatibility, the command is also +named |\arrayrulecolor|. However, \pkg{nicematrix} also provides a key +|rules/color|, available in |\NiceMatrixOptions| or in an individual +environment, to fix the color of the rules. This key sets the value locally +(whereas |\arrayrulecolor| acts globally!) and should be prefered. \medskip \begin{scope} @@ -1148,7 +1177,10 @@ muguet & dahlia & souci \\ \end{NiceTabular} \end{scope} - +\medskip +In fact, in that example, instead of |\hline|, it would have a better choice to +use |\Hline|, provided by \pkg{nicematrix} and described just below, because it +ensures a better output in the PDF viewers at the low levels of zoom. \subsection{The tools of nicematrix for the rules} @@ -1180,22 +1212,21 @@ p.~\pageref{corners}). \item For the exterior rows and columns, see~p.~\pageref{exterior}. \end{itemize} -In particular, this remark explains the difference between the standard +In particular, this remark exhibits a first difference between the standard command |\hline| and the command |\Hline| provided by \pkg{nicematrix}. -The key |\Hline| takes in an optional argument (between square brackets) which -is a list of \textsl{key=value} pairs. For the description of those keys, see -|custom-line| on p.~\pageref{custom-line}.\footnote{Technical remark: If the - user wants to write a command over the command |\Hline|, it shall be ensured - that this new command is expandable in the TeX sens (by using, for instance, - |\NewExpandableDocumentCommand| of LaTeX3, |\newcommand| of LaTeX or |\def| of - TeX). Example: |\newcommand{\RedLine}{\Hline[color=red]}|} +Moreover, the key |\Hline| takes in an optional argument (between square +brackets) which is a list of \textsl{key=value} pairs. For the description of +those keys, see |custom-line| on p.~\pageref{custom-line}.\footnote{Technical + remark: If the user wants to write a command over the command |\Hline|, it + shall be ensured that this new command is expandable in the TeX sens (by + using, for instance, |\NewExpandableDocumentCommand| of LaTeX3, |\newcommand| + of LaTeX or |\def| of TeX). Example: + |\newcommand{\RedLine}{\Hline[color=red]}|} \bigskip -\colorbox{yellow!50}{\textbf{New 6.23}}\enskip - -As well as the command |\Hline|, the specifier ``\verb+|+'' supports a optional +As well as the command |\Hline|, the specifier ``\verb+|+'' supports an optional argument between square brackets for the characteristics of the rule. \medskip @@ -1472,8 +1503,11 @@ to specify a vertical rule. \bigskip We will now speak of the keys which describe the rule itself. Those keys may -also be used in the (optional) argument of an individual command |\Hline|. +also be used in the (optional) argument of an individual command |\Hline| or in +the (optional) argument of a specifier ``\verb+|+'' in the preamble of an +environment. +\bigskip There is three possibilities. \begin{itemize} @@ -1775,6 +1809,10 @@ cf.~p.~\pageref{nodes-i}.} \index{arraycolor@\texttt{\textbackslash arraycolor} (command of \texttt{\textbackslash CodeBefore)}} +The names of these commands are inspired by the names of the commands provided +by \pkg{colortbl}. + + \medskip These commands don't color the cells which are in the ``corners'' if the key |corners| is used. That key has been described p.~\pageref{corners}. @@ -2263,9 +2301,9 @@ with the same syntax as the corresponding command of \pkg{colortbl} (however, unlike the command |\columncolor| of \pkg{colortbl}, this command |\columncolor| can appear within another command, itself used in the preamble of the array); -\item \colorbox{yellow!50}{\textbf{New 6.21}}\enskip |\rowcolors| which takes in as arguments two colors and color the rest of +\item |\rowcolors| which takes in as arguments two colors and color the rest of the tabular with those colors; -\item \colorbox{yellow!50}{\textbf{New 6.21}}\enskip |\rowlistcolors| which takes in as argument a color and color the rest of +\item |\rowlistcolors| which takes in as argument a color and color the rest of the tabular with the colors of that list of colors.\footnote{When the command |\rowlistcolors| (or the command |\rowcolors| is used in a cell of the column~$j$ of the array, the command applies only on the columns above~$j$ (by @@ -2519,10 +2557,7 @@ parameter is |\linewidth| (and not |\textwidth|). For sake of similarity with the environment |{tabularx}|, \pkg{nicematrix} also provides an environment |{NiceTabularX}| with a syntax similar to the syntax of |{tabularx}|, that is to say with a first mandatory argument -which is the width of the tabular.\footnote{If \pkg{tabularx} is loaded, one -must use |{NiceTabularX}| (and not |{NiceTabular}|) in order to use the -columns |X| (this point comes from a conflict in the definitions of the -specifier |X|).} +which is the width of the tabular. As with the packages \pkg{tabu}\footnote{The extension \pkg{tabu} is now considered as deprecated.} and \pkg{tabularray}, the specifier |X| takes @@ -3189,10 +3224,10 @@ p.~\pageref{line-in-code-after}) accept two optional arguments specified by the tokens |_| and |^| for labels positionned below and above the line. The arguments are composed in math mode with |\scriptstyle|. -\colorbox{yellow!50}{\textbf{New 6.22}}\enskip The version 6.22 introduces a new -label, specified by the token ``|:|'' for a label placed on the line. The label -is composed on a white background which is put on the line previously drawn (see -example on p.~\pageref{ex:colon}). +The version 6.22 of \pkg{nicematrix} has introduced a new label, specified by +the token ``|:|'' for a label placed on the line. The label is composed on a +white background which is put on the line previously drawn (see example on +p.~\pageref{ex:colon}). \bigskip \begin{BVerbatim}[baseline=c,boxwidth=10cm] @@ -3269,8 +3304,8 @@ For the clarity of the explanations, we will use those names. \bigskip -With the key \Definition{xdots/horizontal-labels}, the labels (introduced by |_| -and |^|) stay horizontal. +With the key \Definition{xdots/horizontal-labels}, the labels (introduced by~|_|, +|^| and~|:|) stay horizontal. \bigskip The option \Definition{xdots/color} fixes the color or the dotted line. However, @@ -3498,7 +3533,8 @@ beginning on p.~\pageref{PGF-nodes}. \medskip Moreover, several special commands are available in the |\CodeAfter|: |line|, -|\SubMatrix|, |\OverBrace| and |\UnderBrace|. We will now present these commands. +|\SubMatrix|, |\OverBrace|, |\UnderBrace| and |\TikzEveryCell|. We will now +present these commands. \subsection{The command \textbackslash line in the \textbackslash CodeAfter} @@ -3914,7 +3950,7 @@ $\begin{pNiceMatrix} \end{pNiceMatrix}$ \bigskip -Caution : There is no vertical space reserved for those braces.\footnote{See: +Caution : There is no vertical space reserved for those braces and their labels.\footnote{See: \url{https://tex.stackexchange.com/questions/685755}} @@ -3964,6 +4000,72 @@ $\begin{pNiceMatrix} \OverBrace[shorten,yshift=3pt]{1-4}{2-6}{B} \end{pNiceMatrix}$ + +\subsection{The command \textbackslash TikzEveryCell in the \textbackslash + CodeAfter} + + +\index{SubMatrix@\texttt{\textbackslash TikzEveryCell} (command of +\texttt{\textbackslash CodeAfter}\newline and +\texttt{\textbackslash CodeBefore})|textbf} + + + +\colorbox{yellow!50}{\textbf{New 6.24}}\enskip The command |\TikzEveryCell| +execute with TikZ the rectangular path corresponding to each cell of the tabular +with parameters of TikZ the argument of |\TikzEveryCell|. That argument must be +a list of \textsl{key=value} pairs which may be applied to a Tikz path. In fact, +the command applies to each of the tabular, except those in the exterior rows +and columns (cf.~p.~\pageref{exterior}) and those in the empty corners (when the +key |corners| is used: cf.~p.~\pageref{corners}). It applies in fact to each +block (excepted those with the key |transparent|) and does not apply to the +cells located within these blocks. + +\medskip +In fact, in the list of keys provided as argument of |\TikzEveryCell|, it's +possible to put a key |offset|. That key is not provided by TikZ but by +\pkg{nicematrix}. It will narrow the rectangular frame corresponding to the +block by a margin (horizontally and vertically) equal to the value (of that key +|offset|). That new frame, a bit narrower, will be executed by TikZ with options +which are the other keys in the argument of |\TikzEveryCell|. + +\medskip +\begingroup +\bigskip +\begin{BVerbatim}[baseline=c,boxwidth=9cm] +\renewcommand{\arraystretch}{1.3} +\begin{NiceTabular}{ccc}[corners] + & \Block{1-2}{columns} \\ + \Block{2-1}{rows} + & cell 1 1 & cell 1 2 \\ + & cell 2 1 & cell 2 2 +\CodeAfter + ~emphase#\TikzEveryCell{offset=1pt,draw}@ +\end{NiceTabular} +\end{BVerbatim} +\renewcommand{\arraystretch}{1.3} +\begin{NiceTabular}{ccc}[corners] + & \Block{1-2}{columns} \\ + \Block{2-1}{rows} + & cell 1 1 & cell 1 2 \\ + & cell 2 1 & cell 2 2 +\CodeAfter + \TikzEveryCell{offset=1pt,draw} +\end{NiceTabular} +\endgroup + +\bigskip +The command |\TikzEveryCell| has two keys: +\begin{itemize} +\item with the key \Definition{empty}, the command only acts on the empty cells; + +\item with key \Definition{non-empty}, the command only acts on the non-empty cells. +\end{itemize} + +\medskip +The commmand |\TikzEveryCell| is, in fact, also available in the |\CodeBefore|. + + \index{CodeAfter@\texttt{\textbackslash CodeAfter}|)} \section{Captions and notes in the tabulars} @@ -4421,9 +4523,9 @@ exterior rules.} \end{itemize} -\colorbox{yellow!50}{New 6.21}\enskip That key is available in all -the environments and commands (e.g. |\pAutoNiceMatrix|) of \pkg{nicematrix} and also -in the command |\NiceMatrixOptions|. +That key is available in all the environments and commands (e.g. +|\pAutoNiceMatrix|) of \pkg{nicematrix} and also in the command +|\NiceMatrixOptions|. \bigskip \begin{BVerbatim}[baseline=c,boxwidth=9cm] @@ -4616,10 +4718,9 @@ $A = \begin{pNiceMatrix}[last-row=4,last-col=4] \end{varwidth} \bigskip -\colorbox{yellow!50}{\textbf{New 6.21}}\enskip The command |\rotate| has a key -|c|: |\rotate[c]| (spaces are deleted after |\rotate[c]|). When that key is -used, the content is composed in a |\vcenter| and, therefore, in most cases, we -will have a vertical alignment. +The command |\rotate| has a key |c|: |\rotate[c]| (spaces are deleted after +|\rotate[c]|). When that key is used, the content is composed in a |\vcenter| +and, therefore, in most cases, we will have a vertical alignment. \bigskip Caution: the command |\rotate| is designed to be used in a |\Block| or in @@ -6961,6 +7062,15 @@ The successive versions of the file |nicematrix.sty| provided by TeXLive are ava \nolinkurl{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty} } + +\subsection*{Changes between version 6.23 and 6.24} + +New command |\TikzEveryCell| available in the |\CodeAfter| and the |\CodeBefore| +to apply the same TikZ instruction to all the cells and blocks of the array. + +New key |offset| in the key |tikz| of a command |\Block|. + + \subsection*{Changes between version 6.22 and 6.23} The specifier ``\verb+|+'' in the preambles of the environments has now an @@ -6982,7 +7092,7 @@ Key |c| for the command |\tabularnote|. New commands |\rowcolors| and |\rowlistcolors| available in the array itself (previously, there were only two commands |\rowcolors| and |\rowlistcolors| -avaailable in the |\CodeBefore|. +available in the |\CodeBefore|. \subsection*{Changes between version 6.20 and 6.20a} diff --git a/macros/latex/contrib/projlib/ProjLib.dtx b/macros/latex/contrib/projlib/ProjLib.dtx index d1028090a9..5009d8e98c 100644 --- a/macros/latex/contrib/projlib/ProjLib.dtx +++ b/macros/latex/contrib/projlib/ProjLib.dtx @@ -19,84 +19,84 @@ %<*ProjLib> \ProvidesExplPackage {ProjLib} - {2023/09/26} {} + {2023/09/28} {} {Collective interface of the ProjLib toolkit} %</ProjLib> % %<*projlib-author> \ProvidesExplPackage {projlib-author} - {2023/09/26} {} + {2023/09/28} {} {Enhanced author information block} %</projlib-author> % %<*projlib-datetime> \ProvidesExplPackage {projlib-datetime} - {2023/09/26} {} + {2023/09/28} {} {Convert numeric date-time string to natural language} %</projlib-datetime> % %<*projlib-draft> \ProvidesExplPackage {projlib-draft} - {2023/09/26} {} + {2023/09/28} {} {Useful commands during draft stage} %</projlib-draft> % %<*projlib-font> \ProvidesExplPackage {projlib-font} - {2023/09/26} {} + {2023/09/28} {} {Font selection and configuration} %</projlib-font> % %<*projlib-language> \ProvidesExplPackage {projlib-language} - {2023/09/26} {} + {2023/09/28} {} {Multi-language configuration} %</projlib-language> % %<*projlib-logo> \ProvidesExplPackage {projlib-logo} - {2023/09/26} {} + {2023/09/28} {} {The ProjLib logo} %</projlib-logo> % %<*projlib-math> \ProvidesExplPackage {projlib-math} - {2023/09/26} {} + {2023/09/28} {} {Efficient math setup} %</projlib-math> % %<*projlib-paper> \ProvidesExplPackage {projlib-paper} - {2023/09/26} {} + {2023/09/28} {} {Configuration of the paper style} %</projlib-paper> % %<*projlib-text> \ProvidesExplPackage {projlib-text} - {2023/09/26} {} + {2023/09/28} {} {Text-related commands} %</projlib-text> % %<*projlib-theorem> \ProvidesExplPackage {projlib-theorem} - {2023/09/26} {} + {2023/09/28} {} {Configuration of theorem-like environments} %</projlib-theorem> % %<*projlib-titlepage> \ProvidesExplPackage {projlib-titlepage} - {2023/09/26} {} + {2023/09/28} {} {Commands for rendering the title page} %</projlib-titlepage> @@ -3191,6 +3191,8 @@ { language-not-enabled } { The~language~"#1"~is~not~enabled. } +\tl_new:N \l_projlib_language_current_languagetype_tl + \cs_new:Nn \projlib_language_use_language_locally:nn { \cs_if_exist:cTF { projlib_language_apply_settings_locally_ \projlib_language_str_to_languagename:n { #1 } :n } @@ -3198,6 +3200,7 @@ \bool_if:cTF { g__projlib_language_enabled_ \projlib_language_str_to_languagename:n { #1 } _bool } { \use:c { projlib_language_apply_settings_locally_ \projlib_language_str_to_languagename:n { #1 } :n } { #2 } + \tl_set:Ne \l_projlib_language_current_languagetype_tl { \projlib_language_str_to_languagetype:n { #1 } } } { \msg_warning:nnn { projlib-language } { language-not-enabled } { #1 } @@ -3220,6 +3223,7 @@ \use:c { projlib_language_apply_settings_globally_ \projlib_language_str_to_languagename:n { #1 } : } \cs_if_exist_use:c { g_projlib_language_linespacing_ \projlib_language_str_to_languagetype:n { #1 } _tl } \cs_if_exist_use:c { g_projlib_language_parindent_ \projlib_language_str_to_languagetype:n { #1 } _tl } + \tl_set:Ne \l_projlib_language_current_languagetype_tl { \projlib_language_str_to_languagetype:n { #1 } } } { \msg_warning:nnn { projlib-language } { language-not-enabled } { #1 } diff --git a/macros/latex/contrib/projlib/README.md b/macros/latex/contrib/projlib/README.md index c4180e6721..b1ef5e5b4b 100644 --- a/macros/latex/contrib/projlib/README.md +++ b/macros/latex/contrib/projlib/README.md @@ -5,7 +5,7 @@ # The `ProjLib` Toolkit -> **This bundle is dated 2023/09/26.** +> **This bundle is dated 2023/09/28.** > **New documentations are still being written. For now, only the core code is included in TeX Live 2023 (old documentations have been removed from the distribution).** |