пользовательские команды в дословной среде - PullRequest
1 голос
/ 14 декабря 2010

возможно ли создать новую команду с параметром в дословной среде и с некоторыми отступами?

\newcommand{codeblock}[1]{\begin{quote}\begin{verbatim}#1\end{verbatim}\end{quote}}

Это не работает. Есть ли другой способ?

Ответы [ 2 ]

5 голосов
/ 15 декабря 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{\codeblock}[1]{\begin{quote}\begin{verbatim}#1\end{verbatim}\end{quote}} работает.

  1. Прежде всего \codeblock{Some {}$&%^_} читает аргумент.
  2. #1 --> Some code {}$&%^_

    Примечание: {, }, $, &, %, ^, _ имеют категории 1,2,3,4,6, 7,8 вместо 11 или 12 !!! )

  3. \codeblock расширяется до \begin{quote}\begin{verbatim} Some {}$&%^_\end {verbatim}\end {quote}. Важно: Обратная косая черта \end имеет категорию 0, а не 11. Более того, { и } имеют категории 1 и 2, а не 11. И $, &, %, ^, _ имеют категории 3,4,6,7,8.
  4. \begin{quote} расширяется до \quote и \quote выполняется.
  5. Затем \begin{verbatim} расширяется до \varbatim. \varbatim изменяет все категории и шрифт. Но ( важно ) категория обратной косой черты (в \end) остается равной 0. А категории {, }, $, &, %, ^, _ набираются после Some остается из-за того, что «чтение аргумента» выполняется до того, как \verbatim изменит все категории. Но вам нужно, чтобы все символы имели категории 11 или 12.
  6. Тогда \verbatim звонит \@xverbatim.
  7. \@xverbatim пытается поймать ваш аргумент, используя следующий трюк:

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

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

    Возможно (я не уверен), что трюк более виртуозен:

    alt text

    Красные символы имеют категорию 12. Зеленые символы имеют категорию 11. \def, \@xverbatim, \end - макросы с \ (категория 0) и буквами (категория 11).

  8. \@xverbatim пытается и пытается найти \end, где обратная косая черта (\) имеет категорию 11, но .... File ended while scanning use of \@xverbatim

Если вы хотите создать новый макрос \codeblock, вы должны сделать что-то похожее на текст выше.

2 голосов
/ 14 декабря 2010

Похоже, вы хотите иметь код в своем документе, и в этом случае вы, вероятно, лучше обслуживаете списки пакетов, чем дословно. В листингах также есть полезные функции, такие как нумерация строк и подсветка синтаксиса для многих распространенных языков. См. http://www.ctan.org/tex-archive/macros/latex/contrib/listings/, если он еще не установлен с вашим дистрибутивом LaTeX.

...