From bbbe8128e7ae9d816a221377dbf5ff3969bb203b Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 30 Sep 2019 03:00:43 +0000
Subject: CTAN sync 201909300300

---
 .../contrib/filecontentsdef/filecontentsdef.dtx    | 874 ++++++++++++++++-----
 1 file changed, 672 insertions(+), 202 deletions(-)

(limited to 'macros/latex/contrib/filecontentsdef/filecontentsdef.dtx')

diff --git a/macros/latex/contrib/filecontentsdef/filecontentsdef.dtx b/macros/latex/contrib/filecontentsdef/filecontentsdef.dtx
index b6b722383c..7f78abe135 100644
--- a/macros/latex/contrib/filecontentsdef/filecontentsdef.dtx
+++ b/macros/latex/contrib/filecontentsdef/filecontentsdef.dtx
@@ -2,28 +2,28 @@
 % N.B.: this dtx file is NOT for use with \DocInput but only docstrip.
 % The latex source of the user manual isn't commented out.
 %<*none>
-\def\dtxtimestamp{21-04-2019 at 15:24:14 CEST}%
+\def\dtxtimestamp{29-09-2019 at 10:46:12 CEST}%
 %</none>
 %<*!readme&!install>
 %%
 %% Package: filecontentsdef
-%% Version: 1.4 (2019/04/20)
+%% Version: 1.5 (2019/09/29)
 %% License: LPPL 1.3c
 %% Copyright (C) 2016-2019 Jean-Francois Burnol <jfbu at free dot fr>
 %%
 %</!readme&!install>
 %<*none>
 \def\pkgname        {filecontentsdef}
