将内容作为参数(或要扩展的宏)传递给 verbatim 环境

将内容作为参数(或要扩展的宏)传递给 verbatim 环境

是否可以自定义verbatim环境中的内容?假设我想逐字打印一些需要即时计算的内容,插入到一种逐字模板中。例如,考虑打印一种算法,其中步骤数(或任何其他参数)需要在环境之外计算verbatim,然后传递给它。我不知道是否作为或作为争论

这是另一种扭曲问题,但要适应verbatim环境。我觉得如果答案适用于verbatim,那么它对 也适用sagetex

有任何想法吗?

MWE(请注意下面的评论\begin{verbatim}

\documentclass{article}%
\PassOptionsToPackage{T1}{fontenc}
\usepackage{fontenc}
\usepackage[utf8]{inputenc}

\pagestyle{empty} 

\begin{document}
\def\np{15}

\begin{verbatim}
np=\np #THIS IS WHAT I WANT TO GET, WHEN PRINTED, IT SHOULD BE np=15 
p1=0
pcoeffs=range(np+1)
x = var('x')
for i in range(np+1):
 pcoeffs[i]= Integer(randint(-8,8))
 p1=p1+pcoeffs[i]*x^i
\end{verbatim}
\end{document}

答案1

如果您verbatim不使用反斜杠和括号,您可以使用fancyvrb

\documentclass{article}%
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{fancyvrb}

\pagestyle{empty} 

\begin{document}
\def\np{15}

\begin{Verbatim}[commandchars=\\\{\}]
np=\np #THIS IS WHAT I WANT TO GET, WHEN PRINTED, IT SHOULD BE np=15 
p1=0
pcoeffs=range(np+1)
x = var('x')
for i in range(np+1):
 pcoeffs[i]= Integer(randint(-8,8))
 p1=p1+pcoeffs[i]*x^i
\end{Verbatim}
\end{document}

或者,您可以使用我回答中的代码变体部分扩展:仅此而已

\documentclass{article}
\usepackage{xparse,l3regex,verbatim}

\ExplSyntaxOn
\NewDocumentCommand{\tofile}{m}
 {
  \manual_tofile:n { #1 }
 }

\iow_new:N \g_manual_tofile_write_stream
\tl_const:Nn \c_manual_specials_tl { \  \\ \{ \} \$ \& \# \^ \_ \% \~ }
\tl_new:N \l_manual_argument_tl
\tl_new:N \l_manual_line_tl
\seq_new:N \l_manual_arguments_seq
\int_new:N \l_manual_arguments_int

\cs_new_protected:Npn \manual_dospecials:
 {
  \tl_map_inline:Nn \c_manual_specials_tl
   {
    \char_set_catcode_other:N ##1
   }
 }

\cs_new_protected:Npn \manual_tofile:n #1
 {
  \group_begin:
  \tex_endlinechar:D `\^^J
  \iow_open:Nn \g_manual_tofile_write_stream { #1 }
  \manual_tofile_aux:xw
 }

\cs_new_protected:Npn \manual_tofile_aux:nw #1 #2 ~%
 {% #1 is the list of arguments, #2 is the terminator
  \tl_set:Nn \l_manual_eof_tl { #2 }
  \tl_trim_spaces:N \l_manual_eof_tl
  \seq_set_split:Nnn \l_manual_arguments_seq { } { #1 }
  \int_set:Nn \l_manual_arguments_int { \seq_count:N \l_manual_arguments_seq }
  \manual_dospecials:
  \manual_readline:w
 }

\cs_generate_variant:Nn \manual_tofile_aux:nw { x }

\cs_new_protected:Npn \manual_readline:w #1 ^^J
 {
  \str_if_eq:VnTF \l_manual_eof_tl { #1 }
   {
    \iow_close:N \g_manual_tofile_write_stream
    \group_end:
   }
   {
    \manual_replace_write:n { #1 }
    \manual_readline:w
   }
 }

\cs_new_protected:Npn \manual_replace_write:n #1
 {
  \tl_set:Nn \l_manual_line_tl { #1 }
  \int_step_inline:nnnn { 1 } { 1 } { \l_manual_arguments_int }
   {
    \tl_set:Nx \l_manual_argument_tl { \seq_item:Nn \l_manual_arguments_seq { ##1 } }
    \regex_replace_all:nnN { \# ##1 } { \u{l_manual_argument_tl} } \l_manual_line_tl
   }
  \iow_now:NV \g_manual_tofile_write_stream \l_manual_line_tl
 }

\cs_generate_variant:Nn \iow_now:Nn { NV }
\cs_generate_variant:Nn \str_if_eq:nnTF { V }

\ExplSyntaxOff

\newcommand{\np}{15}

\begin{document}
\tofile{\jobname.tmp}{{\np}}<<EOF
np=#1
p1=0
pcoeffs=range(np+1)
x = var('x')
for i in range(np+1):
 pcoeffs[i]= Integer(randint(-8,8))
 p1=p1+pcoeffs[i]*x^i
<<EOF
\verbatiminput{\jobname.tmp}

\end{document}

在此处输入图片描述

您可以使用#1等等来表示要替换的标记;相应的替换应该是可以完全扩展的括号参数列表。

相关内容