这更像是一个 LaTeX 语言问题,而不是“我如何完成 XYZ”的问题。
在下面的代码中,使用VerbatimOut
是成功的。
将该用法放在\newcommand*
定义中,使用 new 命令会失败。
从语言角度来看,为什么它们不等同?
标记化、处理等过程中会发生什么导致它们有不同的行为?
\documentclass[11pt]{article}
\usepackage{fancyvrb}
\newcommand*{\writeToFile}{
\begin{VerbatimOut}{myFileFromCommand.txt}
fromCommand
\end{VerbatimOut}
\input{myFileFromCommand.txt}
}
\begin{document}
% works
\begin{VerbatimOut}{myFileFromPlain.txt}
fromPlain
\end{VerbatimOut}
\input{myFileFromPlain.txt}
% fails with error "FancyVerb Error: Extraneous input ` fromCommand \end {VerbatimOut} \input{myFileFromCommand.txt} ' between \begin{VerbatimOut}[<key=value>] and line end.
\writeToFile
\end{document}
注意:(讨论可能更好meta
,但我没有足够的代表在那里发帖)我已经看到许多问题“为什么当我尝试使用代码 C 进行 X 时会出现错误 E?” 得到了以下回答:
- (A)不能使用 C - 这是可行的 D
- (B)阅读 TeX 书籍和 C 文档
这些答案的优点:
- (A)非常适合那些不关心学习、只想要一些能做 X 的事情的一次性 LaTeX 程序员
- (B)非常适合那些已经了解 TeX 工作原理的 LaTeX 专家 - 他们只需要看一下 C
这些答案的缺点:
- (A)只对有完全相同目标 X 的人有用,而且 X 通常相当具体
- (B)对于新手来说很困难,因为他们只想获得足够的信息来理解错误并寻找解决方案
也许某种显示 LaTeX 运行的操作的调试模式(显示扩展每个用户定义命令之前和之后的情况,以及显示当前正在处理的标记)会有所帮助,既可以用于单独调试,也可以发布某些事情出错/正确的“原因”。
答案1
一般规则是,使 catcode 发生改变的类动词命令不能用作另一个命令的参数。
要了解为什么会得到失控参数,VerbatimOut
请更改解释,\
以便它是一个普通字符,而\foo
不是使用名称制作单个标记,而是foo
制作 4 个字符标记\
f
o
o
因此\end{VerbatimOut}
不会被解释为\end
使用参数VerbatimOut
来停止处理环境检查字符串并手动结束环境。
但你的定义已保存,并且正常的 catcode 仍然有效
\newcommand*{\writeToFile}{
\begin{VerbatimOut}{myFileFromCommand.txt}
fromCommand
\end{VerbatimOut}
\input{myFileFromCommand.txt}
}
有一个\end
标记、一个开放组{
标记和字符标记,因此永远不会找到VerbatimOut
预期的逐字字符标记。\end{VerbatimOut}