Latex saveenv.sty 给出了许多错误

Latex saveenv.sty gives numerous errors

提问人:redlioness 提问时间:11/16/2023 更新时间:11/16/2023 访问量:6

问:

我想使用 Pythonimmediate 包,该包需要 saveenv.sty 文件。我从CTAN下载了这个文件,但是当尝试使用pythonimmediate使用tex文件时,我从saveenv.sty文件中得到了许多错误。作为参考,我还下载了precattl.sty。有人可以给我一些关于我做错了什么的指示吗? 这是我使用的 saveenv.sty 的源代码:

% File: saveenv.sty
% Copyright 2022 user202729
%
% This work  may be  distributed and/or  modified under  the conditions  of the
% LaTeX Project Public License (LPPL),  either version 1.3c  of this license or
% (at your option) any later version.  The latest version of this license is in
% the file:
%
%   http://www.latex-project.org/lppl.txt
%
% This work has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this work is user202729.

\ProvidesExplPackage{saveenv}{2022/12/23}{0.0.1}{Save environment content verbatim}
\RequirePackage{precattl}
\msg_new:nnn {saveenv} {trailing-content-or-pretokenized}
    {Trailing~content~found~on~line,~or~content~pretokenized!}

\msg_new:nnn {saveenv} {trailing-content-end-line}
    {Trailing~content~found~on~environment~last~line}

\msg_new:nnn {saveenv} {currfile-package-not-loaded}
    {currfile~package~is~needed~for~this~functionality}

\precattl_exec:n{
% args: char code, content, environment name
\msg_new:nnn {saveenv} {leading-content-last-line}
    {Leading~content~found~on~\cO\\end{#3}~line,~first~char~code~=~#1,~content~=~'#2'}
}

\makeatletter

\seq_new:N \_senv_lines
\ior_new:N \_senv_file

\precattl_exec:n {

\NewDocumentEnvironment {saveenvghost} {m} {
    \edef \_senv_firstline {\the\inputlineno}
} {

    \cs_if_free:NT \currfilename {
        \msg_error:nn {saveenv} {currfile-package-not-loaded}
    }
    \ior_open:Nn \_senv_file {\currfilename}

    \prg_replicate:nn {\_senv_firstline} {
        \ior_str_get:NN \_senv_file \_senv_line
    }

    \tl_build_gbegin:N #1

    \prg_replicate:nn {\the\inputlineno-\_senv_firstline-1} {
        \ior_str_get:NN \_senv_file \_senv_line
        \exp_args:NNo \tl_build_gput_right:Nn #1 {\_senv_line ^^J}
    }

    \ior_close:N \_senv_file

    \tl_build_gend:N #1

}


% #1: target macro
% #2: content to be inserted after the \end
\NewDocumentEnvironment {saveenvkeeplastreinsert} {mm} {
    \begingroup
    \edef \_senv_old_endlinechar {\the\endlinechar}
    %\bench before cctab.
    \cctab_select:N \c_other_cctab  % note that this changes the value of \endlinechar as well
    %\bench after cctab.
    \int_compare:nNnTF {\_senv_old_endlinechar} < {0} {
        \_senv_start_get_body:Nn #1 {#2}
    } {
        \exp_last_unbraced:Nf \peek_meaning_remove:NTF { \char_generate:nn{\_senv_old_endlinechar}{12} }    %12 is other
        {
            \_senv_start_get_body:Nn #1 {#2}
        }
        {
            \msg_error:nn {saveenv} {trailing-content-or-pretokenized}
        }
    }
} {
}


% #1: target macro
% #2: content to be inserted after the \end
\cs_new_protected:Npn \_senv_start_get_body:Nn #1 #2 {
    \endlinechar=10~
    \str_set:NV \_senv_env \@currenvir
    \tl_replace_all:Nnn \_senv_env {~} {\cO\  }
    \_senv_helper:NVVn #1 \_senv_env \@currenvir {#2}
}

% #1: target macro
% #2: value of \@currenvir but with all tokens catcode 12 (other)
% #3: value of \@currenvir
% #4 content to be inserted after the \end
\cs_new_protected:Npn \_senv_helper:Nnnn #1 #2 #3 #4 {
    \cs_set_protected:cpn {[saveenv]~verbatim~body~scanner~for~#2} ##1 \cO{ \\end\{ } #2 \cO\} {
        %\bench X3.
        % ##1: the body
        \peek_meaning_remove:NTF ^^J {
            %\bench inside peek.
            \endgroup
            %\bench after endgroup.
            \str_gset:Nn #1 {##1}
            %\bench X5.
            \end{#3}
            %\bench X6.
            #4
        } {
            \msg_error:nn {saveenv} {trailing-content-end-line}
        }
    }

    \use:c {[saveenv]~verbatim~body~scanner~for~#2}
}
\cs_generate_variant:Nn \_senv_helper:Nnnn {NVVn}

\NewDocumentEnvironment {saveenvkeeplast} {m} {
    \saveenvkeeplastreinsert #1 {}
} {
    \endsaveenvkeeplastreinsert
}

% set variable #1 to have content of #2, but with last line dropped.
% lines are separated by \^^J.

\cs_new:Npn \_senv_append_newline:n #1 { #1 ^^J }

\cs_new_protected:Npn \saveenv_set_drop_last:Nn #1 #2 {
    \tl_set:Nn \_senv_body {#2}
    \tl_replace_all:Nnn \_senv_body {~} {\cO\  }  % keep spaces in seq_set_split (support older expl3 versions)
    \seq_set_split:NnV \_senv_lines {^^J} \_senv_body
    \seq_pop_right:NN \_senv_lines \_senv_lastline
    \tl_map_inline:Nn \_senv_lastline {  % debug check, ensure last line is empty
        \int_case:nnF {`##1}  {
            {32} {}  %space
            {9} {}   %tab
        }
        {
            \msg_error:nnoVV {saveenv} {leading-content-last-line} {\number`##1} \_senv_lastline \@currenvir
        }
    }
    %\str_gset:Nx #1 {\seq_use:Nn \_senv_lines {^^J}}  % this is extremely slow because \seq_use:Nn is ⋆-expandable
    \str_gset:Nx #1 {\seq_map_function:NN \_senv_lines \_senv_append_newline:n }
}

\cs_generate_variant:Nn \saveenv_set_drop_last:Nn {NV}

\NewDocumentEnvironment {saveenvreinsert} {mm} {
    \saveenvkeeplastreinsert #1 {#2}
} {
    \endsaveenvkeeplastreinsert
    \saveenv_set_drop_last:NV #1 #1
}

\NewDocumentEnvironment {saveenv} {m} {
    \saveenvkeeplast #1
} {
    \endsaveenvkeeplast
    \saveenv_set_drop_last:NV #1 #1
}


}

\cs_generate_variant:Nn \msg_error:nnnnn {nnoVV}```




The errors I got (among many others):
[saveenv.sty log](https://i.stack.imgur.com/2xH3J.png)
python pdflatex

评论


答: 暂无答案