我正在设计一个需要处理一些逐字代码的库。目前,我使用很棒的 xsimverb 包,它提供了一些不错的东西,比如 gobble,可以处理基本上所有类型的字符……我需要为我的命令提供一些参数,但参数列表有时添加起来很烦人,我想为包提供一些包装器,比如:
\NewDocumentEnvironment{wrapperCode}{}%
{\begin{robExtCode}{some arguments}}%
{\end{robExtCode}}
但如果我尝试这样做,它会失败并出现一些错误:
! File ended while scanning use of ^^M.
我该如何解决这些问题?如果包装环境本身可以在包装之前使用多次,那就更好了robExt
,但我没有这个也可以。当然,我可以复制代码,但我更愿意避免这样做,因为我希望我的最终用户能够轻松创建新的包装器,并且他们将无法访问我的代码(可能会更改)。因此,如果没有简单的解决方案,可以创建一个函数,使用提供的参数自动创建一个新的包装环境。
梅威瑟:
\documentclass[]{article}
\usepackage{xsimverb}
\usepackage{verbatim}
\ExplSyntaxOn
\ior_new:N \g_robExt_read_ior
\NewDocumentEnvironment{robExtCode}{m}{
\XSIMfilewritestart*{tmp-file-you-can-remove.tmp}
}{
\XSIMfilewritestop
%% Loop on all lines of the file to put it in l_robExt_content_named
%% but I might want to do other stuff here.
\ior_open:Nn \g_robExt_read_ior {tmp-file-you-can-remove.tmp}
\str_gclear:c {l_robExt_content_named}
\ior_str_map_inline:Nn \g_robExt_read_ior {
\str_gput_right:cx {l_robExt_content_named} {\tl_to_str:N{##1}^^J}
}
I ~ am ~ the ~ argument ~ ``#1'' ~and~ why~ not~ printing~ the~ file:~ \verbatiminput{tmp-file-you-can-remove.tmp}
}
\ExplSyntaxOff
\NewDocumentEnvironment{wrapperCode}{}{\begin{robExtCode}{some arguments}}{\end{robExtCode}}
\begin{document}
\begin{robExtCode}{some arguments}
# Here is a comment
print(1 % 2)
\end{robExtCode}
%%% DO NOT WORK
\begin{wrapperCode}
# Here is a second test
print(1 % 2)
\end{wrapperCode}
\end{document}
答案1
字符串变量的名称错误:它应该以 开头\g
并以 结尾_str
。不需要c
。
函数\tl_to_str:N
使用不当;可能是\tl_to_str:n
,但由于,参数已经是字符串格式\ior_str_map_inline:Nn
。
但最重要的变化是使用环境的“内部”版本。
\documentclass[]{article}
\usepackage{xsimverb}
\usepackage{verbatim}
\ExplSyntaxOn
\ior_new:N \g_robExt_read_ior
\str_new:N \g_robExt_content_str
\NewDocumentEnvironment{robExtCode}{m}{
\XSIMfilewritestart*{\jobname-tmp.tmp}
}{
\XSIMfilewritestop
%% Loop on all lines of the file to put it in \g_robExt_content_str
%% but I might want to do other stuff here.
\ior_open:Nn \g_robExt_read_ior {\jobname-tmp.tmp}
\str_gclear:N \g_robExt_content_str
\ior_str_map_inline:Nn \g_robExt_read_ior
{
\str_gput_right:Nx \g_robExt_content_str {##1^^J}
}
I ~ am ~ the ~ argument ~ ``#1'' ~and~ why~ not~ printing~ the~ file:~
\verbatiminput{\jobname-tmp.tmp}
}
\ExplSyntaxOff
% see how the inner environment is called!
\NewDocumentEnvironment{wrapperCode}{}{%
\robExtCode{some arguments}%
}{\endrobExtCode}
\begin{document}
\begin{robExtCode}{some arguments}
# Here is a comment
print(1 % 2)
\end{robExtCode}
%%% DO NOT WORK
\begin{wrapperCode}
# Here is a second test
print(1 % 2)
\end{wrapperCode}
\end{document}
您知道该如何处理字符串变量,但我不知道。在此代码中,它完全未使用。