Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- \documentclass{article}
- \usepackage{filecontentsdef}[2019/04/20]
- \usepackage{xparse}
- \usepackage{fvextra}
- \usepackage{newvbtm}
- \setlength{\parindent}{0pt} % just for the example
- \ExplSyntaxOn
- \tl_new:N \l__scontents_macro_tmp_tl
- \keys_define:nn { scontents }
- {
- save-env .tl_set:N = \l__scontents_name_seq_tl,
- save-env .initial:n = contents,
- show-env .bool_set:N = \l__scontents_show_env_bool,
- show-env .initial:n = false
- }
- % Adapted from https://tex.stackexchange.com/a/215571/7832
- \cs_new_protected:Npn \__scontents_append_contents:nn #1#2
- {
- \seq_if_exist:cF { g__scontents_seq_name_#1_seq }
- { \seq_new:c { g__scontents_seq_name_#1_seq } }
- \seq_gput_right:cn { g__scontents_seq_name_#1_seq } {#2}
- }
- \cs_new_protected:Npn \__scontents_getfrom_seq:nn #1#2
- { \seq_item:cn { g__scontents_seq_name_#2_seq } {#1} }
- \NewExpandableDocumentCommand { \getstored } { O{1} m }
- { \__scontents_getfrom_seq:nn {#1} {#2} }
- % Define scontents (wrap \filecontentsdefmacro) whit [key=val] Delaying
- % Adapted from https://tex.stackexchange.com/a/487746/7832
- \NewDocumentEnvironment { scontents } { }
- {
- \char_set_catcode_active:N \^^M
- \scontents_start_environment:w
- }
- {
- \scontents_stop_environment:
- \scontents_atend_environment:
- }
- \cs_new_protected:Npn \scontents_environment_keys:w [ #1 ]
- { \keys_set:nn { scontents } {#1} }
- \group_begin:
- \char_set_catcode_active:N \^^M
- \cs_new_protected:Npn \scontents_start_environment:w #1 ^^M
- {
- \tl_if_blank:nF {#1} { \scontents_environment_keys:w #1 }
- \group_begin: % open group for env
- \filecontentsdefmacro { \l__scontents_macro_tmp_tl } ^^M
- }
- \cs_new_protected:Nn \scontents_stop_environment:
- {
- \endfilecontentsdefmacro
- \group_end: % close group for env
- }
- \group_end:
- \cs_gset_protected:Nn \__scontents_macro_to_seq:
- {
- \regex_replace_all:nnN { \^^M } { \^^J } \l__scontents_macro_tmp_tl
- \cs_log:N \l__scontents_macro_tmp_tl
- \exp_args:NNx \__scontents_append_contents:nn \l__scontents_name_seq_tl
- { \exp_not:N \tex_scantokens:D { \tl_use:N \l__scontents_macro_tmp_tl } }
- }
- % Code after scontent environment \seq_item:cn { g__scontents_seq_name_#2_seq } { #1 }
- \cs_new_protected:Nn \scontents_atend_environment:
- {
- \__scontents_macro_to_seq:
- \bool_if:NT \l__scontents_show_env_bool
- { \__scontents_getfrom_seq:nn { -1 } { \l__scontents_name_seq_tl } }
- \tl_clear:N \l__scontents_macro_tmp_tl
- }
- % \newverbatim{typescverb}{}{}{}{}
- \DefineVerbatimEnvironment{typescverb}{Verbatim}{}
- \cs_new_eq:Nc \__scontents_fcdef_get:NN { filecontentsdef@get }
- \cs_new:Npn \__scontents_strip_scantokens:N #1
- { \exp_args:NV \__scontents_strip_scantokens:n #1 }
- \cs_new:Npn \__scontents_strip_scantokens:n #1
- { \exp_not:o { \use_ii:nn #1 } }
- \group_begin:
- \char_set_catcode_active:N \^^M
- \cs_new:Npn \__scontents_fcdef_print:N #1
- {
- \cs_set_eq:NN \__scontents_fcdef_saved_EOL: ^^M
- \cs_set_eq:NN ^^M \scan_stop:
- \use:x
- {
- \exp_not:N \tex_scantokens:D
- {
- \exp_not:N \begin{typescverb} ^^M
- \__scontents_strip_scantokens:N #1
- \c_backslash_str end \c_left_brace_str typescverb \c_right_brace_str ^^M
- }
- }
- \cs_set_eq:NN ^^M \__scontents_fcdef_saved_EOL:
- }
- \group_end:
- \NewDocumentCommand { \typestored } { O{1} m }
- {
- \group_begin:
- \tl_put_right:Nx \l_tmpb_tl
- { \seq_item:cn { g__scontents_seq_name_#2_seq } {#1} }
- \__scontents_fcdef_get:NN \__scontents_fcdef_print:N \l_tmpb_tl
- \group_end:
- }
- \ExplSyntaxOff
- \begin{document}
- \section*{Test environment}
- Test \verb+\begin{scontents}+ no \verb+[key=val]+\par
- \begin{scontents}
- Using \verb+scontents+ env no \verb+[key=val]+, save in \verb+contents+
- with index $1$\footnote{AND footnotes !!}.%
- Prove new \Verb*{ new fvextra whit braces } and environment \verb+Verbatim+
- \begin{Verbatim}
- (A) verbatim environment %
- many space here and percent at end of line %
- many space
- \end{Verbatim}
- No espace after, see \verb+https://tex.stackexchange.com/a/460967/7832+.\par
- Use \verb|\relax|.\relax
- \end{scontents}
- \section*{Show stored contents}
- XX\getstored[1]{contents}NO space here :)\par
- \section*{typestored}
- \typestored[1]{contents} % not work
- \end{document}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement