
Estou tentando entender o significado commandchars
do 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:
- Por que isso é impresso se eu uso
\phantom
. - por que a chave de fechamento está incluída?
- 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 XYZ
apenas para mostrar que o fantasma é honrado. Um em uma linha por si só é inútil: basta deixar uma linha em branco.
Vamos ver o que acontece no seu exemplo. A barra invertida é definida para funcionar também em Verbatim
blocos 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 \phantom
e 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 Verbatim
do \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 \phantom
nã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
}