%% %% This is file `scontents.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% scontents.dtx (with options: `package') %% %% Copyright (C) 2019 by Pablo González L %% %% This work may be distributed and/or modified under the conditions of the %% LaTeX Project Public License, either version 1.3c of this license or (at %% your option) any later version. The latest version of this license is in %% %% http://www.latex-project.org/lppl.txt %% %% and version 1.3c or later is part of all distributions of LaTeX version %% 2005/12/01 or later. %% %% This work is "maintained" (as per the LPPL maintenance status) %% by Pablo González Luengo. %% %% This work consists of the file scontents.dtx %% and the derived files scontents.ins, %% scontents.pdf and %% scontents.sty. %% \RequirePackage{l3keys2e} \RequirePackage{xparse}[2019/05/28] \ProvidesExplPackage{scontents}{2019/10/03}{1.4} {Stores LaTeX contents in memory or files} \@ifpackagelater { expl3 } { 2019/09/19 } { } { \PackageError { scontents } { Support~package~expl3~too~old } { You~need~to~update~your~installation~of~the~bundles~ 'l3kernel'~and~'l3packages'.\MessageBreak Loading~scontents~will~abort! } \file_input_stop: } \keys_define:nn { scontents } { store-env .tl_set:N = \l__scontents_name_seq_env_tl, store-env .initial:n = contents, store-env .value_required:n = true, store-cmd .tl_set:N = \l__scontents_name_seq_cmd_tl, store-cmd .initial:n = contents, store-cmd .value_required:n = true, verb-font .tl_set:N = \l__scontents_verb_font_tl, verb-font .initial:n = \ttfamily, verb-font .value_required:n = true, print-env .bool_set:N = \l__scontents_print_env_bool, print-env .initial:n = false, print-env .default:n = true, print-cmd .bool_set:N = \l__scontents_print_cmd_bool, print-cmd .initial:n = false, print-cmd .default:n = true, force-eol .bool_set:N = \l__scontents_forced_eol_bool, force-eol .initial:n = false, force-eol .default:n = true, width-tab .int_set:N = \l__scontents_tab_width_int, width-tab .initial:n = 1, width-tab .value_required:n = true, print-all .meta:n = { print-env = #1 , print-cmd = #1 }, print-all .default:n = true, store-all .meta:n = { store-env = #1 , store-cmd = #1 }, store-all .value_required:n = true } \ProcessKeysOptions { scontents } \tl_new:N \l__scontents_macro_tmp_tl \tl_new:N \l__scontents_fname_out_tl \tl_new:N \l__scontents_temp_tl \tl_new:N \l__scontents_file_tl \tl_new:N \g__scontents_temp_tl \int_new:N \l__scontents_seq_item_int \int_new:N \l__scontents_env_nesting_int \int_new:N \l__scontents_tmpa_int \bool_new:N \l__scontents_writing_bool \bool_set_false:N \l__scontents_writing_bool \bool_new:N \l__scontents_storing_bool \bool_set_true:N \l__scontents_storing_bool \tl_new:N \g__scontents_end_verbatimsc_tl \tl_gset_rescan:Nnn \g__scontents_end_verbatimsc_tl { \char_set_catcode_other:N \\ \char_set_catcode_other:N \{ \char_set_catcode_other:N \} } { \end{verbatimsc} } \tl_const:Nx \c__scontents_end_env_tl { \c_backslash_str end \c_left_brace_str scontents \c_right_brace_str } \str_const:Nx \c__scontents_hidden_space_str { \c_percent_str \c_circumflex_str \c_circumflex_str A scheol \c_percent_str } \quark_new:N \q__scontents_stop \quark_new:N \q__scontents_mark \iow_new:N \l__scontents_file_iow \cs_new_protected:Npn \__scontents_rescan_tokens:n #1 { \tex_scantokens:D {#1} } \cs_generate_variant:Nn \__scontents_rescan_tokens:n { V, x } \cs_new:Npx \__scontents_tab: { \c_space_tl } \cs_new:Npn \__scontents_par: { ^^J ^^J } \cs_generate_variant:Nn \tl_remove_once:Nn { NV } \cs_generate_variant:Nn \tl_replace_all:Nnn { Nx, Nxx, Nnx } \prg_generate_conditional_variant:Nnn \tl_if_empty:n { f } { TF } \keys_define:nn { scontents / scontents } { write-env .code:n = { \bool_set_true:N \l__scontents_writing_bool \tl_set:Nn \l__scontents_fname_out_tl {#1} }, write-out .code:n = { \bool_set_false:N \l__scontents_storing_bool \bool_set_true:N \l__scontents_writing_bool \tl_set:Nn \l__scontents_fname_out_tl {#1} }, write-env .value_required:n = true, write-out .value_required:n = true, print-env .meta:nn = { scontents } { print-env = #1 }, print-env .default:n = true, store-env .meta:nn = { scontents } { store-env = #1 }, force-eol .meta:nn = { scontents } { force-eol = #1 }, force-eol .default:n = true, unknown .code:n = { \__scontents_parse_environment_keys:n {#1} } } \keys_define:nn { scontents / Scontents } { print-cmd .meta:nn = { scontents } { print-cmd = #1 }, print-cmd .default:n = true, store-cmd .meta:nn = { scontents } { store-cmd = #1 }, force-eol .meta:nn = { scontents } { force-eol = #1 }, force-eol .default:n = true, unknown .code:n = { \__scontents_parse_command_keys:n {#1} } } \keys_define:nn { scontents / typemeaning } { width-tab .meta:nn = { scontents } { width-tab = #1 }, unknown .code:n = { \__scontents_parse_type_meaning_key:n {#1} } } \cs_new_protected:Npn \__scontents_parse_environment_keys:n #1 { \exp_args:NV \__scontents_parse_environment_keys:nn \l_keys_key_tl {#1} } \cs_new_protected:Npn \__scontents_parse_environment_keys:nn #1#2 { \tl_if_blank:nTF {#2} { \msg_error:nnn { scontents } { env-key-unknown } {#1} } { \msg_error:nnnn { scontents } { env-key-value-unknown } {#1} {#2} } } \cs_new_protected:Npn \__scontents_parse_command_keys:n #1 { \exp_args:NV \__scontents_parse_command_keys:nn \l_keys_key_tl {#1} } \cs_new_protected:Npn \__scontents_parse_command_keys:nn #1#2 { \tl_if_blank:nTF {#2} { \msg_error:nnn { scontents } { cmd-key-unknown } {#1} } { \msg_error:nnnn { scontents } { cmd-key-value-unknown } {#1} {#2} } } \cs_new_protected:Npn \__scontents_parse_type_meaning_key:n #1 { \exp_args:NV \__scontents_parse_type_meaning_key:nn \l_keys_key_tl {#1} } \cs_new_protected:Npn \__scontents_parse_type_meaning_key:nn #1#2 { \tl_if_empty:fTF { \int_to_roman:n { -0 #1 } } { \tl_if_blank:nTF {#2} { \int_set:Nn \l__scontents_seq_item_int {#1} } { \msg_error:nnnn { scontents } { type-key-value-unknown } {#1} {#2} } } { \tl_if_blank:nTF {#2} { \msg_error:nnn { scontents } { type-key-unknown } {#1} } { \msg_error:nnnn { scontents } { type-key-value-unknown } {#1} {#2} } } } \cs_new_protected:Npn \__scontents_append_contents:nn #1#2 { \tl_if_blank:nT {#1} { \msg_error:nn { scontents } { empty-store-cmd } } \seq_if_exist:cF { g__scontents_name_#1_seq } { \seq_new:c { g__scontents_name_#1_seq } } \seq_gput_right:cn { g__scontents_name_#1_seq } {#2} } \cs_generate_variant:Nn \__scontents_append_contents:nn { Vx } \cs_new:Npn \__scontents_getfrom_seq:nn #1#2 { \seq_if_exist:cTF { g__scontents_name_#2_seq } { \exp_args:Nf \__scontents_getfrom_seq:nnn { \seq_count:c { g__scontents_name_#2_seq } } {#1} {#2} } { \msg_expandable_error:nnn { scontents } { undefined-storage } {#2} } } \cs_new:Npn \__scontents_getfrom_seq:nnn #1#2#3 { \bool_lazy_or:nnTF { \int_compare_p:nNn {#2} = { 0 } } { \int_compare_p:nNn { \int_abs:n {#2} } > {#1} } { \msg_expandable_error:nnnnn { scontents } { index-out-of-range } {#2} {#3} {#1} } { \seq_item:cn { g__scontents_name_#3_seq } {#2} } } \cs_new_protected:Npn \__scontents_lastfrom_seq:n #1 { \tl_gset:Nx \g__scontents_temp_tl { \seq_item:cn { g__scontents_name_#1_seq } {-1} } \group_insert_after:N \__scontents_rescan_tokens:V \group_insert_after:N \g__scontents_temp_tl \group_insert_after:N \tl_gclear:N \group_insert_after:N \g__scontents_temp_tl } \cs_new_protected:Npn \__scontents_store_to_seq:NN #1#2 { \tl_log:N #1 \__scontents_append_contents:Vx #2 { \exp_not:V #1 } } \NewDocumentEnvironment { scontents } { } { \char_set_catcode_active:N \^^M \__scontents_start_environment:w } { \__scontents_stop_environment: \__scontents_atend_environment: } \cs_new_protected:Npn \__scontents_environment_inline:w { \peek_charcode_ignore_spaces:NTF [ % ] { \__scontents_environment_keys:w } { \__scontents_environment_junk:xw { after~\c_backslash_str begin{scontents} } } } \cs_new_protected:Npn \__scontents_environment_keys:w [ #1 ] { \keys_set:nn { scontents / scontents } {#1} \__scontents_environment_junk:xw { after~optional~argument~to~\c_backslash_str begin{scontents} } } \cs_new_protected:Npn \__scontents_environment_junk:nw #1 #2 \q__scontents_mark { \tl_if_blank:nF {#2} { \msg_error:nnnn { scontents } { junk-after-begin } {#1} {#2} } } \cs_generate_variant:Nn \__scontents_environment_junk:nw { x } \group_begin: \char_set_catcode_active:N \^^I \char_set_catcode_active:N \^^L \char_set_catcode_active:N \^^M \cs_new_protected:Npn \__scontents_start_environment:w #1 ^^M { \__scontents_environment_inline:w #1 \q__scontents_mark \__scontents_make_control_chars_active: \group_begin: \__scontents_file_tl_write_start:V \l__scontents_fname_out_tl } \cs_new_protected:Npn \__scontents_stop_environment: { \__scontents_file_write_stop:N \l__scontents_macro_tmp_tl \exp_args:NNNV \group_end: \tl_set:Nn \l__scontents_macro_tmp_tl \l__scontents_macro_tmp_tl } \cs_new_protected:Npn \__scontents_file_tl_write_start:n #1 { \group_begin: \bool_if:NT \l__scontents_writing_bool { \file_if_exist:nTF {#1} { \msg_warning:nnx { scontents } { rewriting-file } {#1} } { \msg_warning:nnx { scontents } { writing-file } {#1} } \iow_open:Nn \l__scontents_file_iow {#1} } \tl_clear:N \l__scontents_file_tl \seq_map_function:NN \l_char_special_seq \char_set_catcode_other:N \int_step_function:nnN { 128 } { 255 } \char_set_catcode_letter:n \cs_set_protected:Npx \__scontents_ret:w ##1 ^^M { \exp_not:N \__scontents_verb_processor_iterate:w ##1 \c__scontents_end_env_tl \c__scontents_end_env_tl \exp_not:N \q__scontents_stop } \__scontents_make_control_chars_active: \__scontents_ret:w } \use:x { \cs_new:Npn \exp_not:N \__scontents_verb_processor_iterate:w ##1 \c__scontents_end_env_tl ##2 \c__scontents_end_env_tl ##3 \exp_not:N \q__scontents_stop } { \tl_if_blank:nTF {#3} { \__scontents_analyse_nesting:n {#1} \__scontents_verb_processor_output:n {#1} } { \__scontents_if_nested:TF { \__scontents_nesting_decr: \__scontents_verb_processor_output:x { \exp_not:n {#1} \c__scontents_end_env_tl \exp_not:n {#2} } } { \tl_if_blank:nF {#1} { \__scontents_verb_processor_output:n {#1} } \cs_set_protected:Npx \__scontents_ret:w { \exp_not:N \end{scontents} \bool_lazy_or:nnF { \tl_if_blank_p:n {#2} } { \str_if_eq_p:ee {#2} { \c_percent_str } } { \msg_warning:nnn { scontents } { rescanning-text } {#2} \__scontents_rescan_tokens:n {#2} } } \char_set_active_eq:NN ^^M \__scontents_ret:w } } ^^M } \cs_new_protected:Npn \__scontents_file_write_stop:N #1 { \bool_if:NT \l__scontents_writing_bool { \iow_close:N \l__scontents_file_iow } \use:x { \group_end: \bool_if:NT \l__scontents_storing_bool { \tl_set:Nn \exp_not:N #1 { \exp_args:NV \__scontents_remove_leading_nl:n \l__scontents_file_tl } } } } \cs_new:Npn \__scontents_remove_leading_nl:n #1 { \exp_not:o { \__scontents_remove_leading_nl:w #1 } } \cs_new:Npn \__scontents_remove_leading_nl:w ^^J { } \cs_new_protected:Npn \__scontents_verb_processor_output:n #1 { \bool_if:NT \l__scontents_writing_bool { \iow_now:Nn \l__scontents_file_iow {#1} } \bool_if:NT \l__scontents_storing_bool { \tl_put_right:Nn \l__scontents_file_tl { ^^J #1 } } } \cs_generate_variant:Nn \__scontents_verb_processor_output:n { x } \cs_new_protected:Npx \__scontents_analyse_nesting:n #1 { \int_zero:N \l__scontents_tmpa_int \exp_not:N \__scontents_analyse_nesting:w #1 \c_backslash_str begin \c_left_brace_str \exp_not:N \q__scontents_mark \c_right_brace_str \exp_not:N \q__scontents_stop \int_compare:nNnT { \l__scontents_tmpa_int } > { 1 } { \msg_warning:nn { scontents } { multiple-begin } } } \use:x { \cs_new_protected:Npn \exp_not:N \__scontents_analyse_nesting:w ##1 \c_backslash_str begin \c_left_brace_str ##2 \c_right_brace_str } { \if_meaning:w \q__scontents_mark #2 \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { \__scontents_use_none_delimit_by_q_stop:w } { \str_if_eq:eeT {#2} {scontents} { \int_incr:N \l__scontents_env_nesting_int \int_incr:N \l__scontents_tmpa_int \__scontents_analyse_nesting:w } \__scontents_analyse_nesting:w } } \cs_new_protected:Npn \__scontents_nesting_decr: { \int_decr:N \l__scontents_env_nesting_int } \prg_new_protected_conditional:Npnn \__scontents_if_nested: { TF } { \int_compare:nNnTF { \l__scontents_env_nesting_int } > { \c_zero_int } { \prg_return_true: } { \prg_return_false: } } \cs_new:Npn \__scontents_use_none_delimit_by_q_stop:w #1 \q__scontents_stop { } \group_end: \cs_generate_variant:Nn \__scontents_file_tl_write_start:n { V } \cs_new_protected:Npn \__scontents_atend_environment: { \bool_if:NT \l__scontents_storing_bool { \bool_if:NF \l__scontents_forced_eol_bool { \tl_put_right:Nx \l__scontents_macro_tmp_tl { \c__scontents_hidden_space_str } } \__scontents_store_to_seq:NN \l__scontents_macro_tmp_tl \l__scontents_name_seq_env_tl \bool_if:NT \l__scontents_print_env_bool { \__scontents_lastfrom_seq:n \l__scontents_name_seq_env_tl } } } \NewDocumentCommand { \Scontents }{ !s !O{} } { \group_begin: \IfNoValueF {#2} { \keys_set:nn { scontents / Scontents } {#2} } \char_set_catcode_active:n { 9 } \IfBooleanTF {#1} { \__scontents_verb_arg:w } { \__scontents_norm_arg:n } } \cs_new_protected:Npn \__scontents_norm_arg:n #1 { \tl_set:Nx \l__scontents_temp_tl { \exp_not:n {#1} } \tl_put_right:Nx \l__scontents_temp_tl { \c__scontents_hidden_space_str } \__scontents_store_to_seq:NN \l__scontents_temp_tl \l__scontents_name_seq_cmd_tl \bool_if:NT \l__scontents_print_cmd_bool { \__scontents_lastfrom_seq:n \l__scontents_name_seq_cmd_tl } \group_end: } \NewDocumentCommand { \__scontents_verb_arg:w } { +v } { \tl_set:Nx \l__scontents_temp_tl { \exp_not:n {#1} } \tl_replace_all:Nxx \l__scontents_temp_tl { \iow_char:N \^^M } { \iow_char:N \^^J } \bool_if:NF \l__scontents_forced_eol_bool { \tl_put_right:Nx \l__scontents_temp_tl { \c__scontents_hidden_space_str } } \__scontents_store_to_seq:NN \l__scontents_temp_tl \l__scontents_name_seq_cmd_tl \bool_if:NT \l__scontents_print_cmd_bool { \__scontents_lastfrom_seq:n \l__scontents_name_seq_cmd_tl } \group_end: } \NewDocumentCommand { \getstored } { O{1} m } { \group_begin: \__scontents_rescan_tokens:x { \__scontents_getfrom_seq:nn {#1} {#2} } \group_end: } \NewDocumentCommand { \typestored } { o m } { \group_begin: \int_set:Nn \l__scontents_seq_item_int { 1 } \IfValueT {#1} { \keys_set:nn { scontents / typemeaning } {#1} } \tl_set:Nx \l__scontents_temp_tl { \exp_args:NV \__scontents_getfrom_seq:nn \l__scontents_seq_item_int {#2} } \tl_remove_once:NV \l__scontents_temp_tl \c__scontents_hidden_space_str \tl_log:N \l__scontents_temp_tl \tl_if_empty:NF \l__scontents_temp_tl { \__scontents_verb_print:N \l__scontents_temp_tl } \group_end: } \group_begin: \char_set_catcode_active:N \^^M \cs_new_protected:Npn \__scontents_verb_print:N #1 { \tl_if_blank:VT #1 { \msg_error:nnn { scontents } { empty-variable } {#1} } \cs_set_eq:NN \__scontents_verb_print_EOL: ^^M \cs_set_eq:NN ^^M \scan_stop: \cs_set_eq:cN { do@noligs } \__scontents_do_noligs:N \__scontents_rescan_tokens:x { \exp_not:N \begin{verbatimsc} ^^M \exp_not:V #1 ^^M \g__scontents_end_verbatimsc_tl } \cs_set_eq:NN ^^M \__scontents_verb_print_EOL: } \group_end: \cs_new_protected:Npn \__scontents_xverb: { \char_set_catcode_active:n { 9 } \char_set_active_eq:nN { 9 } \__scontents_tabs_to_spaces: \__scontents_xverb:w } \use:x { \cs_new_protected:Npn \exp_not:N \__scontents_xverb:w ##1 \g__scontents_end_verbatimsc_tl } { #1 \end{verbatimsc} } \NewDocumentEnvironment { verbatimsc } { } { \cs_set_eq:cN { @xverbatim } \__scontents_xverb: \verbatim } { } \cs_new:Npn \__scontents_tabs_to_spaces: { \prg_replicate:nn { \l__scontents_tab_width_int } { ~ } } \cs_new:Npn \__scontents_do_noligs:N #1 { \char_set_catcode_active:N #1 \char_set_active_eq:Nc #1 { __scontents_active_char_ \token_to_str:N #1 : } \cs_set:cpx { __scontents_active_char_ \token_to_str:N #1 : } { \mode_leave_vertical: \tex_kern:D \c_zero_dim \char_generate:nn { `#1 } { 12 } } } \cs_new_protected:Npn \__scontents_set_active_eq:NN #1 { \char_set_catcode_active:N #1 \char_set_active_eq:NN #1 } \cs_new_protected:Npn \__scontents_make_control_chars_active: { \__scontents_set_active_eq:NN \^^I \__scontents_tab: \__scontents_set_active_eq:NN \^^L \__scontents_par: \__scontents_set_active_eq:NN \^^M \__scontents_ret:w } \NewDocumentCommand { \setupsc } { +m } { \keys_set:nn { scontents } {#1} } \NewDocumentCommand { \meaningsc } { o m } { \group_begin: \int_set:Nn \l__scontents_seq_item_int { 1 } \IfValueT {#1} { \keys_set:nn { scontents / typemeaning } {#1} } \__scontents_meaningsc:n {#2} \group_end: } \group_begin: \char_set_catcode_active:N \^^I \cs_new_protected:Npn \__scontents_meaningsc:n #1 { \tl_set:Nx \l__scontents_temp_tl { \exp_args:NV \__scontents_getfrom_seq:nn \l__scontents_seq_item_int {#1} } \tl_replace_all:Nxn \l__scontents_temp_tl { \iow_char:N \^^J } { ~ } \tl_remove_once:NV \l__scontents_temp_tl \c__scontents_hidden_space_str \tl_log:N \l__scontents_temp_tl \tl_use:N \l__scontents_verb_font_tl \tl_replace_all:Nnx \l__scontents_temp_tl { ^^I } { \__scontents_tabs_to_spaces: } \cs_replacement_spec:N \l__scontents_temp_tl } \group_end: \NewExpandableDocumentCommand { \countsc } { m } { \seq_count:c { g__scontents_name_#1_seq } } \NewDocumentCommand { \cleanseqsc } { m } { \seq_clear_new:c { g__scontents_name_#1_seq } } \msg_new:nnn { scontents } { junk-after-begin } { Junk~characters~#1~\msg_line_context: : \\ \\ #2 } \msg_new:nnn { scontents } { empty-stored-content } { Empty~value~for~key~'getstored'~\msg_line_context:. } \msg_new:nnn { scontents } { empty-variable } { Variable~'#1'~empty~\msg_line_context:. } \msg_new:nnn { scontents } { rewriting-file } { Overwriting ~ file ~ '#1' } \msg_new:nnn { scontents } { writing-file } { Writing ~ file ~ '#1' } \msg_new:nnn { scontents } { rescanning-text } { Rescanning~text~'#1'~after~\c_backslash_str end{scontents}~\msg_line_context:.} \msg_new:nnn { scontents } { multiple-begin } { Multiple~\c_backslash_str begin{scontents}~\msg_line_context:.} \msg_new:nnn { scontents } { undefined-storage } { Storage~named~'#1'~is~not~defined. } \msg_new:nnn { scontents } { index-out-of-range } { \int_compare:nNnTF {#1} = { 0 } { Index~of~sequence~cannot~be~zero. } { Index~'#1'~out~of~range~for~'#2'.~ \int_compare:nNnTF {#1} > { 0 } { Max = } { Min = -} #3. } } \msg_new:nnnn { scontents } { env-key-unknown } { The~key~'#1'~is~unknown~by~environment~'scontents'~and~is~being~ignored.} { The~environment~'scontents'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \msg_new:nnnn { scontents } { env-key-value-unknown } { The~key~'#1=#2'~is~unknown~by~environment~'scontents'~and~is~being~ignored. } { The~environment~'scontents'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \msg_new:nnnn { scontents } { cmd-key-unknown } { The~key~'#1'~is~unknown~by~'\c_backslash_str Scontents'~and~is~being~ignored.} { The~command~'\c_backslash_str Scontents'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \msg_new:nnnn { scontents } { cmd-key-value-unknown } { The~key~'#1=#2'~is~unknown~by~'\c_backslash_str Scontents'~and~is~being~ignored. } { The~command~'\c_backslash_str Scontents'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \msg_new:nnnn { scontents } { type-key-unknown } { The~key~'#1'~is~unknown~and~is~being~ignored. } { This~command~does~not~have~a~key~called~'#1'.\\ This~command~only~accepts~the~key~'width-tab'. } \msg_new:nnnn { scontents } { type-key-value-unknown } { The~key~'#1'~to~which~you~passed~'#2'~is~unknown~and~is~being~ignored. } { This~command~does~not~have~a~key~called~'#1'.\\ This~command~only~accepts~the~key~'width-tab'. } \file_input_stop: \endinput %% %% End of file `scontents.sty'.