Как добавить фантомный символ в начало дословного блока

Как добавить фантомный символ в начало дословного блока

Я пытаюсь понять commandcharsfancyverb 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}в первой строке дословно. У меня три вопроса:

  1. Почему это вообще печатается, если я использую \phantom.
  2. почему включена закрывающая фигурная скобка?
  3. Я не могу использовать, 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
}

Связанный контент