语言问题:\x 定义为,为什么使用命令 \x 与使用

语言问题:\x 定义为,为什么使用命令 \x 与使用

这更像是一个 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}

相关内容