diff options
Diffstat (limited to 'macros/latex/required/l3kernel/l3legacy.dtx')
-rw-r--r-- | macros/latex/required/l3kernel/l3legacy.dtx | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/macros/latex/required/l3kernel/l3legacy.dtx b/macros/latex/required/l3kernel/l3legacy.dtx new file mode 100644 index 0000000000..ed7dadf222 --- /dev/null +++ b/macros/latex/required/l3kernel/l3legacy.dtx @@ -0,0 +1,161 @@ +% \iffalse meta-comment +% +%% File: l3legacy.dtx +% +% Copyright (C) 2019-2024 The LaTeX Project +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file +% +% https://www.latex-project.org/lppl.txt +% +% This file is part of the "l3kernel bundle" (The Work in LPPL) +% and all files in that bundle must be distributed together. +% +% ----------------------------------------------------------------------- +% +% The development version of the bundle can be found at +% +% https://github.com/latex3/latex3 +% +% for those people who are interested. +% +%<*driver> +\documentclass[full,kernel]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \pkg{l3legacy} module\\ Interfaces to legacy concepts^^A +% } +% +% \author{^^A +% The \LaTeX{} Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2024-04-11} +% +% \maketitle +% +% \begin{documentation} +% +% There are a small number of \TeX{} or \LaTeXe{} concepts which are not used +% in \pkg{expl3} code but which need to be manipulated when working as a \LaTeXe{} +% package. To allow these to be integrated cleanly into \pkg{expl3} code, a set +% of legacy interfaces are provided here. +% +% \begin{function}[EXP,pTF]{\legacy_if:n} +% \begin{syntax} +% \cs{legacy_if_p:n} \Arg{name} +% \cs{legacy_if:nTF} \Arg{name} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests if the \LaTeXe{}/plain \TeX{} conditional (generated by \tn{newif}) +% is \texttt{true} or \texttt{false} and branches accordingly. The +% \meta{name} of the conditional should \emph{omit} the leading \texttt{if}. +% \end{function} +% +% \begin{function}[added = 2021-05-10] +% { +% \legacy_if_set_true:n, \legacy_if_set_false:n, +% \legacy_if_gset_true:n, \legacy_if_gset_false:n +% } +% \begin{syntax} +% \cs{legacy_if_set_true:n} \Arg{name} +% \cs{legacy_if_set_false:n} \Arg{name} +% \end{syntax} +% Sets the \LaTeXe{}/plain \TeX{} conditional |\if|\meta{name} +% (generated by \tn{newif}) to be \texttt{true} or \texttt{false}. +% \end{function} +% +% \begin{function}[added = 2021-05-10]{\legacy_if_set:nn, \legacy_if_gset:nn} +% \begin{syntax} +% \cs{legacy_if_set:nn} \Arg{name} \Arg{boolexpr} +% \end{syntax} +% Sets the \LaTeXe{}/plain \TeX{} conditional |\if|\meta{name} +% (generated by \tn{newif}) to the result of evaluating the +% \meta{boolean expression}. +% \end{function} +% +% \end{documentation} +% +% \begin{implementation} +% +% \section{\pkg{l3legacy} implementation} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=legacy> +% \end{macrocode} +% +% \begin{macro}[EXP,pTF]{\legacy_if:n} +% A friendly wrapper. We need to use the \cs{if:w} approach here, rather than +% testing against \tn{iftrue}/\tn{iffalse} as the latter approach fails for +% primitive conditionals such as \tn{ifmmode}. The \cs{reverse_if:N} here +% means that we get a slightly more useful error if the name is undefined. +% \begin{macrocode} +\prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF } + { + \exp_after:wN \reverse_if:N + \cs:w if#1 \cs_end: + \prg_return_false: + \else: + \prg_return_true: + \fi: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { +% \legacy_if_set_true:n, \legacy_if_set_false:n, +% \legacy_if_gset_true:n, \legacy_if_gset_false:n +% } +% A friendly wrapper. +% \begin{macrocode} +\cs_new_protected:Npn \legacy_if_set_true:n #1 + { \cs_set_eq:cN { if#1 } \if_true: } +\cs_new_protected:Npn \legacy_if_set_false:n #1 + { \cs_set_eq:cN { if#1 } \if_false: } +\cs_new_protected:Npn \legacy_if_gset_true:n #1 + { \cs_gset_eq:cN { if#1 } \if_true: } +\cs_new_protected:Npn \legacy_if_gset_false:n #1 + { \cs_gset_eq:cN { if#1 } \if_false: } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\legacy_if_set:nn, \legacy_if_gset:nn} +% A more elaborate wrapper. +% \begin{macrocode} +\cs_new_protected:Npn \legacy_if_set:nn #1#2 + { + \bool_if:nTF {#2} \legacy_if_set_true:n \legacy_if_set_false:n + {#1} + } +\cs_new_protected:Npn \legacy_if_gset:nn #1#2 + { + \bool_if:nTF {#2} \legacy_if_gset_true:n \legacy_if_gset_false:n + {#1} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex |