So fügen Sie am Anfang eines Wortblocks ein Phantomzeichen hinzu

So fügen Sie am Anfang eines Wortblocks ein Phantomzeichen hinzu

Ich versuche, das commandcharsvon Fancyverbs zu verstehen 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}

Dieser Druck steht bar}in der ersten Zeile des Wortlauts. Ich habe drei Fragen:

  1. Warum wird dies überhaupt gedruckt, wenn ich verwende \phantom?
  2. warum ist die schließende geschweifte Klammer enthalten?
  3. Ich kann nicht verwenden, commandchars=\\\{\}da es mit den geschweiften Klammern der gedruckten Programmiersprache in Konflikt steht. Also verwende ich [commandchars=\\\!\!]. Wenn ich jedoch versuche, einzufügen, \phantom!bar!erhalte ich nur den Fehler \FancyVerbGetLine has an extra }.

Eigentlich möchte ich nur eine führende leere Zeile drucken, was aber nicht funktioniert – stattdessen erscheint eine Zeile mit halber Höhe. Daher dachte ich, das Einfachste wäre, die Höhe der ersten Zeile durch Hinzufügen eines Phantomzeichens zu erzwingen.

Antwort1

Der Fehler liegt in

commandchars=\\\!\!

Sie müssen dreiunterscheidbarZeichen in der Form \<char>; das erste wird anstelle des Backslashs verwendet, das zweite anstelle der öffnenden Klammer und das dritte anstelle der schließenden Klammer. Also etwas wie

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

Ich habe es XYZnur hinzugefügt, um zu zeigen, dass das Phantom geehrt wird. Eines in einer Zeile allein ist nutzlos: Lassen Sie einfach eine leere Zeile.

Bildbeschreibung hier eingeben

Sehen wir uns an, was in Ihrem Beispiel passiert. Der Backslash ist so definiert, dass er auch in VerbatimBlöcken funktioniert, um Befehle zu umgehen. Er !wird zuerst zum Öffnen von Gruppen gleichgesetzt {, dann sofort zum }Schließen von Gruppen. Sie können also keine Multitoken-Argumente an Makros übergeben, da Sie kein linkes Argumenttrennzeichen haben.

Wenn \phantom{bar}verarbeitet wird, \phantomwird es normal ausgeführt (der Backslash hat seine normale Bedeutung erhalten) und es findet ein Token, {dem kein linkes Argumenttrennzeichen vorangestellt ist. Denken Sie daran, dass wir uns im wörtlichen Modus befinden! Daher {wird als Argument von verwendet \phantomund es ergibt sich ein Leerzeichen, das einem Buchstaben entspricht. Dann bar}wird wörtlich gedruckt.

Ihr Versuch mit

\phantom!bar!

funktioniert nicht, weil es gleichbedeutend wäre mit Verbatim, \phantom}bar}was illegal ist. Mit

commandchars=\\\!\?

Und

\phantom!bar?

wir tun, was in einem normalen Kontext wäre \phantom{bar}.

Antwort2

Mir ist klar geworden, dass es bei vielen Latex-Befehlen ein Problem gibt, z. B. dass sie \phantomnicht mit der Idee des Gruppenblocks von Befehlszeichen kompatibel sind. Eine Problemumgehung besteht darin, einen Hilfsbefehl ohne Parameter zu definieren, etwa so:

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

verwandte Informationen