% \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} % % \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-03-14} % % \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} % % \end{macrocode} % % \end{implementation} % % \PrintIndex