
Estoy tratando de entender el significado commandchars
de 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}
Esto se imprime bar}
en la primera línea textual. Tengo tres preguntas:
- ¿Por qué se imprime esto si uso
\phantom
. - ¿Por qué se incluye la llave de cierre?
- No puedo usarlo
commandchars=\\\{\}
porque entra en conflicto con las llaves del lenguaje de programación impreso. Entonces lo uso[commandchars=\\\!\!]
. Sin embargo, cuando intento insertarlo,\phantom!bar!
aparece el error\FancyVerbGetLine has an extra }
.
En realidad, todo lo que quiero lograr es imprimir una línea inicial vacía que no funciona; en su lugar, aparece una línea de media altura. Así que pensé que lo más fácil sería imponer la altura de la primera línea agregando un carácter fantasma.
Respuesta1
El error esta en
commandchars=\\\!\!
Tienes que especificar tresdistintocaracteres en el formulario \<char>
; el primero se utilizará en lugar de la barra invertida, el segundo en lugar de la llave de apertura y el tercero en lugar de la llave de cierre. Así algo así 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}
Agregué XYZ
solo para mostrar que se honra al fantasma. Uno en una línea por sí solo es inútil: simplemente deje una línea en blanco.
Veamos qué sucede en tu ejemplo. La barra invertida está definida para funcionar también en Verbatim
bloques para escapar de comandos. Primero !
se hace equivalente a {
para grupos de apertura, luego inmediatamente se hace equivalente a }
para grupos de cierre. Por lo tanto, no podrá pasar argumentos multitoken a la macro porque no tiene un delimitador de argumento izquierdo.
Cuando \phantom{bar}
se procesa, \phantom
se ejecuta normalmente (a la barra invertida se le ha dado su significado normal) y encuentra un token {
no precedido por un delimitador de argumento izquierdo. ¡Recuerda que estamos en modo palabra por palabra! Se toma So {
como argumento de \phantom
y da como resultado un espacio equivalente a una letra. Luego bar}
se imprime palabra por palabra.
Tu intento con
\phantom!bar!
no funciona, porque sería equivalente, outside Verbatim
, a \phantom}bar}
lo cual es ilegal. Con
commandchars=\\\!\?
y
\phantom!bar?
Estamos haciendo lo que en contextos normales sería \phantom{bar}
.
Respuesta2
Entendí que hay un problema con muchos comandos de látex, como que \phantom
no son compatibles con la idea del bloque de grupo de caracteres de comando. Una solución alternativa aquí es definir un comando auxiliar sin parámetros, así:
\newcommand{\worstLanguageEver}{\phantom{I}}
\begin{Verbatim}[commandchars=\\\$\$]
\worstLanguageEver
trait Sys[S <: Sys[S]] {
type ID <: Ident[S#Tx]
type Tx
}