Проблема латекса \ newcommand - PullRequest
5 голосов
/ 12 ноября 2010

Может кто-нибудь сказать, что я здесь не так делаю?

\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 ]

8 голосов
/ 12 ноября 2010

Как \begin{verbatim} работает.кратко и приблизительно.

  1. \begin{verbatim} расширен до \verbatim.
  2. Затем \verbatim устанавливает код категории каждого специального символа равным 12. Теперь все символы подобны цифрам или пунктам.
  3. Затем \verbatim устанавливает шрифт, parindent и вызывает \@xverbatim.
  4. \@xverbatim ловит конец дословно, используя следующую уловку:

    \def\@xverbatim#1\end{#1\end}
    
  5. Затем \ end {verbatim} заканчивает работу.

Как работает newcommand{\bc}{\small\begin{verbatim}}.

  1. \bс расширяется до \small\begin{verbatim}.
  2. Затем \begin{verbatim} расширяется до \varbatim.\varbatim меняет все категории и шрифт.
  3. Затем \verbatim вызывает \@xverbatim.
  4. \@xverbatim пытается перехватить ваш аргумент, используя следующую уловку:

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

    , но это невозможноиз-за \@xverbatim пытается поймать \end, где все буквы (\, e, n, d) имеют категории 12 и 11. Но на самом деле существуют только \ec выходы.

  5. \@xverbatim пытается и пытается найти \end, где обратная косая черта (\) имеет категорию 12, но .... File ended while scanning use of \@xverbatim
2 голосов
/ 12 ноября 2010

В некоторых средах, таких как verbatim, необходимо сканировать текст впереди, чтобы найти их конец вручную. Таким образом, в отличие от «нормальной» среды, verbatim необходимо найти текст \end{verbatim} во входном тексте дословно.

В вашем примере это не так (поскольку входной текст содержит \ec.

В качестве обходного пути вы можете вместо этого использовать пакет fancyvrb, который определяет пакет Verbatim и позволяет определять пользовательские дословные среды.

2 голосов
/ 12 ноября 2010

verbatim особенный, он ищет литерал \end{verbatim}, так как любые подстановки макросов не выполняются после \begin{verbatim}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...