最近,当我使用带有可选参数的环境时,我注意到当我引入一组方括号时,行为会发生变化,即使其中没有任何内容。例如:
\documentclass{article}
\usepackage{fancyvrb}
\newenvironment{exer}[1][]
{
do the following exercise from #1
\VerbatimOut{\jobname.exer}%
}
{
\endVerbatimOut%
\input{\jobname.exer}%
}
\begin{document}
\begin{exer}[]
some text
\end{exer}
\end{document}
它将编译一个包含“一些文本”的 pdf 以及一个 .exer 文件,但如果我用以下代码替换 exer 环境:
\begin{exer}
some text
\end{exer}
它会抛出以下错误:
! FancyVerb Error:
Extraneous input `some text' between \begin{exer}[<key=value>] and line end
.
\FV@Error ... {FancyVerb Error:
\space \space #1
}
l.16 some text
所以我有两个问题:第一,为什么即使我传入默认可选参数,环境的行为也会有所不同;第二,有没有办法修补或解决这种行为?
非常感谢。
答案1
我不确定这有什么用处。无论如何,你必须宣布fancyvrb
这是一个\VerbatimEnvironment
。
\documentclass{article}
\usepackage{fancyvrb}
\newenvironment{exer}[1][]{%
\VerbatimEnvironment
do the following exercise\if\relax\detokenize{#1}\relax\else\space from~#1\fi
\begin{VerbatimOut}{\jobname.exer}%
}{%
\end{VerbatimOut}%
\par\input{\jobname.exer}%
}
\begin{document}
\begin{exer}[]
some text
\end{exer}
\begin{exer}[the book]
some text
\end{exer}
\end{document}
答案2
\documentclass{article}
\usepackage{fancyvrb}
\makeatletter
\def\exer{\@ifnextchar[\exer@i\exer@i[]}
\def\exer@i[#1]{do the following exercise #1
\VerbatimOut{\jobname.exer}}
\def\endexer{\endVerbatimOut\par
\input{\jobname.exer}}
\makeatother
\begin{document}
\begin{exer}
some text
\end{exer}
\end{document}