texlive[53504] Master/texmf-dist: scontents (22jan20)

commits+karl at tug.org commits+karl at tug.org
Thu Jan 23 18:54:16 CET 2020


Revision: 53504
          http://tug.org/svn/texlive?view=revision&revision=53504
Author:   karl
Date:     2020-01-23 18:54:16 +0100 (Thu, 23 Jan 2020)
Log Message:
-----------
scontents (22jan20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/scontents/README.md
    trunk/Master/texmf-dist/doc/latex/scontents/scontents.pdf
    trunk/Master/texmf-dist/source/latex/scontents/scontents.dtx
    trunk/Master/texmf-dist/source/latex/scontents/scontents.ins
    trunk/Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv
    trunk/Master/texmf-dist/tex/generic/scontents/scontents-code.tex
    trunk/Master/texmf-dist/tex/generic/scontents/scontents.tex
    trunk/Master/texmf-dist/tex/latex/scontents/scontents.sty

Modified: trunk/Master/texmf-dist/doc/latex/scontents/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/scontents/README.md	2020-01-23 17:54:03 UTC (rev 53503)
+++ trunk/Master/texmf-dist/doc/latex/scontents/README.md	2020-01-23 17:54:16 UTC (rev 53504)
@@ -1,6 +1,6 @@
 ## scontents — Stores LaTeX contents in memory or files
-- Version: 1.8
-- Date: 2019-11-18
+- Version: 1.9
+- Date: 2020-01-21
 - Author: Pablo González
 
 ## Description
@@ -20,9 +20,13 @@
 The package `scontents` is present in `TeXLive` and `MiKTeX`, use the 
 package manager to install.
 
-For manual installation, download `scontents.zip` and unzip it, then move
-the files to appropriate locations:
+For manual installation, download `scontents.zip` and unzip it, 
+then run:
 ```
+$ pdftex scontents.ins
+```
+and move all files to appropriate locations:
+```
   scontents.tex      -> TDS:tex/generic/scontents/
   scontents-code.tex -> TDS:tex/generic/scontents/
   scontents.sty      -> TDS:tex/latex/scontents/

Modified: trunk/Master/texmf-dist/doc/latex/scontents/scontents.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/scontents/scontents.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/scontents/scontents.dtx	2020-01-23 17:54:03 UTC (rev 53503)
+++ trunk/Master/texmf-dist/source/latex/scontents/scontents.dtx	2020-01-23 17:54:16 UTC (rev 53504)
@@ -1,6 +1,6 @@
 % \iffalse meta-comment
 %
-% Copyright (C) 2019 by Pablo González L <pablgonz at educarchile.cl>
+% Copyright (C) 2019-2020 by Pablo González L <pablgonz at educarchile.cl>
 %
 % 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
@@ -34,7 +34,6 @@
 \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}
 \setmonofont[
-    %Ligatures      = TeX,
     Numbers        = OldStyle,
     Scale          = 0.80,
     UprightFont    = *-Regular,
@@ -65,7 +64,6 @@
                     \mathcode`\-="702D \mathcode`\+="702B
                     \mathcode`\:="703A \mathcode`\=="703D }
 \makeatother
-
 \setmathfont[Scale = 0.95]{latinmodern-math.otf}
 \usepackage{fontawesome5}
 \newfontfamily\fetamontotf{ffmw10.otf}[
@@ -76,7 +74,7 @@
 \usepackage[svgnames]{xcolor}
 \usepackage[sf,bf,compact,medium,pagestyles]{titlesec}
 \usepackage{lastpage,imakeidx,microtype,attachfile2}
-\usepackage{adjustbox,multicol,listings,accsupp,titletoc}
+\usepackage{adjustbox,multicol,listings,accsupp,titletoc,hypdestopt}
 \usepackage{scontents} % main
 \usepackage[contents]{colordoc}
 % \show\docCodelineNo
@@ -104,15 +102,6 @@
 |catcode`| 12|gdef|sxmacro at code#1%    \end{macrocode*}[|liii at xmacro@code[#1]|end[macrocode*]]
 |endgroup
 
-% Other patch for colordoc.sty to work xelatex
-\makeatletter
-\def\@moddecr#1{%
-    \global\advance#1\m at ne
-    \reset at color
-    \ifnum#1>\z@\else
-        \global#1\@colorlevels\fi}
-\makeatother
-
 \EnableCrossrefs
 % \PageIndex % \CodelineIndex undoes what \PageIndex does
 % \CodelineIndex tries to open another write stream for the index file. We don't
@@ -530,7 +519,7 @@
 \settitlemarks{section}
 \renewpagestyle{plain}[\color{optcolor}\small\sffamily]{%
 \setfoot{\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax%
-         \parbox{1.93\paperwidth\relax}{\hfil\thepage\,/\,\pageref{LastPage}}}}%
+         \parbox{1.93\paperwidth}{\hfil\thepage\,/\,\pageref{LastPage}}}}%
         {}%
         {}%
 }
@@ -540,8 +529,8 @@
       \color{rulecolor}\rule[0.3cm]{\paperwidth}{0.7cm}}\hss
 }
 \setfoot{\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax%
-         \parbox{1.93\paperwidth\relax}{\hfil\thepage\,/\,\pageref{LastPage}}}}%
-        {\parbox{\textwidth}{\raggedright \textcolor{gray}{\raisebox{-1pt}{\textcopyright}{}2019 by Pablo González}}}%
+         \parbox{1.93\paperwidth}{\hfil\thepage\,/\,\pageref{LastPage}}}}%
+        {\parbox{\textwidth}{\raggedright \textcolor{gray}{\raisebox{-1pt}{\textcopyright}{}2019--2020 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}}}%
@@ -596,7 +585,7 @@
 %    \filedate.}\\[25pt]
 %    \author{
 %    \large
-%    \raisebox{-1pt}{\textcopyright}{}2019 by Pablo González\thanks{
+%    \raisebox{-1pt}{\textcopyright}{}2019--2020 by Pablo González\thanks{
 %    E-mail: \textcolor{OrangeRed}{\textsf{\guillemotleft}}\email{pablgonz at educarchile.cl}\textcolor{OrangeRed}{\textsf{\guillemotright}}.
 %       }%
 %    }
@@ -786,7 +775,13 @@
 %
 % The command \ics*{setupsc} sets the \mymeta{keys} in a global way,
 % it can be used both in the preamble and in the body of the document
-% as many times as desired.
+% as many times as desired. However, options set in the declaration of
+% an environment (with \ics*{newenvsc}) have precedence over options
+% set with \ics*{setupsc}.
+%
+% Options in the optional arguments of environments and
+% commands have the highest precedence, overriding both
+% options in \ics*{newenvsc}, and in \ics*{setupsc}.
 % \end{function}
 %
 % \keyexamp{verb-font}{font family}{\textnormal{\ttfamily\textbackslash{}ttfamily}}
@@ -801,13 +796,14 @@
 % 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}.
 %
-% \medskip
+% \newpage
 %
 % \keyexamp{overwrite}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false}
 % Sets whether the \mymeta{files} generated by \mykey{write-out} and \mykey{write-env}
-% from the \myenv*{scontents} environment will be rewritten. This key is
-% available as a package option or using \ics*{setupsc} or \myenv*{scontents}
-% environment.
+% from the \myenv*{scontents} environment will be rewritten. This key is available as
+% a package option, for \ics*{setupsc}, for \ics*{Scontents*} and for the environment
+% \myenv*{scontents}.
+%
 % \medskip
 %
 % \keyexamp{print-all}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false}
@@ -820,8 +816,8 @@
 % This key is necessary only if the last line is the closing of some
 % environment defined by the \mypkg{fancyvrb} package as §\end{Verbatim}§
 % or another environment that does not support a comments \enquote{\ttfamily\textcolor{gray}{\%}}
-% after closing §\end{<env>}%§. This key is available
-% for the \myenv*{scontents} environment and the \ics*{Scontents} command.
+% after closing §\end{<env>}%§. This key is available for the \myenv*{scontents}
+% environment and the \ics*{Scontents} command.
 %
 % \keyexamp{width-tab}{integer}{1}
 % Sets the equivalence in \mymeta{spaces} for the character "TAB"
@@ -851,10 +847,11 @@
 %  \mykey{print-all} & \cmark  & \cmark  &  \xmark  & \xmark  & \xmark  & \xmark  & \xmark \\
 %  \mykey{store-all} & \cmark  & \cmark  &  \xmark  & \xmark  & \xmark  & \xmark  & \xmark \\
 %  \mykey{write-env} & \xmark  & \xmark  &  \cmark  & \xmark  & \xmark  & \xmark  & \xmark \\
-%  \mykey{write-out} & \xmark  & \xmark  &  \cmark  & \xmark  & \xmark  & \xmark  & \xmark \\
-%  \mykey{overwrite} & \cmark  & \cmark  &  \cmark  & \xmark  & \xmark  & \xmark  & \xmark \\
+%  \mykey{write-cmd} & \xmark  & \xmark  &  \xmark  & \xmark  & \cmark  & \xmark  & \xmark \\
+%  \mykey{write-out} & \xmark  & \xmark  &  \cmark  & \xmark  & \cmark  & \xmark  & \xmark \\
+%  \mykey{overwrite} & \cmark  & \cmark  &  \cmark  & \xmark  & \cmark  & \xmark  & \xmark \\
 %  \mykey{width-tab} & \cmark  & \cmark  &  \xmark  & \xmark  & \xmark  & \cmark  & \cmark \\
-%  \mykey{force-eol} & \cmark  & \cmark  &  \cmark  & \xmark  & \cmark  & \xmark  & \xmark \\
+%  \mykey{force-eol} & \cmark  & \cmark  &  \cmark  & \cmark  & \cmark  & \xmark  & \xmark \\
 %  \mykey{verb-font} & \cmark  & \cmark  &  \xmark  & \xmark  & \xmark  & \xmark  & \xmark \\
 % \bottomrule
 % \end{tabular}
@@ -963,11 +960,12 @@
 %
 % \keyexamp{write-env}{file.ext}{not used}
 % Sets the name of the \mymeta{external file} in which the \mymeta{contents} of
-% the environment will be written. The \mymeta{file.ext} will be created
-% in the working directory, if \mymeta{file.ext} exists it will be overwritten,
-% relative or absolute paths are not supported.
+% the environment will be written.  The \mymeta{file.ext} will be created
+% in the working directory, relative or absolute paths are not supported. If \mymeta{file.ext}
+% does not exist, it will be created or overwritten if the \mykey{overwrite} key is used.
+%
 % The characters "TAB"s will be written in \mymeta{file.ext} and the \mymeta{contents}
-% will be stored in the sequence established at that time. \hologo{XeLaTeX} users
+% will be stored in the \mymeta{sequence} established at that time. \hologo{XeLaTeX} users
 % using the "TAB" character must add \texttt{\textcolor{optcolor}{-8bit}}
 % at the command line, otherwise you will get \hologo{TeX}-"TAB" (§^^I§)
 % in \mymeta{file.ext}.
@@ -977,11 +975,12 @@
 % \keyexamp{write-out}{file.ext}{not used}
 % Sets the name of the \mymeta{external file} in which the \mymeta{contents} of
 % the environment will be written. The \mymeta{file.ext} will be created
-% in the working directory, if \mymeta{file.ext} exists it will be overwritten,
-% relative or absolute paths are not supported.
+% in the working directory, relative or absolute paths are not supported. If \mymeta{file.ext}
+% does not exist, it will be created or overwritten if the \mykey{overwrite} key is used.
+%
 % The characters "TAB"s will be written in \mymeta{file.ext}, the rest of the
 % \mymeta{keys} will not be available and the \mymeta{contents} will NOT
-% be stored in any sequence. \hologo{XeLaTeX} users using the "TAB" character
+% be stored in any \mymeta{sequence}. \hologo{XeLaTeX} users using the "TAB" character
 % must add \texttt{\textcolor{optcolor}{-8bit}} at the command line,
 % otherwise you will get \hologo{TeX}-"TAB" (§^^I§) in \mymeta{file.ext}.
 %
@@ -1006,8 +1005,8 @@
 % The command \ics*{newenvsc} allows you to create \mymeta{new environments}
 % based on the same characteristics of the \myenv*{scontents} environment.
 % The values entered in \myoarg{initial keys} will be considered as the
-% default values for this new environment and the valid \mymeta{keys} are the
-% same as those of the \myenv*{scontents} environment. For example:
+% default values for this new environment and the valid \mymeta{keys} are
+% \mykey{store-env} and \mykey{print-env}. For example:
 %
 % \iffalse
 %<*example>
@@ -1039,7 +1038,7 @@
 % mode. It is not possible to pass environments such as \emph{verbatim},
 % but it is possible to use the implementation of \ics{Verb} provided by
 % the \mypkg{fvextra} package for contents on one line and \ics{lstinline}
-% from \mypkg{listings} package, but it is preferable to use the starred
+% from \mypkg{listings} package, but it is preferable to use the starred (§*§)
 % version.
 %
 % The \ics*{Scontents*} command reads the \mymarg{argument} under \emph{verbatim}
@@ -1076,6 +1075,37 @@
 % running the command. The content is extracted from the \mymeta{sequence}
 % in which it is stored.
 %
+% \subsection*{Options only for the starred version}
+% \label{sec:onlystarred}
+%
+% \keyexamp{write-cmd}{file.ext}{not used}
+% Sets the name of the \mymeta{external file} in which the \mymeta{contents} of
+% the \mymarg{argument} will be written. The \mymeta{file.ext} will be created
+% in the working directory, relative or absolute paths are not supported. If \mymeta{file.ext}
+% does not exist, it will be created or overwritten if the \mykey{overwrite} key is used.
+%
+% The characters "TAB"s will be written in \mymeta{file.ext} and the \mymeta{contents}
+% will be stored in the \mymeta{sequence} established at that time. \hologo{XeLaTeX} users
+% using the "TAB" character must add \texttt{\textcolor{optcolor}{-8bit}}
+% at the command line, otherwise you will get \hologo{TeX}-"TAB" (§^^I§)
+% in \mymeta{file.ext}.
+%
+% \medskip
+%
+% \keyexamp{write-out}{file.ext}{not used}
+% Sets the name of the \mymeta{external file} in which the \mymeta{contents} of
+% the \mymarg{argument} will be written. The \mymeta{file.ext} will be created
+% in the working directory, relative or absolute paths are not supported. If \mymeta{file.ext}
+% does not exist, it will be created or overwritten if the \mykey{overwrite} key is used.
+%
+% The characters "TAB"s will be written in \mymeta{file.ext}, the rest of the
+% \mymeta{keys} will not be available and the \mymeta{contents} will NOT
+% be stored in any \mymeta{sequence}. \hologo{XeLaTeX} users using the "TAB" character
+% must add \texttt{\textcolor{optcolor}{-8bit}} at the command line,
+% otherwise you will get \hologo{TeX}-"TAB" (§^^I§) in \mymeta{file.ext}.
+%
+% The key \mykey{overwrite} is available for this command.
+%
 % \subsection{The command \cs{getstored}}
 % \label{sec:getstored}
 %
@@ -1378,6 +1408,8 @@
 \documentclass{article}
 \usepackage[store-cmd=solutions]{scontents}
 \newtheorem{ex}{Exercise}
+\setlength{\parindent}{0pt}
+\pagestyle{empty}
 \begin{document}
 \section{Problems}
 \begin{ex}
@@ -1414,6 +1446,7 @@
 % arara: clean: { extensions: [ aux, log] }
 \documentclass{article}
 \usepackage[store-env=defexercise,store-cmd=defexercise]{scontents}
+\setlength{\parindent}{0pt}
 \pagestyle{empty}
 \begin{document}
 % not starred
@@ -1476,7 +1509,7 @@
 \end{tikzpicture}
 
 \begin{tikzpicture}
-\getstored[3]{tikz}
+\getstored{tikz}
 \end{tikzpicture}
 
 \begin{scontents}[store-env=buffer]
@@ -1520,6 +1553,7 @@
 % arara: clean: { extensions: [ aux, log] }
 \documentclass{article}
 \usepackage{scontents}
+\setlength{\parindent}{0pt}
 \pagestyle{empty}
 \begin{document}
 \begin{scontents}[store-env=main]
@@ -1537,11 +1571,11 @@
 \textbf{Let's print them}
 
 This is first stored in main: \getstored[1]{main}\par
-This is second stored in main: \getstored[2]{main}\par
-This is stored in other: \getstored[1]{other}
+This is second stored in main: \getstored{main}\par
+This is stored in other: \getstored{other}
 
 \textbf{Print all of stored in main}\par
-\foreachsc[sep={\\[10pt]}]{a}
+\foreachsc[sep={\\[10pt]}]{main}
 \end{document}
 \end{scontents}
 % \iffalse
@@ -1562,8 +1596,8 @@
 % arara: clean: { extensions: [ aux, log] }
 \documentclass{article}
 \usepackage{scontents}
+\setlength{\parindent}{0pt}
 \pagestyle{empty}
-\setlength{\parindent}{0pt}
 \begin{document}
 \section{Problem stated the first time}
 \begin{scontents}[print-env=true,store-env=problem]
@@ -1602,6 +1636,8 @@
 \documentclass[10pt]{article}
 \usepackage{scontents}
 \newenvsc{forshort}[store-env=forshort,print-env=false]
+\setlength{\parindent}{0pt}
+\pagestyle{empty}
 \begin{document}
 
 Something in the whole course.
@@ -1668,7 +1704,7 @@
 
 \section{Test \texttt{\textbackslash getstored}}
 \getstored[1]{contents}\par
-\getstored[2]{contents}
+\getstored{contents}
 
 \section{Test \texttt{\textbackslash meaningsc}}
 \meaningsc[1]{contents}\par
@@ -1738,7 +1774,7 @@
 and more.+
 
 \section{Test \texttt{\textbackslash getstored}}
-\getstored[2]{contents}\par
+\getstored{contents}\par
 \getstored[1]{contents}
 
 \section{Test \texttt{\textbackslash typestored}}
@@ -1772,6 +1808,7 @@
 \newminted{tex}{linenos}
 \newenvironment{verbatimsc}{\VerbatimEnvironment\begin{texcode}}{\end{texcode}}
 \pagestyle{empty}
+\setlength{\parindent}{0pt}
 \begin{document}
 \section{Test \texttt{\textbackslash begin\{scontents\}} whit \texttt{minted}}
 Test \verb+{scontents}+ \par
@@ -1798,7 +1835,7 @@
 
 \section{Test \texttt{\textbackslash getstored}}
 \getstored[1]{contents}\par
-\getstored[2]{contents}
+\getstored{contents}
 
 \section{Test \texttt{\textbackslash typestored}}
 \typestored[1]{contents}
@@ -1815,6 +1852,7 @@
 %
 % \newpage
 %
+%
 % \section{Change history}
 % \label{sec:changes}
 %
@@ -1831,6 +1869,13 @@
 % \begin{description}[font=\small\sffamily,wide=0pt,style=multiline,leftmargin=\descrwidth,nosep,noitemsep]
 % \item [\fileversion{} (ctan), \filedate]
 %    \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*|.
+%    \item Fix |sep| key in |\foreachsc|.
+%    \end{itemize}
+% \item [v1.8 (ctan), 2019-11-18]
+%    \begin{itemize}
 %    \item Add |\newenvsc| command.
 %    \item Fix nested environment in \hologo{plainTeX} and \hologo{ConTeXt}.
 %    \item Modified default value in |\getstored|.
@@ -1899,6 +1944,30 @@
 %
 % \printindex[userdoc]
 %
+% \let\stdsection\section
+% \def\section*#1{\stdsection{#1}}
+%
+% \begin{thebibliography}{9}
+% \bibitem{expl3} The \hologo{LaTeX3} 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}
+% package}. Available from
+% \textsc{ctan}, \url{https://www.ctan.org/pkg/xparse}, 2020.
+%
+% \bibitem{l3keys} The \hologo{LaTeX3} Project. \enquote{The \textsf{l3keys2e}
+% package}. Available from
+% \textsc{ctan}, \url{https://www.ctan.org/pkg/l3keys2e}, 2020.
+%
+% \bibitem{keyval} \textsc{Wright, Joseph}. \enquote{Programming
+% \textsf{key–value} in \textsf{expl3}}. Available from
+% \textsc{TUGboat},
+% \url{https://www.tug.org/TUGboat/tb31-1/tb97wright-l3keys.pdf}, 2010.
+% \end{thebibliography}
+%
+% \let\section\stdsection
+%
 % \newpage
 %
 % \StartImplementation
@@ -1916,7 +1985,6 @@
 % \printindex
 % }
 %
-%
 % \section{Implementation}
 % \label{sec:Implementation}
 % \addtocontents{toc}{\protect\setcounter{tocdepth}{0}}
@@ -1937,10 +2005,10 @@
 %
 % Now we define some common macros to hold the package date and version:
 %    \begin{macrocode}
-%<loader>\def\ScontentsFileDate{2019-11-18}%
-%<core>\def\ScontentsCoreFileDate{2019-11-18}%
+%<loader>\def\ScontentsFileDate{2020-01-21}%
+%<core>\def\ScontentsCoreFileDate{2020-01-21}%
 %<*loader>
-\def\ScontentsFileVersion{1.8}%
+\def\ScontentsFileVersion{1.9}%
 \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}%
 %    \end{macrocode}
 %
@@ -2045,6 +2113,8 @@
 %</loader>
 %<*core>
 \begingroup
+  \catcode32=10
+  \endlinechar=32
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
     \begingroup
@@ -2066,23 +2136,23 @@
           }%
         \endgroup
         \endinput
-      }
+      }%
   \else
     \ifx\ScontentsFileDate\ScontentsCoreFileDate
     \else
       \def\next
         {%
-          \PackageError{scontents}{Mismatched~scontents~files~detected}
+          \PackageError{scontents}{Mismatched scontents files detected}
             {%
-              You~have~attempted~to~load~scontents~with~mismatched~files:~
-              probably~you~have~one~or~more~files~'locally~installed'~which~
-              are~in~conflict.~Loading~of~scontents~will~abort.
+              You have attempted to load scontents with mismatched files:
+              probably you have one or more files 'locally installed' which
+              are in conflict. Loading of scontents will abort.
             }%
           \endgroup
           \endinput
         }%
     \fi
-\fi
+  \fi
 \next
 %    \end{macrocode}
 %
@@ -2209,6 +2279,7 @@
 \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}
 %
@@ -2326,12 +2397,25 @@
 %    \begin{macrocode}
 \keys_define:nn { scontents / Scontents }
   {
-    print-cmd .meta:nn   = { scontents } { print-cmd = #1 },
-    print-cmd .default:n = true,
-    store-cmd .meta:nn   = { scontents } { store-cmd = #1 },
-    force-eol .meta:nn   = { scontents } { force-eol = #1 },
-    force-eol .default:n = true,
-    unknown   .code:n    = { \@@_parse_command_keys:n {#1} }
+    write-cmd .code:n           = {
+                                    \bool_set_true:N \l_@@_writing_bool
+                                    \tl_set:Nn \l_@@_fname_out_tl {#1}
+                                  },
+    write-out .code:n           = {
+                                    \bool_set_false:N \l_@@_storing_bool
+                                    \bool_set_true:N  \l_@@_writing_bool
+                                    \tl_set:Nn \l_@@_fname_out_tl {#1}
+                                  },
+    write-env .value_required:n = true,
+    write-out .value_required:n = true,
+    print-cmd .meta:nn          = { scontents } { print-cmd = #1 },
+    print-cmd .default:n        = true,
+    store-cmd .meta:nn          = { scontents } { store-cmd = #1 },
+    force-eol .meta:nn          = { scontents } { force-eol = #1 },
+    force-eol .default:n        = true,
+    overwrite .meta:nn          = { scontents } { overwrite = #1 },
+    overwrite .default:n        = true,
+    unknown   .code:n           = { \@@_parse_command_keys:n {#1} }
   }
 %    \end{macrocode}
 %
@@ -2366,7 +2450,7 @@
     wrapper .code:n           = {
                                   \bool_set_true:N \l_@@_foreach_wrapper_bool
                                   \cs_set_protected:Npn
-                                    \@@_foreach_wrapper:n ##1 {#1}
+                                  \@@_foreach_wrapper:n ##1 {#1}
                                 },
     wrapper .value_required:n = true,
     sep     .tl_set:N         = \l_@@_foreach_sep_tl,
@@ -2669,6 +2753,7 @@
     \group_insert_after:N \tl_gclear:N
     \group_insert_after:N \g_@@_temp_tl
   }
+\cs_generate_variant:Nn \@@_lastfrom_seq:n { V }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2760,7 +2845,8 @@
 \cs_new_protected:Npn \@@_env_generic_end:
   {
     \@@_stop_environment:
-    \@@_atend_environment:
+    \@@_finish_storing:NNN \l_@@_macro_tmp_tl
+      \l_@@_name_seq_env_tl \l_@@_print_env_bool
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2913,19 +2999,12 @@
   \cs_new_protected:Npn \@@_file_tl_write_start:n #1
     {
       \group_begin:
-        \bool_if:nT  { \l_@@_writing_bool && \l_@@_overwrite_bool }
+        \@@_file_if_writable:nTF {#1}
           {
-             \file_if_exist:nTF {#1}
-               { \msg_warning:nnx { scontents } { overwrite-file } {#1} }
-               { \msg_warning:nnx { scontents } { writing-file } {#1} }
-             \iow_open:Nn \l_@@_file_iow {#1}
+            \bool_set_true:N \l_@@_writable_bool
+            \iow_open:Nn \l_@@_file_iow {#1}
           }
-        \bool_if:nT  { \l_@@_writing_bool && !\l_@@_overwrite_bool }
-          {
-             \file_if_exist:nF {#1}
-               { \msg_warning:nnx { scontents } { writing-file } {#1} }
-              \iow_open:Nn \l_@@_file_iow {#1}
-          }
+          { \bool_set_false:N \l_@@_writable_bool }
         \tl_clear:N \l_@@_file_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
@@ -3000,7 +3079,7 @@
     }
   \cs_new_protected:Npn \@@_file_write_stop:N #1
     {
-      \bool_if:NT \l_@@_writing_bool
+      \bool_if:NT \l_@@_writable_bool
         { \iow_close:N \l_@@_file_iow }
       \use:x
         {
@@ -3042,7 +3121,7 @@
 %    \begin{macrocode}
   \cs_new_protected:Npn \@@_verb_processor_output:n #1
     {
-      \bool_if:NT \l_@@_writing_bool
+      \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 } }
@@ -3165,24 +3244,19 @@
 %
 % \subsubsection{Recording of the content in the sequence}
 %
-% \begin{macro}{\@@_atend_environment:}
+% \begin{macro}{\@@_finish_storing:NNN}
 %   Finishes the environment by optionally calling \cs{@@_store_to_seq:}
 %   and then clearing the temporary token list.
 %
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_atend_environment:
+\cs_new_protected:Npn \@@_finish_storing:NNN #1 #2 #3
   {
     \bool_if:NT \l_@@_storing_bool
       {
         \bool_if:NF \l_@@_forced_eol_bool
-          {
-            \tl_put_right:Nx \l_@@_macro_tmp_tl
-              { \c_@@_hidden_space_str }
-          }
-        \@@_store_to_seq:NN \l_@@_macro_tmp_tl
-          \l_@@_name_seq_env_tl
-        \bool_if:NT \l_@@_print_env_bool
-          { \@@_lastfrom_seq:n \l_@@_name_seq_env_tl }
+          { \tl_put_right:Nx #1 { \c_@@_hidden_space_str } }
+        \@@_store_to_seq:NN #1 #2
+        \bool_if:NT #3 { \@@_lastfrom_seq:V #2 }
       }
   }
 %</core>
@@ -3258,6 +3332,48 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \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}.
+%    \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
+        \int_set_eq:NN \l_@@_save_sf_int \tex_spacefactor:D
+      }
+  }
+\cs_new_protected:Npn \@@_esphack:
+  {
+    \scan_stop:
+    \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 { \tex_lastskip:D } = { \c_zero_dim }
+              {
+                \nobreak
+                \skip_horizontal:n { \c_zero_skip }
+              }
+            \tex_ignorespaces:D
+          }
+      }
+  }
+%</core>
+%<*latex>
+\cs_gset_eq:NN \@@_bsphack: \@bsphack
+\cs_gset_eq:NN \@@_esphack: \@esphack
+%</latex>
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{The command \cs{Scontents}}
 %
 % User command to \mymeta{stored content}, adapted from
@@ -3289,6 +3405,7 @@
 %<*core>
 \cs_new_protected:Npn \@@_Scontents_internal:nn #1 #2
   {
+    \@@_bsphack:
     \group_begin:
       \tl_if_novalue:nF {#2}
         { \keys_set:nn { scontents / Scontents } {#2} }
@@ -3299,12 +3416,8 @@
   }
 \cs_new_protected:Npn \@@_norm_arg:n #1
   {
-      \tl_set:Nx \l_@@_temp_tl { \exp_not:n {#1} }
-      \tl_put_right:Nx \l_@@_temp_tl { \c_@@_hidden_space_str }
-      \@@_store_to_seq:NN \l_@@_temp_tl \l_@@_name_seq_cmd_tl
-      \bool_if:NT \l_@@_print_cmd_bool
-        { \@@_lastfrom_seq:n \l_@@_name_seq_cmd_tl }
-    \group_end:
+      \tl_set:Nn \l_@@_temp_tl {#1}
+      \@@_Scontents_finish:
   }
 %</core>
 %<*loader>
@@ -3314,15 +3427,54 @@
 %<*core>
 \cs_new_protected:Npn \@@_verb_arg_internal:n #1
   {
-      \tl_set:Nx \l_@@_temp_tl { \exp_not:n {#1} }
+      \tl_set:Nn \l_@@_temp_tl {#1}
       \tl_replace_all:Nxx \l_@@_temp_tl { \iow_char:N \^^M } { \iow_char:N \^^J }
-      \bool_if:NF \l_@@_forced_eol_bool
-        { \tl_put_right:Nx \l_@@_temp_tl { \c_@@_hidden_space_str } }
-      \@@_store_to_seq:NN \l_@@_temp_tl \l_@@_name_seq_cmd_tl
-      \bool_if:NT \l_@@_print_cmd_bool
-        { \@@_lastfrom_seq:n \l_@@_name_seq_cmd_tl }
+      \@@_Scontents_finish:
+  }
+\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
+      \use:x
+        {
     \group_end:
+    \bool_if:NF \l_@@_print_cmd_bool { \@@_esphack: }
+        }
   }
+\cs_new_protected:Npn \@@_file_write_cmd:nn #1#2
+  {
+    \@@_file_if_writable:nT {#1}
+      {
+        \iow_open:Nn \l_@@_file_iow {#1}
+        \iow_now:Nn  \l_@@_file_iow {#2}
+        \iow_close:N \l_@@_file_iow
+      }
+  }
+\prg_new_protected_conditional:Npnn \@@_file_if_writable:n #1 { T, F, TF }
+  {
+    \bool_if:NTF \l_@@_writing_bool
+      {
+        \file_if_exist:nTF {#1}
+          {
+            \bool_if:NTF \l_@@_overwrite_bool
+              {
+                \msg_warning:nnx { scontents } { overwrite-file } {#1}
+                \prg_return_true:
+              }
+              {
+                \msg_warning:nnx { scontents } { not-writing } {#1}
+                \prg_return_false:
+              }
+          }
+          {
+            \msg_warning:nnx { scontents } { writing-file } {#1}
+            \prg_return_true:
+          }
+      }
+      { \prg_return_false: }
+  }
+\cs_generate_variant:Nn \@@_file_write_cmd:nn { VV }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -3382,8 +3534,8 @@
         \@@_foreach_add_body:n
       \tl_gset:Nx \g_@@_temp_tl
         {
-          \seq_use:Nn \l_@@_foreach_print_seq
-            { \tl_use:N \l_@@_foreach_sep_tl }
+          \exp_args:NNV \seq_use:Nn
+            \l_@@_foreach_print_seq \l_@@_foreach_sep_tl
         }
     \group_end:
     \exp_after:wN \tl_gclear:N
@@ -3707,6 +3859,8 @@
   { Overwriting~file~'#1'. }
 \msg_new:nnn { scontents } { writing-file }
   { Writing~file~'#1'. }
+\msg_new:nnn { scontents } { not-writing }
+  { File~`#1'~already~exists.~Not~writing. }
 \msg_new:nnn { scontents } { rescanning-text }
   { Rescanning~text~'#1'~after~\c_backslash_str end{#2}~\msg_line_context:.}
 \msg_new:nnn { scontents } { multiple-begin }

Modified: trunk/Master/texmf-dist/source/latex/scontents/scontents.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/scontents/scontents.ins	2020-01-23 17:54:03 UTC (rev 53503)
+++ trunk/Master/texmf-dist/source/latex/scontents/scontents.ins	2020-01-23 17:54:16 UTC (rev 53504)
@@ -3,7 +3,7 @@
 \askforoverwritefalse
 \declarepreamble\standard
 
-Copyright (C) 2019 by Pablo González L <pablgonz at educarchile.cl>
+Copyright (C) 2019-2020 by Pablo González L <pablgonz at educarchile.cl>
 
 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 @@
 \declarepreamble\context
  \string\module
    [     file=t-scontents,
-      version=1.8,
+      version=1.9,
         title=\string\CONTEXT\ User Module,
      subtitle=Storing Contents,
        author=Pablo González,
-         date=2019-11-18,
+         date=2020-01-21,
     copyright=Pablo González,
         email=pablgonz at educarchile.cl,
       license=LPPL]

Modified: trunk/Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv
===================================================================
--- trunk/Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv	2020-01-23 17:54:03 UTC (rev 53503)
+++ trunk/Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv	2020-01-23 17:54:16 UTC (rev 53504)
@@ -6,7 +6,7 @@
 %%
 %% scontents.dtx  (with options: `loader,context')
 %% 
-%% Copyright (C) 2019 by Pablo González L <pablgonz at educarchile.cl>
+%% Copyright (C) 2019-2020 by Pablo González L <pablgonz at educarchile.cl>
 %% 
 %% 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,16 +33,16 @@
 %% scontents.dtx  (with options: `loader,context')
 %D  \module
 %D    [     file=t-scontents,
-%D       version=1.8,
+%D       version=1.9,
 %D         title=\CONTEXT\ User Module,
 %D      subtitle=Storing Contents,
 %D        author=Pablo González,
-%D          date=2019-11-18,
+%D          date=2020-01-21,
 %D     copyright=Pablo González,
 %D         email=pablgonz at educarchile.cl,
 %D       license=LPPL]
-\def\ScontentsFileDate{2019-11-18}%
-\def\ScontentsFileVersion{1.8}%
+\def\ScontentsFileDate{2020-01-21}%
+\def\ScontentsFileVersion{1.9}%
 \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}%
 \writestatus{loading}{User Module scontents v\ScontentsFileVersion}
 \unprotect

Modified: trunk/Master/texmf-dist/tex/generic/scontents/scontents-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/scontents/scontents-code.tex	2020-01-23 17:54:03 UTC (rev 53503)
+++ trunk/Master/texmf-dist/tex/generic/scontents/scontents-code.tex	2020-01-23 17:54:16 UTC (rev 53504)
@@ -6,7 +6,7 @@
 %%
 %% scontents.dtx  (with options: `core')
 %% 
-%% Copyright (C) 2019 by Pablo González L <pablgonz at educarchile.cl>
+%% Copyright (C) 2019-2020 by Pablo González L <pablgonz at educarchile.cl>
 %% 
 %% 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
@@ -27,8 +27,10 @@
 %%                                 t-scontents.mkiv and
 %%                                 scontents-code.tex.
 %% 
-\def\ScontentsCoreFileDate{2019-11-18}%
+\def\ScontentsCoreFileDate{2020-01-21}%
 \begingroup
+  \catcode32=10
+  \endlinechar=32
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
     \begingroup
@@ -50,23 +52,23 @@
           }%
         \endgroup
         \endinput
-      }
+      }%
   \else
     \ifx\ScontentsFileDate\ScontentsCoreFileDate
     \else
       \def\next
         {%
-          \PackageError{scontents}{Mismatched~scontents~files~detected}
+          \PackageError{scontents}{Mismatched scontents files detected}
             {%
-              You~have~attempted~to~load~scontents~with~mismatched~files:~
-              probably~you~have~one~or~more~files~'locally~installed'~which~
-              are~in~conflict.~Loading~of~scontents~will~abort.
+              You have attempted to load scontents with mismatched files:
+              probably you have one or more files 'locally installed' which
+              are in conflict. Loading of scontents will abort.
             }%
           \endgroup
           \endinput
         }%
     \fi
-\fi
+  \fi
 \next
 \keys_define:nn { scontents }
   {
@@ -122,6 +124,7 @@
 \bool_set_false:N \l__scontents_foreach_stop_bool
 \bool_new:N \l__scontents_foreach_wrapper_bool
 \bool_set_false:N \l__scontents_foreach_wrapper_bool
+\bool_new:N \l__scontents_writable_bool
 \seq_new:N \l__scontents_foreach_print_seq
 \str_const:Nx \c__scontents_hidden_space_str
   { \c_percent_str \c_circumflex_str \c_circumflex_str A scheol \c_percent_str }
@@ -160,12 +163,25 @@
   }
 \keys_define:nn { scontents / Scontents }
   {
-    print-cmd .meta:nn   = { scontents } { print-cmd = #1 },
-    print-cmd .default:n = true,
-    store-cmd .meta:nn   = { scontents } { store-cmd = #1 },
-    force-eol .meta:nn   = { scontents } { force-eol = #1 },
-    force-eol .default:n = true,
-    unknown   .code:n    = { \__scontents_parse_command_keys:n {#1} }
+    write-cmd .code:n           = {
+                                    \bool_set_true:N \l__scontents_writing_bool
+                                    \tl_set:Nn \l__scontents_fname_out_tl {#1}
+                                  },
+    write-out .code:n           = {
+                                    \bool_set_false:N \l__scontents_storing_bool
+                                    \bool_set_true:N  \l__scontents_writing_bool
+                                    \tl_set:Nn \l__scontents_fname_out_tl {#1}
+                                  },
+    write-env .value_required:n = true,
+    write-out .value_required:n = true,
+    print-cmd .meta:nn          = { scontents } { print-cmd = #1 },
+    print-cmd .default:n        = true,
+    store-cmd .meta:nn          = { scontents } { store-cmd = #1 },
+    force-eol .meta:nn          = { scontents } { force-eol = #1 },
+    force-eol .default:n        = true,
+    overwrite .meta:nn          = { scontents } { overwrite = #1 },
+    overwrite .default:n        = true,
+    unknown   .code:n           = { \__scontents_parse_command_keys:n {#1} }
   }
 \keys_define:nn { scontents / foreachsc }
   {
@@ -193,7 +209,7 @@
     wrapper .code:n           = {
                                   \bool_set_true:N \l__scontents_foreach_wrapper_bool
                                   \cs_set_protected:Npn
-                                    \__scontents_foreach_wrapper:n ##1 {#1}
+                                  \__scontents_foreach_wrapper:n ##1 {#1}
                                 },
     wrapper .value_required:n = true,
     sep     .tl_set:N         = \l__scontents_foreach_sep_tl,
@@ -281,6 +297,7 @@
     \group_insert_after:N \tl_gclear:N
     \group_insert_after:N \g__scontents_temp_tl
   }
+\cs_generate_variant:Nn \__scontents_lastfrom_seq:n { V }
 \cs_new_protected:Npn \__scontents_store_to_seq:NN #1#2
   {
     \tl_log:N #1
@@ -311,7 +328,8 @@
 \cs_new_protected:Npn \__scontents_env_generic_end:
   {
     \__scontents_stop_environment:
-    \__scontents_atend_environment:
+    \__scontents_finish_storing:NNN \l__scontents_macro_tmp_tl
+      \l__scontents_name_seq_env_tl \l__scontents_print_env_bool
   }
 \cs_new_protected:Npn \__scontents_grab_optional:n #1
   {
@@ -365,19 +383,12 @@
   \cs_new_protected:Npn \__scontents_file_tl_write_start:n #1
     {
       \group_begin:
-        \bool_if:nT  { \l__scontents_writing_bool && \l__scontents_overwrite_bool }
+        \__scontents_file_if_writable:nTF {#1}
           {
-             \file_if_exist:nTF {#1}
-               { \msg_warning:nnx { scontents } { overwrite-file } {#1} }
-               { \msg_warning:nnx { scontents } { writing-file } {#1} }
-             \iow_open:Nn \l__scontents_file_iow {#1}
+            \bool_set_true:N \l__scontents_writable_bool
+            \iow_open:Nn \l__scontents_file_iow {#1}
           }
-        \bool_if:nT  { \l__scontents_writing_bool && !\l__scontents_overwrite_bool }
-          {
-             \file_if_exist:nF {#1}
-               { \msg_warning:nnx { scontents } { writing-file } {#1} }
-              \iow_open:Nn \l__scontents_file_iow {#1}
-          }
+          { \bool_set_false:N \l__scontents_writable_bool }
         \tl_clear:N \l__scontents_file_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
@@ -452,7 +463,7 @@
     }
   \cs_new_protected:Npn \__scontents_file_write_stop:N #1
     {
-      \bool_if:NT \l__scontents_writing_bool
+      \bool_if:NT \l__scontents_writable_bool
         { \iow_close:N \l__scontents_file_iow }
       \use:x
         {
@@ -483,7 +494,7 @@
   \cs_new:Npn \__scontents_remove_leading_nl:w ^^J { }
   \cs_new_protected:Npn \__scontents_verb_processor_output:n #1
     {
-      \bool_if:NT \l__scontents_writing_bool
+      \bool_if:NT \l__scontents_writable_bool
         { \iow_now:Nn \l__scontents_file_iow {#1} }
       \bool_if:NT \l__scontents_storing_bool
         { \tl_put_right:Nn \l__scontents_file_tl { ^^J #1 } }
@@ -563,19 +574,14 @@
             ####2 \exp_not:N \q__scontents_stop
       }   { \__scontents_analyse_nesting_generic_process:nn {##1} {##2} }
   }
-\cs_new_protected:Npn \__scontents_atend_environment:
+\cs_new_protected:Npn \__scontents_finish_storing:NNN #1 #2 #3
   {
     \bool_if:NT \l__scontents_storing_bool
       {
         \bool_if:NF \l__scontents_forced_eol_bool
-          {
-            \tl_put_right:Nx \l__scontents_macro_tmp_tl
-              { \c__scontents_hidden_space_str }
-          }
-        \__scontents_store_to_seq:NN \l__scontents_macro_tmp_tl
-          \l__scontents_name_seq_env_tl
-        \bool_if:NT \l__scontents_print_env_bool
-          { \__scontents_lastfrom_seq:n \l__scontents_name_seq_env_tl }
+          { \tl_put_right:Nx #1 { \c__scontents_hidden_space_str } }
+        \__scontents_store_to_seq:NN #1 #2
+        \bool_if:NT #3 { \__scontents_lastfrom_seq:V #2 }
       }
   }
 \cs_if_exist:NF \dospecials
@@ -583,8 +589,37 @@
     \cs_new:Npn \dospecials
       { \seq_map_function:NN \l_char_special_seq \do }
   }
+\int_new:N \l__scontents_save_sf_int
+\dim_new:N \l__scontents_save_skip_dim
+\cs_new_protected:Npn \__scontents_bsphack:
+  {
+    \scan_stop:
+    \mode_if_horizontal:T
+      {
+        \dim_set_eq:NN \l__scontents_save_skip_dim \tex_lastskip:D
+        \int_set_eq:NN \l__scontents_save_sf_int \tex_spacefactor:D
+      }
+  }
+\cs_new_protected:Npn \__scontents_esphack:
+  {
+    \scan_stop:
+    \mode_if_horizontal:T
+      {
+        \int_set_eq:NN \tex_spacefactor:D \l__scontents_save_sf_int
+        \dim_compare:nNnT { \l__scontents_save_skip_dim } > { \c_zero_dim }
+          {
+            \dim_compare:nNnT { \tex_lastskip:D } = { \c_zero_dim }
+              {
+                \nobreak
+                \skip_horizontal:n { \c_zero_skip }
+              }
+            \tex_ignorespaces:D
+          }
+      }
+  }
 \cs_new_protected:Npn \__scontents_Scontents_internal:nn #1 #2
   {
+    \__scontents_bsphack:
     \group_begin:
       \tl_if_novalue:nF {#2}
         { \keys_set:nn { scontents / Scontents } {#2} }
@@ -595,24 +630,59 @@
   }
 \cs_new_protected:Npn \__scontents_norm_arg:n #1
   {
-      \tl_set:Nx \l__scontents_temp_tl { \exp_not:n {#1} }
-      \tl_put_right:Nx \l__scontents_temp_tl { \c__scontents_hidden_space_str }
-      \__scontents_store_to_seq:NN \l__scontents_temp_tl \l__scontents_name_seq_cmd_tl
-      \bool_if:NT \l__scontents_print_cmd_bool
-        { \__scontents_lastfrom_seq:n \l__scontents_name_seq_cmd_tl }
-    \group_end:
+      \tl_set:Nn \l__scontents_temp_tl {#1}
+      \__scontents_Scontents_finish:
   }
 \cs_new_protected:Npn \__scontents_verb_arg_internal:n #1
   {
-      \tl_set:Nx \l__scontents_temp_tl { \exp_not:n {#1} }
+      \tl_set:Nn \l__scontents_temp_tl {#1}
       \tl_replace_all:Nxx \l__scontents_temp_tl { \iow_char:N \^^M } { \iow_char:N \^^J }
-      \bool_if:NF \l__scontents_forced_eol_bool
-        { \tl_put_right:Nx \l__scontents_temp_tl { \c__scontents_hidden_space_str } }
-      \__scontents_store_to_seq:NN \l__scontents_temp_tl \l__scontents_name_seq_cmd_tl
-      \bool_if:NT \l__scontents_print_cmd_bool
-        { \__scontents_lastfrom_seq:n \l__scontents_name_seq_cmd_tl }
+      \__scontents_Scontents_finish:
+  }
+\cs_new_protected:Npn \__scontents_Scontents_finish:
+  {
+      \__scontents_file_write_cmd:VV \l__scontents_fname_out_tl \l__scontents_temp_tl
+      \__scontents_finish_storing:NNN \l__scontents_temp_tl
+          \l__scontents_name_seq_cmd_tl \l__scontents_print_cmd_bool
+      \use:x
+        {
     \group_end:
+    \bool_if:NF \l__scontents_print_cmd_bool { \__scontents_esphack: }
+        }
   }
+\cs_new_protected:Npn \__scontents_file_write_cmd:nn #1#2
+  {
+    \__scontents_file_if_writable:nT {#1}
+      {
+        \iow_open:Nn \l__scontents_file_iow {#1}
+        \iow_now:Nn  \l__scontents_file_iow {#2}
+        \iow_close:N \l__scontents_file_iow
+      }
+  }
+\prg_new_protected_conditional:Npnn \__scontents_file_if_writable:n #1 { T, F, TF }
+  {
+    \bool_if:NTF \l__scontents_writing_bool
+      {
+        \file_if_exist:nTF {#1}
+          {
+            \bool_if:NTF \l__scontents_overwrite_bool
+              {
+                \msg_warning:nnx { scontents } { overwrite-file } {#1}
+                \prg_return_true:
+              }
+              {
+                \msg_warning:nnx { scontents } { not-writing } {#1}
+                \prg_return_false:
+              }
+          }
+          {
+            \msg_warning:nnx { scontents } { writing-file } {#1}
+            \prg_return_true:
+          }
+      }
+      { \prg_return_false: }
+  }
+\cs_generate_variant:Nn \__scontents_file_write_cmd:nn { VV }
 \cs_new_protected:Npn \__scontents_getstored_internal:nn #1 #2
   {
     \group_begin:
@@ -641,8 +711,8 @@
         \__scontents_foreach_add_body:n
       \tl_gset:Nx \g__scontents_temp_tl
         {
-          \seq_use:Nn \l__scontents_foreach_print_seq
-            { \tl_use:N \l__scontents_foreach_sep_tl }
+          \exp_args:NNV \seq_use:Nn
+            \l__scontents_foreach_print_seq \l__scontents_foreach_sep_tl
         }
     \group_end:
     \exp_after:wN \tl_gclear:N
@@ -785,6 +855,8 @@
   { Overwriting~file~'#1'. }
 \msg_new:nnn { scontents } { writing-file }
   { Writing~file~'#1'. }
+\msg_new:nnn { scontents } { not-writing }
+  { File~`#1'~already~exists.~Not~writing. }
 \msg_new:nnn { scontents } { rescanning-text }
   { Rescanning~text~'#1'~after~\c_backslash_str end{#2}~\msg_line_context:.}
 \msg_new:nnn { scontents } { multiple-begin }

Modified: trunk/Master/texmf-dist/tex/generic/scontents/scontents.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/scontents/scontents.tex	2020-01-23 17:54:03 UTC (rev 53503)
+++ trunk/Master/texmf-dist/tex/generic/scontents/scontents.tex	2020-01-23 17:54:16 UTC (rev 53504)
@@ -6,7 +6,7 @@
 %%
 %% scontents.dtx  (with options: `loader,plain')
 %% 
-%% Copyright (C) 2019 by Pablo González L <pablgonz at educarchile.cl>
+%% Copyright (C) 2019-2020 by Pablo González L <pablgonz at educarchile.cl>
 %% 
 %% 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
@@ -27,8 +27,8 @@
 %%                                 t-scontents.mkiv and
 %%                                 scontents-code.tex.
 %% 
-\def\ScontentsFileDate{2019-11-18}%
-\def\ScontentsFileVersion{1.8}%
+\def\ScontentsFileDate{2020-01-21}%
+\def\ScontentsFileVersion{1.9}%
 \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}%
 \input expl3-generic.tex
 \ExplSyntaxOn

Modified: trunk/Master/texmf-dist/tex/latex/scontents/scontents.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/scontents/scontents.sty	2020-01-23 17:54:03 UTC (rev 53503)
+++ trunk/Master/texmf-dist/tex/latex/scontents/scontents.sty	2020-01-23 17:54:16 UTC (rev 53504)
@@ -6,7 +6,7 @@
 %%
 %% scontents.dtx  (with options: `loader,latex')
 %% 
-%% Copyright (C) 2019 by Pablo González L <pablgonz at educarchile.cl>
+%% Copyright (C) 2019-2020 by Pablo González L <pablgonz at educarchile.cl>
 %% 
 %% 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
@@ -27,8 +27,8 @@
 %%                                 t-scontents.mkiv and
 %%                                 scontents-code.tex.
 %% 
-\def\ScontentsFileDate{2019-11-18}%
-\def\ScontentsFileVersion{1.8}%
+\def\ScontentsFileDate{2020-01-21}%
+\def\ScontentsFileVersion{1.9}%
 \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}%
 \RequirePackage{expl3,xparse,l3keys2e}[2019/05/28]
 \ProvidesExplPackage
@@ -87,6 +87,8 @@
   { \__scontents_grab_optional:n {#1} }
 \cs_new_eq:NN \__scontents_analyse_nesting_format:n
   \__scontents_analyse_nesting_latex:n
+\cs_gset_eq:NN \__scontents_bsphack: \@bsphack
+\cs_gset_eq:NN \__scontents_esphack: \@esphack
 \NewDocumentCommand { \Scontents }{ !s !O{} }
   { \__scontents_Scontents_internal:nn {#1} {#2} }
 \NewDocumentCommand { \__scontents_verb_arg:w } { +v }



More information about the tex-live-commits mailing list