![Почему фигурные скобки обрабатываются неправильно при использовании «commandchars» в «Verbatim»?](https://rvso.com/image/472694/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%BD%D1%8B%D0%B5%20%D1%81%D0%BA%D0%BE%D0%B1%D0%BA%D0%B8%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%B0%D1%82%D1%8B%D0%B2%D0%B0%D1%8E%D1%82%D1%81%D1%8F%20%D0%BD%D0%B5%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE%20%D0%BF%D1%80%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%C2%ABcommandchars%C2%BB%20%D0%B2%20%C2%ABVerbatim%C2%BB%3F.png)
Вот что я делаю:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[commandchars=+\{\}]
Hello, \emph{world}!
Bye, +emph{world}!
\end{Verbatim}
\end{document}
Первая строка отображается как Hello, \emphworld!
, что неправильно. По какой-то причине Verbatim
среда обрабатывает {
и }
как специальные символы, а не как простой дословный текст. Без commandchars
, первая строка отображается правильно.
решение1
С commandchars=+\{\}
, внутри средыVerbatim
- символ
+
имеет код категории 0 (escape) и, таким образом, во время токенизации обрабатывается так же, как в обычных обстоятельствах/вне среды обрабатываетсяVerbatim
обратная косая черта .\
- символ
{
имеет код категории 1 (начало группы) и, таким образом, во время токенизации обрабатывается так же, как и при обычных обстоятельствах/вне средыVerbatim
. - символ
}
имеет код категории 2 (конечная группа) и, таким образом, во время токенизации обрабатывается так же, как и при обычных обстоятельствах/вне средыVerbatim
.
Любой другой символ, который обычно имеет специальную функцию в TeX, например, символ обратной косой черты, токенизируется в соответствии с режимом кодирования дословной категории, в котором эти специальные символы назначены.
- либо код категории 12 (другие), так что они больше не имеют специальной функции, но во время набора текста принимаются за директивы для набора некоторого глифа шрифта
- или код категории 13 (активный), чтобы их можно было определить для расширения до некоторых команд, которые, в свою очередь, обеспечивают набор некоторых символов, например,
␣
для символа пробела или выполняют перенос строки для символа возврата каретки.
Токенизация символов {
категории 1 без создания токена управляющего символа дает явные токены символов категории 1 (начало группы).
Токенизация символов }
категории 2 без создания токена управляющего символа дает явные токены символов категории 2 (конец группы).
В отличие от явных токенов символов категории 11(буква) и 12(другие) такие явные токены символов во время набора текста не являются директивами для набора какого-либо глифа шрифта, а являются директивами, которые влияют на группировку — либо ограничивая области действия, либо ограничивая наборы токенов, которые должны формировать аргументы.
Внутри вашей Verbatim
среды, где commandchars=+\{\}
в действительности находится , строка
Hello, \emph{world}!
токенизируется как .
H11e11l11l11o11,13space13\12e11m11p11h11{1w11o11r11l11d11}2!12carriage return13
\12возникает из-за того \
, что код категории 12(другие) не заставляет LaTeX начинать создание токена управляющей последовательности.
{1и влияют на область действия, но не дают видимых результатов в .pdf-файле.}2
Внутри вашей Verbatim
среды, где commandchars=+\{\}
в действительности находится , строка
Bye, +emph{world}!
токенизируется как .
B11y11e11,13space13\emph{1w11o11r11l11d11}2!12carriage return13
С commandchars=+\{\}
in effect вы можете сделать +string+{
/ +string+}
для набора фигурных скобок. (Вы также можете сделать +string{
/ , +string}
пока {
и }
сбалансированы.)
решение2
Вот отрывок со страницы 16 руководства пользователяfancyvrbупаковка:
Поскольку вы указали
\begin{Verbatim}[commandchars=+\{\}]
персонаж +
действует так, как \
и в обычной обстановке, в то время как {
и }
действуют как открыватели и закрывающие TeX-группы. В результате, +emph{world}
отображает "мир" курсивом внутри Verbatim
среды.
В противоположность этому, \emph{world}
внутри Verbatim
среды генерируется \emphworld
, со всеми глифами, отображаемыми в прямом моноширинном шрифте. В конце концов, поскольку вы указали {
и }
действовать как открыватели и закрыватели группы TeX, они имеют особое значение и делаютнетраспечатать.