Cómo agregar un carácter fantasma al comienzo de un bloque textual

Cómo agregar un carácter fantasma al comienzo de un bloque textual

Estoy tratando de entender el significado commandcharsde 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:

  1. ¿Por qué se imprime esto si uso \phantom.
  2. ¿Por qué se incluye la llave de cierre?
  3. 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é XYZsolo 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.

ingrese la descripción de la imagen aquí

Veamos qué sucede en tu ejemplo. La barra invertida está definida para funcionar también en Verbatimbloques 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, \phantomse 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 \phantomy 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 \phantomno 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
}

información relacionada