将 DefineVerbatimEnvironment 与 UseVerbatim 相结合

将 DefineVerbatimEnvironment 与 UseVerbatim 相结合

我想将 的功能\DefineVerbatimEnvironment\UseVerbatim结合到投影仪演示和讲义场景中。我已经定义了环境coding,现在我可以使用 来排版我的代码

\begin{coding}
  foo->bar( ).
\end{coding}

我还可以在其独立版本中定义和重新使用逐字片段:

\begin{SaveVerbatim}{Foo}
  foo->bar( ).
\end{SaveVerbatim}

\UseVerbatim{Foo}

问题是后者使用默认fancyvrb选项排版。我该如何将两者结合起来,以便使用我的自定义环境显示保存的文本?


\documentclass{article}
\usepackage{fancyvrb}

\DefineVerbatimEnvironment{coding}{Verbatim}{numbers=left,fontsize=\small}

\begin{document}

\begin{coding}
  foo->bar( ).
\end{coding}

Yup. This works.

\begin{SaveVerbatim}{Foo}
  foo->bar( ).
  boo->baz( ).
  cat->code( ).
\end{SaveVerbatim}

\UseVerbatim{Foo}
\UseVerbatim{Foo}
\UseVerbatim{Foo}

Yup, this works as well -- but it uses the default format, not my custom environment: larger font, no line numbers.

\end{document}

答案1

看一下内部fancyvrb,有一种机制可以以相当通用的方式扩展现有命令或创建新的逐字命令。关键是\FV@Command,它需要一个 keyval 设置列表和一个要执行的“内部”命令。您会发现它\UseVerbatim被定义为

\def\UseVerbatim{\FV@Command{}{UseVerbatim}}

这建议进行一些修复。首先,您可以简单地重新定义\UseVerbatim以使用您的设置:

\def\UseVerbatim{\FV@Command{numbers=left,fontsize=\small}{UseVerbatim}}

或者,您可以创建一个相关命令,例如\UseCoding,并且不去管\UseVerabtim它:

\documentclass{article}
\usepackage{fancyvrb}

\DefineVerbatimEnvironment{coding}{Verbatim}{numbers=left,fontsize=\small}
\makeatletter
\def\UseCoding{\FV@Command{numbers=left,fontsize=\small}{UseVerbatim}}
\makeatother
\begin{document}

\begin{coding}
  foo->bar( ).
\end{coding}

Yup. This works.

\begin{SaveVerbatim}{Foo}
  foo->bar( ).
  boo->baz( ).
  cat->code( ).
\end{SaveVerbatim}

\UseCoding{Foo}

\end{document}

如果您想要真正系统化,那么也可以创建一个SaveCoding环境,尽管这可能有点过头了。

相关内容