Como adicionar um caractere fantasma ao início de um bloco literal

Como adicionar um caractere fantasma ao início de um bloco literal

Estou tentando entender o significado commandcharsdo 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}

Esta impressão bar}na primeira linha do texto. Eu tenho três perguntas:

  1. Por que isso é impresso se eu uso \phantom.
  2. por que a chave de fechamento está incluída?
  3. Não posso usar commandchars=\\\{\}porque entra em conflito com as chaves da linguagem de programação impressa. Então eu uso [commandchars=\\\!\!]. No entanto, quando tento inserir, \phantom!bar!apenas recebo o erro \FancyVerbGetLine has an extra }.

Na verdade, tudo o que quero alcançar é imprimir uma linha inicial vazia que não funciona - em vez disso, aparece uma linha de meia altura. Então, meu pensamento foi que o mais fácil seria impor a altura da primeira linha adicionando um caractere fantasma.

Responder1

O erro está em

commandchars=\\\!\!

Você deve especificar trêsdistintocaracteres no formato \<char>; o primeiro será utilizado no lugar da barra invertida, o segundo no lugar da chave de abertura e o terceiro no lugar da chave de fechamento. Assim algo como

\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}

Adicionei XYZapenas para mostrar que o fantasma é honrado. Um em uma linha por si só é inútil: basta deixar uma linha em branco.

insira a descrição da imagem aqui

Vamos ver o que acontece no seu exemplo. A barra invertida é definida para funcionar também em Verbatimblocos para escapar de comandos. Primeiro !é equivalente a {abrir grupos, depois é imediatamente equivalente }a fechar grupos. Portanto, você não poderá passar argumentos multitoken para a macro, porque não possui um delimitador de argumento esquerdo.

Quando \phantom{bar}é processado, \phantomé executado normalmente (a barra invertida recebeu seu significado normal) e encontra um token {não precedido por um delimitador de argumento à esquerda. Lembre-se de que estamos no modo literal! Então {é tomado como argumento de \phantome resulta em um espaço equivalente a uma letra. Em seguida, bar}é impresso literalmente.

Sua tentativa com

\phantom!bar!

não funciona, porque seria equivalente, fora Verbatimdo \phantom}bar}que é ilegal. Com

commandchars=\\\!\?

e

\phantom!bar?

estamos fazendo o que seria em contextos normais \phantom{bar}.

Responder2

Entendi que há um problema com muitos comandos do latex, como \phantomnão serem compatíveis com a ideia do bloco de grupo de commandchars. Uma solução alternativa aqui é definir um comando auxiliar sem parâmetros, assim:

\newcommand{\worstLanguageEver}{\phantom{I}}
\begin{Verbatim}[commandchars=\\\$\$]
\worstLanguageEver
trait Sys[S <: Sys[S]] {
  type ID <: Ident[S#Tx]
  type Tx
}

informação relacionada