
Ich versuche, das commandchars
von 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:
- Warum wird dies überhaupt gedruckt, wenn ich verwende
\phantom
? - warum ist die schließende geschweifte Klammer enthalten?
- 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 XYZ
nur hinzugefügt, um zu zeigen, dass das Phantom geehrt wird. Eines in einer Zeile allein ist nutzlos: Lassen Sie einfach eine leere Zeile.
Sehen wir uns an, was in Ihrem Beispiel passiert. Der Backslash ist so definiert, dass er auch in Verbatim
Blö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, \phantom
wird 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 \phantom
und 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 \phantom
nicht 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
}