From a4e931576165d0a4a143915f4725399272e06fee Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Tue, 5 Apr 2022 03:01:24 +0000 Subject: CTAN sync 202204050301 --- macros/latex/contrib/scontents/README.md | 47 +- macros/latex/contrib/scontents/scontents.dtx | 731 ++++++++++++++------------- macros/latex/contrib/scontents/scontents.ins | 10 +- macros/latex/contrib/scontents/scontents.pdf | Bin 373717 -> 385642 bytes 4 files changed, 413 insertions(+), 375 deletions(-) (limited to 'macros/latex/contrib/scontents') diff --git a/macros/latex/contrib/scontents/README.md b/macros/latex/contrib/scontents/README.md index fe1c537bf1..95b0291960 100644 --- a/macros/latex/contrib/scontents/README.md +++ b/macros/latex/contrib/scontents/README.md @@ -1,42 +1,48 @@ ## scontents — Stores LaTeX contents in memory or files -- Version: 1.9 -- Date: 2020-01-21 -- Author: Pablo González + +Release v2.0 \[2022-04-04\] ## Description + This package allows to store `LaTeX` code, including _"verbatim"_, in <sequences> using the `l3seq` module of `expl3`. The <stored content> can be used as many times as desired in the document, additionally you can write to <external files> or show it in <verbatim style>. ## Requirements + The package loads and depends on updated versions of: - [expl3](https://ctan.org/pkg/expl3) - [l3keys2e](https://ctan.org/pkg/l3keys2e) -- [xparse](https://ctan.org/pkg/xparse) ## Installation -The package `scontents` is present in `TeXLive` and `MiKTeX`, use the +The package `scontents` is present in `TeX Live` and `MiKTeX`, use the package manager to install. -For manual installation, download `scontents.zip` and unzip it, +For manual installation, download [scontents.zip](http://mirrors.ctan.org/macros/latex/contrib/scontents.zip) and unzip it, then run: + ``` -$ pdftex scontents.ins +$ luatex scontents.ins ``` -and move all files to appropriate locations: + +Now the different files must be moved into the different directories in your +installation `TDS` tree or in your `TEXMFHOME`: + ``` - scontents.tex -> TDS:tex/generic/scontents/ - scontents-code.tex -> TDS:tex/generic/scontents/ - scontents.sty -> TDS:tex/latex/scontents/ - t-scontents.mkiv -> TDS:tex/context/third/scontents/ - scontents.pdf -> TDS:doc/latex/scontents/ - README.md -> TDS:doc/latex/scontents/ - scontents.dtx -> TDS:source/latex/scontents/ - scontents.ins -> TDS:source/latex/scontents/ + scontents.tex -> TDS:tex/generic/scontents/scontents.tex + scontents-code.tex -> TDS:tex/generic/scontents/scontents-code.tex + scontents.sty -> TDS:tex/latex/scontents/scontents.sty + t-scontents.mkiv -> TDS:tex/context/third/scontents/t-scontents.mkiv + scontents.pdf -> TDS:doc/latex/scontents/scontents.pdf + scontents.dtx -> TDS:source/latex/scontents/scontents.dtx + scontents.ins -> TDS:source/latex/scontents/scontents.ins ``` -then run `mktexlsr`. + +then run `mktexlsr`. To produce the documentation with source code run `luatex scontents.ins` and +`lualatex scontents.dtx` three times. + ## Examples The file <scontents.pdf> contains attached examples, which can be extracted @@ -45,14 +51,21 @@ from the PDF viewer or from the command line by running: ``` $ pdfdetach -saveall scontents.pdf ``` + and then you can use the excellent `arara` tool to compile them. ## License + The scontents package may be modified and distributed under the terms and conditions of the [LaTeX Project Public License](https://www.latex-project.org/lppl/), version 1.3c or greater. ## Contents + - README.md (this file) - scontents.pdf (documentation) - scontents.dtx (master file that produced all files) - scontents.ins (installer to extract all files) + +## Author and copyright + +Copyright 2019-2022 by Pablo González L. diff --git a/macros/latex/contrib/scontents/scontents.dtx b/macros/latex/contrib/scontents/scontents.dtx index f13db2db83..d82fec48c0 100644 --- a/macros/latex/contrib/scontents/scontents.dtx +++ b/macros/latex/contrib/scontents/scontents.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2020 by Pablo González L +% Copyright (C) 2019-2022 by Pablo González L % % This work may be distributed and/or modified under the conditions of the % LaTeX Project Public License, either version 1.3c of this license or (at @@ -32,23 +32,27 @@ % so that entries written to both streams end up in the same file. \usepackage[english]{babel} \usepackage[top=0.5in,bottom=0.3in,left=2in,right=0.7in,footskip=0.2in,headheight=1cm,headsep=0.27cm]{geometry} -\usepackage[osf,mono=false,scale=0.95,llscaled=0.95]{libertine} +\usepackage[osf,nomath,mono=false,ScaleSF=0.95,ScaleRM=0.95]{libertinus-otf} +% Set Monospace font, fix 'quotes' in verbatim +\usepackage{sourcecodepro} +\defaultfontfeatures[\ttfamily] + { + Numbers = OldStyle, + Scale = 0.80, + Extension = .otf, + } \setmonofont[ - Numbers = OldStyle, - Scale = 0.80, UprightFont = *-Regular, ItalicFont = *-RegularIt, BoldFont = *-Semibold, BoldItalicFont = *-SemiboldIt, - RawFeature = {+zero,+ss06}, - FontFace = {m}{sc}{LinBiolinum_R.otf}, - Extension = .otf]{SourceCodePro} -\newfontfamily\sourcecodeprolight{SourceCodePro-Regular.otf}[ + RawFeature = {+zero,+ss06}]{SourceCodePro} +\newfontfamily\mysourcecodeprolight{SourceCodePro-Regular.otf}[ Scale = 0.80,FakeStretch =0.75, FontFace = {m}{it}{Font =SourceCodePro-RegularIt.otf,Color=FF0000}] \RenewDocumentCommand{\MacroLongFont}{} { - \sourcecodeprolight\small + \mysourcecodeprolight\small } % The character of visible space is now taken from Latin Modern Mono % to prevent fonts in T1. The original definition for xetex/luatex is @@ -69,12 +73,13 @@ \newfontfamily\fetamontotf{ffmw10.otf}[ Scale = 0.95,% RawFeature = {+latn,+rand,+kern,+size},% - FontFace = {bx}{n}{ffmw10.otf}, + FontFace = {b}{n}{ffmw10.otf},% fix raplece font ] \usepackage[svgnames]{xcolor} \usepackage[sf,bf,compact,medium,pagestyles]{titlesec} -\usepackage{lastpage,imakeidx,microtype,attachfile2} -\usepackage{adjustbox,multicol,listings,accsupp,titletoc,hypdestopt} +\usepackage{lastpage,microtype,attachfile2} +\usepackage{adjustbox,multicol,listings,accsupp,titletoc} +\usepackage{imakeidx} \usepackage{scontents} % main \usepackage[contents]{colordoc} % \show\docCodelineNo @@ -102,6 +107,21 @@ |catcode`| 12|gdef|sxmacro@code#1% \end{macrocode*}[|liii@xmacro@code[#1]|end[macrocode*]] |endgroup +% Patching colordoc.sty to work with doc v3 (TeX Live 2022 & lualatex-dev) +\usepackage{etoolbox} +\makeatletter +\@ifpackagelater{doc}{2022-06-01}% + {\patchcmd\macro@finish + {\ifnot@excluded % \if + \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}% + \@tempa \fi}% + {\maybe@index@macro \macro@namepart} + {}{\FAILED}% + \let\default@color\current@color + }% + {} +\makeatother + \EnableCrossrefs % \PageIndex % \CodelineIndex undoes what \PageIndex does % \CodelineIndex tries to open another write stream for the index file. We don't @@ -128,8 +148,8 @@ \ExplSyntaxOff \indexsetup{level=\section,firstpagestyle=myheader,othercode=\pagestyle{myheader}} -\makeindex[name=userdoc,options=-s gind.ist,columnsep=15pt,title={Index of Documentation}] -\makeindex[options=-s gind.ist,columnsep=15pt,title={Index of Implementation}] +\makeindex[name=userdoc,options={-q -s gind.ist},columnsep=15pt,title={Index of Documentation}] +\makeindex[options={-q -s gind.ist},columnsep=15pt,title={Index of Implementation}] % Now, after imakeidx opens the write stream for the index file, we copy % the reference to \@indexfile: \makeatletter @@ -420,7 +440,7 @@ % Reserved words 6 (optcolor) keywordstyle = [6]{\color{optcolor}},% keywords = [6]{store-cmd,store-env,print-env,print-cmd,write-env,% - start,stopt,wrapper,sep,step,before,after,write-out,% + start,stopt,wrapper,sep,step,before,after,write-out,write-cmd,% overwrite,width-tab,force-eol,inner,outer,I,J,M,L,Ascheol},% % Reserved words 7 (OrangeRed) keywordstyle = [7]{\color{OrangeRed}},% @@ -501,18 +521,18 @@ \lstMakeShortInline[language=scontents-doc,basicstyle=\ttfamily]§ % Get file info -\GetFileInfo{\jobname.sty} +\GetFileInfo{scontents.sty} % Config hyperref \hypersetup{ allcolors = linkcolor, - colorlinks = true,% - linktoc = all,% - pdftitle = {.:: The scontents package --- \fileinfo{} ::.},% + colorlinks = true, + linktoc = all, + pdftitle = {.:: The scontents package --- \fileinfo{} ::.}, pdfauthor = {Pablo González L}, - pdfsubject = {Documentation for \fileversion{} [\filedate] },% - pdfkeywords = {sequences, contents, external files, expl3, xparse, l3seq, store contents}, - bookmarksopenlevel = 1,% + pdfsubject = {Documentation for \fileversion{} [\filedate] }, + pdfkeywords = {sequences, contents, external files, expl3, l3seq, store contents}, + bookmarksopenlevel = 1 } % Configuration titleps and titlesec @@ -530,7 +550,7 @@ } \setfoot{\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax% \parbox{1.93\paperwidth}{\hfil\thepage\,/\,\pageref{LastPage}}}}% - {\parbox{\textwidth}{\raggedright \textcolor{gray}{\raisebox{-1pt}{\textcopyright}{}2019--2020 by Pablo González}}}% + {\parbox{\textwidth}{\raggedright \textcolor{gray}{\raisebox{-1pt}{\textcopyright}{}2019--2022 by Pablo González}}}% {}% \sethead{\llap{\raisebox{0.55cm}{\parbox{\dimexpr\oddsidemargin+1in\relax}{\makebox[0pt][l]{\hspace{15pt}\pkglogo\space\fileversion}}}}} {\raisebox{0.55cm}{\parbox{\textwidth}{\hspace*{-\oddsidemargin}\centering\small\S.\thesection\space\sectiontitle}}}% @@ -580,12 +600,12 @@ % \scalebox{1.57}{\pkglogo}\\[2pt] % \Large % \textsf{Stores \hologo{LaTeX}}{ \fetamontotf{contents} }\\[3pt] -% \fileversion{} --- \filedate\thanks{ +% \fileversion \quad \filedate\thanks{ % This file describes a documentation for \fileversion, last revised % \filedate.}\\[25pt] % \author{ % \large -% \raisebox{-1pt}{\textcopyright}{}2019--2020 by Pablo González\thanks{ +% \raisebox{-1pt}{\textcopyright}{}2019--2022 by Pablo González\thanks{ % E-mail: \textcolor{OrangeRed}{\textsf{\guillemotleft}}\email{pablgonz@educarchile.cl}\textcolor{OrangeRed}{\textsf{\guillemotright}}. % }% % } @@ -610,12 +630,23 @@ % % \setlength{\parskip}{3pt} % +% \section{Description of the package} +% +% \begin{scontents}[store-env=description, print-env=true] +% The \mypkg*{scontents} package allows to \mymeta{store contents} in \mymeta{sequences} +% or \mymeta{external files}. In some ways it is similar to the \mypkg{filecontentsdef} +% package, with the difference in which the \mymeta{content} is stored. The idea behind +% this package is to get an approach to \hologo{ConTeXt} \enquote{\emph{buffers}} by +% making use \mymeta{sequences}. +% \end{scontents} +% % \section{Motivation and Acknowledgments} % % In \hologo{LaTeX} there is no direct way to record content for later use, although % you can do this using §\macros§, recording \mymeta[type=rm]{verbatim content} is a -% problem, usually you can avoid this by creating external files or boxes. The -% general idea of this package is to try to imitate this implementation +% problem, usually you can avoid this by creating external files or boxes. +% +% The general idea of this package is to try to imitate this implementation % \enquote{\emph{buffers}} that has \hologo{ConTeXt} which allows you to save content in % memory, including \emph{verbatim}, to be used later. The package % \mypkg{filecontentsdef} solves this problem and since \mypkg{expl3} has an @@ -625,7 +656,7 @@ % Fran\c{c}ois Burnol} who was kind enough to take my requirements into account % and add the \myenv{filecontentsdefmacro} environment. Also a special thanks to % Phelype Oleinik who has collaborated and adapted a large part of the code and -% all \hologo{LaTeX3} team for their great work and to the different members +% all \hologo{LaTeX} team for their great work and to the different members % of the \href{https://tex.stackexchange.com}{TeX-SX} community who have provided % great answers and ideas. Here a note of the main ones: % @@ -641,6 +672,10 @@ % \item \href{https://tex.stackexchange.com/q/373647/7832}{Collect contents of an environment (that contains verbatim content)} % \end{enumerate} % +% \thispagestyle{plain} +% \newpage +% \pagestyle{myheader} +% % \section{License and Requirements} % \label{sec:licence} % @@ -649,30 +684,41 @@ % (\url{http://www.latex-project.org/lppl.txt}). The software has the status % \enquote{maintained}. % -% \medskip -% -% The \mypkg*{scontents} package loads \mypkg{expl3}, \mypkg{xparse} and +% The \mypkg*{scontents} package loads \mypkg{expl3} (minimum version 2020-02-08) and % \mypkg{l3keys2e}. This package can be used with "plain", "context", "xelatex", % "lualatex", "pdflatex" and the classical workflow §latex>dvips>ps2pdf§. % -% \thispagestyle{plain} -% -% \newpage -% -% \pagestyle{myheader} -% % \section{The \texttt{scontents} package} % \label{sec:pkgscontents} % -% \subsection{Description of the package and load} +% \subsection{Installation} % -% \begin{scontents}[store-env=description, print-env=true] -% The \mypkg*{scontents} package allows to \mymeta{store contents} in \mymeta{sequences} -% or \mymeta{external files}. In some ways it is similar to the \mypkg{filecontentsdef} -% package, with the difference in which the \mymeta{content} is stored. The idea behind -% this package is to get an approach to \hologo{ConTeXt} \enquote{\emph{buffers}} by -% making use \mymeta{sequences}. -% \end{scontents} +% The package \mypkg*{scontents} is present in \hologo{TeX} Live and \hologo{MiKTeX}, +% use the package manager to install. For manual installation, download +% \href{https://mirrors.ctan.org/macros/latex/contrib/scontents.zip}{scontents.zip} +% and unzip it, run \lstinline[language=scontents-doc,basicstyle=\ttfamily]+luatex scontents.ins+ +% and move all files to appropriate locations, then run "mktexlsr". To produce the documentation +% with source code run \lstinline[language=scontents-doc,basicstyle=\ttfamily]+luatex scontents.ins+ and +% "lualatex scontents.dtx" three times. +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single,language={}] + scontents.tex > TDS:tex/generic/scontents/ + scontents-code.tex > TDS:tex/generic/scontents/ + scontents.sty > TDS:tex/latex/scontents/ + t-scontents.mkiv > TDS:tex/context/third/scontents/ + scontents.pdf > TDS:doc/latex/scontents/ + README.md > TDS:doc/latex/scontents/ + scontents.dtx > TDS:source/latex/scontents/ + scontents.ins > TDS:source/latex/scontents/ +\end{examplecode} +% \iffalse +% +% \fi +% +% \subsection{Loading and options} % % The package is loaded in the usual way: % @@ -731,10 +777,10 @@ % % Some users use horizontal "TAB"s \enquote{\LKeyTab} from keyboard to indented the source % code of the document and depending on the text editor used, some will use real "TAB"s -% (\enquote{hard tabs}), others with \enquote{soft tabs}(\verb*| | or \verb*| |) +% (\enquote{\emph{hard tabs}}), others with \enquote{\emph{soft tabs}}(\verb*| | or \verb*| |) % or both. % -% At first glance it may seem the same, but the way in which "TAB"s (\enquote{hard tabs}) +% At first glance it may seem the same, but the way in which "TAB"s (\enquote{\emph{hard tabs}}) % are processed according to the context in which they are found within % a file, both in \mymeta{reading}\footnote{Check the answer given by Ulrich Diez % in \href{https://tex.stackexchange.com/a/508103/7832}{Keyboard TAB @@ -746,7 +792,7 @@ % are treated as explicit spaces (in most contexts) and is the behavior when % \mymeta{stored contents}, but when \mymeta{writing files} these are preserved. % -% With a \hologo{TeX}Live distribution, the "TAB" character is \enquote{printable} +% With a \hologo{TeX} Live distribution, the "TAB" character is \enquote{\emph{printable}} % for "latex", "pdflatex" and "lualatex", but if you use "xelatex" you % must add the \texttt{\textcolor{optcolor}{-8bit}} option on the command % line, otherwise you will get \hologo{TeX}-"TAB" (§^^I§) in the \mymeta{output file}. @@ -796,7 +842,7 @@ % environment and the \mykey{store-cmd} key of the \ics*{Scontents} command. This key is % only available as a package option or using \ics*{setupsc}. % -% \newpage +% \medskip % % \keyexamp{overwrite}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} % Sets whether the \mymeta{files} generated by \mykey{write-out} and \mykey{write-env} @@ -1198,7 +1244,6 @@ This text is in the outer environment (after nested). % stored in the \mymarg{seq name}. The key \mykey{width-tab} is available for % this command. % -% % \subsection{The environment \env{verbatimsc}} % \label{sec:verbatimsc} % @@ -1209,14 +1254,11 @@ This text is in the outer environment (after nested). % contents. % \end{function} % -% One consideration to keep in mind is that this is a \emph{representation} -% of the \mymeta{stored content} in a \emph{verbatim} environment and not -% a real \emph{verbatim} environment. The \mypkg{verbatim} package is not -% compatible with the implementation of the \myenv*{verbatimsc} environment. +% One consideration to keep in mind is that this is a \enquote{\emph{representation}} +% of the \mymeta{stored content} in a \enquote{\emph{verbatim}} environment. % -%^^A \newpage -% -% The \myenv*{verbatimsc} environment can be customized in the following ways: +% The \myenv*{verbatimsc} environment can be customized in the +% following ways after loading the \mypkg*{scontents} package: % % Using the package \mypkg{fancyvrb}: % \iffalse @@ -1227,6 +1269,7 @@ This text is in the outer environment (after nested). \let\verbatimsc\@undefined \let\endverbatimsc\@undefined \makeatother +\usepackage{fancyvrb} \DefineVerbatimEnvironment{verbatimsc}{Verbatim}{numbers=left} \end{examplecode} % \iffalse @@ -1624,7 +1667,6 @@ This is from the verbatim environment: % \textattachfile[color=linkcolor,print=false]{scexamp5.ltx}{\faFile*[regular]}. % \lstinputlisting[language=scontents-doc,numbers=left]{scexamp5.ltx} % -% % \subsubsection*{Example 6} % % \iffalse @@ -1796,7 +1838,7 @@ and more.+ %<*example> % \fi \begin{scontents}[write-out=scexamp9.ltx] -% arara: xelatex : {shell: true, options: [-8bit]} +% arara: xelatex: {shell: true, options: [-8bit]} % arara: clean: { extensions: [ aux, log] } \documentclass{article} \usepackage{scontents} @@ -1852,7 +1894,6 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \newpage % -% % \section{Change history} % \label{sec:changes} % @@ -1864,11 +1905,18 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \setlist[itemize,1]{label=\textendash,wide=0.5em,nosep,noitemsep,leftmargin=10pt} % \newlength\descrwidth -% \settowidth{\descrwidth}{\textsf{v1.0, (ctan), 2019-07-30} } +% \settowidth{\descrwidth}{\textsf{v1.0a, (ctan), 2019-07-30} } % % \begin{description}[font=\small\sffamily,wide=0pt,style=multiline,leftmargin=\descrwidth,nosep,noitemsep] % \item [\fileversion{} (ctan), \filedate] % \begin{itemize} +% \item Adapting the |verbatimsc| environment (compatibility |verbatim| package). +% \item Removed compatibility layer for older \hologo{LaTeX} releases. +% \item Fix loader in \hologo{plainTeX} and \hologo{ConTeXt}. +% \item Minor adjustments in the documentation. +% \end{itemize} +% \item [v1.9 (ctan), 2020-01-21] +% \begin{itemize} % \item Update and improvements in the internal code. % \item Updating the generic code for |I/O| verification. % \item Add |write-cmd| and |write-out| keys for |\Scontents*|. @@ -1916,7 +1964,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \item Added |force-eol|, |verb-font| and |width-tab| keys. % \item The extra space has been removed when you run |\getstored|. % \item Internal code has been rewritten more efficiently. -% \item Remove |\typestored|. +% \item Remove starred argument for |\typestored|. % \item Remove |filecontentsdef| dependency. % \item Changing |\regex_replace_all:| for |\tl_replace_all:|. % \end{itemize} @@ -1948,15 +1996,15 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \def\section*#1{\stdsection{#1}} % % \begin{thebibliography}{9} -% \bibitem{expl3} The \hologo{LaTeX3} Project. \enquote{The \textsf{expl3} +% \bibitem{expl3} The \hologo{LaTeX} Project. \enquote{The \textsf{expl3} % package}. Available from % \textsc{ctan}, \url{https://www.ctan.org/pkg/expl3}, 2020. % -% \bibitem{xparse} The \hologo{LaTeX3} Project. \enquote{The \textsf{xparse} +% \bibitem{xparse} The \hologo{LaTeX} Project. \enquote{The \textsf{xparse} % package}. Available from % \textsc{ctan}, \url{https://www.ctan.org/pkg/xparse}, 2020. % -% \bibitem{l3keys} The \hologo{LaTeX3} Project. \enquote{The \textsf{l3keys2e} +% \bibitem{l3keys} The \hologo{LaTeX} Project. \enquote{The \textsf{l3keys2e} % package}. Available from % \textsc{ctan}, \url{https://www.ctan.org/pkg/l3keys2e}, 2020. % @@ -2005,38 +2053,30 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % Now we define some common macros to hold the package date and version: % \begin{macrocode} -%\def\ScontentsFileDate{2020-01-21}% -%\def\ScontentsCoreFileDate{2020-01-21}% +%\def\ScontentsFileDate{2022-04-04}% +%\def\ScontentsCoreFileDate{2022-04-04}% %<*loader> -\def\ScontentsFileVersion{1.9}% +\def\ScontentsFileVersion{2.0}% \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}% % \end{macrocode} % % The \LaTeX{} loader is fairly simple: just load the dependencies, load the % core code, and then set interfaces up. % -% We also check if the \pkg{verbatim} package is loaded and show a compatibility -% warning. % \begin{macrocode} %<*latex> -\RequirePackage{expl3,xparse,l3keys2e}[2019/05/28] +\RequirePackage{l3keys2e}[2020/02/08] \ProvidesExplPackage {scontents} {\ScontentsFileDate} {\ScontentsFileVersion} {\ScontentsFileDescription} -\@ifpackageloaded { verbatim } - { - \msg_set:nnn { scontents } { unsupported-verbatim } - { - The~implementation~of~the~'verbatimsc'~environment~used~by~ - \iow_char:N \\typestored~is~not~compatible~with~package~'verbatim'.~ - Review~the~documentation~and~redefine~the~'verbatimsc'~environment. - } - \msg_warning:nn { scontents } { unsupported-verbatim } - } { } % % \end{macrocode} -% The Plain and \hologo{ConTeXt} loaders are similar (probably because I don't -% know how to make a proper \hologo{ConTeXt} module :-). We define a -% \LaTeX{}-style §\ver@scontents.sty§ macro with version info (just in case): +% +% The \hologo{plainTeX} and \hologo{ConTeXt} loaders are similar +% (probably because I don't know how to make a proper \hologo{ConTeXt} +% module :-). We define a \LaTeX{}-style §\ver@scontents.sty§ macro with +% version info (just in case) and add §\ExplSyntaxOn§ to be able to load +% \pkg{xparse} later. +% % \begin{macrocode} %<*!latex> %\writestatus{loading}{User Module scontents v\ScontentsFileVersion} @@ -2049,8 +2089,8 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \end{macrocode} % -% In Plain, check that the package isn't being loaded twice (\LaTeX{} and -% \hologo{ConTeXt} already defend against that): +% In \hologo{plainTeX}, check that the package isn't being loaded twice +% (\LaTeX{} and \hologo{ConTeXt} already defend against that): % \begin{macrocode} %<*plain> \msg_gset:nnn { scontents } { already-loaded } @@ -2064,14 +2104,18 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \end{macrocode} % -% \begin{macro}{\g_@@_end_verbatimsc_tl,\c_@@_end_env_tl} -% A token list to match when ending \env{verbatimsc} and \env{scontents} -% environments. +% \subsection{Definition of variables by format} +% +% We define and set variables that must be handled separately in order +% to work properly with \hologo{plainTeX}, \hologo{ConTeXt} and \LaTeX. +% +% \begin{macro}{\g_@@_end_verbatimsc_tl} +% A global token list \cs{g_@@_end_verbatimsc_tl} match when ending +% \env{verbatimsc} environment. % % \begin{macrocode} \tl_new:N \g_@@_end_verbatimsc_tl -\tl_gset_rescan:Nnn - \g_@@_end_verbatimsc_tl +\tl_gset_rescan:Nnn \g_@@_end_verbatimsc_tl { \char_set_catcode_other:N \\ %<*latex> @@ -2082,6 +2126,16 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % { \end{verbatimsc} } % { \endverbatimsc } % { \stopverbatimsc } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c_@@_end_env_tl,\l_@@_env_name_tl} +% A token list \cs{c_@@_end_env_tl} match when ending environments +% defined by \cs{newenvsc}, \cs{l_@@_env_name_tl} storing the name +% of environments defined by \cs{newenvsc}. +% +% \begin{macrocode} +\tl_new:N \l_@@_env_name_tl \tl_const:Nx \c_@@_end_env_tl { \c_backslash_str @@ -2099,13 +2153,15 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \file_input:n { scontents-code.tex } % \end{macrocode} % -% Sometimes we need to detect the format from within a macro: +% \begin{macro}{\@@_format_case:nnn} +% Sometimes we need to detect the format from within a macro: % \begin{macrocode} \cs_new:Npn \@@_format_case:nnn #1 #2 #3 % {#1} % LaTeX % {#2} % Plain/Generic % {#3} % ConTeXt % \end{macrocode} +% \end{macro} % % Checking that the package was loaded with the proper loader code. This code % was copied from \texttt{expl3-code.tex}. @@ -2156,10 +2212,45 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \next % \end{macrocode} % -% \subsection{Definition of common keys} +% \subsection{Definition of temporary variables} +% +% \begin{macro}{\l_@@_macro_tmp_tl,\l_@@_temp_tl,\g_@@_temp_tl,\l_@@_tmpa_int, +% \l_@@_temp_bool} +% The token list \cs{l_@@_macro_tmp_tl} is a temporary token list to +% hold the contents of the macro/environment. \cs{l_@@_temp_tl}, +% \cs{g_@@_temp_tl}, \cs{l_@@_tmpa_int} and \cs{l_@@_temp_bool} are +% generic temporary vars. +% \begin{macrocode} +\tl_new:N \l_@@_macro_tmp_tl +\tl_new:N \l_@@_temp_tl +\tl_new:N \g_@@_temp_tl +\int_new:N \l_@@_tmpa_int +\bool_new:N \l_@@_temp_bool +% \end{macrocode} +% \end{macro} % -% We create some common \mymeta{keys} that will be used by the options passed to -% the package as well as by the environments and commands defined. +% \subsection{Compatibility layer with \hologo{plainTeX} and \hologo{ConTeXt}} +% +% When loading the package outside of \LaTeX{} we can't usually use +% \pkg{xparse}. However since \pkg{xparse} now \pkg{ltcmd} is part of +% the \LaTeX{} kernel is loadable in any format. +% +% \begin{macrocode} +% +%<*loader&!latex> +\int_set:Nn \l_@@_tmpa_int { \char_value_catcode:n { `\@ } } +\char_set_catcode_letter:N \@ +\file_input:n { xparse-generic.tex } +\char_set_catcode:nn { `\@ } { \l_@@_tmpa_int } +% +%<*core> +% \end{macrocode} +% +% \subsection{Definition of keys for the package} +% +% We create some common \mymeta{keys} that will be used by the options +% passed to the package as well as by the environments and commands +% defined. % % \begin{macrocode} \keys_define:nn { scontents } @@ -2198,74 +2289,78 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % { verb-font .initial:n = \tt } % \end{macrocode} % -% In \LaTeX{} mode we load \mypkg{l3keys2e} process the \mymeta{keys} as options -% passed on to the package, the package \pkg{l3keys2e} will verify the -% \mymeta{keys} and will return an error when they are \emph{unknown}. +% In \LaTeX{} mode we load \mypkg{l3keys2e} process the \mymeta{keys} +% as options passed on to the package, the package \pkg{l3keys2e} will +% verify the \mymeta{keys} and will return an error when they are +% \emph{unknown}. % \begin{macrocode} %\ProcessKeysOptions { scontents } %<*core> % \end{macrocode} % -% \subsection{Internal variables} +% \subsection{Internal variables and utility functions} +% +% \begin{macro}{\l_@@_fname_out_tl,\l_@@_every_line_env_tl,\l_@@_file_iow} +% The token list \cs{l_@@_fname_out_tl} is used for store the name of +% the \meta{output file}, when there's one. Its value is set by the +% keys §write-env§, §write-out§ and §write-cmd§. +% +% The token list \cs{l_@@_every_line_env_tl} holds the contents of an +% environment, \env{scontents} by default, as it's being read. +% \cs{l_@@_file_iow} is an output stream for saving the contents of an +% environment (or command) to a file. % -% Now we declare the internal variables we will use. +% This variables is used by the function \cs{@@_file_tl_write_start:n} +% (see \ref{the:environment:itself}). % -% \begin{macro}{\l_@@_macro_tmp_tl,\l_@@_fname_out_tl,\l_@@_temp_tl, -% \l_@@_file_tl,\g_@@_temp_tl,\l_@@_foreach_name_seq_tl, -% \l_@@_foreach_before_tl,\l_@@_foreach_after_tl} -% \cs{l_@@_macro_tmp_tl} is a temporary token list to hold the contents -% of the macro/environment, \cs{l_@@_fname_out_tl} is used as the name -% of the output file, when there's one, \cs{l_@@_file_tl} holds the contents -% of an environment as it's being read, and \cs{l_@@_temp_tl} and -% \cs{g_@@_temp_tl} are generic temporary token lists. +% \begin{macrocode} +\tl_new:N \l_@@_fname_out_tl +\tl_new:N \l_@@_every_line_env_tl +\iow_new:N \l_@@_file_iow +% \end{macrocode} +% \end{macro} % +% \begin{macro}{\l_@@_foreach_name_seq_tl,\l_@@_foreach_before_tl,\l_@@_foreach_after_tl} % \cs{l_@@_foreach_name_seq_tl} is the name assigned to the sequence on % which the loop will be made, \cs{l_@@_foreach_before_tl} and \cs{l_@@_foreach_after_tl} % are token lists in which the assigned material will be placed before % and after the execution of the §\foreachsc§ loop. % % \begin{macrocode} -\tl_new:N \l_@@_macro_tmp_tl -\tl_new:N \l_@@_fname_out_tl -\tl_new:N \l_@@_temp_tl -\tl_new:N \l_@@_file_tl -\tl_new:N \g_@@_temp_tl \tl_new:N \l_@@_foreach_name_seq_tl \tl_new:N \l_@@_foreach_before_tl \tl_new:N \l_@@_foreach_after_tl % \end{macrocode} % \end{macro} % -% \begin{macro}{\l_@@_seq_item_int,\l_@@_env_nesting_int,\l_@@_tmpa_int, -% \l_@@_foreach_stop_int} +% \begin{macro}{\l_@@_seq_item_int,\l_@@_env_nesting_int,\l_@@_foreach_stop_int} % \cs{l_@@_seq_item_int} stores the index in the sequence of the item -% requested to \cs{typestored} or \cs{meaningsc}. \cs{l_@@_env_nesting_int} +% requested to §\typestored§ or §\meaningsc§. \cs{l_@@_env_nesting_int} % stores the current nesting level of the \env{scontents} environment. -% \cs{l_@@_foreach_stop_int} will save the value at which the §\foreachsc§ -% loop will stop. +% \cs{l_@@_foreach_stop_int} will save the value at which the §\foreachsc§ +% loop will stop. % % \begin{macrocode} \int_new:N \l_@@_foreach_stop_int \int_new:N \l_@@_seq_item_int \int_new:N \l_@@_env_nesting_int -\int_new:N \l_@@_tmpa_int % \end{macrocode} % \end{macro} % -% \begin{macro}{\l_@@_writing_bool,\l_@@_storing_bool} +% \begin{macro}{\l_@@_writing_bool,\l_@@_storing_bool,\l_@@_writable_bool} % The boolean \cs{l_@@_writing_bool} keeps track of whether we should write % to a file, and \cs{l_@@_storing_bool} determines whether it is in write-only -% mode when the §write-out§ option is used. +% mode when the key §write-out§ is used. % % \begin{macrocode} \bool_new:N \l_@@_writing_bool \bool_set_false:N \l_@@_writing_bool \bool_new:N \l_@@_storing_bool \bool_set_true:N \l_@@_storing_bool +\bool_new:N \l_@@_writable_bool % \end{macrocode} % \end{macro} % -% % \begin{macro}{\l_@@_foreach_before_bool,\l_@@_foreach_after_bool, % \l_@@_foreach_stop_bool,\l_@@_foreach_wrapper_bool} % Boolean variables used by the §\foreachsc§ loop. @@ -2279,7 +2374,6 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \bool_set_false:N \l_@@_foreach_stop_bool \bool_new:N \l_@@_foreach_wrapper_bool \bool_set_false:N \l_@@_foreach_wrapper_bool -\bool_new:N \l_@@_writable_bool % \end{macrocode} % \end{macro} % @@ -2313,20 +2407,25 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % -% \begin{macro}{\l_@@_file_iow} -% An output stream for saving the contents of an environment to a file. +% \begin{macro}{\l_@@_save_sf_int,\l_@@_save_skip} +% Internal variables used by functions \cs{@@_bsphack:} and \cs{@@_esphack:}. % % \begin{macrocode} -\iow_new:N \l_@@_file_iow +\int_new:N \l_@@_save_sf_int +\skip_new:N \l_@@_save_skip % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_rescan_tokens:n} -% \cs{tl_rescan:nn} doesn't fit the needs of this package because -% it does not allow catcode changes inside the argument, so verbatim -% commands used inside one of \mypkg*{scontents}'s commands/environments -% will not work. Here we create a private copy of \cs{tex_scantokens:D} -% which will serve our purposes. +% \begin{macro}{\@@_rescan_tokens:n,\@@_rescan_tokens:x,\@@_rescan_tokens:V} +% The function \cs{tl_rescan:nn} provided by \pkg{expl3} doesn't fit +% the needs of this package because it does not allow catcode changes +% inside the argument, so verbatim commands used inside one of +% \mypkg*{scontents}'s commands/environments will not work. Here we +% create a private copy of \cs{tex_scantokens:D} which will serve our +% purposes. See the answer by Ulrich Diez in +% \href{https://tex.stackexchange.com/a/577183/7832}{How do use +% \{\} in \textbackslash tl_set_rescan:Nnn to replace +% \textbackslash scantokens?} % % \begin{macrocode} \cs_new_protected:Npn \@@_rescan_tokens:n #1 { \tex_scantokens:D {#1} } @@ -2345,7 +2444,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \begin{macro}[int]{\tl_remove_once:NV,\tl_replace_all:Nxx, % \tl_replace_all:Nxn,\tl_replace_all:Nnx,\tl_if_empty:fTF} -% Some nonstandard variants. +% Some nonstandard kernel variants. % % \begin{macrocode} \cs_generate_variant:Nn \tl_remove_once:Nn { NV } @@ -2406,7 +2505,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \bool_set_true:N \l_@@_writing_bool \tl_set:Nn \l_@@_fname_out_tl {#1} }, - write-env .value_required:n = true, + write-cmd .value_required:n = true, write-out .value_required:n = true, print-cmd .meta:nn = { scontents } { print-cmd = #1 }, print-cmd .default:n = true, @@ -2476,7 +2575,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \subsection{Handling undefined keys} % -% The \mymeta{keys} are stored in the token list variable \cs{l_keys_key_tl}, +% The \mymeta{keys} are stored in the token list variable \cs{l_keys_key_str}, % and the value (if any) is passed as an argument to each \mymeta{function}. % % \subsubsection{Undefined keys for environment \env{scontents}} @@ -2490,7 +2589,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \begin{macrocode} \cs_new_protected:Npn \@@_parse_environment_keys:n #1 - { \exp_args:NV \@@_parse_environment_keys:nn \l_keys_key_tl {#1} } + { \exp_args:NV \@@_parse_environment_keys:nn \l_keys_key_str {#1} } \cs_new_protected:Npn \@@_parse_environment_keys:nn #1#2 { \tl_if_blank:nTF {#2} @@ -2511,7 +2610,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \begin{macrocode} \cs_new_protected:Npn \@@_parse_command_keys:n #1 - { \exp_args:NV \@@_parse_command_keys:nn \l_keys_key_tl {#1} } + { \exp_args:NV \@@_parse_command_keys:nn \l_keys_key_str {#1} } \cs_new_protected:Npn \@@_parse_command_keys:nn #1#2 { \tl_if_blank:nTF {#2} @@ -2538,7 +2637,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): { \msg_error:nnnn { scontents } { for-key-value-unknown } {#1} {#2} } } \cs_new_protected:Npn \@@_parse_foreach_keys:n #1 - { \exp_args:NV \@@_parse_foreach_keys:nn \l_keys_key_tl {#1} } + { \exp_args:NV \@@_parse_foreach_keys:nn \l_keys_key_str {#1} } % \end{macrocode} % \end{macro} % @@ -2564,7 +2663,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \begin{macrocode} \cs_new_protected:Npn \@@_parse_type_meaning_key:n #1 - { \exp_args:NV \@@_parse_type_meaning_key:nn \l_keys_key_tl {#1} } + { \exp_args:NV \@@_parse_type_meaning_key:nn \l_keys_key_str {#1} } \cs_new_protected:Npn \@@_parse_type_meaning_key:nn #1#2 { \tl_if_empty:fTF { \int_to_roman:n { -0 #1 } } @@ -2582,123 +2681,15 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % -% \subsection{Compatibility layer with Plain} -% -% When loading the package outside of \LaTeX{} we can't usually use \pkg{xparse}. -% However since \pkg{xparse} doesn't actually hold any dependency with \LaTeX{} -% except for package-loading commands, we can emulate those commands (much like -% in \pkg{miniltx}) so that \pkg{xparse} is loadable in any format. -% -% The bunch of macros below is adapted from the \LaTeX{} kernel (greatly simplified). -% \begin{macrocode} -% -%<*loader&!latex> -\seq_new:N \l_@@_compat_seq -\cs_new_protected:Npn \@@_compat_redefine:Npn #1 - { - \seq_put_right:Nn \l_@@_compat_seq {#1} - \cs_set_eq:cN { @@_saved_\cs_to_str:N #1: } #1 - \cs_new_protected:Npn #1 - } -\cs_new_protected:Npn \@@_compat_restore: - { \seq_map_function:NN \l_@@_compat_seq \@@_compat_restore:N } -\cs_new_protected:Npn \@@_compat_restore:N #1 - { - \cs_set_eq:Nc #1 { @@_saved_\cs_to_str:N #1: } - \cs_undefine:c { @@_saved_\cs_to_str:N #1: } - } -\cs_generate_variant:Nn \@@_compat_redefine:Npn { c } -\cs_new_protected:Npn \@@_optarg:nn #1 #2 - { \peek_charcode_ignore_spaces:NTF [ {#1} {#1[#2]} } -\cs_new_protected:Npn \@@_stararg:nn #1 #2 - { \peek_charcode_remove_ignore_spaces:NTF * {#1} {#2} } -\@@_compat_redefine:Npn \RequirePackage - { \@@_optarg:nn { \@@_require_auxi:wn } { } } -\cs_new_protected:Npn \@@_require_auxi:wn [#1] #2 - { \@@_optarg:nn { \@@_require_auxii:wnw [{#1}]{#2} } { } } -\cs_new:Npn \@@_zap_space:ww #1~#2 - { - #1 \if_meaning:w #2 \q_mark - \exp_after:wN \use_none:n - \else: - \exp_after:wN \@@_zap_space:ww - \fi: #2 - } -\cs_new_protected:Npn \@@_require_auxii:wnw [#1] #2 [#3] - { - \tl_set:Nx \l_@@_temp_tl { \@@_zap_space:ww #2 ~ \q_mark } - \clist_map_function:NN \l_@@_temp_tl \@@_require_auxiii:n - } -\cs_new_protected:Npn \@@_require_auxiii:n #1 - { - \str_if_eq:eeF {expl3} {#1} - { \msg_error:nnn { scontents } { invalid-package } {#1} } - } -\msg_new:nnn { scontents } { invalid-package } - { Package~'#1'~invalid~in~scontents.~This~is~an~error~in~scontents. } -\@@_compat_redefine:cpn { @ifpackagelater } #1 - { \exp_args:Nc \@@_package_later_aux:Nn { ver@#1.sty } } -\cs_new_protected:Npn \@@_package_later_aux:Nn #1 #2 - { - \int_compare:nNnTF - { \exp_after:wN \@@_parse_version:w #1 //00 \q_mark } < - { \exp_after:wN \@@_parse_version:w #2 //00 \q_mark } - } -\cs_new:Npn \@@_parse_version:w #1 { \@@_parse_version_auxi:w 0#1 } -\cs_new:Npn \@@_parse_version_auxi:w #1/#2/#3#4#5 \q_mark - { \@@_parse_version_auxii:w #1-#2-#3#4 \q_mark } -\cs_new:Npn \@@_parse_version_auxii:w #1-#2-#3#4#5 \q_mark - { \tl_if_blank:nF {#2} {#1} #2 #3 #4 } -\@@_compat_redefine:Npn \ProvidesExplPackage #1 #2 #3 #4 - { \@@_provides_aux:nn {#1} { #2 \tl_if_empty:nF {#3} {#3~} #4 } } -\cs_new_protected:Npn \@@_provides_aux:nn #1 #2 - { - \tl_gset:cx { ver@#1.sty } {#2} - \iow_log:n { Package~#1:~#2 } - \ExplSyntaxOn - } -\@@_compat_redefine:Npn \DeclareOption - { \@@_stararg:nn { \use_none:n } { \use_none:nn } } -\@@_compat_redefine:Npn \ProcessOptions - { \@@_stararg:nn { } { } } -% \end{macrocode} -% -% Now that the compatibility layer is defined, we can finally load \pkg{xparse}. -% \pkg{xparse} expects to be loaded with §\ExplSyntaxOff§ (not much harm would -% be done otherwise, but just to be on the safe side). -% -% Within \pkg{xparse} a §\RequirePackage{expl3}§ is done. We can ignore that since -% we have already loaded \pkg{expl3}. Next, a §\@ifpackagelater§ test is done: -% we do that test too to ensure that \pkg{xparse} is compatible with the current -% running version of \pkg{expl3}. The following §\ProvidesExplPackage§ simply -% defines §\ver@xparse.sty§ for any other package that might uset it, and then -% does §\ExplSyntaxOn§. At the end of the package, \pkg{xparse} parses (heh) -% the package options. Since we don't have those in non-\LaTeX{} formats, they are -% ignored. Okay, so load \pkg{xparse}: -% \begin{macrocode} -\int_set:Nn \l_@@_tmpa_int { \char_value_catcode:n { `\@ } } -\char_set_catcode_letter:N \@ -\exp_after:wN -\ExplSyntaxOff -\file_input:n { xparse.sty } -\ExplSyntaxOn -\char_set_catcode:nn { `\@ } { \l_@@_tmpa_int } -\@@_compat_restore: -% -%<*core> -% \end{macrocode} -% (actually we don't need to do §\ExplSyntaxOn§ there because we don't have -% \LaTeX{}'s full package loading mechanism, so the \pkg{expl3} syntax remains -% active after \pkg{xparse} is loaded, but it doesn't harm either). -% % \subsection{Programming of the sequences} % % The storage of the package is done using |seq| variables. Here we % set up the macros that will manage the variables. -% \begin{macro}{\@@_append_contents:nn} -% \cs{@@_append_contents:nn} creates a seq variable if one didn't -% exist and appends the contents in the argument to the right of the -% sequence. +% +% \begin{macro}{\@@_append_contents:nn,\@@_append_contents:Vx} +% The function \cs{@@_append_contents:nn} creates a |seq| variable if +% one didn't exist and appends the contents in the argument to the +% right of the sequence. % % \begin{macrocode} \cs_new_protected:Npn \@@_append_contents:nn #1#2 @@ -2714,7 +2705,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macro} % % \begin{macro}{\@@_getfrom_seq:nn,\@@_getfrom_seq:nnn} -% \cs{@@_getfrom_seq:nn} retrieves the saved item from the +% The function \cs{@@_getfrom_seq:nn} retrieves the saved item from the % sequence. % % \begin{macrocode} @@ -2739,8 +2730,8 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_lastfrom_seq:n} -% \cs{@@_lastfrom_seq:n} retrieves the last saved item from the +% \begin{macro}{\@@_lastfrom_seq:n,\@@_lastfrom_seq:V} +% The function \cs{@@_lastfrom_seq:n} retrieves the last saved item from the % sequence when \cs{l_@@_print_env_bool} or \cs{l_@@_print_cmd_bool} % is true. % @@ -2758,7 +2749,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macro} % % \begin{macro}{\@@_store_to_seq:NN} -% The \cs{@@_store_to_seq:NN} writes the recorded contents +% The function \cs{@@_store_to_seq:NN} writes the recorded contents % in §#1§ to the log and stores it in §#2§. % % \begin{macrocode} @@ -2770,7 +2761,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % -% \subsection{Construction of environment \env{scontents}} +% \subsection{The command \cs{newenvsc} and environment \env{scontents}} % % In order to be able to define environments that behave similarly to % \myenv{scontents}, we define a generic environment and make all other @@ -2778,14 +2769,17 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \subsubsection{The command \cs{newenvsc}} % -% \begin{macro}{\newenvsc,\l_@@_env_name_tl,\@@_scontents_setenv:nn} -% The \cs{newenvsc} command defines two functions \cs[no-index]{@@_\#1_env_begin:} -% and \cs[no-index]{@@_\#1_env_end:}, which set the current environment's -% default properties and then call the generic \cs{@@_env_generic_begin:} and -% \cs{@@_env_generic_end:}. +% \begin{macro}{\newenvsc,\@@_env_setting:nn,\@@_env_define:nnn} +% The internal function \cs{@@_env_setting:nn} defines two +% functions \cs[no-index]{@@_\#1_env_begin:} and +% \cs[no-index]{@@_\#1_env_end:}, which set the current environment's +% name in §#1§ and \cs{l_@@_env_name_tl} and default properties in §#2§ +% then call \cs{@@_setup_verb_processor:}, the generic +% \cs{@@_env_generic_begin:} and \cs{@@_env_generic_end:}. +% +% Finally the function \cs{@@_env_define:nnn} will create the environments. % \begin{macrocode} -\tl_new:N \l_@@_env_name_tl -\cs_new_protected:Npn \@@_scontents_setenv:nn #1 #2 +\cs_new_protected:Npn \@@_env_setting:nn #1 #2 { \cs_new_protected:cpn { @@_#1_env_begin: } { @@ -2803,12 +2797,12 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): } % %<*loader> -\NewDocumentCommand { \newenvsc } { m O{} } +\NewDocumentCommand \newenvsc { m O{} } { % \cs_if_exist:cTF { #1 } % \cs_if_exist:cTF { start #1 } { \msg_error:nnn { scontents } { env-already-defined } {#1} } - { \@@_scontents_setenv:nn {#1} {#2} } + { \@@_env_setting:nn {#1} {#2} } } \cs_new_protected:Npn \@@_env_define:nnn #1 #2 #3 { @@ -2831,11 +2825,10 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \subsubsection{Generic definition of the environment} % -% \begin{macro}{ -% \@@_env_generic_begin:, -% \@@_env_generic_begin:, -% } -% Now we define the generic environment \cs{@@_env_generic_begin:} +% \begin{macro}{\@@_env_generic_begin:,\@@_env_generic_end:} +% +% Now we define the generic environment functions +% \cs{@@_env_generic_begin:} and \cs{@@_env_generic_end:}. % \begin{macrocode} \cs_new_protected:Npn \@@_env_generic_begin: { @@ -2846,7 +2839,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): { \@@_stop_environment: \@@_finish_storing:NNN \l_@@_macro_tmp_tl - \l_@@_name_seq_env_tl \l_@@_print_env_bool + \l_@@_name_seq_env_tl \l_@@_print_env_bool } % \end{macrocode} % \end{macro} @@ -2860,7 +2853,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \startscontents, % \stopscontents, % } -% Now defining the \myenv{scontents} environment should be easy: +% Finaly defining the \myenv{scontents} environment should be easy :) % \begin{macrocode} % %\newenvsc{scontents} @@ -2870,9 +2863,6 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \subsubsection{key val for environment} % -% Define a \myoarg{key \textnormal{\textcolor{gray}{=}} val} for -% environment \env{scontents} -% % \begin{macro}{\@@_grab_optional:n,\@@_grab_optional:w} % The macro \cs{@@_grab_optional:w} is called from the % \env{scontents} environment with the tokens following the @@ -2904,9 +2894,10 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macro} % % \subsubsection{The environment itself} +% \label{the:environment:itself} % % \begin{macro}{\@@_start_environment:w,\@@_start_after_option:w, -% \@@_check_line_process:xn,\@@_stop_environment:} +% \@@_check_line_process:xn,\@@_stop_environment:} % Here we make §^^I§, §^^L§ and §^^M§ active characters so that the end of % line can be \enquote{seen} to be used as a delimiter, and \hologo{TeX} doesn't try to % eliminate space-like characters. @@ -2916,19 +2907,21 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % to do the heavy lifting. \cs{@@_grab_optional:w} processes the optional % argument and calls \cs{@@_start_after_option:w}. % -% \cs{@@_start_after_option:w} also checks for trailing tokens after -% the optional argument and issues an error if any. +% The function \cs{@@_start_after_option:w} also checks for trailing +% tokens after the optional argument and issues an error if any. % -% In all cases, \cs{@@_check_line_process:xn} ckecks that +% In all cases, the function \cs{@@_check_line_process:xn} ckecks that % everything past §\begin{scontents}§ is empty and then process -% the environment. \cs{@@_check_line_process:xn} calls the -% \cs{@@_file_tl_write_start:V} function, which will then read the contents +% the environment. +% +% The function \cs{@@_check_line_process:xn} calls the function +% \cs{@@_file_tl_write_start:V} which will then read the contents % of the environment and optionally store them in a token list or write to % an external file. % -% When that's done, \cs{@@_file_write_stop:N} does the cleanup. This part of -% the code is inspired and adapted from the code of the package \pkg{xsimverb} -% by Clemens Niederberger. +% When that's done, the function \cs{@@_file_write_stop:N} does the +% cleanup. This part of the code is inspired and adapted from the code of +% the package \pkg{xsimverb} by Clemens Niederberger. % % \begin{macrocode} \group_begin: @@ -2966,8 +2959,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): { \l_@@_storing_bool } { \tl_if_empty_p:N \l_@@_macro_tmp_tl } { - \msg_warning:nnx { scontents } { empty-environment } - { \l_@@_env_name_tl } + \msg_warning:nnx { scontents } { empty-environment } { \l_@@_env_name_tl } } } % \end{macrocode} @@ -3005,7 +2997,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \iow_open:Nn \l_@@_file_iow {#1} } { \bool_set_false:N \l_@@_writable_bool } - \tl_clear:N \l_@@_file_tl + \tl_clear:N \l_@@_every_line_env_tl \seq_map_function:NN \l_char_special_seq \char_set_catcode_other:N \int_step_function:nnnN { 128 } { 1 } { 255 } \char_set_catcode_letter:n \cs_set_protected:Npx \@@_ret:w ##1 ^^M @@ -3087,7 +3079,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \bool_if:NT \l_@@_storing_bool { \tl_set:Nn \exp_not:N #1 - { \exp_args:NV \@@_remove_leading_nl:n \l_@@_file_tl } + { \exp_args:NV \@@_remove_leading_nl:n \l_@@_every_line_env_tl } } } } @@ -3111,20 +3103,17 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % -% \begin{macro}{ -% \@@_verb_processor_output:n, -% \@@_verb_processor_output:x, -% } -% \cs{@@_verb_processor_output:n} does the output of each line read, -% to a token list and to a file, depending on the booleans -% \cs{l_@@_writing_bool} and \cs{l_@@_storing_bool}. +% \begin{macro}{\@@_verb_processor_output:n,\@@_verb_processor_output:x} +% The function \cs{@@_verb_processor_output:n} does the output of +% each line read, to a token list and to a file, depending on the +% booleans \cs{l_@@_writing_bool} and \cs{l_@@_storing_bool}. % \begin{macrocode} \cs_new_protected:Npn \@@_verb_processor_output:n #1 { \bool_if:NT \l_@@_writable_bool { \iow_now:Nn \l_@@_file_iow {#1} } \bool_if:NT \l_@@_storing_bool - { \tl_put_right:Nn \l_@@_file_tl { ^^J #1 } } + { \tl_put_right:Nn \l_@@_every_line_env_tl { ^^J #1 } } } \group_end: \cs_generate_variant:Nn \@@_verb_processor_output:n { x } @@ -3169,6 +3158,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): } \cs_new:Npn \@@_use_none_delimit_by_q_stop:w #1 \q_@@_stop { } % \end{macrocode} +% % In \LaTeX{}, environments start with §\begin{}§, so checking if a % string contains §\begin{scontents}§ is straightforward. Since no §}§ can % appear inside §§, then just a macro delimited by §}§ is enough. @@ -3194,6 +3184,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \exp_not:N \q_@@_stop } % \end{macrocode} +% % In other formats, however, we don't have an \enquote{end anchor} to delimit the % environment name, so a delimited macro won't help. We have to search for % the entire environment command (usually §\scontents§ and §\startscontents§). @@ -3263,11 +3254,14 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % -% \begin{macro}[int]{\verbatimsc,\endverbatimsc} -% In Plain we emulate \LaTeX's \env{verbatim} environment. +% \subsection{The environment \env{verbatimsc}} +% +% \begin{macro}[int]{\verbatimsc,\endverbatimsc,\@@_verbatimsc_aux:, +% \@@_vobeyspaces:,\@@_xverb:,\@@_nolig_list:,\@@_xobeysp:} +% In \hologo{plainTeX} we emulate \LaTeX's \env{verbatim} environment. +% % \begin{macrocode} %<*plain> -\bool_new:N \l_@@_temp_bool \cs_new_protected:Npn \verbatimsc { \group_begin: @@ -3279,9 +3273,9 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \cs_new_protected:Npn \@@_verbatimsc_aux: { \skip_vertical:N \parskip - \int_set:Nn \parindent { 0pt } + \dim_zero:N \parindent \skip_set:Nn \parfillskip { 0pt plus 1fil } - \int_set:Nn \parskip { 0pt plus0pt minus0pt } + \skip_set:Nn \parskip { 0pt plus0pt minus0pt } \tex_par:D \bool_set_false:N \l_@@_temp_bool \cs_set:Npn \par @@ -3332,20 +3326,28 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % +% +% \subsection{The command \cs{Scontents}} +% +% User command to \mymeta{stored content}, adapted from code by Ulrich +% Diez in \href{https://tex.stackexchange.com/a/472044/7832}{Stringify +% input - \textbackslash string on token list} +% and code by user siracusa in +% \href{https://tex.stackexchange.com/a/500281/7832}{Convert a macro from +% Latex2e to expl3} +% % \begin{macro}{\@@_bsphack:,\@@_esphack:} -% \pkg{xparse} also requires \LaTeX's §\dospecials§. In case it doesn't -% exist (at the time \pkg{scontents} is loaded) we define §\dospecials§ -% to use the \cs{l_char_special_seq}. +% We emulate §\@bsphack§ and §\@esphack§ for \hologo{plainTeX}. +% This is necessary to prevent unwanted spaces when the §print-cmd§ +% key is false. % \begin{macrocode} %<*core> -\int_new:N \l_@@_save_sf_int -\dim_new:N \l_@@_save_skip_dim \cs_new_protected:Npn \@@_bsphack: { \scan_stop: \mode_if_horizontal:T { - \dim_set_eq:NN \l_@@_save_skip_dim \tex_lastskip:D + \skip_set_eq:NN \l_@@_save_skip \tex_lastskip:D \int_set_eq:NN \l_@@_save_sf_int \tex_spacefactor:D } } @@ -3355,9 +3357,9 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \mode_if_horizontal:T { \int_set_eq:NN \tex_spacefactor:D \l_@@_save_sf_int - \dim_compare:nNnT { \l_@@_save_skip_dim } > { \c_zero_dim } + \dim_compare:nNnT { \l_@@_save_skip } > { \c_zero_skip } { - \dim_compare:nNnT { \tex_lastskip:D } = { \c_zero_dim } + \skip_if_eq:nnT { \tex_lastskip:D } { \c_zero_skip } { \nobreak \skip_horizontal:n { \c_zero_skip } @@ -3374,32 +3376,20 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % -% \subsection{The command \cs{Scontents}} -% -% User command to \mymeta{stored content}, adapted from -% \url{https://tex.stackexchange.com/a/500281/7832}. -% % \begin{macro}{ % \Scontents, -% \@@_norm_arg:n, -% \@@_Scontents_auxi:N, % \@@_Scontents_internal:nn, +% \@@_norm_arg:n, % \@@_verb_arg:w, -% \@@_verb_arg_internal:n, % } -% The §\Scontents§ macro starts by parsing an optional argument and -% then delegates to \cs{@@_verb_arg:w} or \cs{@@_norm_arg:n} depending whether -% a star (§*§) argument is present. -% -% \cs{@@_norm_arg:n} grabs a normal argument, adds it to the |seq| varaible, -% and optionally prints it. -% -% \cs{@@_verb_arg:w} grabs a verbatim argument using \pkg{xparse}'s |+v| -% argument parser. +% The §\Scontents§ command starts by parsing an optional argument to +% the function \cs{@@_Scontents_internal:nn} then delegates to +% \cs{@@_verb_arg:w} or \cs{@@_norm_arg:n} depending whether a star +% (§*§) argument is present. % % \begin{macrocode} %<*loader> -\NewDocumentCommand { \Scontents }{ !s !O{} } +\NewDocumentCommand \Scontents { !s !O{} } { \@@_Scontents_internal:nn {#1} {#2} } % %<*core> @@ -3414,17 +3404,43 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): { \@@_verb_arg:w } { \@@_norm_arg:n } } +% \end{macrocode} +% +% The function \cs{@@_norm_arg:n} grabs a normal argument, adds it to +% the |seq| varaible and optionally prints it. +% +% \begin{macrocode} \cs_new_protected:Npn \@@_norm_arg:n #1 { \tl_set:Nn \l_@@_temp_tl {#1} \@@_Scontents_finish: } +% \end{macrocode} +% +% The function \cs{@@_verb_arg:w} grabs a verbatim argument using +% \pkg{xparse}'s |+v| argument parser. +% +% \begin{macrocode} % %<*loader> -\NewDocumentCommand { \@@_verb_arg:w } { +v } +\NewDocumentCommand \@@_verb_arg:w { +v } { \@@_verb_arg_internal:n {#1} } % %<*core> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ +% \@@_verb_arg_internal:n, +% \@@_Scontents_finish:, +% \@@_file_write_cmd:nn, +% \@@_file_write_cmd:VV, +% } +% +% The function \cs{@@_verb_arg_internal:n} replace all §\^^M§ by +% §\^^J§ then adds it to the |seq| varaible. +% +% \begin{macrocode} \cs_new_protected:Npn \@@_verb_arg_internal:n #1 { \tl_set:Nn \l_@@_temp_tl {#1} @@ -3434,8 +3450,10 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \cs_new_protected:Npn \@@_Scontents_finish: { \@@_file_write_cmd:VV \l_@@_fname_out_tl \l_@@_temp_tl - \@@_finish_storing:NNN \l_@@_temp_tl - \l_@@_name_seq_cmd_tl \l_@@_print_cmd_bool + \@@_finish_storing:NNN + \l_@@_temp_tl + \l_@@_name_seq_cmd_tl + \l_@@_print_cmd_bool \use:x { \group_end: @@ -3451,6 +3469,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \iow_close:N \l_@@_file_iow } } +\cs_generate_variant:Nn \@@_file_write_cmd:nn { VV } \prg_new_protected_conditional:Npnn \@@_file_if_writable:n #1 { T, F, TF } { \bool_if:NTF \l_@@_writing_bool @@ -3474,20 +3493,19 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): } { \prg_return_false: } } -\cs_generate_variant:Nn \@@_file_write_cmd:nn { VV } % \end{macrocode} % \end{macro} % % \subsection{The command \cs{getstored}} % -% \begin{macro}{\getstored} +% \begin{macro}{\getstored,\@@_getstored_internal:nn} % User command §\getstored§ to extract \mymeta{stored content} in |seq| % (robust). % % \begin{macrocode} % %<*loader> -\NewDocumentCommand { \getstored } { O{-1} m } +\NewDocumentCommand \getstored { O{-1} m } { \@@_getstored_internal:nn {#1} {#2} } % %<*core> @@ -3506,13 +3524,13 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \subsection{The command \cs{foreachsc}} % -% \begin{macro}{\foreachsc} +% \begin{macro}{\foreachsc,\@@_foreachsc_internal:nn,\@@_foreach_add_body:n} % User command §\foreachsc§ to loop over \mymeta{stored content} in |seq|. % % \begin{macrocode} % %<*loader> -\NewDocumentCommand { \foreachsc } { o m } +\NewDocumentCommand \foreachsc { o m } { \@@_foreachsc_internal:nn {#1} {#2} } % %<*core> @@ -3561,14 +3579,15 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \subsection{The command \cs{typestored}} % -% \begin{macro}{\typestored,\@@_verb_print:N,\@@_xverb:w,verbatimsc} +% \begin{macro}{\typestored,\@@_typestored_internal:nn,\@@_verb_print:N, +% \@@_xverb:w} % The §\typestored§ commands fetches a buffer from memory, prints it % to the log file, and then calls \cs{@@_verb_print:N}. % % \begin{macrocode} % %<*loader> -\NewDocumentCommand { \typestored } { o m } +\NewDocumentCommand \typestored { o m } { \@@_typestored_internal:nn {#1} {#2} } % %<*core> @@ -3616,11 +3635,6 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \cs_set_eq:NN ^^M \@@_verb_print_EOL: } \group_end: -% \end{macrocode} -% -% Finally, the §verbatimsc§ environment is defined. -% -% \begin{macrocode} \cs_new_protected:Npn \@@_xverb: { \char_set_catcode_active:n { 9 } @@ -3628,6 +3642,18 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \@@_xverb:w } % +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{verbatimsc,\startverbatimsc,\stopverbatimsc} +% Finally the \hologo{LaTeX} and \hologo{ConTeXt} version of +% §verbatimsc§ environment is defined. +% +% The macro §\endverbatim§ in the second argument of the §verbatimsc§ +% environment is only needed for compatibility with the \pkg{verbatim} +% package. +% +% \begin{macrocode} %<*loader> %<*!context> \use:x @@ -3645,7 +3671,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): \cs_set_eq:cN { @xverbatim } \@@_xverb: \verbatim } - { } + { \endverbatim } % %\definetyping[verbatimsc] % @@ -3653,7 +3679,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macrocode} % \end{macro} % -% \subsection{Some auxiliaries} +% \subsubsection{Some auxiliaries functions} % % \begin{macro}{\@@_tabs_to_spaces:} % In a verbatim context the |TAB| character is made active and set @@ -3705,9 +3731,8 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \end{macro} % % \begin{macro}{ -% \@@_set_active_eq:NN, -% \@@_make_control_chars_active:, -% } +% \@@_set_active_eq:NN, \@@_make_control_chars_active:, +% \@@_plain_disable_outer_par:} % Shortcut definitions for common catcode changes. % The §^^L§ needs a special treatment in non-\LaTeX{} mode % because in Plain\,\TeX{} it is an §\outer§ token. @@ -3758,7 +3783,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \begin{macrocode} % %<*loader> -\NewDocumentCommand { \setupsc } { +m } +\NewDocumentCommand \setupsc { +m } { \keys_set:nn { scontents } {#1} } % %<*core> @@ -3767,13 +3792,13 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % % \subsection{The command \cs{meaningsc}} % -% \begin{macro}{\meaningsc} +% \begin{macro}{\meaningsc,\@@_meaningsc_internal:nn,\@@_meaningsc:n} % User command §\meaningsc§ to see content stored in |seq|. % % \begin{macrocode} % %<*loader> -\NewDocumentCommand { \meaningsc } { o m } +\NewDocumentCommand \meaningsc { o m } { \@@_meaningsc_internal:nn {#1} {#2} } % %<*core> @@ -3810,7 +3835,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \begin{macrocode} % %<*loader> -\NewExpandableDocumentCommand { \countsc } { m } +\NewExpandableDocumentCommand \countsc { m } { \seq_count:c { g_@@_name_#1_seq } } % %<*core> @@ -3826,7 +3851,7 @@ Read \Verb{\jobname.tsc} (shows TABs as red arrows): % \begin{macrocode} % %<*loader> -\NewDocumentCommand { \cleanseqsc } { m } +\NewDocumentCommand \cleanseqsc { m } { \seq_clear_new:c { g_@@_name_#1_seq } } % %<*core> diff --git a/macros/latex/contrib/scontents/scontents.ins b/macros/latex/contrib/scontents/scontents.ins index c5770ae484..32b3e52331 100644 --- a/macros/latex/contrib/scontents/scontents.ins +++ b/macros/latex/contrib/scontents/scontents.ins @@ -1,9 +1,9 @@ -\input l3docstrip.tex +\input docstrip.tex \keepsilent \askforoverwritefalse \declarepreamble\standard -Copyright (C) 2019-2020 by Pablo González L +Copyright (C) 2019-2022 by Pablo González L This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this license or (at @@ -33,11 +33,11 @@ and the derived files scontents.sty, \declarepreamble\context \string\module [ file=t-scontents, - version=1.9, + version=2.0, title=\string\CONTEXT\ User Module, subtitle=Storing Contents, author=Pablo González, - date=2020-01-21, + date=2022-04-04, copyright=Pablo González, email=pablgonz@educarchile.cl, license=LPPL] @@ -60,7 +60,7 @@ and the derived files scontents.sty, \Msg{* To finish the installation you have to move the files into a } \Msg{* directory searched by TeX. See README.md for instructions.} \Msg{*} -\Msg{* To produce the documentation with source code run xelatex }% +\Msg{* To produce the documentation with source code run lualatex }% \Msg{* thrice on file scontents.dtx }% \Msg{*} \Msg{* Happy TeXing!} diff --git a/macros/latex/contrib/scontents/scontents.pdf b/macros/latex/contrib/scontents/scontents.pdf index 4b5dfbc9c3..73255df198 100644 Binary files a/macros/latex/contrib/scontents/scontents.pdf and b/macros/latex/contrib/scontents/scontents.pdf differ -- cgit v1.2.3