2010-11-12 85 views
4

有人可以告诉我在这里做错了吗?乳胶新命令问题

\newcommand{\bc}{\small\begin{verbatim}} 
\newcommand{\ec}{\normalsize\end{verbatim}} 

然后

\bc 
1 3  6 7 89 10 
22 7 7 45 
\ec 

,但我得到

Runaway argument? 
^^M1 3  6 7 89 10^^M 22 7 7 45^^M\ec^^M^^M\section{Reading on\ETC. 
! File ended while scanning use of \@xverbatim. 
<inserted text> 
       \par 
<*> i4c.tex 

? 
! Emergency stop. 
<inserted text> 
       \par 
<*> i4c.tex 

我认为这是非常安全的,做到这一点,因为大多数命令只是文本替换...任何提示?

+3

属于上http://tex.stackexchange.com/ – 2010-11-12 14:34:17

+4

我以前说过的这,但这种“堆栈交换”东西的扩散是荒谬的。很快,它将是error.newcommand.tex.stackexchange.com ...无论发生什么集中知识的想法?那么标签是什么?啧啧,有人有一个好主意,然后它爆炸成无数愚蠢的人。 – 2010-11-12 16:28:21

+2

关于'error.newcommand.tex.stackexchange.com'的好处。优秀。我的想法。我的互联网浏览器无法容纳这么多标签。 – 2010-11-12 17:19:50

回答

7

如何\begin{verbatim}的作品。简单和粗略。

  1. \begin{verbatim}扩展到\verbatim
  2. Then \verbatim将每个特殊字符的分类代码设置为12. 现在所有的字符都是数字或点子。
  3. 然后\verbatim设置字体,parindent和呼叫\@xverbatim
  4. \@xverbatim渔获逐字使用下面的技巧的末尾:

    \def\@xverbatim#1\end{#1\end} 
    
  5. 然后\ {端逐字}完成的工作。

newcommand{\bc}{\small\begin{verbatim}}如何工作。

  1. \bс扩大为\small\begin{verbatim}
  2. 然后\begin{verbatim}扩大为\varbatim\varbatim更改所有类别和字体。
  3. Then \verbatim calls \@xverbatim
  4. \@xverbatim尝试使用下面的技巧来抓住你的论点:

    \def\@xverbatim#1\end{#1\end} 
    

    ,但它是不可能的,因为\@xverbatim的尝试赶上 \end所有字母(\end)有类别12和11. 但实际上只有\ec exsits。

  5. \@xverbatim尝试,并试图找到\end其中反斜线(\)有12类,但是.... File ended while scanning use of \@xverbatim
+0

哇。振聋发聩! – 2010-11-12 17:11:31

2

verbatim是特殊的,它扫描文字\end{verbatim},因为任何宏替换不在\begin{verbatim}后执行。

2

某些环境(例如verbatim)需要在前面的文本中进行扫描以手动查找其结尾。因此,与“正常”环境不同,verbatim需要在输入文本中逐字找到文本\end{verbatim}

在你的榜样,它不会(因为输入的文本包含\ec代替。

作为一种变通方法,您可以改用fancyvrb包定义Verbatim包,并允许定义自定义的逐字环境。