diff options
-rw-r--r-- | Master/texmf-dist/doc/latex/scontents/README.md | 21 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/scontents/scontents.pdf | bin | 336246 -> 341895 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/scontents/scontents.dtx | 1328 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/scontents/scontents.ins | 4 | ||||
-rw-r--r-- | Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv | 45 | ||||
-rw-r--r-- | Master/texmf-dist/tex/generic/scontents/scontents-code.tex | 344 | ||||
-rw-r--r-- | Master/texmf-dist/tex/generic/scontents/scontents.tex | 44 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/scontents/scontents.sty | 36 |
8 files changed, 1154 insertions, 668 deletions
diff --git a/Master/texmf-dist/doc/latex/scontents/README.md b/Master/texmf-dist/doc/latex/scontents/README.md index bd42d3ab4f5..9cb10569240 100644 --- a/Master/texmf-dist/doc/latex/scontents/README.md +++ b/Master/texmf-dist/doc/latex/scontents/README.md @@ -1,13 +1,13 @@ ## scontents — Stores LaTeX contents in memory or files -- Version: 1.7 -- Date: 2019-10-29 +- Version: 1.8 +- Date: 2019-11-18 - Author: Pablo González ## Description -The `scontents` package stores valid `LaTeX` code in memory (sequences) using the -`l3seq` module of `expl3`. The stored content, including `verbatim` material, can be -used as many times as desired in the document, additionally can be written -to external files. +This package allows to store `LaTeX` code, including _"verbatim"_, in <code><sequences></code> +using the `l3seq` module of `expl3`. The <code><stored content></code> can be used +as many times as desired in the document, additionally you can write to <code><external files></code> +or show it in <code><verbatim style></code>. ## Requirements The package loads and depends on updated versions of: @@ -35,8 +35,13 @@ the files to appropriate locations: then run `mktexlsr`. ## Examples -The file `scontents.pdf` contains attached examples, which can be extracted -from the PDF viewer or using `pdfdetach -saveall scontents.pdf` from command line. +The file <code><scontents.pdf></code> contains attached examples, which can be extracted +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 diff --git a/Master/texmf-dist/doc/latex/scontents/scontents.pdf b/Master/texmf-dist/doc/latex/scontents/scontents.pdf Binary files differindex 958da1dcc6f..eea74b01014 100644 --- a/Master/texmf-dist/doc/latex/scontents/scontents.pdf +++ b/Master/texmf-dist/doc/latex/scontents/scontents.pdf diff --git a/Master/texmf-dist/source/latex/scontents/scontents.dtx b/Master/texmf-dist/source/latex/scontents/scontents.dtx index c2316fb9991..3f362eea956 100644 --- a/Master/texmf-dist/source/latex/scontents/scontents.dtx +++ b/Master/texmf-dist/source/latex/scontents/scontents.dtx @@ -31,10 +31,10 @@ % and later we will copy the write stream opened by imakeidx into \@indexfile % so that entries written to both streams end up in the same file. \usepackage[english]{babel} -\usepackage[top=0.5in,bottom=0.5in,left=2in,right=0.7in,footskip=0.2in,headsep=10pt]{geometry} +\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, + %Ligatures = TeX, Numbers = OldStyle, Scale = 0.80, UprightFont = *-Regular, @@ -42,11 +42,15 @@ BoldFont = *-Semibold, BoldItalicFont = *-SemiboldIt, RawFeature = {+zero,+ss06}, - FontFace = {m}{sc}{*-ExtraLight}, + FontFace = {m}{sc}{LinBiolinum_R.otf}, Extension = .otf]{SourceCodePro} -\newfontfamily\sourcecodeprolight{SourceCodePro-Regular.otf}[Scale = 0.80,FakeStretch =0.75] +\newfontfamily\sourcecodeprolight{SourceCodePro-Regular.otf}[ + Scale = 0.80,FakeStretch =0.75, + FontFace = {m}{it}{Font =SourceCodePro-RegularIt.otf,Color=FF0000}] \RenewDocumentCommand{\MacroLongFont}{} - { \sourcecodeprolight\small } + { + \sourcecodeprolight\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 % \def\verbvisiblespace{\usefont{OT1}{cmtt}{m}{n}\asciispace} @@ -64,11 +68,6 @@ \setmathfont[Scale = 0.95]{latinmodern-math.otf} \usepackage{fontawesome5} -\newfontfamily\lmmitalic{lmmono10-italic.otf}[ - Scale = 0.95,% - Extension = .otf,% - ItalicFont = lmmono10-italic,% - ] \newfontfamily\fetamontotf{ffmw10.otf}[ Scale = 0.95,% RawFeature = {+latn,+rand,+kern,+size},% @@ -76,10 +75,11 @@ ] \usepackage[svgnames]{xcolor} \usepackage[sf,bf,compact,medium,pagestyles]{titlesec} -\usepackage{hyperxmp,lastpage,imakeidx,microtype,attachfile2} +\usepackage{lastpage,imakeidx,microtype,attachfile2} \usepackage{adjustbox,multicol,listings,accsupp,titletoc} \usepackage{scontents} % main \usepackage[contents]{colordoc} +% \show\docCodelineNo \def\textnew#1{\color{color-def}#1\/} \def\AltMacroFont{\fontencoding\encodingdefault \fontfamily\ttdefault @@ -104,6 +104,15 @@ |catcode`| 12|gdef|sxmacro@code#1% \end{macrocode*}[|liii@xmacro@code[#1]|end[macrocode*]] |endgroup +% Other patch for colordoc.sty to work xelatex +\makeatletter +\def\@moddecr#1{% + \global\advance#1\m@ne + \reset@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 @@ -117,9 +126,19 @@ \expandafter\DoNotIndex\expandafter{\string\}} \expandafter\DoNotIndex\expandafter{\string\begin} \newcommand{\HP}[1]{\emph{\hyperpage{#1}}\normalsize} -\def\MYSortIndex#1#2{\index[userdoc]{#1\actualchar#2|HP}} +\ExplSyntaxOn +\cs_new_protected:Npn \StartImplementation + { \bool_set_true:N \l__codedoc_in_implementation_bool } +\bool_set_false:N \l__codedoc_in_implementation_bool +\cs_new_protected:Npn \MYSortIndex #1 #2 + { + \bool_if:NTF \l__codedoc_in_implementation_bool + { \index{#1\actualchar#2|HP} } + { \index[userdoc]{#1\actualchar#2|HP} } + } +\ExplSyntaxOff -\indexsetup{level=\section,firstpagestyle=myheader} +\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}] % Now, after imakeidx opens the write stream for the index file, we copy @@ -130,104 +149,108 @@ \setlength{\parindent}{0pt} -%%-------------------- ONLY FOR DOCUMENTATION ------------------------%% -% Colors for options +% Colors \definecolor{optcolor}{rgb}{0.281,0.275,0.485} -\definecolor{mypkgcolor}{RGB}{0,128,128}% +\definecolor{pkgcolor}{rgb}{0,0.5,0.5} +\definecolor{araracolor}{rgb}{0, 0.72, 0.28} +\definecolor{linkcolor}{rgb}{0.04,0.38,0.04} +\definecolor{rulecolor}{rgb}{0.96,0.96,0.96} -% Logo with fetamont font for title -\makeatletter -\newsavebox{\logobox} -\savebox{\logobox}{% - \normalsize\fetamontotf{\textcolor{mypkgcolor}{s}\textcolor{OrangeRed}{content}\textcolor{mypkgcolor}{s}}} -\newcommand{\mylogo}{% - \settoheight{\@tempdima}{L}% - \resizebox{!}{\@tempdima}{\usebox{\logobox}}% - } -\makeatother +% Only for arara... I like arara :) +\usepackage[scale=0.85]{comfortaa} +\newcommand{\araratext}[1]{{\small\normalfont\comfortaa\color{araracolor}\bfseries#1}} +\newcommand*\arara{\araratext{ar\kern-.03emar\kern-.03ema}} -% Custom \meta[...]{...}, \marg[...]{...} and \oarg[...]{...} with color -\ExplSyntaxOn % User level commands +\ExplSyntaxOn +% Logo with fetamont font +\NewDocumentCommand{\pkglogo}{} + { + \group_begin: + \fetamontotf{\textcolor{pkgcolor}{s}\textcolor{OrangeRed}{content}\textcolor{pkgcolor}{s}} + \group_end: + } + +% Custom \meta[...]{...}, \marg[...]{...} and \oarg[...]{...} with color \NewDocumentCommand{\mymeta}{O{}m} { - \userdoc_meta_generic:Nnn \userdoc_meta:n { #1 } { #2 } + \userdoc_meta_generic:Nnn \userdoc_meta:n { #1 } { #2 } } \NewDocumentCommand{\mymarg}{O{}m} { - \userdoc_meta_generic:Nnn \userdoc_marg:n { #1 } { #2 } + \userdoc_meta_generic:Nnn \userdoc_marg:n { #1 } { #2 } } \NewDocumentCommand{\myoarg}{O{}m} { - \userdoc_meta_generic:Nnn \userdoc_oarg:n { #1 } { #2 } + \userdoc_meta_generic:Nnn \userdoc_oarg:n { #1 } { #2 } } % Variables and keys \tl_new:N \l_userdoc_meta_font_tl \keys_define:nn { userdoc / mymeta } { - type .choice:, - type / tt .code:n = \tl_set:Nn \l_userdoc_meta_font_tl { \ttfamily }, - type / rm .code:n = \tl_set:Nn \l_userdoc_meta_font_tl { \rmfamily }, - type .initial:n = rm, - cf .tl_set:N = \l_userdoc_meta_color_tl, - cf .initial:n = optcolor, - ac .tl_set:N = \l_userdoc_meta_anglecolor_tl, - ac .initial:n = lightgray, - sbc .tl_set:N = \l_userdoc_meta_brackcolor_tl, - sbc .initial:n = gray, - cbc .tl_set:N = \l_userdoc_meta_bracecolor_tl, - cbc .initial:n = gray, + type .choice:, + type / tt .code:n = \tl_set:Nn \l_userdoc_meta_font_tl { \ttfamily }, + type / rm .code:n = \tl_set:Nn \l_userdoc_meta_font_tl { \rmfamily }, + type .initial:n = rm, + cf .tl_set:N = \l_userdoc_meta_color_tl, + cf .initial:n = optcolor, + ac .tl_set:N = \l_userdoc_meta_anglecolor_tl, + ac .initial:n = lightgray, + sbc .tl_set:N = \l_userdoc_meta_brackcolor_tl, + sbc .initial:n = gray, + cbc .tl_set:N = \l_userdoc_meta_bracecolor_tl, + cbc .initial:n = gray, } % Internal commands \cs_new_protected:Npn \userdoc_meta_generic:Nnn #1 #2 #3 { - \group_begin: - \keys_set:nn { userdoc / mymeta } { #2 } - \color{ \l_userdoc_meta_color_tl } - \l_userdoc_meta_font_tl - #1 { #3 } % #1 is \userdoc_meta:n, \userdoc_marg:n or \userdoc_oarg:n - \group_end: + \group_begin: + \keys_set:nn { userdoc / mymeta } { #2 } + \color{ \l_userdoc_meta_color_tl } + \l_userdoc_meta_font_tl + #1 { #3 } % #1 is \userdoc_meta:n, \userdoc_marg:n or \userdoc_oarg:n + \group_end: } \cs_new_protected:Npn \userdoc_meta:n #1 { - \userdoc_meta_angle:n { \textlangle } - \userdoc_meta_meta:n { #1 } - \userdoc_meta_angle:n { \textrangle } + \userdoc_meta_angle:n { \textlangle } + \userdoc_meta_meta:n { #1 } + \userdoc_meta_angle:n { \textrangle } } \cs_new_protected:Npn \userdoc_marg:n #1 { - \userdoc_meta_brace:n { \textbraceleft } - \userdoc_meta:n { #1 } - \userdoc_meta_brace:n { \textbraceright } + \userdoc_meta_brace:n { \textbraceleft } + \userdoc_meta:n { #1 } + \userdoc_meta_brace:n { \textbraceright } } \cs_new_protected:Npn \userdoc_oarg:n #1 { - \userdoc_meta_brack:n { [ } - \userdoc_meta:n { #1 } - \userdoc_meta_brack:n { ] } + \userdoc_meta_brack:n { [ } + \userdoc_meta:n { #1 } + \userdoc_meta_brack:n { ] } } \cs_new_protected:Npn \userdoc_meta_meta:n #1 { - \textnormal{\textit{#1}} + \textnormal{\textit{#1}} } \cs_new_protected:Npn \userdoc_meta_angle:n #1 { - \group_begin: - \fontfamily{lmr}\selectfont - \textcolor{\l_userdoc_meta_anglecolor_tl}{#1} - \group_end: + \group_begin: + \fontfamily{lmr}\selectfont + \textcolor{\l_userdoc_meta_anglecolor_tl}{#1} + \group_end: } \cs_new_protected:Npn \userdoc_meta_brace:n #1 { - \group_begin: - \color{\l_userdoc_meta_bracecolor_tl} + \group_begin: + \color{\l_userdoc_meta_bracecolor_tl} #1 - \group_end: + \group_end: } \cs_new_protected:Npn \userdoc_meta_brack:n #1 { - \textcolor{\l_userdoc_meta_brackcolor_tl}{#1} + \textcolor{\l_userdoc_meta_brackcolor_tl}{#1} } % \envexamp{m} \newsavebox{\boxexaenv} @@ -236,10 +259,10 @@ \begin{lrbox}{\boxexaenv}% \begin{minipage}[t]{\marginparwidth}% \raggedright\ttfamily\small - \textcolor{gray}{\textbackslash begin\{\textcolor{mypkgcolor}{{#1}}\}\myoarg + \textcolor{gray}{\textbackslash begin\{\textcolor{pkgcolor}{{#1}}\}\myoarg [type=tt,sbc=gray,ac=lightgray,cf=optcolor]{keyval ~ list}}\par% \hspace{0.5cm}\mymeta[type=tt,ac=lightgray,cf=gray]{env ~ contents}\par% - \textcolor{gray}{\textbackslash end\{{\textcolor{mypkgcolor}{{#1}}}\}}\par + \textcolor{gray}{\textbackslash end\{{\textcolor{pkgcolor}{{#1}}}\}}\par \end{minipage}% \end{lrbox}% \usebox{\boxexaenv} @@ -249,10 +272,10 @@ \begin{lrbox}{\boxexaenv}% \begin{minipage}[t]{\marginparwidth}% \raggedright\ttfamily\small - \textcolor{mypkgcolor}{{\textbackslash#1#2}}\myoarg + \textcolor{pkgcolor}{{\textbackslash#1#2}}\myoarg [type=tt,sbc=gray,ac=lightgray,cf=optcolor]{keyval ~ list}\par% \hspace{0.5cm}\mymeta[type=tt,ac=lightgray,cf=gray]{env ~ contents}\par% - \textcolor{mypkgcolor}{{\textbackslash #3#2}}\par + \textcolor{pkgcolor}{{\textbackslash #3#2}}\par \end{minipage}% \end{lrbox}% \usebox{\boxexaenv} @@ -261,22 +284,20 @@ % \cmdexamp{s m o m o} \DeclareDocumentCommand{\cmdexamp}{o m o m o} { - \group_begin: - \small\ttfamily - \textcolor{mypkgcolor}{\textbackslash#2} - \IfValueT{#1}{ \textcolor{MediumOrchid}{#1} } - \IfValueT{#3}{ \myoarg[type=tt,sbc=gray,ac=lightgray,cf=optcolor]{#3} } - \IfValueTF{#5} - { - \mymeta[ac=gray,type=tt,cf=MediumOrchid]{#5}% - \mymeta[type=tt,ac=gray,cf=optcolor]{#4} - \mymeta[ac=gray,type=tt,cf=MediumOrchid]{#5}% - } - { \mymarg[type=tt,cbc=gray,ac=lightgray,cf=optcolor]{#4} } - \par - \group_end: - \MYSortIndex{Commands}{Commands ~ provide ~ by ~ - {\fetamontotf{\textcolor{mypkgcolor}{s}\textcolor{OrangeRed}{content}\textcolor{mypkgcolor}{s}}}:}% + \group_begin: + \small\ttfamily + \textcolor{pkgcolor}{\textbackslash#2} + \IfValueT{#1}{ \textcolor{MediumOrchid}{#1} } + \IfValueT{#3}{ \myoarg[type=tt,sbc=gray,ac=lightgray,cf=optcolor]{#3} } + \IfValueTF{#5} + { + \mymeta[ac=gray,type=tt,cf=MediumOrchid]{#5}% + \mymeta[type=tt,ac=gray,cf=optcolor]{#4} + \mymeta[ac=gray,type=tt,cf=MediumOrchid]{#5}% + } + { \mymarg[type=tt,cbc=gray,ac=lightgray,cf=optcolor]{#4} } + \par + \group_end: } % \keyexamp{mmm} @@ -286,19 +307,25 @@ \adjustbox{outer=-\marginparsep}{\textcolor{black}{\small\ttfamily{#1}}} \textcolor{gray}{\,\bfseries\texttt{=}}\,{} \mymarg[type=tt,cbc=gray,ac=lightgray,cf=optcolor]{\small{#2}} - \hfill\textcolor{gray}{ \small (\textsf{default}:~\emph{#3})} + \hfill\textcolor{gray}{\small\textsf{default}:~\emph{#3}} \par \MYSortIndex{Keys}{Keys>\texttt{#1}}% } +% \mykey{m} +\DeclareDocumentCommand{\mykey}{ m } + { + \textcolor{optcolor}{\texttt{#1}} + \MYSortIndex{Keys}{Keys>\texttt{#1}}% + } + % \mypkg{sm} \NewDocumentCommand{\mypkg}{sm} { \group_begin: \IfBooleanTF{#1} { - %\textsf{\textcolor{mypkgcolor}{s}\textcolor{OrangeRed}{content}\textcolor{mypkgcolor}{s}} - \fetamontotf{\textcolor{mypkgcolor}{s}\textcolor{OrangeRed}{content}\textcolor{mypkgcolor}{s}} + \pkglogo \MYSortIndex{packages}{Packages>\texttt{#2}} } { @@ -313,13 +340,12 @@ { \IfBooleanTF{#1} { - \textcolor{mypkgcolor}{\ttfamily{#2}}% - \MYSortIndex{environment}{ Environment ~ provide ~ by ~ - {\fetamontotf{\textcolor{mypkgcolor}{s}\textcolor{OrangeRed}{content}\textcolor{mypkgcolor}{s}}}:>\texttt{#2}} + \textcolor{pkgcolor}{\ttfamily{#2}}% + \MYSortIndex{environment}{ Environment ~ provide ~ by ~\pkglogo :>\texttt{#2}} } { - \textcolor{darkgray}{\ttfamily{#2}}% - \MYSortIndex{environment}{Environments>\texttt{#2}} + \textcolor{darkgray}{\ttfamily{#2}}% + \MYSortIndex{environment}{Environments>\texttt{#2}} } } @@ -330,12 +356,8 @@ { \tl_set:Nn \l_tmpa_tl { #2 } \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl - \textcolor{mypkgcolor}{\ttfamily\textbackslash{\tl_use:N \l_tmpa_tl}} - \MYSortIndex{Commands}{ Commands ~ provide ~ by ~ - { - \fetamontotf{ - \textcolor{mypkgcolor}{s}\textcolor{OrangeRed}{content}\textcolor{mypkgcolor}{s}} - }:>\texttt{\textbackslash#2}} + \textcolor{pkgcolor}{\ttfamily\textbackslash{\tl_use:N \l_tmpa_tl}} + \MYSortIndex{Commands}{ Commands ~ provide ~ by ~ \pkglogo :>\texttt{\textbackslash#2}} } { \textcolor{darkgray}{\ttfamily\textbackslash{#2}} @@ -363,10 +385,9 @@ \lstnewenvironment{verbatimsc} { \lstset{ - language=,% - basicstyle= \ttfamily, - columns = fullflexible, - gobble = 2,% + language =,% + basicstyle = \ttfamily\small, + gobble = 2,% } }{} \makeatother @@ -376,100 +397,100 @@ % Create a language for documentation \lstdefinelanguage{scontents-doc}{ - texcsstyle=*,% - escapechar=`,% - extendedchars=true,% - breakatwhitespace=true,% - breaklines=true,% - keepspaces=true,% - columns=fullflexible,% - stringstyle= {\color{red}},% - basicstyle=\ttfamily\small,% - alsoletter={-,@,.},% + texcsstyle = *,% + escapechar = Ç,% + extendedchars = true,% + keepspaces = true,% + stringstyle = {\color{red}},% + basicstyle = \ttfamily\small,% + alsoletter = {-,@,.},% % comments - morecomment=[l]{\%},% - commentstyle=\lmmitalic\small\itshape\color{lightgray},% + morecomment = [l]{\%},% + commentstyle = \ttfamily\small\color{lightgray},% % Important words 1 - keywordstyle=[1]{\color{gray}},% - keywords=[1]{begin,end,Verbatim},% + keywordstyle = [1]{\color{gray}},% + keywords = [1]{begin,end,Verbatim,env,myseq,false},% % Other words 2 - keywordstyle=[2]{\color{blue!75}},% - keywords=[2]{usepackage,section,documentclass,input,usemodule, - subsection,ExplSyntaxOff,ExplSyntaxOn,RequirePackage, - ProvidesExplPackage},% + keywordstyle = [2]{\color{blue!75}},% + keywords = [2]{usepackage,section,documentclass,input,usemodule, + subsection,ExplSyntaxOff,ExplSyntaxOn,RequirePackage, + ProvidesExplPackage},% % Other words 3 - keywordstyle=[3]{\color{optcolor!85}},% - keywords=[3]{document,article,setlength,pagestyle,definecolor},% + keywordstyle = [3]{\color{optcolor!85}},% + keywords = [3]{document,article,setlength,pagestyle,definecolor},% % Reserved words 4 (scontents pkg) - keywordstyle=[4]{\color{mypkgcolor}},% - keywords=[4]{scontents,Scontents,getstored,typestored,verbatimsc,% - endverbatimsc,countsc,meaningsc,foreachsc,macros - endscontents,startscontents,stopscontents,scontents.tex},% -% Reserved in red - keywordstyle=[5]{\color{red}},% - keywords=[5]{makeatletter,makeatother,let,verb,@undefined,makebox,def,% - par,item,parindent,lstinline,@ifpackagelater,ver@xparse.sty,% - dospecials,do@noligs,char,outer},% -% Reserved in orange - 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,% - width-tab,force-eol,inner,outer,I,J,M,L,Ascheol},% -% Reserved in orange - keywordstyle=[7]{\color{OrangeRed}},% - keywords=[7]{DefineVerbatimEnvironment,lstnewenvironment,newminted,% - newtheorem,newenvironment,VerbatimEnvironment},% + keywordstyle = [4]{\color{pkgcolor}},% + keywords = [4]{scontents,Scontents,getstored,typestored,verbatimsc,% + endverbatimsc,countsc,meaningsc,foreachsc,macros,newenvsc, + endscontents,startscontents,stopscontents,scontents.tex},% +% Reserved words 5 (in red) + keywordstyle = [5]{\color{red}},% + keywords = [5]{makeatletter,makeatother,let,verb,@undefined,makebox,def,% + par,item,parindent,lstinline,@ifpackagelater,ver@xparse.sty,% + ver@scontents.sty,dospecials,do@noligs,char,outer,jobname,inner},% +% 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,% + overwrite,width-tab,force-eol,inner,outer,I,J,M,L,Ascheol},% +% Reserved words 7 (OrangeRed) + keywordstyle = [7]{\color{OrangeRed}},% + keywords = [7]{DefineVerbatimEnvironment,lstnewenvironment,newminted,% + newtheorem,newenvironment,VerbatimEnvironment,myenvstore},% % literate - literate=*{\{}{{{\color{gray}{\char`\{}}}}{1} - {\}}{{{\color{gray}{\char`\}}}}}{1} - {\|}{{{\color{gray}{\char`\|}}}}{1} - {\$}{{{\color{gray}{\char`\$}}}}{1} - {\#}{{{\color{optcolor}{\char`\#}}}}{1} - {[}{{\textcolor{gray}{[}}}{1} - {]}{{\textcolor{gray}{]}}}{1} - {,}{{\textcolor{gray}{,}}}{1} - {;}{{\textcolor{gray}{;}}}{1} - {\&}{{\textcolor{gray}{\&}}}{1} - {>}{{\textcolor{OrangeRed}{\guillemotright}}}{1} - {*}{{\textcolor{MediumOrchid}{*}}}{1} - %{@}{{\textcolor{red}{@}}}{1} - {\^}{{\textcolor{optcolor}{\textasciicircum}}}{1} - {0}{{\textcolor{MediumOrchid}{0}}}{1} - {1}{{\textcolor{MediumOrchid}{1}}}{1} - {2}{{\textcolor{MediumOrchid}{2}}}{1} - %{3}{{\textcolor{MediumOrchid}{3}}}{1}% expl3 - {4}{{\textcolor{MediumOrchid}{4}}}{1} - {5}{{\textcolor{MediumOrchid}{5}}}{1} - {6}{{\textcolor{MediumOrchid}{6}}}{1} - {7}{{\textcolor{MediumOrchid}{7}}}{1} - {8}{{\textcolor{MediumOrchid}{8}}}{1} - {9}{{\textcolor{MediumOrchid}{9}}}{1} - {.0}{{\textcolor{MediumOrchid}{.0}}}{2}% Following is to ensure that only periods - {.1}{{\textcolor{MediumOrchid}{.1}}}{2}% followed by a digit are changed. - {.2}{{\textcolor{MediumOrchid}{.2}}}{2} - {.3}{{\textcolor{MediumOrchid}{.3}}}{2} - {.4}{{\textcolor{MediumOrchid}{.4}}}{2} - {.5}{{\textcolor{MediumOrchid}{.5}}}{2} - {.6}{{\textcolor{MediumOrchid}{.6}}}{2} - {.7}{{\textcolor{MediumOrchid}{.7}}}{2} - {.8}{{\textcolor{MediumOrchid}{.8}}}{2} - {.9}{{\textcolor{MediumOrchid}{.9}}}{2} - {=}{{\textcolor{gray}{=}}}{1},% + literate =*{\{}{{{\color{gray}{\char`\{}}}}{1} + {\}}{{{\color{gray}{\char`\}}}}}{1} + {\|}{{{\color{gray}{\char`\|}}}}{1} + {\$}{{{\color{gray}{\char`\$}}}}{1} + {\#}{{{\color{optcolor}{\char`\#}}}}{1} + {[}{{\textcolor{gray}{[}}}{1} + {]}{{\textcolor{gray}{]}}}{1} + {,}{{\textcolor{gray}{,}}}{1} + {;}{{\textcolor{gray}{;}}}{1} + {`}{{\textcolor{gray}{\textasciigrave}}}{1} + {\&}{{\textcolor{gray}{\&}}}{1} + {>}{{\textcolor{OrangeRed}{\guillemotright}}}{1} + {<}{{\textcolor{OrangeRed}{\guillemotleft}}}{1} + {*}{{\textcolor{MediumOrchid}{*}}}{1} + {\^}{{\textcolor{optcolor}{\textasciicircum}}}{1} + {0}{{\textcolor{MediumOrchid}{0}}}{1} + {1}{{\textcolor{MediumOrchid}{1}}}{1} + {2}{{\textcolor{MediumOrchid}{2}}}{1} + {3}{{\textcolor{MediumOrchid}{3}}}{1} + {4}{{\textcolor{MediumOrchid}{4}}}{1} + {5}{{\textcolor{MediumOrchid}{5}}}{1} + {6}{{\textcolor{MediumOrchid}{6}}}{1} + {7}{{\textcolor{MediumOrchid}{7}}}{1} + {8}{{\textcolor{MediumOrchid}{8}}}{1} + {9}{{\textcolor{MediumOrchid}{9}}}{1} + {.0}{{\textcolor{MediumOrchid}{.0}}}{2}% Following is to ensure that only periods + {.1}{{\textcolor{MediumOrchid}{.1}}}{2}% followed by a digit are changed. + {.2}{{\textcolor{MediumOrchid}{.2}}}{2} + {.3}{{\textcolor{MediumOrchid}{.3}}}{2} + {.4}{{\textcolor{MediumOrchid}{.4}}}{2} + {.5}{{\textcolor{MediumOrchid}{.5}}}{2} + {.6}{{\textcolor{MediumOrchid}{.6}}}{2} + {.7}{{\textcolor{MediumOrchid}{.7}}}{2} + {.8}{{\textcolor{MediumOrchid}{.8}}}{2} + {.9}{{\textcolor{MediumOrchid}{.9}}}{2} + {=}{{\textcolor{gray}{=}}}{1},% }[keywords,tex,comments,strings]% end languaje % \begin{examplecode}[key=val]...\end{examplecode} \lstnewenvironment{examplecode}[1][]{% \lstset{ - language=scontents-doc,% - stringstyle= {\color{red}},% - basicstyle=\ttfamily\small,% - numbersep=1em,% - numberstyle=\tiny\color{lightgray}\noaccsupp,% - rulecolor=\color{gray!50},% - framesep=\fboxsep,% - framerule=\fboxrule,% - xleftmargin=\dimexpr\fboxsep+\fboxrule\relax,% - xrightmargin=\dimexpr\fboxsep+\fboxrule\relax,% + language = scontents-doc,% + stringstyle = {\color{red}},% + basicstyle = \ttfamily\small,% + columns = fullflexible,% + fontadjust = true,% + aboveskip = 8pt,% + belowskip = 5pt,% + rulecolor = \color{gray!50},% + framesep = \fboxsep,% + framerule = \fboxrule,% + xleftmargin = \dimexpr\fboxsep+\fboxrule\relax,% + xrightmargin= \dimexpr\fboxsep+\fboxrule\relax,% #1,% }% close lstset }{}% close examplecode @@ -477,56 +498,55 @@ % \lstinline[style=inline]|...| \lstdefinestyle{inline} { - language=scontents-doc,% - escapechar=`,% - upquote=true,% - numbersep=1em,% - columns=fullflexible,% - numberstyle=\tiny\color{lightgray}\noaccsupp,% - literate=*{\%}{{\bfseries\textcolor{gray}{\%}}}{1} + language = scontents-doc,% + upquote = true,% + numbersep = 1em,% + numberstyle = \tiny\color{lightgray}\noaccsupp,% + literate =*{\%}{{\textcolor{gray}{\%}}}{1} } % Set default \lstinline style \lstset{style=inline} + +% Set short §...§ \lstMakeShortInline[language=scontents-doc,basicstyle=\ttfamily]§ % Get file info \GetFileInfo{\jobname.sty} % Config hyperref -\definecolor{linkcolour}{cmyk}{0.64,0,0.95,0.40}% <-Olive Green \hypersetup{ - linkcolor = linkcolour,% - citecolor = linkcolour,% - urlcolor = linkcolour,% + allcolors = linkcolor, colorlinks = true,% linktoc = all,% pdftitle = {.:: The scontents package --- \fileinfo{} ::.},% pdfauthor = {Pablo González L}, pdfsubject = {Documentation for \fileversion{} [\filedate] },% - pdfcopyright = {\textcopyright 2019 by Pablo González}, - pdfcontacturl = {https://github.com/pablgonz/scontents}, pdfkeywords = {sequences, contents, external files, expl3, xparse, l3seq, store contents}, - pdfstartview = {FitH},% bookmarksopenlevel = 1,% } % Configuration titleps and titlesec \settitlemarks{section} -\renewpagestyle{plain}[\color{gray}\small\sffamily]{ -\setfoot{}{}{\thepage/\pageref{LastPage}}} - -\newpagestyle{myheader}[\color{gray}\small\sffamily]{ -\renewcommand\makeheadrule{\color{gray}\rule[0.45\baselineskip]{\linewidth}{0.4pt}} -\setfoot{\scalebox{0.8}{\mylogo}\space\textcopyright\space 2019 by Pablo González} - {} - {\thepage/\pageref{LastPage}} -\sethead{\raisebox{0.75\baselineskip}{Documentation for \fileversion\space[\filedate]}} - {} - {\raisebox{0.75\baselineskip}{\scshape\small\S.\thesection\space\sectiontitle}} +\renewpagestyle{plain}[\color{optcolor}\small\sffamily]{% +\setfoot{\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax% + \parbox{1.93\paperwidth\relax}{\hfil\thepage\,/\,\pageref{LastPage}}}}% + {}% + {}% +} +\newpagestyle{myheader}[\color{optcolor}\small\sffamily]{% +\renewcommand\makeheadrule{% +\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax + \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}}}% + {}% +\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}}}% + {}% } - -\setlength{\headheight}{21pt}% \titlecontents{section}[0mm]{}% {\bfseries\contentspush{\makebox[5mm][l]{\thecontentslabel\hfill}}}% @@ -541,7 +561,7 @@ \makeatletter \renewcommand\tableofcontents{% \begingroup% -\section*{\contentsname\quad{\color{optcolor}\leaders\hrule height 5pt depth -4.4pt\hfill}% +\section*{\contentsname\quad{\color{gray}\leaders\hrule height 5pt depth -4.4pt\hfill}% \@mkboth{% \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}% \vspace*{-14pt} @@ -549,11 +569,18 @@ \begin{multicols}{2}% \@starttoc{toc}% \end{multicols}% -\vspace*{-3pt}{\color{optcolor}\hrule height 0.6pt}% +\vspace*{-3pt}{\color{gray}\hrule height 0.6pt}% \vspace*{5pt} \endgroup } \makeatother +% thanks +\makeatletter +\renewcommand*{\@fnsymbol}[1]{\ensuremath{\ifcase#1\or \textcolor{pkgcolor}{*} +\or \textcolor{pkgcolor}{\dagger} \or \ddagger\or \mathsection +\or \mathparagraph\or \|\or **\or \dagger\dagger +\or \ddagger\ddagger \else\@ctrerr\fi}} +\makeatother \begin{document} \DocInput{\jobname.dtx} \end{document} @@ -561,7 +588,7 @@ % \fi % % \title{ -% \scalebox{1.025}{\mylogo}\\[2pt] +% \scalebox{1.57}{\pkglogo}\\[2pt] % \Large % \textsf{Stores \hologo{LaTeX}}{ \fetamontotf{contents} }\\[3pt] % \fileversion{} --- \filedate\thanks{ @@ -569,24 +596,24 @@ % \filedate.}\\[25pt] % \author{ % \large -% \raisebox{-1pt}{\textcopyright}{}2019 by Pablo González -% \thanks{E-mail: \textsf{\guillemotleft}\email{pablgonz@educarchile.cl}\textsf{\guillemotright}}% +% \raisebox{-1pt}{\textcopyright}{}2019 by Pablo González\thanks{ +% E-mail: \textcolor{OrangeRed}{\textsf{\guillemotleft}}\email{pablgonz@educarchile.cl}\textcolor{OrangeRed}{\textsf{\guillemotright}}. +% }% % } % \small -% \textsc{ctan}: \url{http://www.ctan.org/pkg/scontents}\\ -% \textsc{git}: \url{https://github.com/pablgonz/scontents} +% \textsc{ctan}: \url{https://www.ctan.org/pkg/scontents}\\ +% \textcolor{gray}{\scriptsize\faIcon[regular]{github}}\,\,\,\url{https://github.com/pablgonz/scontents} % \vspace*{-2cm} % } % \date{} % \maketitle % -% \begin{scontents}[store-env=abstract,print-env=true] +% \begin{scontents}[store-env=abstract, print-env=true] % \begin{abstract} -% The \mypkg*{scontents} package stores valid \hologo{LaTeX} code in -% \mymeta{sequences} using the \mypkg{l3seq} module of \mypkg{expl3}. -% The \mymeta{stored content}, including \emph{verbatim}, can be used -% as many times as desired in the document, additionally can be written -% to \mymeta{external files}. +% This package allows to store \hologo{LaTeX} code, including \enquote{\emph{verbatim}}, +% in \mymeta{sequences} using the \mypkg{l3seq} module of \mypkg{expl3}. The \mymeta{stored +% content} can be used as many times as desired in the document, additionally you can write +% to \mymeta{external files} or show it in \mymeta{verbatim style}. % \end{abstract} % \end{scontents} % @@ -597,10 +624,10 @@ % \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{verbatim content} is a +% 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 -% \emph{buffers} that has \hologo{ConTeXt} which allows you to save content in +% \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 % excellent way to manage data, ideas were combined giving rise to this package. @@ -613,7 +640,7 @@ % of the \href{https://tex.stackexchange.com}{TeX-SX} community who have provided % great answers and ideas. Here a note of the main ones: % -% \begin{enumerate}[nosep] +% \begin{enumerate}[left=0pt, labelsep=5pt, noitemsep, nosep, label=\small\arabic*.] % \item \href{https://tex.stackexchange.com/q/45946/7832}{Stack datastructure using LaTeX} % % \item \href{https://tex.stackexchange.com/q/5338/7832}{LaTeX equivalent of ConTeXt buffers} @@ -651,12 +678,11 @@ % \subsection{Description of the package and load} % % \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}. +% 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 is loaded in the usual way: @@ -671,13 +697,14 @@ % \iffalse %</example> % \fi -% \vspace*{-5pt} +% % or +% % \iffalse %<*example> % \fi \begin{examplecode}[frame=single] -\usepackage`\small\myoarg[type=tt]{key \textnormal{\textcolor{gray}{=}} val}`{scontents} +\usepackageÇ\small\myoarg[type=tt]{key \textnormal{\textcolor{gray}{=}} val}Ç{scontents} \end{examplecode} % \iffalse %</example> @@ -715,8 +742,8 @@ % % 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}(\verbvisiblespace\verbvisiblespace{} -% or \verbvisiblespace\verbvisiblespace\verbvisiblespace\verbvisiblespace) or both. +% (\enquote{hard tabs}), others with \enquote{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}) % are processed according to the context in which they are found within @@ -745,7 +772,7 @@ % % Most of the options can be passed directly to the package or using the % command \ics*{setupsc}. All boolean keys can be passed using the -% equal sign \enquote{\textnormal{\textcolor{optcolor}{=}}} or just the +% equal sign \enquote{\textnormal{\textcolor{gray}{=}}} or just the % name of the key, all unknown keys will return an error. In this section % are described some of the options, a summary of all options is shown in % section \ref{sec:optover}. @@ -764,32 +791,37 @@ % % \keyexamp{verb-font}{font family}{\textnormal{\ttfamily\textbackslash{}ttfamily}} % Sets the \mymeta{font family} used to display the \mymeta{stored content} for the -% commands \ics*{typestored} and \ics*{meaningsc}. This key is only available +% \ics*{typestored} and \ics*{meaningsc} commands. This key is only available % as a package option or using \ics*{setupsc}. % % \medskip % % \keyexamp{store-all}{seq name}{not used} -% It is a \mymeta{meta-key} that sets the §store-env§ key of the \myenv*{scontents} -% environment and the §store-cmd§ key of the \ics*{Scontents} command. This key is +% It is a \mymeta{meta-key} that sets the \mykey{store-env} key of the \myenv*{scontents} +% 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 % +% \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. +% \medskip +% % \keyexamp{print-all}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} -% It is a \mymeta{meta-key} that sets the §print-env§ key of the \myenv*{scontents} -% environment and the §print-cmd§ key of the \ics*{Scontents} command. This key is +% It is a \mymeta{meta-key} that sets the \mykey{print-env} key of the \myenv*{scontents} +% environment and the \mykey{print-cmd} key of the \ics*{Scontents} command. This key is % only available as a package option or using \ics*{setupsc}. % -% \medskip -% % \keyexamp{force-eol}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} % Sets if the end of line for the \mymeta{stored content} is hidden or not. % 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{\textcolor{gray}{\%}} -% after closing §\end{§\textcolor{gray}{...}§}%§. This key is available for the \myenv*{scontents} -% environment and the \ics*{Scontents} command. +% 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. % % \keyexamp{width-tab}{integer}{1} % Sets the equivalence in \mymeta{spaces} for the character "TAB" @@ -800,29 +832,30 @@ % \subsection{Options Overview} % \label{sec:optover} % -% \newcommand*{\xmark}{\textcolor{red}{✘}}% -% \newcommand*{\cmark}{\textcolor{green}{✔}}% +% \newcommand*{\xmark}{\textcolor{OrangeRed}{✘}}% +% \newcommand*{\cmark}{\textcolor{linkcolor}{✔}}% % -% Summary of available options. +% Summary of available options: % % \setlength{\tabcolsep}{0.25em} % \begin{center} % \small % \begin{tabular}{cccccccc} % \toprule -% \texttt{key} &package &\ics{setupsc} &\myenv*{scontents} &\ics*{Scontents} &\ics*{Scontents*} &\ics*{typestored} &\ics*{meaningsc}\\ +% \texttt{key} &package &\ics*{setupsc} &\myenv*{scontents} &\ics*{Scontents} &\ics*{Scontents*} &\ics*{typestored} &\ics*{meaningsc}\\ % \midrule -% \texttt{store-env} & \cmark & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark \\ -% \texttt{store-cmd} & \cmark & \cmark & \xmark & \cmark & \cmark & \xmark & \xmark \\ -% \texttt{print-env} & \cmark & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark \\ -% \texttt{print-cmd} & \cmark & \cmark & \xmark & \cmark & \cmark & \xmark & \xmark \\ -% \texttt{print-all} & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark & \xmark \\ -% \texttt{store-all} & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark & \xmark \\ -% \texttt{write-env} & \xmark & \xmark & \cmark & \xmark & \xmark & \xmark & \xmark \\ -% \texttt{write-out} & \xmark & \xmark & \cmark & \xmark & \xmark & \xmark & \xmark \\ -% \texttt{width-tab} & \cmark & \cmark & \xmark & \xmark & \xmark & \cmark & \cmark \\ -% \texttt{force-eol} & \cmark & \cmark & \cmark & \xmark & \cmark & \xmark & \xmark \\ -% \texttt{verb-font} & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark & \xmark \\ +% \mykey{store-env} & \cmark & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark \\ +% \mykey{store-cmd} & \cmark & \cmark & \xmark & \cmark & \cmark & \xmark & \xmark \\ +% \mykey{print-env} & \cmark & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark \\ +% \mykey{print-cmd} & \cmark & \cmark & \xmark & \cmark & \cmark & \xmark & \xmark \\ +% \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{width-tab} & \cmark & \cmark & \xmark & \xmark & \xmark & \cmark & \cmark \\ +% \mykey{force-eol} & \cmark & \cmark & \cmark & \xmark & \cmark & \xmark & \xmark \\ +% \mykey{verb-font} & \cmark & \cmark & \xmark & \xmark & \xmark & \xmark & \xmark \\ % \bottomrule % \end{tabular} % \end{center} @@ -870,14 +903,11 @@ % \fi \begin{examplecode}[frame=single] \begin{scontents}[store-env=outer] -This text is in the outer environment -(before nested). +This text is in the outer environment (before nested). \begin{scontents}[store-env=inner] -This text is found in the inner environment -(inside of nested). +This text is found in the inner environment (inside of nested). \end{scontents} -This text is in the outer environment -(after nested). +This text is in the outer environment (after nested). \end{scontents} \end{examplecode} % \iffalse @@ -886,13 +916,11 @@ This text is in the outer environment % % Of course, content stored in the \mymeta{inner} sequence is only available % after content stored in the \mymeta{outer} sequence one has been retrieved, -% either by using the key §print-env§ or §\getstored§ command. +% either by using the key \mykey{print-env} or \ics*{getstored} command. % % It is advisable to store content within sequences with different names, % so as not to get lost in the order in which content is stored. % -% \newpage -% % \subsection*{Notes for \hologo{plainTeX} and \hologo{ConTeXt} users} % % In \hologo{plainTeX} there is not environments as in \hologo{LaTeX}. @@ -918,7 +946,7 @@ This text is in the outer environment % The environment options can be configured globally using option % in package or the \ics*{setupsc} command and locally using % \myoarg{key \textnormal{\textcolor{gray}{=}} val} in the environment. -% The key §force-eol§ is available for this environment. +% The key \mykey{force-eol} is available for this environment. % % \keyexamp{store-env}{seq name}{contents} % Sets the name of the \mymeta{sequence} in which the contents will be @@ -957,6 +985,43 @@ This text is in the outer environment % must add \texttt{\textcolor{optcolor}{-8bit}} at the command line, % otherwise you will get \hologo{TeX}-"TAB" (§^^I§) in \mymeta{file.ext}. % +% +% \subsection{The command \cs{newenvsc}} +% \label{sec:newenvsc} +% +% \newsavebox{\exaboxtmp} +% \begin{lrbox}{\exaboxtmp} +% \small\ttfamily +% \textcolor{pkgcolor}{\textbackslash newenvsc}\mymarg[type=tt]{env name}\myoarg[type=tt]{initial keys} +% \end{lrbox} +% +% \vspace*{-10pt} +% +% \begin{function}{\newenvsc} +% \begin{syntax} +% \usebox{\exaboxtmp} +% \end{syntax} +% \end{function} +% +% 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: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\newenvsc{myenvstore}[store-env=myseq,print-env=false] +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% created the §myenvstore§ environment that stored the content in the §myseq§ +% sequence and will not display the content when it is executed. +% % \subsection{The command \cs{Scontents}} % \label{sec:Scontents} % @@ -987,6 +1052,8 @@ This text is in the outer environment % \enquote{\texttt{\textcolor{gray}{\textbackslash\}}}} must also be % balanced if the argument is used with braces and "TAB"s characters typed % from the keyboard are converted into spaces. +% The starred argument (§*§) and \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% must not be separated by horizontal spaces between them and the command. % % Both versions can be used anywhere in the document and cannot be used % as an \mymeta{argument} for other command. @@ -996,7 +1063,7 @@ This text is in the outer environment % % The command options can be configured globally using option in package % or the \ics*{setupsc} command and locally using \myoarg{key \textnormal{\textcolor{gray}{=}} val}. -% The key §force-eol§ is available for this command. +% The key \mykey{force-eol} is available for this command. % % \keyexamp{store-cmd}{seq name}{contents} % Sets the name of the \mymeta{sequence} in which the contents will be stored. @@ -1022,9 +1089,9 @@ This text is in the outer environment % % The command \ics*{getstored} gets the content stored in \mymarg{seq name} % according to the \mymeta{index} in which it was stored. The command is -% robust and can be used as an \mymeta{argument} for another command. If the -% optional argument is not passed it defaults to the first element stored -% in the \mymarg{seq name}. +% robust and can be used as an \mymeta{argument} for another command. If +% the optional argument is not passed, the default value is the \enquote{last +% element} stored in \mymarg{seq name}. % % \subsection{The command \cs{foreachsc}} % \label{sec:foreachsc} @@ -1072,8 +1139,13 @@ This text is in the outer environment % Sets the \mymarg{code} that will be executed \mymeta{after} each content stored % in \mymarg{seq name}. The \mymarg{code} must be passed between braces. % -% \keyexamp{wrapper}{code \textnormal{\textcolor{gray}{\{\#1\}}} more code}{empty} -% Wraps the content stored in \mymarg{seq name} referenced by \mymarg{\#1}. +% \newsavebox{\hashbox} +% \begin{lrbox}{\hashbox} +% \lstinline[language=scontents-doc,basicstyle=\ttfamily]+{#1}+ +% \end{lrbox} +% +% \keyexamp{wrapper}{code{} \space\usebox{\hashbox} more code}{empty} +% Wraps the content stored in \mymarg{seq name} referenced by §{#1}§. % The \mymarg{code} must be passed between braces. For example % §\foreachsc[wrapper={\makebox[1em][l]{#1}}]{contents}§. % @@ -1093,9 +1165,10 @@ This text is in the outer environment % \end{function} % % If the optional argument is not passed it defaults to the first element -% stored in the \mymarg{seq name}. The key §width-tab§ is available for +% stored in the \mymarg{seq name}. The key \mykey{width-tab} is available for % this command. % +% % \subsection{The environment \env{verbatimsc}} % \label{sec:verbatimsc} % @@ -1111,9 +1184,9 @@ This text is in the outer environment % a real \emph{verbatim} environment. The \mypkg{verbatim} package is not % compatible with the implementation of the \myenv*{verbatimsc} environment. % -% The \myenv*{verbatimsc} environment can be customized in the following ways: +%^^A \newpage % -% \newpage +% The \myenv*{verbatimsc} environment can be customized in the following ways: % % Using the package \mypkg{fancyvrb}: % \iffalse @@ -1188,7 +1261,7 @@ This text is in the outer environment % \end{function} % % If the optional argument is not passed it defaults to the first element -% stored in the \mymarg{seq name}. The key §width-tab§ is available for +% stored in the \mymarg{seq name}. The key \mykey{width-tab} is available for % this command. % % \subsection{The command \cs{countsc}} @@ -1243,11 +1316,10 @@ This text is in the outer environment \begin{examplecode}[numbers=left] \begin{scontents}[store-env=abstract,print-env=true] \begin{abstract} -The \mypkg*{scontents} package stores valid \hologo{(La)TeX} code in -\mymeta{sequences} using the \mypkg{l3seq} module of \mypkg{expl3}. -The \mymeta{stored content}, including \emph{verbatim}, can be used -as many times as desired in the document, additionally can be written -to \mymeta{external files}. +This package allows to store \hologo{LaTeX} code, including \enquote{\emph{verbatim}}, +in \mymeta{sequences} using the \mypkg{l3seq} module of \mypkg{expl3}. The \mymeta{stored +content} can be used as many times as desired in the document, additionally you can write +to \mymeta{external files} or show it in \mymeta{verbatim style}. \end{abstract} \end{scontents} \end{examplecode} @@ -1262,12 +1334,11 @@ to \mymeta{external files}. % \fi \begin{examplecode}[numbers=left] \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}. +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} \end{examplecode} % \iffalse @@ -1280,7 +1351,19 @@ by making use \mymeta{sequences}. % \section{Examples} % % These are some adapted examples that have served as inspiration for -% the creation of this package. +% the creation of this package. The examples are attached to this documentation +% and can be extracted from your PDF viewer or from the command line by running: +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +$ pdfdetach -saveall scontents.pdf +\end{examplecode} +% \iffalse +%</example> +% \fi +% and then you can use the excellent \arara\footnote{The cool \TeX\ automation tool: +% \url{https://www.ctan.org/pkg/arara}} tool to compile them. % % \subsection{From \texttt{answers} package} % @@ -1290,6 +1373,8 @@ by making use \mymeta{sequences}. %<*example> % \fi \begin{scontents}[write-out=scexamp1.ltx] +% arara: pdflatex +% arara: clean: { extensions: [ aux, log] } \documentclass{article} \usepackage[store-cmd=solutions]{scontents} \newtheorem{ex}{Exercise} @@ -1314,7 +1399,7 @@ Second exercise % \fi % % Adaptation of example 1 of the package \mypkg{answers} -% \textattachfile[color=0 0 1]{scexamp1.ltx}{\faFile*[regular]}. +% \textattachfile[color=linkcolor,print=false]{scexamp1.ltx}{\faFile*[regular]}. % \lstinputlisting[language=scontents-doc,numbers=left]{scexamp1.ltx} % % \subsection{From \texttt{filecontentsdef} package} @@ -1325,6 +1410,8 @@ Second exercise %<*example> % \fi \begin{scontents}[write-out=scexamp2.ltx] +% arara: pdflatex +% arara: clean: { extensions: [ aux, log] } \documentclass{article} \usepackage[store-env=defexercise,store-cmd=defexercise]{scontents} \pagestyle{empty} @@ -1356,7 +1443,7 @@ seventies that the \NSA\ has known that for 40 years.\par % \fi % % Adaptation of example from package \mypkg{filecontentsdef} -% \textattachfile[color=0 0 1]{scexamp2.ltx}{\faFile*[regular]}. +% \textattachfile[color=linkcolor,print=false]{scexamp2.ltx}{\faFile*[regular]}. % \lstinputlisting[language=scontents-doc,numbers=left]{scexamp2.ltx} % % \subsection{From TeX-SX} @@ -1367,6 +1454,8 @@ seventies that the \NSA\ has known that for 40 years.\par %<*example> % \fi \begin{scontents}[write-out=scexamp3.ltx] +% arara: pdflatex +% arara: clean: { extensions: [ aux, log] } \documentclass{article} \usepackage[store-cmd=tikz]{scontents} \usepackage{tikz} @@ -1418,7 +1507,7 @@ This is a \verb*|fake poor man's buffer :)|. % \fi % % Adapted from \href{https://tex.stackexchange.com/q/5338/7832}{LaTeX equivalent of ConTeXt buffers} -% \textattachfile[color=0 0 1]{scexamp3.ltx}{\faFile*[regular]}. +% \textattachfile[color=linkcolor,print=false]{scexamp3.ltx}{\faFile*[regular]}. % \lstinputlisting[language=scontents-doc,numbers=left]{scexamp3.ltx} % % \subsubsection*{Example 4} @@ -1427,6 +1516,8 @@ This is a \verb*|fake poor man's buffer :)|. %<*example> % \fi \begin{scontents}[write-out=scexamp4.ltx] +% arara: pdflatex +% arara: clean: { extensions: [ aux, log] } \documentclass{article} \usepackage{scontents} \pagestyle{empty} @@ -1458,7 +1549,7 @@ This is stored in other: \getstored[1]{other} % \fi % % Adapted from \href{https://tex.stackexchange.com/q/184503/7832}{Collecting contents of environment and store them for later retrieval} -% \textattachfile[color=0 0 1]{scexamp4.ltx}{\faFile*[regular]}. +% \textattachfile[color=linkcolor,print=false]{scexamp4.ltx}{\faFile*[regular]}. % \lstinputlisting[language=scontents-doc,numbers=left]{scexamp4.ltx} % % \subsubsection*{Example 5} @@ -1467,6 +1558,8 @@ This is stored in other: \getstored[1]{other} %<*example> % \fi \begin{scontents}[write-out=scexamp5.ltx] +% arara: pdflatex +% arara: clean: { extensions: [ aux, log] } \documentclass{article} \usepackage{scontents} \pagestyle{empty} @@ -1494,10 +1587,9 @@ This is from the verbatim environment: % \fi % % Adapted from \href{https://tex.stackexchange.com/q/373647/7832}{Collect contents of an environment (that contains verbatim content)} -% \textattachfile[color=0 0 1]{scexamp5.ltx}{\faFile*[regular]}. +% \textattachfile[color=linkcolor,print=false]{scexamp5.ltx}{\faFile*[regular]}. % \lstinputlisting[language=scontents-doc,numbers=left]{scexamp5.ltx} % -% \subsection{Customization of \texttt{verbatimsc}} % % \subsubsection*{Example 6} % @@ -1505,7 +1597,40 @@ This is from the verbatim environment: %<*example> % \fi \begin{scontents}[write-out=scexamp6.ltx] +% arara: pdflatex +% arara: clean: { extensions: [ aux, log] } +\documentclass[10pt]{article} +\usepackage{scontents} +\newenvsc{forshort}[store-env=forshort,print-env=false] +\begin{document} + +Something in the whole course. + +\begin{forshort} + Just a summary... +\end{forshort} + +\end{document} +\end{scontents} +% \iffalse +%</example> +% \fi +% +% Adapted from \href{https://tex.stackexchange.com/q/509595/7832}{Environment hiding its content} +% \textattachfile[color=linkcolor,print=false]{scexamp6.ltx}{\faFile*[regular]}. +% \lstinputlisting[language=scontents-doc,numbers=left]{scexamp6.ltx} +% +% \subsection{Customization of \texttt{verbatimsc}} +% +% \subsubsection*{Example 7} +% +% \iffalse +%<*example> +% \fi +\begin{scontents}[write-out=scexamp7.ltx] \documentclass{article} +% arara: pdflatex +% arara: clean: { extensions: [ aux, log] } \usepackage{scontents} \makeatletter \let\verbatimsc\@undefined @@ -1560,15 +1685,17 @@ Prove new \Verb*{ fancyvrb whit braces } and environment \verb+Verbatim*+ % % Customization of \myenv*{verbatimsc} using the \mypkg{fancyvrb} and % \mypkg{tcolorbox} package -% \textattachfile[color=0 0 1]{scexamp6.ltx}{\faFile*[regular]}. -% \lstinputlisting[language=scontents-doc,numbers=left]{scexamp6.ltx} +% \textattachfile[color=linkcolor,print=false]{scexamp7.ltx}{\faFile*[regular]}. +% \lstinputlisting[language=scontents-doc,numbers=left]{scexamp7.ltx} % -% \subsubsection*{Example 7} +% \subsubsection*{Example 8} % % \iffalse %<*example> % \fi -\begin{scontents}[write-out=scexamp7.ltx] +\begin{scontents}[write-out=scexamp8.ltx] +% arara: pdflatex +% arara: clean: { extensions: [ aux, log] } \documentclass{article} \usepackage{scontents} \makeatletter @@ -1624,16 +1751,17 @@ and more.+ % \fi % % Customization of \myenv*{verbatimsc} using the \mypkg{listings} package -% \textattachfile[color=0 0 1]{scexamp7.ltx}{\faFile*[regular]}. -% \lstinputlisting[language=scontents-doc,numbers=left]{scexamp7.ltx} +% \textattachfile[color=linkcolor,print=false]{scexamp8.ltx}{\faFile*[regular]}. +% \lstinputlisting[language=scontents-doc,numbers=left]{scexamp8.ltx} % -% \subsubsection*{Example 8} +% \subsubsection*{Example 9} % % \iffalse %<*example> % \fi -\begin{scontents}[write-out=scexamp8.ltx] -% need -shell-escape +\begin{scontents}[write-out=scexamp9.ltx] +% arara: xelatex : {shell: true, options: [-8bit]} +% arara: clean: { extensions: [ aux, log] } \documentclass{article} \usepackage{scontents} \makeatletter @@ -1648,19 +1776,22 @@ and more.+ \section{Test \texttt{\textbackslash begin\{scontents\}} whit \texttt{minted}} Test \verb+{scontents}+ \par -\begin{scontents}[write-env=usingtab.tex,force-eol=true] +\begin{scontents}[overwrite,write-env=\jobname.tsc,force-eol=true] Using \verb+scontents+ env no \verb+[key=val]+, save in seq \verb+contents+ with index 1.\par Prove new \Verb*{ new fvextra whit braces } and environment \verb+Verbatim*+ -% Real TABs here :) -\begin{Verbatim}[obeytabs, showtabs, tab=\rightarrowfill, tabcolor=red,showspaces, spacecolor=blue] +\begin{Verbatim}[obeytabs, showtabs, tab=\rightarrowfill, tabcolor=red] No tab One real tab Two real Tab plus one tab \end{Verbatim} \end{scontents} +\section{See \Verb{\jobname.tsc}} +Read \Verb{\jobname.tsc} (shows TABs as red arrows): +\VerbatimInput[obeytabs, showtabs, tab=\rightarrowfill, tabcolor=red]{\jobname.tsc} + \section{Test \texttt{\textbackslash Scontents} whit \texttt{minted}} \Scontents{ We have coded \par this in \LaTeX: $E=mc^2$.} @@ -1679,8 +1810,10 @@ No tab % \fi % % Customization of \myenv*{verbatimsc} using the \mypkg{minted} package -% \textattachfile[color=0 0 1]{scexamp8.ltx}{\faFile*[regular]}. -% \lstinputlisting[language=scontents-doc,numbers=left]{scexamp8.ltx} +% \textattachfile[color=linkcolor,print=false]{scexamp9.ltx}{\faFile*[regular]}. +% \lstinputlisting[language=scontents-doc,numbers=left]{scexamp9.ltx} +% +% \newpage % % \section{Change history} % \label{sec:changes} @@ -1689,6 +1822,8 @@ No tab % development, from the first public implementation using the \mypkg{filecontentsdef} % package to the current version with only \mypkg{expl3}. % +% \medskip +% % \setlist[itemize,1]{label=\textendash,wide=0.5em,nosep,noitemsep,leftmargin=10pt} % \newlength\descrwidth % \settowidth{\descrwidth}{\textsf{v1.0, (ctan), 2019-07-30} } @@ -1696,6 +1831,14 @@ No tab % \begin{description}[font=\small\sffamily,wide=0pt,style=multiline,leftmargin=\descrwidth,nosep,noitemsep] % \item [\fileversion{} (ctan), \filedate] % \begin{itemize} +% \item Add |\newenvsc| command. +% \item Fix nested environment in \hologo{plainTeX} and \hologo{ConTeXt}. +% \item Modified default value in |\getstored|. +% \item Add |overwrite| key to reduce |I/O| operations. +% \item Deleted an unnecessary group in the code. +% \end{itemize} +% \item [v1.7 (ctan), 2019-10-29] +% \begin{itemize} % \item The |verbatimsc| environment was rewritten. % \item Minor adjustments in documentation. % \end{itemize} @@ -1744,18 +1887,24 @@ No tab % \end{itemize} % \item [v1.0 (ctan), 2019-07-30] % \begin{itemize} -% \item First public release, +% \item First public release. % \end{itemize} % \end{description} % % \newpage % +% \indexprologue{ +% The italic numbers denote the pages where the corresponding entry is +% described.} +% % \printindex[userdoc] % % \newpage % +% \StartImplementation +% % \StopEventually{^^A -% \newgeometry{top=0.5in,bottom=0.5in,left=1.0in,right=0.5in,footskip=0.2in,headsep=10pt} +% \newgeometry{top=0.5in,bottom=0.3in,left=1.0in,right=0.5in,footskip=0.2in,headheight=1cm,headsep=0.27cm} % \addtocontents{toc}{\protect\setcounter{tocdepth}{2}} % \cleardoublepage % \phantomsection @@ -1767,10 +1916,18 @@ No tab % \printindex % } % +% % \section{Implementation} % \label{sec:Implementation} % \addtocontents{toc}{\protect\setcounter{tocdepth}{0}} % +% The most recent publicly released version of \mypkg*{scontents} is available at +% \textsc{ctan}: \url{https://www.ctan.org/pkg/scontents}. Historical and +% developmental versions are available at \textcolor{gray}{\scriptsize\faIcon[regular]{github}} +% \url{https://github.com/pablgonz/scontents}. While general feedback via email is +% welcomed, specific bugs or feature requests should be reported through the issue +% tracker: \url{https://github.com/pablgonz/scontents/issues}. +% % \subsection{Declaration of the package} % % First we set up the module name for \pkg{l3doc}: @@ -1780,10 +1937,10 @@ No tab % % Now we define some common macros to hold the package date and version: % \begin{macrocode} -%<loader>\def\ScontentsFileDate{2019-10-29}% -%<core>\def\ScontentsCoreFileDate{2019-10-29}% +%<loader>\def\ScontentsFileDate{2019-11-18}% +%<core>\def\ScontentsCoreFileDate{2019-11-18}% %<*loader> -\def\ScontentsFileVersion{1.7}% +\def\ScontentsFileVersion{1.8}% \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}% % \end{macrocode} % @@ -1799,13 +1956,13 @@ No tab {scontents} {\ScontentsFileDate} {\ScontentsFileVersion} {\ScontentsFileDescription} \@ifpackageloaded { verbatim } { - \iow_term:n + \msg_set:nnn { scontents } { unsupported-verbatim } { - The~implementation~of~the~'verbatimsc'~environment~\\ - used~by~\tl_to_str:n{\typestored}~is~not~compatible~with~package\\ - 'verbatim'.~Review~the~documentation~and~redefine~\\ - the~'verbatimsc'~environment. + 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 } } { } %</latex> % \end{macrocode} @@ -1829,7 +1986,7 @@ No tab % \begin{macrocode} %<*plain> \msg_gset:nnn { scontents } { already-loaded } - { The~`scontents'~package~is~already~loaded.~Aborting~input~\msg_line_context:. } + { The~'scontents'~package~is~already~loaded.~Aborting~input~\msg_line_context:. } \cs_if_exist:NT \@@_rescan_tokens:n { \msg_warning:nn { scontents } { already-loaded } @@ -1863,7 +2020,7 @@ No tab %<latex|plain> end %<context> stop %<latex> \c_left_brace_str - scontents + \exp_not:N \l_@@_env_name_tl %<latex> \c_right_brace_str } % \end{macrocode} @@ -1954,6 +2111,9 @@ No tab force-eol .bool_set:N = \l_@@_forced_eol_bool, force-eol .initial:n = false, force-eol .default:n = true, + overwrite .bool_set:N = \l_@@_overwrite_bool, + overwrite .initial:n = false, + overwrite .default:n = true, width-tab .int_set:N = \l_@@_tab_width_int, width-tab .initial:n = 1, width-tab .value_required:n = true, @@ -2036,7 +2196,7 @@ No tab % \end{macro} % % -% \begin{macro}{\l_@@_foreach_before_bool,\l_@@_foreach_after_bool +% \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. % @@ -2152,6 +2312,8 @@ No tab store-env .meta:nn = { scontents } { store-env = #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_environment_keys:n {#1} } } % \end{macrocode} @@ -2203,7 +2365,8 @@ No tab step .initial:n = 1, wrapper .code:n = { \bool_set_true:N \l_@@_foreach_wrapper_bool - \cs_set_protected:Npn \@@_foreach_wrapper:n ##1 {#1} + \cs_set_protected:Npn + \@@_foreach_wrapper:n ##1 {#1} }, wrapper .value_required:n = true, sep .tl_set:N = \l_@@_foreach_sep_tl, @@ -2343,7 +2506,7 @@ No tab % 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} +% \begin{macrocode} %</core> %<*loader&!latex> \seq_new:N \l_@@_compat_seq @@ -2383,9 +2546,12 @@ No tab \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} } } + { + \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. } + { 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 @@ -2400,7 +2566,7 @@ No tab \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 \ifx\relax#3\relax\else v#3\space\fi #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} @@ -2521,43 +2687,77 @@ No tab % % \subsection{Construction of environment \env{scontents}} % -% We define the environment \env{scontents}, next to the system -% \myoarg{key \textnormal{\textcolor{gray}{=}} val}. The environment -% is divided into two parts. +% In order to be able to define environments that behave similarly to +% \myenv{scontents}, we define a generic environment and make all other +% environment as wappers around that one. % -% \begin{macro}{ -% scontents, -% \scontents, -% \startscontents, -% \endscontents, -% \stopscontents, -% \@@_scontents_env_begin:, -% \@@_scontents_env_end:, -% } -% This is the main environment used in the document. +% \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{macrocode} +\tl_new:N \l_@@_env_name_tl +\cs_new_protected:Npn \@@_scontents_setenv:nn #1 #2 + { + \cs_new_protected:cpn { @@_#1_env_begin: } + { + \tl_set:Nn \l_@@_env_name_tl {#1} + \keys_set:nn { scontents } {#2} + \@@_setup_verb_processor: + \@@_env_generic_begin: + } + \cs_new_protected:cpn { @@_#1_env_end: } + { \@@_env_generic_end: } + \exp_args:Nooo % http://nooooooooooooooo.com :) jeje + \@@_env_define:nnn { \tl_to_str:n {#1} } + { \cs:w @@_#1_env_begin: \cs_end: } + { \cs:w @@_#1_env_end: \cs_end: } + } %</core> %<*loader> -%<!context>\NewDocumentEnvironment { scontents } { } -%<context>\cs_new_protected:Npn \startscontents +\NewDocumentCommand { \newenvsc } { m O{} } { -%<plain|context> \group_begin: - \@@_scontents_env_begin: +%<latex|plain> \cs_if_exist:cTF { #1 } +%<context> \cs_if_exist:cTF { start #1 } + { \msg_error:nnn { scontents } { env-already-defined } {#1} } + { \@@_scontents_setenv:nn {#1} {#2} } } -%<context>\cs_new_protected:Npn \stopscontents +\cs_new_protected:Npn \@@_env_define:nnn #1 #2 #3 { - \@@_scontents_env_end: -%<plain|context> \group_end: +%<latex|plain> \NewDocumentEnvironment {#1} { } +%<context> \cs_new_protected:cpn { start #1 } + { +%<!latex> \group_begin: + #2 + } +%<context> \cs_new_protected:cpn { stop #1 } + { + #3 +%<!latex> \group_end: + } } %</loader> %<*core> -\cs_new_protected:Npn \@@_scontents_env_begin: +% \end{macrocode} +% \end{macro} +% +% \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{macrocode} +\cs_new_protected:Npn \@@_env_generic_begin: { \char_set_catcode_active:N \^^M \@@_start_environment:w } -\cs_new_protected:Npn \@@_scontents_env_end: +\cs_new_protected:Npn \@@_env_generic_end: { \@@_stop_environment: \@@_atend_environment: @@ -2565,6 +2765,23 @@ No tab % \end{macrocode} % \end{macro} % +% \subsubsection{Definition of the environment \env{scontents}} +% +% \begin{macro}{ +% scontents, +% \scontents, +% \endscontents, +% \startscontents, +% \stopscontents, +% } +% Now defining the \myenv{scontents} environment should be easy: +% \begin{macrocode} +%</core> +%<loader>\newenvsc{scontents} +%<*core> +% \end{macrocode} +% \end{macro} +% % \subsubsection{key val for environment} % % Define a \myoarg{key \textnormal{\textcolor{gray}{=}} val} for @@ -2603,7 +2820,7 @@ No tab % \subsubsection{The environment itself} % % \begin{macro}{\@@_start_environment:w,\@@_start_after_option:w, -% \@@_check_line_and_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. @@ -2616,22 +2833,17 @@ No tab % \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_and_process:xn} is called to check that -% the rest of the §\begin{scontents}§ is empty and then process -% the environment. \cs{@@_check_line_and_process:xn} calls the +% In all cases, \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 % 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 and the -% read token list is smuggled out of the verbatim group. This part of +% 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. % -%^^A Hm... Apparently this is not the verbatim group, but one level above. Is -%^^A this group really necessary? -%^^A Reply : I've checked it several times, it seems to be correct. -% % \begin{macrocode} \group_begin: \char_set_catcode_active:N \^^I @@ -2645,31 +2857,32 @@ No tab { \str_if_eq:eeTF { \tl_head:n {#1} } { [ } { \@@_grab_optional:w #1 ^^M } - { \@@_check_line_and_process:xn { } {#1} } + { \@@_check_line_process:xn { } {#1} } } - { \@@_check_line_and_process:xn { } {#1} } + { \@@_check_line_process:xn { } {#1} } } \cs_new_protected:Npn \@@_start_after_option:w #1 ^^M - { \@@_check_line_and_process:xn { [...] } {#1} } - \cs_new_protected:Npn \@@_check_line_and_process:xn #1 #2 + { \@@_check_line_process:xn { [...] } {#1} } + \cs_new_protected:Npn \@@_check_line_process:xn #1 #2 { \tl_if_blank:nF {#2} { \msg_error:nnxn { scontents } { junk-after-begin } - { after~\c_backslash_str begin{scontents} #1 } {#2} + { after~\c_backslash_str begin { \l_@@_env_name_tl } #1 } {#2} } \@@_make_control_chars_active: - \group_begin: - \@@_file_tl_write_start:V \l_@@_fname_out_tl + \@@_file_tl_write_start:V \l_@@_fname_out_tl } \cs_new_protected:Npn \@@_stop_environment: { - \@@_file_write_stop:N \l_@@_macro_tmp_tl - \exp_args:NNNV - \group_end: - \tl_set:Nn \l_@@_macro_tmp_tl \l_@@_macro_tmp_tl - \tl_if_empty:NT \l_@@_macro_tmp_tl - { \msg_warning:nnn { scontents } { empty-environment } } + \@@_file_write_stop:N \l_@@_macro_tmp_tl + \bool_lazy_and:nnT + { \l_@@_storing_bool } + { \tl_if_empty_p:N \l_@@_macro_tmp_tl } + { + \msg_warning:nnx { scontents } { empty-environment } + { \l_@@_env_name_tl } + } } % \end{macrocode} % \end{macro} @@ -2678,6 +2891,8 @@ No tab % \@@_file_tl_write_start:n, % \@@_file_tl_write_start:V, % \@@_verb_processor_iterate:w, +% \@@_verb_processor_iterate:nnn, +% \@@_setup_verb_processor:, % \@@_file_write_stop:N, % \@@_remove_leading_nl:n, % \@@_remove_leading_nl:w, @@ -2698,16 +2913,22 @@ No tab \cs_new_protected:Npn \@@_file_tl_write_start:n #1 { \group_begin: - \bool_if:NT \l_@@_writing_bool + \bool_if:nT { \l_@@_writing_bool && \l_@@_overwrite_bool } { - \file_if_exist:nTF {#1} - { \msg_warning:nnx { scontents } { rewriting-file } {#1} } - { \msg_warning:nnx { scontents } { writing-file } {#1} } - \iow_open:Nn \l_@@_file_iow {#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_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} } \tl_clear:N \l_@@_file_tl \seq_map_function:NN \l_char_special_seq \char_set_catcode_other:N - \int_step_function:nnN { 128 } { 255 } \char_set_catcode_letter:n + \int_step_function:nnnN { 128 } { 1 } { 255 } \char_set_catcode_letter:n \cs_set_protected:Npx \@@_ret:w ##1 ^^M { \exp_not:N \@@_verb_processor_iterate:w @@ -2718,48 +2939,65 @@ No tab \@@_make_control_chars_active: \@@_ret:w } - \use:x + \cs_new:Npn \@@_setup_verb_processor: { - \cs_new:Npn \exp_not:N \@@_verb_processor_iterate:w - ##1 \c_@@_end_env_tl - ##2 \c_@@_end_env_tl - ##3 \exp_not:N \q_@@_stop - } { - \tl_if_blank:nTF {#3} - { - \@@_analyse_nesting:n {#1} - \@@_verb_processor_output:n {#1} - } - { - \@@_if_nested:TF - { - \@@_nesting_decr: - \@@_verb_processor_output:x - { \exp_not:n {#1} \c_@@_end_env_tl \exp_not:n {#2} } - } - { - \tl_if_blank:nF {#1} - { \@@_verb_processor_output:n {#1} } - \cs_set_protected:Npx \@@_ret:w - { - \@@_format_case:nnn - { \exp_not:N \end{scontents} } % LaTeX - { \endscontents } % Plain/Generic - { \stopscontents } % ConTeXt - \bool_lazy_or:nnF - { \tl_if_blank_p:n {#2} } - { \str_if_eq_p:ee {#2} { \c_percent_str } } - { - \str_if_eq:VnF \c_@@_hidden_space_str {#2} - { \msg_warning:nnn { scontents } { rescanning-text } {#2} } - \@@_rescan_tokens:n {#2} - } - } - \char_set_active_eq:NN ^^M \@@_ret:w - } - } - ^^M - } + \use:x + { + \cs_set:Npn \exp_not:N \@@_verb_processor_iterate:w + ####1 \c_@@_end_env_tl + ####2 \c_@@_end_env_tl + ####3 \exp_not:N \q_@@_stop + } { \@@_verb_processor_iterate:nnn {##1} {##2} {##3} } + } + \cs_new:Npn \@@_verb_processor_iterate:nnn #1 #2 #3 + { + \tl_if_blank:nTF {#3} + { + \@@_analyse_nesting:n {#1} + \@@_verb_processor_output:n {#1} + } + { + \@@_if_nested:TF + { + \@@_nesting_decr: + \@@_verb_processor_output:x + { \exp_not:n {#1} \c_@@_end_env_tl \exp_not:n {#2} } + } + { + \tl_if_blank:nF {#1} + { \@@_verb_processor_output:n {#1} } + \cs_set_protected:Npx \@@_ret:w + { + \@@_env_end_function: + \bool_lazy_or:nnF + { \tl_if_blank_p:n {#2} } + { \str_if_eq_p:ee {#2} { \c_percent_str } } + { + \str_if_eq:VnF \c_@@_hidden_space_str {#2} + { + \msg_warning:nnnn { scontents } { rescanning-text } + {#2} { \tl_use:N \l_@@_env_name_tl } + } + \@@_rescan_tokens:n {#2} + } + } + \char_set_active_eq:NN ^^M \@@_ret:w + } + } + ^^M + } + \cs_new:Npn \@@_env_end_function: + { + \@@_format_case:nnn + { \exp_not:N \end { \if_false: } \fi: } + { \exp_after:wN \exp_not:N \cs:w end } + { \exp_after:wN \exp_not:N \cs:w stop } + \tl_use:N \l_@@_env_name_tl + \@@_format_case:nnn + { \if_false: { \fi: } } + { \cs_end: } + { \cs_end: } + } \cs_new_protected:Npn \@@_file_write_stop:N #1 { \bool_if:NT \l_@@_writing_bool @@ -2797,23 +3035,10 @@ No tab % \begin{macro}{ % \@@_verb_processor_output:n, % \@@_verb_processor_output:x, -% \@@_analyse_nesting:n, -% \@@_analyse_nesting:w, -% \@@_nesting_decr:, -% \@@_use_none_delimit_by_q_stop:w, % } -% \begin{macro}[TF]{\@@_if_nested:} % \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}. -% -% \cs{@@_analyse_nesting:n} looks for nested §\begin{scontents}§ -% and adds to a \cs{l_@@_env_nesting_int} counter. The \cs{@@_if_nested:} -% conditional tests if we're in a nested environment, and -% \cs{@@_nesting_decr:} reduces the nesting level, if an §\end{scontents}§ -% is found. -% -% Multiple §\end{scontents}§ in the same line are not supported... % \begin{macrocode} \cs_new_protected:Npn \@@_verb_processor_output:n #1 { @@ -2822,51 +3047,120 @@ No tab \bool_if:NT \l_@@_storing_bool { \tl_put_right:Nn \l_@@_file_tl { ^^J #1 } } } - \cs_generate_variant:Nn \@@_verb_processor_output:n { x } - \cs_new_protected:Npx \@@_analyse_nesting:n #1 - { - \int_zero:N \l_@@_tmpa_int - \exp_not:N \@@_analyse_nesting:w #1 - \c_backslash_str begin - \c_left_brace_str \exp_not:N \q_@@_mark \c_right_brace_str - \exp_not:N \q_@@_stop - \int_compare:nNnT { \l_@@_tmpa_int } > { 1 } - { \msg_warning:nn { scontents } { multiple-begin } } - } - \use:x - { - \cs_new_protected:Npn \exp_not:N \@@_analyse_nesting:w ##1 - \c_backslash_str begin \c_left_brace_str ##2 \c_right_brace_str - } { - \if_meaning:w \q_@@_mark #2 - \exp_after:wN \use_i:nn - \else: - \exp_after:wN \use_ii:nn - \fi: - { \@@_use_none_delimit_by_q_stop:w } - { - \str_if_eq:eeT {#2} {scontents} - { - \int_incr:N \l_@@_env_nesting_int - \int_incr:N \l_@@_tmpa_int - \@@_analyse_nesting:w - } - \@@_analyse_nesting:w - } - } - \cs_new_protected:Npn \@@_nesting_decr: - { \int_decr:N \l_@@_env_nesting_int } - \prg_new_protected_conditional:Npnn \@@_if_nested: { TF } - { - \int_compare:nNnTF { \l_@@_env_nesting_int } > { \c_zero_int } - { \prg_return_true: } - { \prg_return_false: } - } - \cs_new:Npn \@@_use_none_delimit_by_q_stop:w #1 \q_@@_stop { } \group_end: +\cs_generate_variant:Nn \@@_verb_processor_output:n { x } \cs_generate_variant:Nn \@@_file_tl_write_start:n { V } % \end{macrocode} % \end{macro} +% +% \begin{macro}{ +% \@@_analyse_nesting:n, +% \@@_analyse_nesting:w, +% \@@_nesting_decr:, +% \@@_use_none_delimit_by_q_stop:w, +% } +% \begin{macro}[TF]{\@@_if_nested:} +% \cs{@@_analyse_nesting:n} scans nested §\begin{scontents}§ +% and steps a \cs{l_@@_env_nesting_int} counter. The \cs{@@_if_nested:} +% conditional tests if we're in a nested environment, and +% \cs{@@_nesting_decr:} reduces the nesting level, if an §\end{scontents}§ +% is found. +% +% Multiple §\end{scontents}§ in the same line are not supported\dots +% \begin{macrocode} +\cs_new_protected:Npn \@@_analyse_nesting:n #1 + { + \int_zero:N \l_@@_tmpa_int + \@@_analyse_nesting_format:n {#1} + \int_compare:nNnT { \l_@@_tmpa_int } > { 1 } + { \msg_warning:nn { scontents } { multiple-begin } } + } +\cs_new_protected:Npn \@@_nesting_incr: + { + \int_incr:N \l_@@_env_nesting_int + \int_incr:N \l_@@_tmpa_int + } +\cs_new_protected:Npn \@@_nesting_decr: + { \int_decr:N \l_@@_env_nesting_int } +\prg_new_protected_conditional:Npnn \@@_if_nested: { TF } + { + \int_compare:nNnTF { \l_@@_env_nesting_int } > { \c_zero_int } + { \prg_return_true: } + { \prg_return_false: } + } +\cs_new:Npn \@@_use_none_delimit_by_q_stop:w #1 \q_@@_stop { } +% \end{macrocode} +% In \LaTeX{}, environments start with §\begin{<env>}§, so checking if a +% string contains §\begin{scontents}§ is straightforward. Since no §}§ can +% appear inside §<env>§, then just a macro delimited by §}§ is enough. +% \begin{macrocode} +\use:x + { + \cs_new_protected:Npn \exp_not:N \@@_analyse_nesting_latex:w ##1 + \c_backslash_str begin \c_left_brace_str ##2 \c_right_brace_str + } { + \@@_tl_if_head_is_q_mark:nTF {#2} + { \@@_use_none_delimit_by_q_stop:w } + { + \str_if_eq:VnT \l_@@_env_name_tl {#2} + { \@@_nesting_incr: } + \@@_analyse_nesting_latex:w + } + } +\cs_new_protected:Npx \@@_analyse_nesting_latex:n #1 + { + \@@_analyse_nesting_latex:w #1 + \c_backslash_str begin + \c_left_brace_str \exp_not:N \q_@@_mark \c_right_brace_str + \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§). +% \begin{macrocode} +\cs_new_protected:Npn \@@_analyse_nesting_generic_process:nn #1 #2 + { + \tl_if_head_is_N_type:nTF {#2} + { + \@@_tl_if_head_is_q_mark:nF {#2} + { + \@@_nesting_incr: + \@@_analyse_nesting_generic:w #2 \q_@@_stop + } + } + { \@@_analyse_nesting_generic:w #2 \q_@@_stop } + } +\cs_new_protected:Npn \@@_analyse_nesting_generic:nn #1 #2 + { + \@@_define_generic_nesting_function:n {#1} + \use:x + { + \exp_not:N \@@_analyse_nesting_generic:w #2 + \c_backslash_str #1 \tl_use:N \l_@@_env_name_tl + \exp_not:N \q_@@_mark \exp_not:N \q_@@_stop + } + } +\cs_new_protected:Npn \@@_define_generic_nesting_function:n #1 + { + \use:x + { + \cs_set_protected:Npn \exp_not:N \@@_analyse_nesting_generic:w ####1 + \c_backslash_str #1 \tl_use:N \l_@@_env_name_tl + ####2 \exp_not:N \q_@@_stop + } { \@@_analyse_nesting_generic_process:nn {##1} {##2} } + } +%</core> +%<*loader> +%<latex>\cs_new_eq:NN \@@_analyse_nesting_format:n +%<latex> \@@_analyse_nesting_latex:n +%<!latex>\cs_new_protected:Npn \@@_analyse_nesting_format:n +%<plain> { \@@_analyse_nesting_generic:nn { } } +%<context> { \@@_analyse_nesting_generic:nn { start } } +%</loader> +%<*core> +% \end{macrocode} +% \end{macro} % \end{macro} % % \subsubsection{Recording of the content in the sequence} @@ -2881,8 +3175,12 @@ No tab \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 + { + \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 } } @@ -2899,7 +3197,8 @@ No tab \cs_new_protected:Npn \verbatimsc { \group_begin: - \@@_verbatimsc_aux: \frenchspacing \@@_vobeyspaces: \@@_xverb: + \@@_verbatimsc_aux: \frenchspacing \@@_vobeyspaces: + \@@_xverb: } \cs_new_protected:Npn \endverbatimsc { \group_end: } @@ -3036,7 +3335,7 @@ No tab % \begin{macrocode} %</core> %<*loader> -\NewDocumentCommand { \getstored } { O{1} m } +\NewDocumentCommand { \getstored } { O{-1} m } { \@@_getstored_internal:nn {#1} {#2} } %</loader> %<*core> @@ -3082,7 +3381,10 @@ No tab { \l_@@_foreach_stop_int } \@@_foreach_add_body:n \tl_gset:Nx \g_@@_temp_tl - { \seq_use:Nn \l_@@_foreach_print_seq { \tl_use:N \l_@@_foreach_sep_tl } } + { + \seq_use:Nn \l_@@_foreach_print_seq + { \tl_use:N \l_@@_foreach_sep_tl } + } \group_end: \exp_after:wN \tl_gclear:N \exp_after:wN \g_@@_temp_tl @@ -3235,6 +3537,21 @@ No tab % \end{macrocode} % \end{macro} % +% \begin{macro}[TF]{\@@_tl_if_head_is_q_mark:n} +% Tests if the head of the token list is \cs{q_@@_mark}. +% \begin{macrocode} +\prg_new_protected_conditional:Npnn \@@_tl_if_head_is_q_mark:n #1 + { T, F, TF } + { + \if_meaning:w \q_@@_mark #1 \scan_stop: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{ % \@@_set_active_eq:NN, % \@@_make_control_chars_active:, @@ -3335,7 +3652,6 @@ No tab % % \subsection{The command \cs{countsc}} % -% % \begin{macro}{\countsc} % User command §\countsc§ to count number of contents stored in |seq|. % @@ -3376,18 +3692,25 @@ No tab \\ \\ #2 } +\msg_new:nnnn { scontents } { env-already-defined } + { Environment~'#1'~already~defined! } + { + You~have~used~\newenvsc + with~an~environment~that~already~has~a~definition. \\ \\ + The~existing~definition~of~'#1'~will~not~be~altered. + } \msg_new:nnn { scontents } { empty-stored-content } { Empty~value~for~key~'getstored'~\msg_line_context:. } \msg_new:nnn { scontents } { empty-variable } { Variable~'#1'~empty~\msg_line_context:. } -\msg_new:nnn { scontents } { rewriting-file } - { Overwriting ~ file ~ '#1' } +\msg_new:nnn { scontents } { overwrite-file } + { Overwriting~file~'#1'. } \msg_new:nnn { scontents } { writing-file } - { Writing ~ file ~ '#1' } + { Writing~file~'#1'. } \msg_new:nnn { scontents } { rescanning-text } - { Rescanning~text~'#1'~after~\c_backslash_str end{scontents}~\msg_line_context:.} + { Rescanning~text~'#1'~after~\c_backslash_str end{#2}~\msg_line_context:.} \msg_new:nnn { scontents } { multiple-begin } - { Multiple~\c_backslash_str begin{scontents}~\msg_line_context:.} + { Multiple~\c_backslash_str begin{ \l_@@_env_name_tl }~\msg_line_context:.} \msg_new:nnn { scontents } { undefined-storage } { Storage~named~'#1'~is~not~defined. } \msg_new:nnn { scontents } { index-out-of-range } @@ -3401,15 +3724,21 @@ No tab } } \msg_new:nnnn { scontents } { env-key-unknown } - { The~key~'#1'~is~unknown~by~environment~'scontents'~and~is~being~ignored.} { - The~environment~'scontents'~does~not~have~a~key~called~'#1'.\\ + The~key~'#1'~is~unknown~by~environment~ + '\l_@@_env_name_tl'~and~is~being~ignored. + } + { + The~environment~'\l_@@_env_name_tl'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \msg_new:nnnn { scontents } { env-key-value-unknown } - { The~key~'#1=#2'~is~unknown~by~environment~'scontents'~and~is~being~ignored. } { - The~environment~'scontents'~does~not~have~a~key~called~'#1'.\\ + The~key~'#1=#2'~is~unknown~by~environment~ + '\l_@@_env_name_tl'~and~is~being~ignored. + } + { + The~environment~'\l_@@_env_name_tl'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \msg_new:nnnn { scontents } { cmd-key-unknown } @@ -3449,7 +3778,7 @@ No tab This~command~only~accepts~the~key~'width-tab'. } \msg_new:nnn { scontents } { empty-environment } - { scontents~environment~empty~\msg_line_context:. } + { environment~'#1'~empty~\msg_line_context:. } \msg_new:nnnn { scontents } { verbatim-newline } { Verbatim~argument~of~#1~ended~by~end~of~line. } { @@ -3479,4 +3808,5 @@ No tab %</core> %<plain|context>\ExplSyntaxOff % \end{macrocode} +% % \Finale diff --git a/Master/texmf-dist/source/latex/scontents/scontents.ins b/Master/texmf-dist/source/latex/scontents/scontents.ins index 6c761fe6b04..953dc79bb69 100644 --- a/Master/texmf-dist/source/latex/scontents/scontents.ins +++ b/Master/texmf-dist/source/latex/scontents/scontents.ins @@ -33,11 +33,11 @@ and the derived files scontents.sty, \declarepreamble\context \string\module [ file=t-scontents, - version=1.7, + version=1.8, title=\string\CONTEXT\ User Module, subtitle=Storing Contents, author=Pablo González, - date=2019-10-29, + date=2019-11-18, copyright=Pablo González, email=pablgonz@educarchile.cl, license=LPPL] diff --git a/Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv b/Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv index 8f336482dad..944ff08225a 100644 --- a/Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv +++ b/Master/texmf-dist/tex/context/third/scontents/t-scontents.mkiv @@ -33,16 +33,16 @@ %% scontents.dtx (with options: `loader,context') %D \module %D [ file=t-scontents, -%D version=1.7, +%D version=1.8, %D title=\CONTEXT\ User Module, %D subtitle=Storing Contents, %D author=Pablo González, -%D date=2019-10-29, +%D date=2019-11-18, %D copyright=Pablo González, %D email=pablgonz@educarchile.cl, %D license=LPPL] -\def\ScontentsFileDate{2019-10-29}% -\def\ScontentsFileVersion{1.7}% +\def\ScontentsFileDate{2019-11-18}% +\def\ScontentsFileVersion{1.8}% \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}% \writestatus{loading}{User Module scontents v\ScontentsFileVersion} \unprotect @@ -62,7 +62,7 @@ { \c_backslash_str stop - scontents + \exp_not:N \l__scontents_env_name_tl } \file_input:n { scontents-code.tex } \cs_new:Npn \__scontents_format_case:nnn #1 #2 #3 @@ -106,9 +106,12 @@ \clist_map_function:NN \l__scontents_temp_tl \__scontents_require_auxiii:n } \cs_new_protected:Npn \__scontents_require_auxiii:n #1 - { \str_if_eq:eeF {expl3} {#1} { \msg_error:nnn { scontents } { invalid-package } {#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. } + { Package~'#1'~invalid~in~scontents.~This~is~an~error~in~scontents. } \__scontents_compat_redefine:cpn { @ifpackagelater } #1 { \exp_args:Nc \__scontents_package_later_aux:Nn { ver@#1.sty } } \cs_new_protected:Npn \__scontents_package_later_aux:Nn #1 #2 @@ -123,7 +126,7 @@ \cs_new:Npn \__scontents_parse_version_auxii:w #1-#2-#3#4#5 \q_mark { \tl_if_blank:nF {#2} {#1} #2 #3 #4 } \__scontents_compat_redefine:Npn \ProvidesExplPackage #1 #2 #3 #4 - { \__scontents_provides_aux:nn {#1} { #2 \ifx\relax#3\relax\else v#3\space\fi #4 } } + { \__scontents_provides_aux:nn {#1} { #2 \tl_if_empty:nF {#3} {#3~} #4 } } \cs_new_protected:Npn \__scontents_provides_aux:nn #1 #2 { \tl_gset:cx { ver@#1.sty } {#2} @@ -142,18 +145,30 @@ \ExplSyntaxOn \char_set_catcode:nn { `\@ } { \l__scontents_tmpa_int } \__scontents_compat_restore: -\cs_new_protected:Npn \startscontents +\NewDocumentCommand { \newenvsc } { m O{} } { - \group_begin: - \__scontents_scontents_env_begin: + \cs_if_exist:cTF { start #1 } + { \msg_error:nnn { scontents } { env-already-defined } {#1} } + { \__scontents_scontents_setenv:nn {#1} {#2} } } -\cs_new_protected:Npn \stopscontents +\cs_new_protected:Npn \__scontents_env_define:nnn #1 #2 #3 { - \__scontents_scontents_env_end: - \group_end: + \cs_new_protected:cpn { start #1 } + { + \group_begin: + #2 + } + \cs_new_protected:cpn { stop #1 } + { + #3 + \group_end: + } } +\newenvsc{scontents} \NewDocumentCommand \__scontents_grab_optional:w { r[] } { \__scontents_grab_optional:n {#1} } +\cs_new_protected:Npn \__scontents_analyse_nesting_format:n + { \__scontents_analyse_nesting_generic:nn { start } } \cs_if_exist:NF \dospecials { \cs_new:Npn \dospecials @@ -163,7 +178,7 @@ { \__scontents_Scontents_internal:nn {#1} {#2} } \NewDocumentCommand { \__scontents_verb_arg:w } { +v } { \__scontents_verb_arg_internal:n {#1} } -\NewDocumentCommand { \getstored } { O{1} m } +\NewDocumentCommand { \getstored } { O{-1} m } { \__scontents_getstored_internal:nn {#1} {#2} } \NewDocumentCommand { \foreachsc } { o m } { \__scontents_foreachsc_internal:nn {#1} {#2} } diff --git a/Master/texmf-dist/tex/generic/scontents/scontents-code.tex b/Master/texmf-dist/tex/generic/scontents/scontents-code.tex index 49e87eba3e0..f417191f680 100644 --- a/Master/texmf-dist/tex/generic/scontents/scontents-code.tex +++ b/Master/texmf-dist/tex/generic/scontents/scontents-code.tex @@ -27,7 +27,7 @@ %% t-scontents.mkiv and %% scontents-code.tex. %% -\def\ScontentsCoreFileDate{2019-10-29}% +\def\ScontentsCoreFileDate{2019-11-18}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -87,6 +87,9 @@ force-eol .bool_set:N = \l__scontents_forced_eol_bool, force-eol .initial:n = false, force-eol .default:n = true, + overwrite .bool_set:N = \l__scontents_overwrite_bool, + overwrite .initial:n = false, + overwrite .default:n = true, width-tab .int_set:N = \l__scontents_tab_width_int, width-tab .initial:n = 1, width-tab .value_required:n = true, @@ -151,6 +154,8 @@ store-env .meta:nn = { scontents } { store-env = #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_environment_keys:n {#1} } } \keys_define:nn { scontents / Scontents } @@ -187,7 +192,8 @@ step .initial:n = 1, wrapper .code:n = { \bool_set_true:N \l__scontents_foreach_wrapper_bool - \cs_set_protected:Npn \__scontents_foreach_wrapper:n ##1 {#1} + \cs_set_protected:Npn + \__scontents_foreach_wrapper:n ##1 {#1} }, wrapper .value_required:n = true, sep .tl_set:N = \l__scontents_foreach_sep_tl, @@ -280,12 +286,29 @@ \tl_log:N #1 \__scontents_append_contents:Vx #2 { \exp_not:V #1 } } -\cs_new_protected:Npn \__scontents_scontents_env_begin: +\tl_new:N \l__scontents_env_name_tl +\cs_new_protected:Npn \__scontents_scontents_setenv:nn #1 #2 + { + \cs_new_protected:cpn { __scontents_#1_env_begin: } + { + \tl_set:Nn \l__scontents_env_name_tl {#1} + \keys_set:nn { scontents } {#2} + \__scontents_setup_verb_processor: + \__scontents_env_generic_begin: + } + \cs_new_protected:cpn { __scontents_#1_env_end: } + { \__scontents_env_generic_end: } + \exp_args:Nooo % http://nooooooooooooooo.com :) jeje + \__scontents_env_define:nnn { \tl_to_str:n {#1} } + { \cs:w __scontents_#1_env_begin: \cs_end: } + { \cs:w __scontents_#1_env_end: \cs_end: } + } +\cs_new_protected:Npn \__scontents_env_generic_begin: { \char_set_catcode_active:N \^^M \__scontents_start_environment:w } -\cs_new_protected:Npn \__scontents_scontents_env_end: +\cs_new_protected:Npn \__scontents_env_generic_end: { \__scontents_stop_environment: \__scontents_atend_environment: @@ -312,45 +335,52 @@ { \str_if_eq:eeTF { \tl_head:n {#1} } { [ } { \__scontents_grab_optional:w #1 ^^M } - { \__scontents_check_line_and_process:xn { } {#1} } + { \__scontents_check_line_process:xn { } {#1} } } - { \__scontents_check_line_and_process:xn { } {#1} } + { \__scontents_check_line_process:xn { } {#1} } } \cs_new_protected:Npn \__scontents_start_after_option:w #1 ^^M - { \__scontents_check_line_and_process:xn { [...] } {#1} } - \cs_new_protected:Npn \__scontents_check_line_and_process:xn #1 #2 + { \__scontents_check_line_process:xn { [...] } {#1} } + \cs_new_protected:Npn \__scontents_check_line_process:xn #1 #2 { \tl_if_blank:nF {#2} { \msg_error:nnxn { scontents } { junk-after-begin } - { after~\c_backslash_str begin{scontents} #1 } {#2} + { after~\c_backslash_str begin { \l__scontents_env_name_tl } #1 } {#2} } \__scontents_make_control_chars_active: - \group_begin: - \__scontents_file_tl_write_start:V \l__scontents_fname_out_tl + \__scontents_file_tl_write_start:V \l__scontents_fname_out_tl } \cs_new_protected:Npn \__scontents_stop_environment: { - \__scontents_file_write_stop:N \l__scontents_macro_tmp_tl - \exp_args:NNNV - \group_end: - \tl_set:Nn \l__scontents_macro_tmp_tl \l__scontents_macro_tmp_tl - \tl_if_empty:NT \l__scontents_macro_tmp_tl - { \msg_warning:nnn { scontents } { empty-environment } } + \__scontents_file_write_stop:N \l__scontents_macro_tmp_tl + \bool_lazy_and:nnT + { \l__scontents_storing_bool } + { \tl_if_empty_p:N \l__scontents_macro_tmp_tl } + { + \msg_warning:nnx { scontents } { empty-environment } + { \l__scontents_env_name_tl } + } } \cs_new_protected:Npn \__scontents_file_tl_write_start:n #1 { \group_begin: - \bool_if:NT \l__scontents_writing_bool + \bool_if:nT { \l__scontents_writing_bool && \l__scontents_overwrite_bool } { - \file_if_exist:nTF {#1} - { \msg_warning:nnx { scontents } { rewriting-file } {#1} } - { \msg_warning:nnx { scontents } { writing-file } {#1} } - \iow_open:Nn \l__scontents_file_iow {#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_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} } \tl_clear:N \l__scontents_file_tl \seq_map_function:NN \l_char_special_seq \char_set_catcode_other:N - \int_step_function:nnN { 128 } { 255 } \char_set_catcode_letter:n + \int_step_function:nnnN { 128 } { 1 } { 255 } \char_set_catcode_letter:n \cs_set_protected:Npx \__scontents_ret:w ##1 ^^M { \exp_not:N \__scontents_verb_processor_iterate:w @@ -361,48 +391,65 @@ \__scontents_make_control_chars_active: \__scontents_ret:w } - \use:x + \cs_new:Npn \__scontents_setup_verb_processor: { - \cs_new:Npn \exp_not:N \__scontents_verb_processor_iterate:w - ##1 \c__scontents_end_env_tl - ##2 \c__scontents_end_env_tl - ##3 \exp_not:N \q__scontents_stop - } { - \tl_if_blank:nTF {#3} - { - \__scontents_analyse_nesting:n {#1} - \__scontents_verb_processor_output:n {#1} - } - { - \__scontents_if_nested:TF - { - \__scontents_nesting_decr: - \__scontents_verb_processor_output:x - { \exp_not:n {#1} \c__scontents_end_env_tl \exp_not:n {#2} } - } - { - \tl_if_blank:nF {#1} - { \__scontents_verb_processor_output:n {#1} } - \cs_set_protected:Npx \__scontents_ret:w - { - \__scontents_format_case:nnn - { \exp_not:N \end{scontents} } % LaTeX - { \endscontents } % Plain/Generic - { \stopscontents } % ConTeXt - \bool_lazy_or:nnF - { \tl_if_blank_p:n {#2} } - { \str_if_eq_p:ee {#2} { \c_percent_str } } - { - \str_if_eq:VnF \c__scontents_hidden_space_str {#2} - { \msg_warning:nnn { scontents } { rescanning-text } {#2} } - \__scontents_rescan_tokens:n {#2} - } - } - \char_set_active_eq:NN ^^M \__scontents_ret:w - } - } - ^^M - } + \use:x + { + \cs_set:Npn \exp_not:N \__scontents_verb_processor_iterate:w + ####1 \c__scontents_end_env_tl + ####2 \c__scontents_end_env_tl + ####3 \exp_not:N \q__scontents_stop + } { \__scontents_verb_processor_iterate:nnn {##1} {##2} {##3} } + } + \cs_new:Npn \__scontents_verb_processor_iterate:nnn #1 #2 #3 + { + \tl_if_blank:nTF {#3} + { + \__scontents_analyse_nesting:n {#1} + \__scontents_verb_processor_output:n {#1} + } + { + \__scontents_if_nested:TF + { + \__scontents_nesting_decr: + \__scontents_verb_processor_output:x + { \exp_not:n {#1} \c__scontents_end_env_tl \exp_not:n {#2} } + } + { + \tl_if_blank:nF {#1} + { \__scontents_verb_processor_output:n {#1} } + \cs_set_protected:Npx \__scontents_ret:w + { + \__scontents_env_end_function: + \bool_lazy_or:nnF + { \tl_if_blank_p:n {#2} } + { \str_if_eq_p:ee {#2} { \c_percent_str } } + { + \str_if_eq:VnF \c__scontents_hidden_space_str {#2} + { + \msg_warning:nnnn { scontents } { rescanning-text } + {#2} { \tl_use:N \l__scontents_env_name_tl } + } + \__scontents_rescan_tokens:n {#2} + } + } + \char_set_active_eq:NN ^^M \__scontents_ret:w + } + } + ^^M + } + \cs_new:Npn \__scontents_env_end_function: + { + \__scontents_format_case:nnn + { \exp_not:N \end { \if_false: } \fi: } + { \exp_after:wN \exp_not:N \cs:w end } + { \exp_after:wN \exp_not:N \cs:w stop } + \tl_use:N \l__scontents_env_name_tl + \__scontents_format_case:nnn + { \if_false: { \fi: } } + { \cs_end: } + { \cs_end: } + } \cs_new_protected:Npn \__scontents_file_write_stop:N #1 { \bool_if:NT \l__scontents_writing_bool @@ -441,56 +488,92 @@ \bool_if:NT \l__scontents_storing_bool { \tl_put_right:Nn \l__scontents_file_tl { ^^J #1 } } } - \cs_generate_variant:Nn \__scontents_verb_processor_output:n { x } - \cs_new_protected:Npx \__scontents_analyse_nesting:n #1 - { - \int_zero:N \l__scontents_tmpa_int - \exp_not:N \__scontents_analyse_nesting:w #1 - \c_backslash_str begin - \c_left_brace_str \exp_not:N \q__scontents_mark \c_right_brace_str - \exp_not:N \q__scontents_stop - \int_compare:nNnT { \l__scontents_tmpa_int } > { 1 } - { \msg_warning:nn { scontents } { multiple-begin } } - } - \use:x - { - \cs_new_protected:Npn \exp_not:N \__scontents_analyse_nesting:w ##1 - \c_backslash_str begin \c_left_brace_str ##2 \c_right_brace_str - } { - \if_meaning:w \q__scontents_mark #2 - \exp_after:wN \use_i:nn - \else: - \exp_after:wN \use_ii:nn - \fi: - { \__scontents_use_none_delimit_by_q_stop:w } - { - \str_if_eq:eeT {#2} {scontents} - { - \int_incr:N \l__scontents_env_nesting_int - \int_incr:N \l__scontents_tmpa_int - \__scontents_analyse_nesting:w - } - \__scontents_analyse_nesting:w - } - } - \cs_new_protected:Npn \__scontents_nesting_decr: - { \int_decr:N \l__scontents_env_nesting_int } - \prg_new_protected_conditional:Npnn \__scontents_if_nested: { TF } - { - \int_compare:nNnTF { \l__scontents_env_nesting_int } > { \c_zero_int } - { \prg_return_true: } - { \prg_return_false: } - } - \cs_new:Npn \__scontents_use_none_delimit_by_q_stop:w #1 \q__scontents_stop { } \group_end: +\cs_generate_variant:Nn \__scontents_verb_processor_output:n { x } \cs_generate_variant:Nn \__scontents_file_tl_write_start:n { V } +\cs_new_protected:Npn \__scontents_analyse_nesting:n #1 + { + \int_zero:N \l__scontents_tmpa_int + \__scontents_analyse_nesting_format:n {#1} + \int_compare:nNnT { \l__scontents_tmpa_int } > { 1 } + { \msg_warning:nn { scontents } { multiple-begin } } + } +\cs_new_protected:Npn \__scontents_nesting_incr: + { + \int_incr:N \l__scontents_env_nesting_int + \int_incr:N \l__scontents_tmpa_int + } +\cs_new_protected:Npn \__scontents_nesting_decr: + { \int_decr:N \l__scontents_env_nesting_int } +\prg_new_protected_conditional:Npnn \__scontents_if_nested: { TF } + { + \int_compare:nNnTF { \l__scontents_env_nesting_int } > { \c_zero_int } + { \prg_return_true: } + { \prg_return_false: } + } +\cs_new:Npn \__scontents_use_none_delimit_by_q_stop:w #1 \q__scontents_stop { } +\use:x + { + \cs_new_protected:Npn \exp_not:N \__scontents_analyse_nesting_latex:w ##1 + \c_backslash_str begin \c_left_brace_str ##2 \c_right_brace_str + } { + \__scontents_tl_if_head_is_q_mark:nTF {#2} + { \__scontents_use_none_delimit_by_q_stop:w } + { + \str_if_eq:VnT \l__scontents_env_name_tl {#2} + { \__scontents_nesting_incr: } + \__scontents_analyse_nesting_latex:w + } + } +\cs_new_protected:Npx \__scontents_analyse_nesting_latex:n #1 + { + \__scontents_analyse_nesting_latex:w #1 + \c_backslash_str begin + \c_left_brace_str \exp_not:N \q__scontents_mark \c_right_brace_str + \exp_not:N \q__scontents_stop + } +\cs_new_protected:Npn \__scontents_analyse_nesting_generic_process:nn #1 #2 + { + \tl_if_head_is_N_type:nTF {#2} + { + \__scontents_tl_if_head_is_q_mark:nF {#2} + { + \__scontents_nesting_incr: + \__scontents_analyse_nesting_generic:w #2 \q__scontents_stop + } + } + { \__scontents_analyse_nesting_generic:w #2 \q__scontents_stop } + } +\cs_new_protected:Npn \__scontents_analyse_nesting_generic:nn #1 #2 + { + \__scontents_define_generic_nesting_function:n {#1} + \use:x + { + \exp_not:N \__scontents_analyse_nesting_generic:w #2 + \c_backslash_str #1 \tl_use:N \l__scontents_env_name_tl + \exp_not:N \q__scontents_mark \exp_not:N \q__scontents_stop + } + } +\cs_new_protected:Npn \__scontents_define_generic_nesting_function:n #1 + { + \use:x + { + \cs_set_protected:Npn \exp_not:N \__scontents_analyse_nesting_generic:w ####1 + \c_backslash_str #1 \tl_use:N \l__scontents_env_name_tl + ####2 \exp_not:N \q__scontents_stop + } { \__scontents_analyse_nesting_generic_process:nn {##1} {##2} } + } \cs_new_protected:Npn \__scontents_atend_environment: { \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 + { + \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 } } @@ -557,7 +640,10 @@ { \l__scontents_foreach_stop_int } \__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 } } + { + \seq_use:Nn \l__scontents_foreach_print_seq + { \tl_use:N \l__scontents_foreach_sep_tl } + } \group_end: \exp_after:wN \tl_gclear:N \exp_after:wN \g__scontents_temp_tl @@ -632,6 +718,15 @@ \char_generate:nn { `#1 } { 12 } } } +\prg_new_protected_conditional:Npnn \__scontents_tl_if_head_is_q_mark:n #1 + { T, F, TF } + { + \if_meaning:w \q__scontents_mark #1 \scan_stop: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } \cs_new_protected:Npn \__scontents_set_active_eq:NN #1 { \char_set_catcode_active:N #1 @@ -675,18 +770,25 @@ \\ \\ #2 } +\msg_new:nnnn { scontents } { env-already-defined } + { Environment~'#1'~already~defined! } + { + You~have~used~\newenvsc + with~an~environment~that~already~has~a~definition. \\ \\ + The~existing~definition~of~'#1'~will~not~be~altered. + } \msg_new:nnn { scontents } { empty-stored-content } { Empty~value~for~key~'getstored'~\msg_line_context:. } \msg_new:nnn { scontents } { empty-variable } { Variable~'#1'~empty~\msg_line_context:. } -\msg_new:nnn { scontents } { rewriting-file } - { Overwriting ~ file ~ '#1' } +\msg_new:nnn { scontents } { overwrite-file } + { Overwriting~file~'#1'. } \msg_new:nnn { scontents } { writing-file } - { Writing ~ file ~ '#1' } + { Writing~file~'#1'. } \msg_new:nnn { scontents } { rescanning-text } - { Rescanning~text~'#1'~after~\c_backslash_str end{scontents}~\msg_line_context:.} + { Rescanning~text~'#1'~after~\c_backslash_str end{#2}~\msg_line_context:.} \msg_new:nnn { scontents } { multiple-begin } - { Multiple~\c_backslash_str begin{scontents}~\msg_line_context:.} + { Multiple~\c_backslash_str begin{ \l__scontents_env_name_tl }~\msg_line_context:.} \msg_new:nnn { scontents } { undefined-storage } { Storage~named~'#1'~is~not~defined. } \msg_new:nnn { scontents } { index-out-of-range } @@ -700,15 +802,21 @@ } } \msg_new:nnnn { scontents } { env-key-unknown } - { The~key~'#1'~is~unknown~by~environment~'scontents'~and~is~being~ignored.} { - The~environment~'scontents'~does~not~have~a~key~called~'#1'.\\ + The~key~'#1'~is~unknown~by~environment~ + '\l__scontents_env_name_tl'~and~is~being~ignored. + } + { + The~environment~'\l__scontents_env_name_tl'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \msg_new:nnnn { scontents } { env-key-value-unknown } - { The~key~'#1=#2'~is~unknown~by~environment~'scontents'~and~is~being~ignored. } { - The~environment~'scontents'~does~not~have~a~key~called~'#1'.\\ + The~key~'#1=#2'~is~unknown~by~environment~ + '\l__scontents_env_name_tl'~and~is~being~ignored. + } + { + The~environment~'\l__scontents_env_name_tl'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \msg_new:nnnn { scontents } { cmd-key-unknown } @@ -748,7 +856,7 @@ This~command~only~accepts~the~key~'width-tab'. } \msg_new:nnn { scontents } { empty-environment } - { scontents~environment~empty~\msg_line_context:. } + { environment~'#1'~empty~\msg_line_context:. } \msg_new:nnnn { scontents } { verbatim-newline } { Verbatim~argument~of~#1~ended~by~end~of~line. } { diff --git a/Master/texmf-dist/tex/generic/scontents/scontents.tex b/Master/texmf-dist/tex/generic/scontents/scontents.tex index 24d0ee99dcf..03078a4cc9f 100644 --- a/Master/texmf-dist/tex/generic/scontents/scontents.tex +++ b/Master/texmf-dist/tex/generic/scontents/scontents.tex @@ -27,8 +27,8 @@ %% t-scontents.mkiv and %% scontents-code.tex. %% -\def\ScontentsFileDate{2019-10-29}% -\def\ScontentsFileVersion{1.7}% +\def\ScontentsFileDate{2019-11-18}% +\def\ScontentsFileVersion{1.8}% \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}% \input expl3-generic.tex \ExplSyntaxOn @@ -36,7 +36,7 @@ v\ScontentsFileVersion\space \ScontentsFileDescription } \iow_log:x { Package: ~ scontents ~ \use:c { ver @ scontents . sty } } \msg_gset:nnn { scontents } { already-loaded } - { The~`scontents'~package~is~already~loaded.~Aborting~input~\msg_line_context:. } + { The~'scontents'~package~is~already~loaded.~Aborting~input~\msg_line_context:. } \cs_if_exist:NT \__scontents_rescan_tokens:n { \msg_warning:nn { scontents } { already-loaded } @@ -54,7 +54,7 @@ { \c_backslash_str end - scontents + \exp_not:N \l__scontents_env_name_tl } \file_input:n { scontents-code.tex } \cs_new:Npn \__scontents_format_case:nnn #1 #2 #3 @@ -98,9 +98,12 @@ \clist_map_function:NN \l__scontents_temp_tl \__scontents_require_auxiii:n } \cs_new_protected:Npn \__scontents_require_auxiii:n #1 - { \str_if_eq:eeF {expl3} {#1} { \msg_error:nnn { scontents } { invalid-package } {#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. } + { Package~'#1'~invalid~in~scontents.~This~is~an~error~in~scontents. } \__scontents_compat_redefine:cpn { @ifpackagelater } #1 { \exp_args:Nc \__scontents_package_later_aux:Nn { ver@#1.sty } } \cs_new_protected:Npn \__scontents_package_later_aux:Nn #1 #2 @@ -115,7 +118,7 @@ \cs_new:Npn \__scontents_parse_version_auxii:w #1-#2-#3#4#5 \q_mark { \tl_if_blank:nF {#2} {#1} #2 #3 #4 } \__scontents_compat_redefine:Npn \ProvidesExplPackage #1 #2 #3 #4 - { \__scontents_provides_aux:nn {#1} { #2 \ifx\relax#3\relax\else v#3\space\fi #4 } } + { \__scontents_provides_aux:nn {#1} { #2 \tl_if_empty:nF {#3} {#3~} #4 } } \cs_new_protected:Npn \__scontents_provides_aux:nn #1 #2 { \tl_gset:cx { ver@#1.sty } {#2} @@ -134,22 +137,35 @@ \ExplSyntaxOn \char_set_catcode:nn { `\@ } { \l__scontents_tmpa_int } \__scontents_compat_restore: -\NewDocumentEnvironment { scontents } { } +\NewDocumentCommand { \newenvsc } { m O{} } { - \group_begin: - \__scontents_scontents_env_begin: + \cs_if_exist:cTF { #1 } + { \msg_error:nnn { scontents } { env-already-defined } {#1} } + { \__scontents_scontents_setenv:nn {#1} {#2} } } +\cs_new_protected:Npn \__scontents_env_define:nnn #1 #2 #3 { - \__scontents_scontents_env_end: - \group_end: + \NewDocumentEnvironment {#1} { } + { + \group_begin: + #2 + } + { + #3 + \group_end: + } } +\newenvsc{scontents} \NewDocumentCommand \__scontents_grab_optional:w { r[] } { \__scontents_grab_optional:n {#1} } +\cs_new_protected:Npn \__scontents_analyse_nesting_format:n + { \__scontents_analyse_nesting_generic:nn { } } \bool_new:N \l__scontents_temp_bool \cs_new_protected:Npn \verbatimsc { \group_begin: - \__scontents_verbatimsc_aux: \frenchspacing \__scontents_vobeyspaces: \__scontents_xverb: + \__scontents_verbatimsc_aux: \frenchspacing \__scontents_vobeyspaces: + \__scontents_xverb: } \cs_new_protected:Npn \endverbatimsc { \group_end: } @@ -199,7 +215,7 @@ { \__scontents_Scontents_internal:nn {#1} {#2} } \NewDocumentCommand { \__scontents_verb_arg:w } { +v } { \__scontents_verb_arg_internal:n {#1} } -\NewDocumentCommand { \getstored } { O{1} m } +\NewDocumentCommand { \getstored } { O{-1} m } { \__scontents_getstored_internal:nn {#1} {#2} } \NewDocumentCommand { \foreachsc } { o m } { \__scontents_foreachsc_internal:nn {#1} {#2} } diff --git a/Master/texmf-dist/tex/latex/scontents/scontents.sty b/Master/texmf-dist/tex/latex/scontents/scontents.sty index ceb700d4348..77147e8ecf7 100644 --- a/Master/texmf-dist/tex/latex/scontents/scontents.sty +++ b/Master/texmf-dist/tex/latex/scontents/scontents.sty @@ -27,21 +27,21 @@ %% t-scontents.mkiv and %% scontents-code.tex. %% -\def\ScontentsFileDate{2019-10-29}% -\def\ScontentsFileVersion{1.7}% +\def\ScontentsFileDate{2019-11-18}% +\def\ScontentsFileVersion{1.8}% \def\ScontentsFileDescription{Stores LaTeX contents in memory or files}% \RequirePackage{expl3,xparse,l3keys2e}[2019/05/28] \ProvidesExplPackage {scontents} {\ScontentsFileDate} {\ScontentsFileVersion} {\ScontentsFileDescription} \@ifpackageloaded { verbatim } { - \iow_term:n + \msg_set:nnn { scontents } { unsupported-verbatim } { - The~implementation~of~the~'verbatimsc'~environment~\\ - used~by~\tl_to_str:n{\typestored}~is~not~compatible~with~package\\ - 'verbatim'.~Review~the~documentation~and~redefine~\\ - the~'verbatimsc'~environment. + 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 } } { } \tl_new:N \g__scontents_end_verbatimsc_tl \tl_gset_rescan:Nnn @@ -57,7 +57,7 @@ \c_backslash_str end \c_left_brace_str - scontents + \exp_not:N \l__scontents_env_name_tl \c_right_brace_str } \file_input:n { scontents-code.tex } @@ -66,20 +66,32 @@ \keys_define:nn { scontents } { verb-font .initial:n = \ttfamily } \ProcessKeysOptions { scontents } -\NewDocumentEnvironment { scontents } { } +\NewDocumentCommand { \newenvsc } { m O{} } { - \__scontents_scontents_env_begin: + \cs_if_exist:cTF { #1 } + { \msg_error:nnn { scontents } { env-already-defined } {#1} } + { \__scontents_scontents_setenv:nn {#1} {#2} } } +\cs_new_protected:Npn \__scontents_env_define:nnn #1 #2 #3 { - \__scontents_scontents_env_end: + \NewDocumentEnvironment {#1} { } + { + #2 + } + { + #3 + } } +\newenvsc{scontents} \NewDocumentCommand \__scontents_grab_optional:w { r[] } { \__scontents_grab_optional:n {#1} } +\cs_new_eq:NN \__scontents_analyse_nesting_format:n + \__scontents_analyse_nesting_latex:n \NewDocumentCommand { \Scontents }{ !s !O{} } { \__scontents_Scontents_internal:nn {#1} {#2} } \NewDocumentCommand { \__scontents_verb_arg:w } { +v } { \__scontents_verb_arg_internal:n {#1} } -\NewDocumentCommand { \getstored } { O{1} m } +\NewDocumentCommand { \getstored } { O{-1} m } { \__scontents_getstored_internal:nn {#1} {#2} } \NewDocumentCommand { \foreachsc } { o m } { \__scontents_foreachsc_internal:nn {#1} {#2} } |