From 78655a585d87722e604b5d7320df24e26f0bff6c Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 29 Sep 2019 21:13:57 +0000 Subject: filecontentsdef (29sep19) git-svn-id: svn://tug.org/texlive/trunk@52208 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/doc/latex/filecontentsdef/INSTALL | 4 +- .../doc/latex/filecontentsdef/INSTALL.md | 4 +- .../texmf-dist/doc/latex/filecontentsdef/README.md | 36 +- .../latex/filecontentsdef/filecontentsdef-tab.test | 5 + .../doc/latex/filecontentsdef/filecontentsdef.pdf | Bin 90457 -> 129819 bytes .../doc/latex/filecontentsdef/filecontentsdef.test | 4 - .../doc/latex/filecontentsdef/filecontentsdef.tex | 2 +- .../latex/filecontentsdef/filecontentsdef.dtx | 874 ++++++++++++++++----- .../tex/latex/filecontentsdef/filecontentsdef.sty | 149 ++-- 9 files changed, 812 insertions(+), 266 deletions(-) create mode 100644 Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef-tab.test diff --git a/Master/texmf-dist/doc/latex/filecontentsdef/INSTALL b/Master/texmf-dist/doc/latex/filecontentsdef/INSTALL index 26576323824..b8685ab7ffd 100644 --- a/Master/texmf-dist/doc/latex/filecontentsdef/INSTALL +++ b/Master/texmf-dist/doc/latex/filecontentsdef/INSTALL @@ -1,4 +1,4 @@ - 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 @@ -15,7 +15,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 + documentation, execute latex thrice on filecontentsdef.dtx then dvipdfmx on the dvi file. To customize the PDF documentation (paper size, etc...): execute diff --git a/Master/texmf-dist/doc/latex/filecontentsdef/INSTALL.md b/Master/texmf-dist/doc/latex/filecontentsdef/INSTALL.md index 7e828696307..18f13dd15c8 100644 --- a/Master/texmf-dist/doc/latex/filecontentsdef/INSTALL.md +++ b/Master/texmf-dist/doc/latex/filecontentsdef/INSTALL.md @@ -1,6 +1,6 @@ - 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 @@ -15,7 +15,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` diff --git a/Master/texmf-dist/doc/latex/filecontentsdef/README.md b/Master/texmf-dist/doc/latex/filecontentsdef/README.md index 305ecfc66d9..77ed11d7b7e 100644 --- a/Master/texmf-dist/doc/latex/filecontentsdef/README.md +++ b/Master/texmf-dist/doc/latex/filecontentsdef/README.md @@ -1,6 +1,6 @@ - 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 @@ -27,6 +27,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\] ------------------- diff --git a/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef-tab.test b/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef-tab.test new file mode 100644 index 00000000000..9f950b52b36 --- /dev/null +++ b/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef-tab.test @@ -0,0 +1,5 @@ +%% LaTeX2e file `filecontentsdef-tab.test' +%% generated by the `filecontentshere' environment +%% from source `filecontentsdef' on 2019/09/29. +%% +Here is a tab and then three in a row . diff --git a/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.pdf b/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.pdf index ddf56cc7ac0..c0af8cdb554 100644 Binary files a/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.pdf and b/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.pdf differ diff --git a/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.test b/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.test index 15169b9eb83..b7b7d160807 100644 --- a/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.test +++ b/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.test @@ -1,7 +1,3 @@ -%% LaTeX2e file `filecontentsdef.test' -%% generated by the `filecontentshere' environment -%% from source `filecontentsdef' on 2019/05/03. -%% \begin{framed} \noindent We have coded this in \LaTeX: both diff --git a/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.tex b/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.tex index 9aa1933073b..34cec0eedaf 100644 --- a/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.tex +++ b/Master/texmf-dist/doc/latex/filecontentsdef/filecontentsdef.tex @@ -1,6 +1,6 @@ %% %% 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 %% diff --git a/Master/texmf-dist/source/latex/filecontentsdef/filecontentsdef.dtx b/Master/texmf-dist/source/latex/filecontentsdef/filecontentsdef.dtx index b6b722383cd..7f78abe1358 100644 --- a/Master/texmf-dist/source/latex/filecontentsdef/filecontentsdef.dtx +++ b/Master/texmf-dist/source/latex/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}% % %<*!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 %% % %<*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 % %<*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}{}{\macro} + \begin{filecontentsdef}{}{\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 |\| with given name). +second argument |\foo| (or into the macro |\| 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 |\| 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 -\par +\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}{} ... 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}. % % %<*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| 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 diff --git a/Master/texmf-dist/tex/latex/filecontentsdef/filecontentsdef.sty b/Master/texmf-dist/tex/latex/filecontentsdef/filecontentsdef.sty index e956a6ff767..c1347d3af95 100644 --- a/Master/texmf-dist/tex/latex/filecontentsdef/filecontentsdef.sty +++ b/Master/texmf-dist/tex/latex/filecontentsdef/filecontentsdef.sty @@ -23,19 +23,25 @@ %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{filecontentsdef} - [2019/04/20 v1.4 filecontents + macro + verbatim (JFB)] + [2019/09/29 v1.5 filecontents + macro + verbatim (JFB)] %% %% 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 %% +\let\FCD@global\global \begingroup \catcode`\^^M\active% \catcode`\^^L\active\let^^L\relax% \catcode`\^^I\active% -\gdef\filec@ntentsdef#1#2{% - \let#2\@empty% +\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% @@ -46,11 +52,11 @@ {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 % @@ -73,26 +79,32 @@ \ifnum\count@<\@cclvi% \repeat% \let^^L\relax% - \edef\E{\@backslashchar end\string{\@currenvir\string}}% - \edef\reserved@b{\def\noexpand\reserved@b####1\E####2\E####3\relax}% - \reserved@b{% + \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}% + \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% \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% + \let^^L\FCDformfeedtofile% + \let^^I\FCDtabtofile% + \immediate\write\FCD@reserved@c{##1}% + \fi% \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% @@ -102,52 +114,81 @@ \fi% ^^M}% \catcode`\^^L\active% - \let\L\@undefined% - \def^^L{\expandafter\ifx\csname L\endcsname\relax\fi^^J^^J}% \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}% \catcode32\active\lccode`~32 \lowercase{\def~{\noexpand~}}% }% -\endgroup -\long\def\filecontentsdef@aux#1\filecontentsdef@aux{\@firstofone}% -\def\filecontentsdef@get#1#2% +\gdef\FCDformfeedtofile{^^J^^J}% +\gdef\FCDformfeedtomacro{\noexpand^^M\noexpand^^M}% +\gdef\FCDtabtofile{ }% +\catcode32\active\gdef\FCDtabtomacro{\noexpand }% +\endgroup% +\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 }% \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* +\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 -\gdef\filecontentsprint{\filecontentsdef@get\filecontents@print}% +\global\let\endfilecontentsherestarred\endfilecontentshere +\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}% +\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}% +\def\FCD@exec #1{\edef\FCD@newlinechar{\the\newlinechar}% + \newlinechar13 + \scantokens\expandafter{#1}\newlinechar\FCD@newlinechar\relax}% \endinput %% %% End of file `filecontentsdef.sty'. -- cgit v1.2.3