-\def\pkgdate        {2019/04/20}
-\def\pkgdocdate     {2019/04/21}
-\def\pkgversion     {v1.4}
+\def\pkgdate        {2019/09/29}
+\def\pkgdocdate     {2019/09/29}
+\def\pkgversion     {v1.5}
 \def\pkgdescription {filecontents + macro + verbatim (JFB)}
 \catcode`\^ 12 \iffalse
 %</none>
 %<*readme|install>
 <!-- -->
 
-    Source:  filecontentsdef.dtx (v1.4 2019/04/20)
+    Source:  filecontentsdef.dtx (v1.5 2019/09/29)
     Author:  Jean-Francois Burnol
     Info:    filecontents + macro + verbatim
     License: LPPL 1.3c
@@ -52,6 +52,40 @@ macro, but skips the save-to-a-file part.
 CHANGE LOG
 ==========
 
+v1.5 \[2019/09/29\]
+-------------------
+
+- `\filecontentsexec` does not forcefully reset `\newlinechar`
+  to its LaTeX default after execution.
+
+- `\FCD@` as prefix for internal non public macros.
+
+- drop usage of the legacy LaTeX mechanism which issued a warning
+  in case of a form feed or horizontal tabulation character in the
+  parsed contents.
+
+- make handling of the tabulation and form feed characters
+  customizable.
+
+- treat especially the case when the `\end{filecontents...}`
+  is not on a line of its own.
+
+- add `filecontentsdefstarred` (et al.) as alias for
+  `filecontentsdef*` (et al.) for easying up encapsulation in
+  wrapping environments.
+
+- breaking change: `filecontentsdef` and `filecontentsdefmacro`
+  define a macro obeying the local scope. Use `filecontentsgdef`,
+  resp. `filecontentsgdefmacro` for definitions with global scope.
+
+- make the name of the environment used by `\filecontentsprint`
+  customizable (it defaults to `verbatim`) and allow to pass options
+  to it; has been tested with `fancyvrb` and `minted`.
+
+- add `\filecontentsprintviascan` which allows to use verbatim-like
+  environment such as `listings` which are incompatible with
+  `\filecontentsprint`.
+
 v1.4 \[2019/04/20\]
 -------------------
 
@@ -104,7 +138,7 @@ Use your installation manager.
 Else, for manual installation:
 
 - To extract the package and at the same time produce the documentation,
-  execute latex twice on `filecontentsdef.dtx` then `dvipdfmx` on the
+  execute latex thrice on `filecontentsdef.dtx` then `dvipdfmx` on the
   `dvi` file.
 
   To customize the PDF documentation (paper size, etc...): execute `etex`
@@ -172,7 +206,7 @@ of the project using it.
 \Msg{*\space\space\space\space \pkgname.sty^^J}%
 \Msg{*^^J}%
 \Msg{* To produce the documentation with source code included run latex^^J}%
-\Msg{* twice on file \pkgname.tex and then dvipdfmx on \pkgname.dvi^^J}%
+\Msg{* thrice on file \pkgname.tex and then dvipdfmx on \pkgname.dvi^^J}%
 \Msg{*^^J}%
 \Msg{* Happy TeXing!^^J}%
 \Msg{*^^J}%
@@ -257,7 +291,7 @@ of the project using it.
 \newcommand\fcdname{%
   \texorpdfstring{{\color{joli}\ttfamily\bfseries \pkgname}}{\pkgname}\xspace}
 
-\DeclareRobustCommand\csa [1] {{\ttfamily\hyphenchar\font45 \char`\\ #1}}
+\DeclareRobustCommand\csa[1]{{\ttfamily\hyphenchar\font45 \char`\\ #1}}
 
 \newcommand\csh[1]{\texorpdfstring{\csa{#1}}{\textbackslash\detokenize{#1}}}
 
@@ -292,25 +326,20 @@ pdfpagemode=UseOutlines}
 \usepackage{filecontentsdef}
 
 \makeatletter
-% Revert change to \smash and other macros at LaTeX 2018/12/01
-% https://github.com/latex3/latex2e/issues/108
-\let\leavevmode@ifvmode\empty % for \smash in \NewWith etc...
-\newcommand\inmarg [1]{\@bsphack
+% \hbox needed since change to \smash and other macros at LaTeX 2018/12/01
+\def\NewWith #1{\@bsphack
     \vadjust{\vskip-\dp\strutbox
-             \smash{\hbox to 0pt
-                       {\color[named]{PineGreen}\normalfont\small\bfseries
+             \hbox{\smash{\hbox to 0pt {\hss\color[named]{Thistle}%
+                        \normalfont\small\bfseries
                         \hsize 2.5cm\rightskip.5cm minus.5cm
-                        \hyphenpenalty\z@\exhyphenpenalty\z@
-                        \doublehyphendemerits\z@\baselineskip9pt
-                        \hss\vtop{\noindent#1}\kern.25cm }}%
+                        \vtop{\noindent New with #1}\kern.25cm }}}%
              \vskip\dp\strutbox }\strut\@esphack}
-%! 24 février 2014. J'ai besoin de me débarrasser du \to
-\def\NewWith #1{\@bsphack
+\def\ChangedAt #1{\@bsphack
     \vadjust{\vskip-\dp\strutbox
-             \smash{\hbox to 0pt {\hss\color[named]{Thistle}%
+             \hbox{\smash{\hbox to 0pt {\hss\color[named]{Thistle}%
                         \normalfont\small\bfseries
                         \hsize 2.5cm\rightskip.5cm minus.5cm
-                        \vtop{\noindent New with #1}\kern.25cm }}%
+                        \vtop{\noindent Changed at #1}\kern.25cm }}}%
              \vskip\dp\strutbox }\strut\@esphack}
 \makeatother
 
@@ -361,21 +390,20 @@ pdfpagemode=UseOutlines}
   \href{https://ctan.org/pkg/attachfile}{attachfile}.)
 \end{abstract}
 
-\section{Description}
+\tableofcontents
+
+\section{Environments and macros}
 
-This package provides the |filecontentsdef|\inmarg{|file\-contents\-def|}
-environment. It is like |filecontents| but requires a second argument. This
-argument will either be:
+\subsection{\textcolor[named]{PineGreen}{\texttt{filecontentsdef}},
+            \textcolor[named]{PineGreen}{\texttt{filecontentsgdef}}}
+
+The |filecontentsdef| environment is like |filecontents| but
+requires a second argument. This argument will either be:
 \begin{itemize}
-\item a single control sequence token such as |\macro|,
-\item \mbox{}\NewWith{v1.4$\to$}or anything else which then must after expansion be
+\item a single control sequence token such as |\foo|,
+\item or anything else which then must after expansion be
   usable as a macro \emph{name} (it will be handled via
   |\csname...\endcsname| encapsulation).
-% Bordel, que d'emmerdements avec le LaTeX \footnote et \verb ! On ne peut même
-% pas faire \string\fi (ou \else, ou \if pas vérifié lequel des trois:
-% incomplete \ifmmode
-%\footnote{
-% Bon ben finalement pas de footnote de toute façon. Déjà fait le mark-up je laisse.
   For example \texttt{\string\myitemnumber\{3\}} can be used as argument and
   it will then be expanded inside \texttt{\string\csname...\string\endcsname}
   to construct a control sequence, whose name will possibly contain digits or
@@ -383,13 +411,11 @@ argument will either be:
   allowed as long as its expansion is
   \texttt{\string\csname...\string\endcsname} compatible; the character itself
   will \emph{not} be assigned a new meaning.
-%}
-%
 \end{itemize}
 
 Thus the syntax is either:
 \begin{verbatim}
-    \begin{filecontentsdef}{<filename>}{\macro}
+    \begin{filecontentsdef}{<filename>}{\foo}
     ... arbitrary contents ...
     \end{filecontentsdef}
 \end{verbatim}
@@ -401,22 +427,32 @@ or:
 \end{verbatim}
 
 The environment creates the file and stores its (verbatim) contents into its
-second argument |\macro| (or into the  macro |\<macro name>| with given name).
+second argument |\foo| (or into the  macro |\<macro name>| with given name).
+
+\begin{framed}
+  Hint: if some |\foo| contains the \emph{name} of the macro to be defined, use
+  |\empty\foo| as argument, thus avoiding |\foo| itself to get overwritten by
+  the environment.
+\end{framed}
 
 \begin{enumerate}
-\item The starred variant acts like |filecontents*| environment regarding the
-  file contents.
+\item The starred variant |filecontentsdef*| acts like
+  |filecontents*| environment regarding the file contents, i.e.
+  it drops addition of a (\TeX) commented out header.
+\item |filecontentsdefstarred| is an alias for
+  |filecontentsdef*|.\NewWith{v1.5}
 \item The contents put into the macro are the same for the starred and
-  non-starred environments: they do not contain the commented-out header.
-\item The scope of the macro definition is global.
+  non-starred environments: neither contains a commented-out header.
+\item The scope of the macro definition is
+  \textbf{local}.\ChangedAt{v1.5}
+\item 
+  Use |filecontentsgdef| for a definition with global scope.\NewWith{v1.5}
 \item No check is done on whether the defined macro pre-existed.
-% \item |filecontentshere| is a wrapper of the |filecontentsdef|
-%   environment using \csa{filecontentsheremacro} as the macro where the
-%   contents are stored.\inmarg{\csa{file\-contents\-here\-macro}} This macro
-%   can then be reused elsewhere if wanted.
-\item The macro holds a verbatim rendering of the contents, which handles the
-  Form Feed and Tabulation characters analogously to the |filecontents|
-  treatment.
+\item The macro holds a verbatim rendering of the contents, with active spaces
+  and active |^^M| tokens.
+\item The handling of the\NewWith{v1.5}
+  Form Feed and Tabulation characters can be, contrarily to the |filecontents|
+  treatment, customized. See \autoref{sec:tab}.
 \item Babel shorthands will be neutralized the same way they are when
   encountered in a verbatim environment or in a |filecontents|
   environment. Their action is reactivated if the macro (assuming the
@@ -425,13 +461,10 @@ second argument |\macro| (or into the  macro |\<macro name>| with given name).
 \item The environment can be used either in the preamble or the body
   of the document.
 \item The contents must not contain themselves a
-  \texttt{\string\end}|{filecontentsdef}| (or |end{filecontentsdef*}| in the
+  \texttt{\string\end}|{filecontentsdef}| (or \texttt{\string\end}|{filecontentsdef*}| in the
 starred case).
-\item If some |\macro| contains the \emph{name} of the macro to be defined,
-  use then |\empty\macro| as argument, this trick will avoid the environment
-  thinking it is supposed to redefine |\macro| itself.
 % problème avec Emacs/AUCTeX et |\end{...}| qui fait boguer le fontlock
-% biarrement le deuxième ne pose pas de problème. 19 avril 2019.
+% bizarrement le deuxième ne pose pas de problème. 19 avril 2019.
 \end{enumerate}
 
 \begin{footnotesize}
@@ -442,8 +475,8 @@ starred case).
 \item the space becomes the active character of ascii code |32|,
 \item the end of line is converted into the active character |^^M| (i.e. ascii
   code |13|),
-\item the tabulation character |CTRL-I| becomes the active space character,
-\item the form feed character |CTRL-L| is converted into a pair of active |^^M|,
+\item see \autoref{sec:tab} for the handling of the horizontal tabulation
+  and form feed characters,
 \item the active bytes of ascii code between |128| and |255| (this is now
   systematically the case with |inputenc+utf8| being default) are stored
   into the produced macro ``as is'',
@@ -455,22 +488,44 @@ display as expected in a verbatim rendering, see \csa{filecontentsprint} next.
 \par
 \end{footnotesize}
 
-\medskip
+\subsection{\textcolor[named]{PineGreen}{\texttt{filecontentsdefmacro}},
+            \textcolor[named]{PineGreen}{\texttt{filecontentsgdefmacro}}}
 
-The \csa{filecontentsprint}\inmarg{\csa{file\-contents\-print}} macro has a
+This environment
+\begin{verbatim}
+    \begin{filecontentsdefmacro}{\foo or macro name}
+    ... arbitrary contents ...
+    \end{filecontentsdefmacro}
+\end{verbatim}
+was added at |v1.4|. It is like |filecontentsdef| without the
+``save to file'' part... and has thus a sole mandatory argument which may be
+either a control sequence or a name (or material expanding to name), as
+previously described. The macro can then be either printed verbatim via
+\csa{filecontentsprint} or, if it consists of \LaTeX\ code, be executed in
+re-tokenized form via \csa{filecontentsexec}.
+
+Its name is thus a bit paradoxical but was chosen to share an existing prefix
+with the other package macros and environments.
+
+\subsection{\textcolor[named]{PineGreen}{\csh{filecontentsprint}},
+\textcolor[named]{PineGreen}{\csh{FCDprintenvname}},
+\textcolor[named]{PineGreen}{\csh{FCDprintenvoptions}}}
+
+
+\csa{filecontentsprint} has a
 unique mandatory argument which will be either:
 \begin{itemize}
-\item a single control sequence token (for example |\macro|),
-\item \mbox{}\NewWith{v1.4$\to$}or anything else which then must after expansion be
+\item a single control sequence token (for example |\foo|),
+\item or anything else which then must after expansion be
   usable as a macro \emph{name} (for example |macro|). It will be handled via
   |\csname...\endcsname| encapsulation (see earlier explanations).%
 \end{itemize}
-The |\macro| must be of the type constructed by the environment
-|filecontentsdef|. It will be then be printed exactly as
+The |\foo| must be of the type constructed by the environments
+|filecontentsdef| or |filecontentsdefmacro|. It will be then be printed exactly as
 \begingroup\makeatletter\def\x{\let\@xverbatim\relax
        \verbatim
 \string\begin\string{verbatim\string}\par
-<contents of \string\macro>\par
+<contents of \string\foo>\par
 \string\end\string{verbatim\string}\par
 \endverbatim%
 \endgroup}\x
@@ -483,11 +538,6 @@ This uses underneath the |verbatim| environment and has been
   \href{http://www.ctan.org/pkg/verbatim}{verbatim} (whose mechanism is quite
   different from the one of the default |verbatim| environment.)
 
-%xxx
-% MARRE DE EMACS/AUCTEX QUI SE CROIT PLUS INTELLIGENT QUE L'UTILISATEUR POUR
-% L'INDENTATION PAR FILL-PARAGRAPH (M-q)
-%xxx
-
 \begin{framed}
   Due to limitation of the |verbatim| environment, the
   \texttt{\string\end}|{verbatim}| must not appear inside the contents... else
@@ -498,30 +548,182 @@ This uses underneath the |verbatim| environment and has been
   affects \csa{filecontentsprint}, not \csa{filecontentsexec}.
 \end{framed}
 
+The name of the used environment is held in macro
+\textcolor[named]{PineGreen}{\csa{FCDprintenvname}}.\NewWith{v1.5}
+Redefine it to modify the environment name from its default |verbatim|.
+
+Furthermore\NewWith{v1.5} the macro
+\textcolor[named]{PineGreen}{\csa{FCDprintenvoptions}} can be used to pass
+options to that environment.
+
+Here is a set-up using |fancyvrb| which I tested with success:
+\begin{verbatim}
+\documentclass{article}
+\usepackage{filecontentsdef}
+\usepackage{xcolor}
+\usepackage{fancyvrb}
+\usepackage{fvextra}
+
+% store tabs as active characters so they can be handled by fancyvrb
+{\catcode`\^^I=\active\gdef\FCDtabtomacro{\noexpand^^I}}
+
+% Use fancyvrb Verbatim environment
+\renewcommand*\FCDprintenvname{Verbatim}
+
+% with these options. This will be submitted to an \edef, so we
+% simply wrap in \unexpanded to avoid problems
+\renewcommand*\FCDprintenvoptions{%
+  \unexpanded{[fontsize=\scriptsize, highlightlines={1, 3-4},
+               numbers=both, showspaces, spacecolor=red,
+               showtabs, %tab=\rightarrowfill% incompatible with linebreaks?
+               breaklines,breakbefore=\\\space]}%
+}
+\begin{filecontentsdefmacro}{\testfancyvrb}
+some contents with long lines and tabs to test the options
+\end{filecontentsdefmacro}
+\end{verbatim}
+
+Here is now a set-up with |minted| which worked also (although the syntax
+highlighting was not handling correctly control sequences using the @ letter,
+but I am not knowledgeable enough in the Pygmentize library):
+
+\begin{verbatim}
+\documentclass{article}% needs shell-escape
+\usepackage{filecontentsdef}
+\usepackage{minted}
+\newminted{tex}{linenos}
+
+\renewcommand*\FCDprintenvname{texcode}
+
+\begin{filecontentsdefmacro}{\testminted}
+some TeX macros
+\end{filecontentsdefmacro}
+
+\begin{document}
+\filecontentsprint\testminted
+\end{document}
+\end{verbatim}
+
+\subsection{\textcolor[named]{PineGreen}{\csh{filecontentsprintviascan}}}
+
+It is not possible to use a |listings| environment via \csa{filecontentsprint}
+and \csa{FCDprintenv}, because |listings| has a special way to identify where
+it ends and this is incompatible with the \csa{filecontentsprint} approach.
+
+At |v1.5| 
+\csa{filecontentsprintviascan} is added\NewWith{v1.5} which is more powerful
+than \csa{filecontentsprint} as it should work not only with verbatim
+environments known to be compatible with \csa{filecontentsprint} but
+also with environments of the |listings| type. But this requires \eTeX{}
+\csa{scantokens} (it uses \csa{filecontentsexec}, see next).%
+%
+\footnote{I know that the \LaTeX{} kernel itself requires \eTeX{} for a few
+  years now, but \fcdname could have been installed on an old machine...}
+
+Here is an example of usage which worked for me (although the syntax
+highlighting, like the one from |minted|, was not fully satisfying):
+
+\begin{verbatim}
+\documentclass{article}
+\usepackage{filecontentsdef}
+\usepackage{xcolor}
+\usepackage{listings}
+\lstnewenvironment{latexverbatim}
+ {\lstset{
+     basicstyle=\small\ttfamily,
+     breaklines=true,
+     columns=fullflexible,
+     language=[LaTeX]TeX,
+     numbers=left,
+     numbersep=1em,
+     numberstyle=\tiny\color{gray},
+     keywordstyle=\color{red}}}{}
+
+\renewcommand*\FCDprintenvname{latexverbatim}
+
+\begin{document}
+
+\begin{filecontentsdefmacro}{\testlistings}
+\gdef\filecontentsprintviascan{\FCD@get\FCD@printviascan}%
+\gdef\FCD@printviascan#1{%
+   \toks@\expandafter{#1}%
+   \edef\FCD@envwithcontents{%
+        \noexpand\begin{\FCDprintenvname}\FCDprintenvoptions\noexpand^^M%
+        \the\toks@\@backslashchar end{\FCDprintenvname}\noexpand^^M}%
+   \FCD@exec\FCD@envwithcontents}%
+\end{filecontentsdefmacro}
+
+\filecontentsprintviascan\testlistings
+\end{document}
+\end{verbatim}
+
+\subsection{\textcolor[named]{PineGreen}{\csh{filecontentsexec}}}
+
 Although \fcdname itself generally does not require \eTeX, it provides as a
-convenience \csa{filecontentsexec}\inmarg{\csa{file\-contents\-exec}} which
+convenience \csa{filecontentsexec} which
 does require it as it uses |\scantokens| to re-assign the current catcode
 regime to the verbatimized tokens stored into its mandatory argument. Again
-the mandatory argument may have one of the two forms described previously.%
-\NewWith{v1.4$\to$}
+the mandatory argument may have one of the two forms described previously.
 
 And of course this assumes that the tokens provide legitimate \LaTeX\ code.
 
 \begin{footnotesize}
-  \textbf{TeX-hacker note:} As an aftereffect, the |\newlinechar| will be set
-  to |10| (its \LaTeX\ default) after execution; we skipped the saving and
-  restoring of its value (it is temporarily set to |13| for |\scantokens|
-  execution). No group is used in order to not create an extra scoping of the
-  executed macro contents.
+  \textbf{TeX-hacker note:} No group is used in order to not create an extra
+  scoping of the executed macro contents.
+
+  \textbf{TeX-hacker note:} In the case of storage in a macro of some \LaTeX{}
+  contents, and re-parsing via |\filecontentsexec| which uses
+  |\scantokens|, the last line before the
+  \texttt{\string\end}|{filecontentsdef}|
+  or |\end{filecontentsdefmacro}| potentially generates an end of line
+  character, typically a space token (but this depends on the
+  \csa{endlinechar} valid at this location
+  setting). Such a space coming from the last end of line has no impact if
+  the \LaTeX{} contents get executed in vertical mode. In horizontal mode it
+  will be avoided if these contents end with a |%|
+  or also with some control sequence such as a |\relax| or
+  |\empty| (only if \csa{endlinechar} is standard).
+
+  At |v1.5|\NewWith{v1.5} a special convention is added that if the
+  \texttt{\string\end}|{filecontentsdef}| (or variants) stands on
+  the same line as the last line of the contents, rather than being on
+  a line of its own, then the stored contents will get postfixed with
+  an added \csa{empty} token. Thus execution via
+  \csa{filecontentsexec} in horizontal mode will not induce any ending
+  space token (assuming the \csa{endlinechar} is then at its standard
+  setting). This feature is to be used only with contents representing
+  \TeX{} macros, as the \csa{empty} makes sense only in that context.
+  This token will remain invisible in the PDF output from
+  \csa{filecontentsprint}.
+
+  No \csa{empty}
+  gets added to the last line of the exported file (if there is one).
+  The original |filecontents| environment issues a warning when there is
+  contents before the end of the environment on the same line, this warning is
+  now skipped.\ChangedAt{v1.5}
+
+  This extra \csa{empty}
+  added only under such special usage of the environment is not currently
+  customizable, but I can add such a feature if there is a user request.
+
+  \textbf{TeX-hacker note:} one should not think that using
+  \csa{filecontentsexec} with some stored material will behave like copying
+  pasting that material directly at that very location of the source code: for
+  example if the last line ends with a |%|
+  this does not mean that this will comment out what is next in the source
+  code on the same line after the \csa{filecontentsexec}! It is more analogous
+  to making first a macro definition with the contents and then execute that
+  macro. But it is not possible for some macro from inside these contents to
+  itself grab tokens coming next after the \csa{filecontentsexec}\csa{foo}
+  (moreover, \fcdname adds tokens of its own in order restore the
+  \csa{newlinechar}).
 
-  \textbf{TeX-hacker note:} A space token will be present at the end of the
-  expansion, due to |\scantokens|'s way of working, but may be hidden by the
-  nature of the contents themselves, if for example they end with a |\relax|
-  or a |%|, or from arising in vertical mode.
 
 \end{footnotesize}
 
-The environment\inmarg{|file\-contents\-here|}
+\subsection{\textcolor[named]{PineGreen}{\texttt{filecontentshere}}}
+
+This environment
 \begin{verbatim}
     \begin{filecontentshere}{<filename>}
     ... arbitrary contents ...
@@ -538,84 +740,79 @@ and then immediately
 \begin{verbatim}
     \filecontentsprint\filecontentsheremacro
 \end{verbatim}
-The |\filecontentsheremacro| remains available for reuse with |\filecontentsexec|.
+The |\filecontentsheremacro| is then available for usage as argument
+of |\filecontentsexec|. Since |v1.5| its definition has only
+local scope.
+\ChangedAt{v1.5}
+
+The environment has a starred variant 
+|filecontentshere*| (also |filecontentsherestarred|) which does the
+expected thing.
 
 For example
 \begin{verbatim}
-\begin{filecontentshere}{\jobname.test}
+\begin{filecontentshere*}{\jobname.test}
   \begin{framed}
     \noindent 
                 We have coded this in \LaTeX: both
       $E=mc^2$ (input as \verb|$E=mc^2$|)
     and     $E=h\nu$  owe much    to \textsc{Albert Einstein}.
   \end{framed}
-\end{filecontentshere}
+\end{filecontentshere*}
 \filecontentsexec\filecontentsheremacro
 \end{verbatim}
-will produce the external file with extension
-|.test| and have this effect in the document (verbatim framed then real framed):
-\begin{filecontentshere}{\jobname.test}
+will produce an external file with the above contents and have this
+effect in the document (verbatim framed then real framed):
+\begin{filecontentshere*}{\jobname.test}
   \begin{framed}
     \noindent 
                 We have coded this in \LaTeX: both
       $E=mc^2$ (input as \verb|$E=mc^2$|)
     and     $E=h\nu$  owe much    to \textsc{Albert Einstein}.
   \end{framed}
-\end{filecontentshere}
+\end{filecontentshere*}
 \filecontentsexec\filecontentsheremacro
 
-The environment\inmarg{|file\-contents\-def\-macro|}
-\begin{verbatim}
-    \begin{filecontentsdefmacro}{\macro or macro name}
-    ... arbitrary contents ...
-    \end{filecontentsdefmacro}
-\end{verbatim}
-was added at |v1.4|.\NewWith{v1.4} It is like |filecontentsdef| without the
-``save to file'' part... and has thus a sole mandatory argument which may be
-either a control sequence or a name (or material expanding to name), as
-previously described. The macro can then be either printed verbatim via
-\csa{filecontentsprint} or, if it consists of \LaTeX\ code, be executed in
-re-tokenized form via \csa{filecontentsexec}.
-
-Its name is thus a bit paradoxical but was chosen to share an existing prefix
-with the other package macros and environments.
-
 \section{How to wrap usage of \texttt{filecontentsdef} in another
   environment}
 
-It is simple: don't use |\begin/\end| syntax
-%  \verb|\end{filecontentsdef}|, % uniquement à cause de bug de Emacs/AUCTeX
-%                                % fontlocking
-but |\begingroup\filecontentsdef{..}{..}| and |\endfilecontentsdef\endgroup|.
+Don't use the |\begin/\end| syntax but directly
+|\begingroup\filecontentsdef{..}{..}| and |\endfilecontentsdef\endgroup|.
 And these should come last, respectively first, in the definition of the
 begin, respectively end, part of the new environment.
 
-The extra |\begingroup...\endgroup| is needed only to the extent that
-definitions and catcode assignments could affect the execution of the
-rest of the |end| part of the new environment. As this |end| part will
-be tokenized at time of definition, it will in general be indifferent to
-the catcode modifications done by \csa{filecontentsdef} and generally
-speaking the |\begingroup...\endgroup| can be dropped.
-
-Of course, for wrapping the starred variant one should use
-% PUTAIN DE BORDEL DE Text for \verb command ended by end of line, QU'EST-CE
-% QUE LATEX EST CHIANT. Plus le fill-paragraph de Emacs et le doctex-mode défectueux.
-|\csname filecontentsdef*\endcsname|, or make the definition with |*| having catcode
-letter. But the \verb|\endfilecontentsdef| can drop the |*|, as the starred
-environments defined by the \fcdname package use the same ending macros as
-their non-starred variants.
+The extra |\begingroup...\endgroup| are mandatory with the
+\fcdname environments making a local scope definition.\ChangedAt{v1.5}
+
+For those creating global scope macros, |\begingroup...\endgroup|
+is recommended, as the \LaTeX{} state is not completely clean
+after |\endfilecontentsgdef| (et al.) execution. Thus it is
+better to have the extra |\begingroup...\endgroup| pair always
+(which are a part of the things added by the |\begin/\end| syntax).
+
+For wrapping the starred variant one needs to use
+|\csname filecontentsdef*\endcsname|, or make the definition with |*|
+having catcode letter. A simpler way is to use the alias ending
+in |...starred|.\NewWith{v1.5} Regarding the ending macro its
+name can drop the |*|, as the starred environments defined by the
+\fcdname package use the same ending macros as their non-starred
+variants.
 
 As exercise, let's imagine we want an environment which will be associated
 to some counter, will automatically increment it at each usage, and will
-use this counter to index the files and macros created on each invocation.
+use this counter to index the files and macros created on each
+invocation.
+Except if you know how to smuggle how a macro from an environment
+you probably want to use |filecontentsgdef| in order for the
+macro to have global scope.
 \begin{filecontentsdefmacro}{\pablo}
 \newcounter{pablo}
 \newenvironment{defexercise}
    {\stepcounter{pablo}%
     \begingroup
-    \csname filecontentsdef*\endcsname
+    \filecontentsgdefstarred
     {\jobname-ex\the\value{pablo}}{exercise-\the\value{pablo}}}%
-   {\endfilecontentsdef\endgroup}
+   {\endfilecontentsgdefstarred\endgroup}
 \newcommand{\printexercise}[1]{\filecontentsexec{exercise-\the\numexpr#1\relax}}
 \end{filecontentsdefmacro}
 \filecontentsprint\pablo
@@ -649,11 +846,155 @@ This produces in the document:
 Additionally, three small files were created containing the \LaTeX\ mark-up
 for each exercise.
 
+
+\section{How to customize handling of tabulation and form feed characters}
+\label{sec:tab}
+
+\LaTeX{} assigns catcode 10 by default to |^^I| meaning that it is handled by
+default as a space character:
+\begin{filecontentsdefmacro}{\coucou}
+\def\test{^^I}
+\ifx\test\space \textcolor{blue}{OK}\else \ERROR\fi
+\end{filecontentsdefmacro}
+\filecontentsprint\coucou
+\filecontentsexec\coucou
+
+But \fcdname like the original |filecontents| environment assigns active
+catcode to the tabulation character before parsing the contents. This allows
+special treatment.
+
+\begin{framed}
+  Attention that if input as |^^I| (in opposition to the real ascii character
+  of ascii code 9), it will end up simply as |^^I| in external file or macro,
+  because the caret loses its special meaning in the environment.
+
+  The discussion in this section about customizing \fcdname behaviour applies
+  only to a source with a real tabulation character, not one in \TeX{} notation
+  |^^I|.
+\end{framed}
+
+With
+|v1.5|, \fcdname diverges from original |filecontents| by adding the means to
+customize the handling of such tabulation character, rather than simply raising
+a warning and exporting it as a space like original |filecontents|. And also
+the handling of the form feed character can be customized.
+
+This is controlled via four control sequences whose default definitions are
+the following:\NewWith{v1.5}
+\begin{verbatim}
+\def\FCDtabtofile{ }%
+
+{\catcode32\active\gdef\FCDtabtomacro{\noexpand }}%
+
+\def\FCDformfeedtofile{^^J^^J}%
+
+{\catcode`\^^M\active\gdef\FCDformfeedtomacro{\noexpand^^M\noexpand^^M}}%
+\end{verbatim}
+
+Each of \csa{FCDtabtofile}, \csa{FCDtabtomacro},
+\csa{FCDformfeedtofile}, \csa{FCDformfeedtomacro} gets used via an
+expansion inside an \csa{edef}, hence the need for \csa{noexpand} in front
+of active characters. The |^^J| in \csa{FCDformfeedtofile} matches
+the default newline character (ascii code 10) of \LaTeX{} for
+exporting files. The active |^^M| is used for macro storage
+because this is the most suitable for verbatim printing via
+\csa{filecontentsprint} as typically in a verbatim environment end
+of lines get converted into such active |^^M| (which will create
+a |\par| token).
+
+If you want for example tabulation characters to get converted into four
+spaces, use:
+\begin{verbatim}
+\def\FCDtabtofile{\space\space\space\space}%
+{\catcode32\active\gdef\FCDtabtomacro{\noexpand \noexpand \noexpand \noexpand }}%
+\end{verbatim}
+I have here used for macro storage active spaces. The \csa{noexpand} are
+mandatory in such case, but they will disappear from stored contents in a
+macro. We could also have defined \csa{FCDtabtofile} as an alias to
+\csa{FCDtabtomacro} here because a non-expanding active space will simply give a
+space in the external file. Due to \TeX{} tokenization rules
+|\def\FCDtabtofile{    }| would be the same as with only one single space and
+thus we used |\space\space\space\space|.
+
+If you want an actual tabulation character stored to a file, use:
+\begin{verbatim}
+{\catcode`\^^I=12 \gdef\FCDtabtofile{^^I}}
+\def\FCDtabtomacro{TAB}
+\end{verbatim}
+The second line is for demonstration only as an example of how to store the
+tabulation character in a macro, use anything adequate to replace \texttt{TAB}
+as used here. For example you can store in it the actual tabulation (ascii code
+9) with catcode 12, via using rather |\let\FCDtabtomacro\FCDtabtofile| in the
+above. Or use some Unicode symbol and appropriate font configuration.
+
+Here is an example. This is rendered via |verbatim| which will treat the
+tabulation characters as spaces, but they are there in the original:
+\begin{verbatim}
+{\catcode`\^^I=12 \gdef\FCDtabtofile{^^I}}
+\let\FCDtabtomacro\FCDtabtofile
+\begin{filecontentshere}{\jobname-tab.test}
+Here is a tab	and then three in a row			.
+\end{filecontentshere}
+(we will see them in the PDF output via the glyph at slot 9 of the T1 encoding).
+\end{verbatim}
+Here is what the original produces indeed when executed:
+{\catcode`\^^I=12 \gdef\FCDtabtofile{^^I}}
+\let\FCDtabtomacro\FCDtabtofile
+\begin{filecontentshere}{\jobname-tab.test}
+Here is a tab	and then three in a row			.
+\end{filecontentshere}
+The way it looks in the PDF is due to our definition of \csa{FCDtabtomacro}
+which gives a catcode12 character of ascii code 9, and we use T1
+font-encoding. The exported file does contain on the other hand as promised a
+real tabulation character.
+
 \begin{footnotesize}
+  \begin{framed}
+    \LaTeX{} since 2018 uses by default |\usepackage[utf8]{inputenc}| and
+    almost all control characters are given active catcode. Exceptions: |^^@|
+    (illegal), |^^I| (treated as space), |^^J| (for some reason it gets catcode
+    12 and thus will if printed to PDF give the glyph at slot 10 of the font
+    encoding), and |^^M| (end of line).
+
+    Notice that such a control character which in the source gets input using
+    \TeX{} notation, for example |^^P|, causes no issue to \fcdname as the
+    caret |^| has lost its special catcode. Thus a |^^P| will be printed to
+    external file.
+
+    If one tries to use directly in the source the CTRL-P, an error will be
+    raised by \LaTeX{} triggered by the active character (\fcdname does not
+    sanitize catcodes in this ascii range, as original |filecontents|
+    environment does not either).
+
+    One can always reassign catcodes, thus you can set the catcode of |^^P| to
+    12 for example. However, when exporting such a control character with
+    catcode 11 or 12 to a file, pdflatex uses |^^| notation in the output.
+    There are three exceptions (with |pdflatex|): the horizontal tabulation (ascii code 9,
+    |^^I|), the line feed (ascii code 10, |^^J|), and vertical tabulation
+    (ascii code 11, |^^K|) are exported to the file as the corresponding ascii
+    characters (at least this is the case with \TeX Live). \emph{These
+      exceptions do not apply with} |xelatex|.
+
+    Thus we again end up with \TeX{} notation |^^P| in the exported file. To
+    get a literal CTRL-P, you need to set the catcode of |^^P| to 11 or 12, and
+    to run |pdflatex| with the |-8bit| option. With Xe\LaTeX, this would be
+    needed even for the horizontal tabulation CTRL-I. 
+  \end{framed}
+\end{footnotesize}
 
-\section{Custom verbatim print-outs}
+\begin{footnotesize}
 
-We now comment on alternatives to using \csa{filecontentsprint}. Here is
+\section{How to obtain customized verbatim in the output}
+
+Please refer first to the discussion of \csa{filecontentsprint} and
+\csa{filecontentsprintviascan} as it provides examples using |fancyvrb|,
+|minted|, or |listings| environments which may be what you are looking for.
+
+Here we make quick comments on alternatives to using \csa{filecontentsprint},
+and handling directly the contents via the configuration of active spaces and
+active end of lines.
+
+Here is
 some (non-\LaTeX) text snippet.
 \begin{verbatim}
 \begin{filecontentsdef}{\jobname.test2}{\testactive}
@@ -726,6 +1067,20 @@ not contain \verb|\end{verbatim}|.
 
 \end{footnotesize}
 
+\section{Related packages}
+
+\begin{itemize}
+\item Scott~\textsc{Pakin}'s
+  \href{http://www.ctan.org/pkg/filecontents}{filecontents}. Notice that the
+  package functionality has been integrated into \LaTeX{} release dated
+  |2019/10/01|.
+\item Pablo~\textsc{González}'s
+  \href{http://www.ctan.org/pkg/scontents}{scontents}. Make sure your version
+  is at least |v1.3| as earlier ones had a dependency on \fcdname
+  and are broken by the changes coming with |filecontentsdef v1.5|.
+\end{itemize}
+
+
 \StopEventually{\end{document}}
 
 \clearpage
@@ -777,19 +1132,62 @@ See the \texttt{README.md} file for the \texttt{CHANGE LOG}.
 %
 %</none>
 %<*package>
-% Most of
-% the code is still identical to the one in \textsc{Scott Pakin}'s
-% \href{http://www.ctan.org/pkg/filecontents}{filecontents} hence to
-% the original one in \LaTeX's sources.
-%
-% But |v1.4| adds \cs{filecontentsdefmacro} which does not write to a file...
 %    \begin{macrocode}
+\let\FCD@global\global
 \begingroup
 \catcode`\^^M\active%
+%    \end{macrocode}
+% Attention that all end of lines must now get protected due to
+% the end of line character being active.
+%
+% The \LaTeX{} default for active |^^L| was \csa{outer} up to the |2017-01-01|
+% release (got modified in |{v2.3b}{2016/11/06}| version of |ltplain.dtx|).
+% But we must still handle that possibility for usage with older formats.
+%    \begin{macrocode}
 \catcode`\^^L\active\let^^L\relax%
 \catcode`\^^I\active%
-\gdef\filec@ntentsdef#1#2{%
-  \let#2\@empty%
+%    \end{macrocode}
+% \csa{FCD@main} is the core construct.
+%
+% Bulk of the code is still identical to the one in \textsc{Scott Pakin}'s
+% \href{http://www.ctan.org/pkg/filecontents}{filecontents} hence to the
+% original one in \LaTeX's sources regarding \csa{filec@ntents}, as
+% |filecontentsdef| was conceived as an extension of the original
+% |filecontents| environment, with the added feature of storing the
+% verbatimized contents in a \TeX{} macro, which can then be printed (verbatim)
+% or re-tokenized later via \csa{scantokens} and executed (if it represents
+% \LaTeX{} material). Starting with |v1.5| some renaming of internal macros
+% appears and the original coding is not only extended but starts being
+% modified at some places as well.
+%
+% |v1.4| adds \csa{filecontentsdefmacro} which does not write to a file.
+%
+% |v1.5| renames all internal macros to use |\FCD@| namespace prefix. This
+% applies here to \csa{FCD@main} whose name was still \csa{filec@ntentsdef} at
+% |v1.4|. The change also applies to the \csa{reserved@b} and \csa{reservec@c}.
+%
+% |v1.5| adds customizability of how tabulation and form feed characters are
+% handled either in file output or in macro storage.
+%
+% |v1.5| modifies |filecontentsdef| to only make a definition with local
+% scope. For this we must smuggle out of the environment both the name and the
+% meaning of the control sequence to define. We prepare for this a
+% \csa{FCD@defmacro} which gets executed via |\endfilecontentsdef| (and
+% variants). As \csa{FCD@defmacro} issues \csa{endgroup}, direct usage of
+% \csa{filecontentsdef} (not as environment) must be inside an explicit
+% \csa{begingroup}/\csa{endgroup} pair, mimicking the one which an environment
+% would insert.
+%
+% The |filecontentsgdef/filecontentsgdefmacro| environments do define
+% \csa{FCD@defmacro} but do not execute it.
+%    \begin{macrocode}
+\gdef\FCD@main#1#2{%
+  \def\FCD@defmacro%
+     {\toks@\expandafter{#2}%
+      \edef\x{\endgroup\def\noexpand#2{\the\toks@}%
+              \begingroup\def\noexpand\@currenvir{\@currenvir}}%
+      \x}%
+  \FCD@global\let#2\@empty%
  \if@filesw%
   \openin\@inputcheck#1 %
   \ifeof\@inputcheck%
@@ -800,11 +1198,11 @@ See the \texttt{README.md} file for the \texttt{CHANGE LOG}.
         {Overwriting file `\@currdir#1'}%
   \fi%
   \closein\@inputcheck%
-  \chardef\reserved@c15 %
-  \ch@ck7\reserved@c\write%
-  \immediate\openout\reserved@c#1\relax%
+  \chardef\FCD@reserved@c15 %
+  \ch@ck7\FCD@reserved@c\write%
+  \immediate\openout\FCD@reserved@c#1\relax%
   \if@tempswa%
-    \immediate\write\reserved@c{%
+    \immediate\write\FCD@reserved@c{%
       \@percentchar\@percentchar\space%
           \expandafter\@gobble\string\LaTeX2e file `#1'^^J%
       \@percentchar\@percentchar\space  generated by the %
@@ -837,18 +1235,21 @@ See the \texttt{README.md} file for the \texttt{CHANGE LOG}.
     \ifnum\count@<\@cclvi%
   \repeat%
 %    \end{macrocode}
-% The default active |^^L|  is |\outer|. But |\reserved@b| will be |def'd|
-% with an active |^^L| in its replacement text.
+% The default active |^^L| was |\outer| up to |2017/01/01|.
 %    \begin{macrocode}
   \let^^L\relax%
-  \edef\E{\@backslashchar end\string{\@currenvir\string}}%
-  \edef\reserved@b{\def\noexpand\reserved@b####1\E####2\E####3\relax}%
+  \edef\FCD@E{\@backslashchar end\string{\@currenvir\string}}%
+  \edef\FCD@reserved@b{\def\noexpand\FCD@reserved@b####1\FCD@E####2\FCD@E####3\relax}%
 %    \end{macrocode}
-% \cs{filecontentsdefmacro} sets \cs{if@filesw} to false.
+% \csa{filecontentsdefmacro} sets \csa{if@filesw} to false.
 %    \begin{macrocode}
-  \reserved@b{%
+  \FCD@reserved@b{%
     \ifx\relax##3\relax%
-      \if@filesw\immediate\write\reserved@c{##1}\fi%
+      \if@filesw%
+        \let^^L\FCDformfeedtofile%
+        \let^^I\FCDtabtofile%
+        \immediate\write\FCD@reserved@c{##1}%
+      \fi%
 %    \end{macrocode}
 % This is where the original |filecontents| is extended to store the
 % parsed material in a macro (in my very first hack I simply
@@ -862,29 +1263,34 @@ See the \texttt{README.md} file for the \texttt{CHANGE LOG}.
 % the characters it contains are protected from further expansion in
 % the |\xdef|'s. And the single |\noexpand| is enough also for the
 % |\write| done above.
-%
-% The |lccode| of the tilde is |32| when this gets executed. Multiple
-% form feeds produce the same effect in the macro (insertion of two
-% |^^M| per form feed) as in the written out file (via two |^^J|).
 %    \begin{macrocode}
       \toks@\expandafter{#2}%
-      {\def^^L{\noexpand^^M\noexpand^^M}\lowercase{\let^^I~}%
-       \xdef#2{\the\toks@##1\noexpand^^M}}%
+      \let^^L\FCDformfeedtomacro%
+      \let^^I\FCDtabtomacro%
+      \FCD@global\edef#2{\the\toks@##1\noexpand^^M}%
     \else%
       \edef^^M{\noexpand\end{\@currenvir}}%
       \ifx\relax##1\relax%
       \else%
-       \if@filesw%
-          \@latex@warning{Writing text `##1' before %
-             \string\end{\@currenvir}\MessageBreak as last line of #1}%
-        \immediate\write\reserved@c{##1}%
-       \fi%
+        \if@filesw%
+%    \end{macrocode}
+% |v1.5| suppresses the warning issued by |filecontents| environment
+% in such case.
+%    \begin{macrocode}
+          \let^^L\FCDformfeedtofile%
+          \let^^I\FCDtabtofile%
+          \immediate\write\FCD@reserved@c{##1}%
+        \fi%
 %    \end{macrocode}
-% Same added code as above.
+% In such case with the end of environment not being on a line of its own,
+% |v1.5| injects an extra |\empty| token at end of last line. Thus
+% usage in this form is restricted to contents representing \TeX{} macros.
+% We still need the final |^^M| for \csa{filecontentsprint} matters.
 %    \begin{macrocode}
         \toks@\expandafter{#2}%
-        {\def^^L{\noexpand^^M\noexpand^^M}\lowercase{\let^^I~}%
-         \xdef#2{\the\toks@##1\noexpand^^M}}%
+        \let^^L\FCDformfeedtomacro%
+        \let^^I\FCDtabtomacro%
+        \FCD@global\edef#2{\the\toks@##1\noexpand\empty\noexpand^^M}%
       \fi%
       \ifx\relax##2\relax%
       \else%
@@ -893,62 +1299,98 @@ See the \texttt{README.md} file for the \texttt{CHANGE LOG}.
       \fi%
     \fi%
     ^^M}%
-  \catcode`\^^L\active%
 %    \end{macrocode}
-% |v1.4|: sync |^^L| and |^^I| with 2018/04/01 LaTeX release.
+% |v1.4|: sync |^^L| and |^^I| with |2018/04/01| \LaTeX{} release.
+%
+% |v1.5|: drop the |^^L| and |^^I| \LaTeX{} definitions in favour of
+% \csa{FCDformfeedtomacro} etc...
 %    \begin{macrocode}
-  \let\L\@undefined%
-  \def^^L{\expandafter\ifx\csname L\endcsname\relax\fi^^J^^J}%
+  \catcode`\^^L\active%
   \catcode`\^^I\active%
-  \let\I\@undefined%
-  \def^^I{\expandafter\ifx\csname I\endcsname\relax\fi\space}%
   \catcode`\^^M\active%
-  \edef^^M##1^^M{\noexpand\reserved@b##1\E\E\relax}%
+  \edef^^M##1^^M{\noexpand\FCD@reserved@b##1\FCD@E\FCD@E\relax}%
 %    \end{macrocode}
-% We want space characters to be active in the produced macro.
-% We only need to protect them once from expansion.
+% We need active space characters to be active in the produced macro.
+% We only need to protect them once from expansion. The definition
+% will work both for writing to a file and for storage into the macro.
 %    \begin{macrocode}
   \catcode32\active\lccode`~32 \lowercase{\def~{\noexpand~}}%
 }%
-\endgroup
+\gdef\FCDformfeedtofile{^^J^^J}%
+\gdef\FCDformfeedtomacro{\noexpand^^M\noexpand^^M}%
+\gdef\FCDtabtofile{ }%
+\catcode32\active\gdef\FCDtabtomacro{\noexpand }%
+\endgroup%
 %    \end{macrocode}
 % The |v1.4| macros accept a name as alternative to a macro. Empty or
 % ill-formed |#2| will break code. But |#2| can be using |\if|, |\else|,
 % |\fi| tokens, the whole thing will end up |\csname|-expanded. An active
 % character also will end up |\csname|-expanded. There is no check on
 % whether |#2| or |\csname#2\endcsname| is an existing macro.
+%
+% |v1.5| replaces \csa{@tempa,b} by \csa{FCD@tempa,b}. And its
+% \csa{FCD@get@aux} directly grabs |#2| rather than issuing \csa{@firstofone}.
 %    \begin{macrocode}
-\long\def\filecontentsdef@aux#1\filecontentsdef@aux{\@firstofone}%
-\def\filecontentsdef@get#1#2%
+\long\def\FCD@get@aux#1\FCD@get@aux#2{#2}%
+\def\FCD@get#1#2%
 {%
-  \def\@tempa{#1}\def\@tempb{{#2}}%
-  \expandafter\filecontentsdef@aux\@gobbletwo#2\filecontentsdef@aux
+  \def\FCD@tempa{#1}\def\FCD@tempb{{#2}}%
+  \expandafter\FCD@get@aux\@gobbletwo#2\FCD@get@aux
   \@thirdofthree
-  \filecontentsdef@aux
+  \FCD@get@aux
   {\ifcat\relax\noexpand#2\expandafter\@gobble\else\expandafter\@firstofone\fi}%
-  {\edef\@tempb{{\expandafter\noexpand\csname#2\endcsname}}}%
-  \expandafter\@tempa\@tempb
+  {\edef\FCD@tempb{{\expandafter\noexpand\csname#2\endcsname}}}%
+  \expandafter\FCD@tempa\FCD@tempb
 }%
 %    \end{macrocode}
-% |v1.4| adds \cs{filecontentsdefmacro}. I abuse the \cs{if@filesw} toggle as there
-% is no \cs{if@tempswb} available. No need for a starred version as anyhow
-% the commented-out header was not put into the macro by the existing
-% \cs{filec@ntentsdef} code. No need to reset the toggle as only usage as
-% an environment is supported. And by lazyness and to spare extra coding,
-% \cs{endfilecontentsdefmacro} emits no warning about Form Feed and Tabulation.
+% |v1.4| adds \csa{filecontentsdefmacro}. I abuse the \csa{if@filesw} toggle as
+% there is no \csa{if@tempswb} available. No need for a starred version as
+% anyhow the commented-out header was not put into the macro by the existing
+% \csa{FCD@main} code. No need to reset the toggle as documentation explains
+% direct usage of the environment begin and end macros must be inside a 
+% |\begingroup\endgroup| pair.
+%
+% |v1.5| adds the ``starred''-named variants as aliases.
 %    \begin{macrocode}
 \begingroup
 \catcode`\*=11
-\gdef\filecontentsdef #1{\@tempswatrue\filecontentsdef@get{\filec@ntentsdef{#1}}}%
-\gdef\filecontentsdef*#1{\@tempswafalse\filecontentsdef@get{\filec@ntentsdef{#1}}}%
-\global\let\endfilecontentsdef \endfilecontents
-\global\let\endfilecontentsdef*\endfilecontents
-\gdef\filecontentsdefmacro{\@fileswfalse\filecontentsdef@get{\filec@ntentsdef{}}}%
-\global\let\endfilecontentsdefmacro\relax
-\gdef\filecontentshere #1{\@tempswatrue\filec@ntentsdef{#1}\filecontentsheremacro}%
-\gdef\filecontentshere*#1{\@tempswafalse\filec@ntentsdef{#1}\filecontentsheremacro}%
-\gdef\endfilecontentshere{\endfilecontentsdef\aftergroup\filecontents@here}%
+\gdef\filecontentsdef #1{\let\FCD@global\@empty
+                         \@tempswatrue\FCD@get{\FCD@main{#1}}}%
+\gdef\filecontentsdef*#1{\let\FCD@global\@empty
+                         \@tempswafalse\FCD@get{\FCD@main{#1}}}%
+\global\let\filecontentsdefstarred\filecontentsdef*
+\gdef\filecontentsgdef #1{\@tempswatrue\FCD@get{\FCD@main{#1}}}%
+\gdef\filecontentsgdef*#1{\@tempswafalse\FCD@get{\FCD@main{#1}}}%
+\global\let\filecontentsgdefstarred\filecontentsgdef*
+%    \end{macrocode}
+% |v1.5| can not use original \csa{endfilecontents} which makes reference to
+% \csa{reserved@c} whereas \fcdname now uses in its place \csa{FCD@reserved@c}.
+% Finally I drop altogether the bulk of this macro which issued a warning in
+% case of an encountered form feed or tabulation character.
+%
+% |v1.5| adds support for definitions with local scope so we must smuggle the
+% defined macro out of the environment. This is done via \csa{FCD@defmacro}
+% which is set-up via \csa{FCD@main}.
+%    \begin{macrocode}
+\gdef\endfilecontentsdef{\immediate\closeout\FCD@reserved@c\FCD@defmacro}%
+\global\let\endfilecontentsdef*\endfilecontentsdef
+\global\let\endfilecontentsdefstarred\endfilecontentsdef
+\gdef\endfilecontentsgdef{\immediate\closeout\FCD@reserved@c}%
+\global\let\endfilecontentsgdef*\endfilecontentsgdef
+\global\let\endfilecontentsgdefstarred\endfilecontentsgdef
+\gdef\filecontentsdefmacro{\let\FCD@global\@empty
+                           \@fileswfalse\FCD@get{\FCD@main{}}}%
+\gdef\endfilecontentsdefmacro{\FCD@defmacro}%
+\gdef\filecontentsgdefmacro{\@fileswfalse\FCD@get{\FCD@main{}}}%
+\global\let\endfilecontentsgdefmacro\relax
+\gdef\filecontentshere #1{\let\FCD@global\@empty
+                           \@tempswatrue\FCD@main{#1}\filecontentsheremacro}%
+\gdef\filecontentshere*#1{\let\FCD@global\@empty
+                           \@tempswafalse\FCD@main{#1}\filecontentsheremacro}%
+\global\let\filecontentsherestarred\filecontentshere*
+\gdef\endfilecontentshere{\endfilecontentsdef\aftergroup\FCD@here}%
 \global\let\endfilecontentshere*\endfilecontentshere
+\global\let\endfilecontentsherestarred\endfilecontentshere
 %    \end{macrocode}
 % Package |verbatim.sty| modifies the standard |verbatim| environment. For
 % both the original and the modified version we need to insert an active |^^M|
@@ -961,20 +1403,48 @@ See the \texttt{README.md} file for the \texttt{CHANGE LOG}.
 % the code compatible with further packages (I have not looked for them)
 % modifying the |verbatim| environment. For better code readibility I use
 % |^^M%|'s rather than exploiting the active ends of lines here.
+%
+% |v1.5| adds \csa{FCDprintenvname} which holds the name of the environment to
+% be used. Initially configured to hold of course |verbatim|. And it also adds
+% \csa{FCDprintenvoptions}.
 %    \begin{macrocode}
-\gdef\filecontentsprint{\filecontentsdef@get\filecontents@print}%
+\gdef\filecontentsprint{\FCD@get\FCD@print}%
 \catcode`\^^M\active%
-\gdef\filecontents@print #1{\let\filecontents@print@EOL^^M\let^^M\relax%
-   \begingroup\toks@\expandafter{#1}\edef\x{\endgroup%
-            \noexpand\begin{verbatim}^^M%
-            \the\toks@\@backslashchar end\string{verbatim\string}}\x^^M%
-   \filecontents@print@resetEOL}%
-\gdef\filecontents@print@resetEOL{\let^^M\filecontents@print@EOL}%
+\gdef\FCD@print #1{\let\FCD@print@EOL^^M\let^^M\relax%
+   \begingroup\toks@\expandafter{#1}%
+    \edef\x{\endgroup%
+        \noexpand\begin{\FCDprintenvname}\FCDprintenvoptions^^M%
+        \the\toks@\@backslashchar end\string{\FCDprintenvname\string}}%
+   \x^^M%
+   \FCD@print@resetEOL}%
+\gdef\FCD@print@resetEOL{\let^^M\FCD@print@EOL}%
+\gdef\filecontentsprintviascan{\FCD@get\FCD@printviascan}%
+%    \end{macrocode}
+% |v1.5| adds \csa{filecontentsprintviascan} which uses \csa{scantokens} to wrap
+% stored contents in a verbatim-like environment. This is needed for things
+% such as |listings| (it uses an active backslash at start of lines).
+% Attention to the \csa{scantokens} subtlety with \csa{end} which would become
+% |\end<space>| and then again |listings| would not recognize the ending
+% pattern.
+%    \begin{macrocode}
+\gdef\FCD@printviascan#1{%
+   \toks@\expandafter{#1}%
+   \edef\FCD@envwithcontents{%
+        \noexpand\begin{\FCDprintenvname}\FCDprintenvoptions\noexpand^^M%
+        \the\toks@\@backslashchar end{\FCDprintenvname}\noexpand^^M}%
+   \FCD@exec\FCD@envwithcontents}%
 \endgroup
-\def\filecontents@here{\filecontents@print\filecontentsheremacro}%
-\def\filecontentsexec{\filecontentsdef@get\filecontents@exec}%
-\def\filecontents@exec #1{\newlinechar13 
-    \scantokens\expandafter{#1}\newlinechar10\relax}%
+\def\FCDprintenvname{verbatim}%
+\let\FCDprintenvoptions\@empty
+\def\FCD@here{\FCD@print\filecontentsheremacro}%
+\def\filecontentsexec{\FCD@get\FCD@exec}%
+%    \end{macrocode}
+% |v1.5| restores \csa{newlinechar} to its prior value, rather than setting it
+% to the \LaTeX{} default (10).
+%    \begin{macrocode}
+\def\FCD@exec #1{\edef\FCD@newlinechar{\the\newlinechar}%
+    \newlinechar13 
+    \scantokens\expandafter{#1}\newlinechar\FCD@newlinechar\relax}%
 \endinput
 %    \end{macrocode}
 % \MakePercentComment
-- 
cgit v1.2.3

