包装逐字环境(xsimverb)

包装逐字环境(xsimverb)

我正在设计一个需要处理一些逐字代码的库。目前,我使用很棒的 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}

在此处输入图片描述

您知道该如何处理字符串变量,但我不知道。在此代码中,它完全未使用。

相关内容