Как \begin{verbatim}
работает. кратко и грубо.
\begin{verbatim}
расширен до \verbatim
.
- Затем
\verbatim
устанавливает код категории каждого специального символа на 12.
Теперь все символы похожи на цифры или знаки.
- Тогда
\verbatim
устанавливает шрифт, parindent и вызывает \@xverbatim
.
\@xverbatim
ловит конец дословно, используя следующую уловку:
\def\@xverbatim#1\end{#1\end}
Затем \end{verbatim}
заканчивает работу.
Как \newcommand{\codeblock}[1]{\begin{quote}\begin{verbatim}#1\end{verbatim}\end{quote}}
работает.
- Прежде всего
\codeblock{Some {}$&%^_}
читает аргумент.
#1 --> Some code {}$&%^_
Примечание: {
, }
, $
, &
, %
, ^
, _
имеют категории 1,2,3,4,6, 7,8 вместо 11 или 12 !!! )
\codeblock
расширяется до \begin{quote}\begin{verbatim} Some {}$&%^_\end {verbatim}\end {quote}
.
Важно: Обратная косая черта \end
имеет категорию 0, а не 11.
Более того, {
и }
имеют категории 1 и 2, а не 11.
И $
, &
, %
, ^
, _
имеют категории 3,4,6,7,8.
\begin{quote}
расширяется до \quote
и \quote
выполняется.
- Затем
\begin{verbatim}
расширяется до \varbatim
.
\varbatim
изменяет все категории и шрифт. Но ( важно )
категория обратной косой черты (в \end
) остается равной 0. А категории {
, }
, $
, &
, %
, ^
, _
набираются после Some
остается из-за того, что «чтение аргумента» выполняется до того, как \verbatim
изменит все категории. Но вам нужно, чтобы все символы имели категории 11 или 12.
- Тогда
\verbatim
звонит \@xverbatim
.
\@xverbatim
пытается поймать ваш аргумент, используя следующий трюк:
\def\@xverbatim#1\end{#1\end}
но невозможно из-за \@xverbatim
пытается поймать
\end
где все буквы (\
, e
, n
, d
) имеют категории 12 и 11.
Но на самом деле есть четыре буквы с другим кодом категории:
\
с категориями 0 и e
, n
, d
с категорией 11.
Возможно (я не уверен), что трюк более виртуозен:
Красные символы имеют категорию 12. Зеленые символы имеют категорию 11.
\def
, \@xverbatim
, \end
- макросы с \
(категория 0) и буквами (категория 11).
\@xverbatim
пытается и пытается найти \end
, где обратная косая черта (\
) имеет категорию 11, но .... File ended while scanning use of \@xverbatim
Если вы хотите создать новый макрос \codeblock
, вы должны сделать что-то похожее на текст выше.