是否可以自定义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
等等来表示要替换的标记;相应的替换应该是可以完全扩展的括号参数列表。