
Я пытаюсь понять commandchars
fancyverb Verbatim
:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\phantom{foo}
\begin{Verbatim}[commandchars=\\\!\!]
\phantom{bar}
trait Sys[S <: Sys[S]] {
type ID <: Ident[S#Tx]
type Tx
}
\end{Verbatim}
\end{document}
Этот отпечаток bar}
в первой строке дословно. У меня три вопроса:
- Почему это вообще печатается, если я использую
\phantom
. - почему включена закрывающая фигурная скобка?
- Я не могу использовать,
commandchars=\\\{\}
потому что это конфликтует с фигурными скобками языка программирования, напечатанного. Поэтому я использую[commandchars=\\\!\!]
. Однако, когда я пытаюсь вставить,\phantom!bar!
я просто получаю ошибку\FancyVerbGetLine has an extra }
.
На самом деле все, чего я хочу добиться, это напечатать пустую строку в начале, что не работает — вместо этого появляется строка половинной высоты. Поэтому я подумал, что проще всего будет принудительно задать высоту первой строки, добавив фантомный символ.
решение1
Ошибка в
commandchars=\\\!\!
Вам необходимо указать триотчетливыйсимволы в форме \<char>
; первый будет использоваться вместо обратной косой черты, второй вместо открывающей скобки и третий вместо закрывающей скобки. Таким образом, что-то вроде
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[commandchars=\\\!\?]
\phantom!bar?XYZ
trait Sys[S <: Sys[S]] {
type ID <: Ident[S#Tx]
type Tx
}
\end{Verbatim}
\end{document}
Я добавил XYZ
только для того, чтобы показать, что фантом почитается. Один в строке сам по себе бесполезен: просто оставьте пустую строку.
Давайте посмотрим, что происходит в вашем примере. Обратная косая черта определена для работы также в Verbatim
блоках для экранирования команд. !
Сначала делается эквивалентной {
для открытия групп, затем она сразу же делается эквивалентной }
для закрытия групп. Таким образом, вы не сможете передать многотокенные аргументы в макрос, потому что у вас нет левого разделителя аргументов.
При \phantom{bar}
обработке \phantom
выполняется нормально (обратной косой черте дано ее нормальное значение) и находит токен, которому {
не предшествует левый разделитель аргументов. Помните, что мы находимся в режиме дословного перевода! Поэтому {
принимается как аргумент \phantom
и в результате получается пробел, эквивалентный букве. Затем bar}
печатается дословно.
Ваша попытка с
\phantom!bar!
не работает, потому что это было бы эквивалентно, за пределами Verbatim
, \phantom}bar}
что незаконно. С
commandchars=\\\!\?
и
\phantom!bar?
мы делаем то, что в обычных условиях было бы \phantom{bar}
...
решение2
Я понял, что есть проблема со многими командами latex, например, \phantom
несовместимость с идеей группового блока commandchars. Обходной путь здесь — определить вспомогательную команду без параметров, например:
\newcommand{\worstLanguageEver}{\phantom{I}}
\begin{Verbatim}[commandchars=\\\$\$]
\worstLanguageEver
trait Sys[S <: Sys[S]] {
type ID <: Ident[S#Tx]
type Tx
}