Gibt es eine einfache Methode, um in einer „Verbatim“-Umgebung einigen Zeilen Beschriftungen hinzuzufügen?

Gibt es eine einfache Methode, um in einer „Verbatim“-Umgebung einigen Zeilen Beschriftungen hinzuzufügen?

Ich habe in meinem Dokument viele VerbatimUmgebungen, die Quellcode mit unterschiedlichen Zeichen enthalten, darunter {, (, [, <. Ich versuche, eine Möglichkeit zu finden, einigen Zeilen in diesen Umgebungen Beschriftungen hinzuzufügen. Das sieht umständlich aus, da ich alles {durch \{und alles }durch ersetzen muss \}, wodurch der Java-Code viel weniger lesbar wird (für mich als Herausgeber des Dokuments):

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
void main() \{
  print("Hello!"); \label{foo}
\}
\end{Verbatim}
\end{document}

So etwas wäre viel besser:

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}
void main() {
  print("Hello!"); !foo
}
\end{Verbatim}
\end{document}

Ist es irgendwie möglich, es als zu fancyvrbinterpretieren ? (es ist OK, wenn ein „Hack“ von notwendig wäre)!foo\label{foo}fancyvrb

Antwort1

Sie können !es mit einer geeigneten Definition auf aktiv setzen: Es wird nach alphanumerischen Zeichen gesucht und diese als Argument an übergeben \label.

\documentclass{article}
\usepackage{fancyvrb}

\ExplSyntaxOn

\cs_new_protected:Nn \__yegor_verbatim_label:
 {
  \peek_regex_replace_once:nn { [[:alnum:]]* } { \c{label}\cB\{\0\cE\} }
 }
\char_set_active_eq:nN { `! } \__yegor_verbatim_label:

\ExplSyntaxOff

\begin{document}

\begin{Verbatim}[codes={\catcode`\!=\active}]
void main() {
  print("Hello!"); !foo
}
\end{Verbatim}

\end{document}

Folgendes finden Sie in der .auxDatei:

\newlabel{foo}{{2}{1}{}{}{}}

Antwort2

Sie können andere Gruppenzeichen verwenden, die im Code nicht verwendet werden, zB

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[{commandchars=\\[]}]
void main() {
  print("Hello!"); \label[foo]
}
\end{Verbatim}
\end{document}

oder

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[{commandchars=\\$/}]
void main() {
  print("Hello!"); \label$foo/
}
\end{Verbatim}
\end{document}

Abonnieren

Hinweis: Mit PDFLaTeX können Sie keine UTF8-Zeichen als Wert von verwenden commandchars. Mit einer UTF8-Engine, z. B. LuaLaTeX, können Sie jedoch auch etwas wie Folgendes verwenden:

% This is a LuaLaTeX example!
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[{commandchars=§«»}]
void main() {
  print("Hello!"); §label«foo»
}
\end{Verbatim}
\end{document}

kann verwendet werden.


Eine weitere Alternative wäre die VerwendungPaketlistingsanstelle von fancyvrb. In diesem Fall benötigen Sie nureinsEscape-Zeichen, zB:

\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[escapechar=~]
void main() {
  print("Hello!"); ~\label{foo}~
}
\end{lstlisting}
\end{document}

oder auch:

\documentclass{article}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[escapechar=¡]
void main() {
  print("Hello!"); ¡\label{foo}¡
}
\end{lstlisting}
\end{document}

Inserate

oder

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset{columns=flexible,basicstyle=\ttfamily,identifierstyle=\color{blue}}
\begin{document}
\begin{lstlisting}[language=Java,escapechar=¡]
void main() {
  print("Hello!"); ¡\label{foo}¡
}
\end{lstlisting}
\end{document}

Java-Code mit Farbe

listingsWeitere Hinweise und eine Alternative zum Verweisen auf Zeilennummern finden Sie auch in Abschnitt 8 des Handbuchs, auch wenn alle Zeichen im Code verwendbar sein müssen.


Wenn Sie wirklich darauf bestehen, im Code !as zu verwenden \label, aber nur, wenn kein folgt ", würde ich empfehlen, auch foomit einem zusätzlichen abzugrenzen !:

\documentclass{article}
\usepackage{fancyvrb}
\makeatletter
\let\!!
\begingroup
\catcode`\!=\active
\gdef!{\@ifnextchar"{\!}{\labeltill}}
\gdef\labeltill#1!{\label{#1}}
\endgroup
\makeatother
\begin{document}
\begin{Verbatim}[codes*={\catcode`\!\active}]
void main() {
  print("Hello!"); !foo!
}
\end{Verbatim}
\end{document}

Besser wäre allerdings die Verwendung eines Zeichens, das nie als Teil des Codes verwendet wird:

\documentclass{article}
\usepackage{fancyvrb}
\begingroup
\catcode`\^=\active
\gdef^#1^{\label{#1}}
\endgroup
\begin{document}
\begin{Verbatim}[codes*={\catcode`\^\active}}
void main() {
  print("Hello!"); ^foo^
}
\end{Verbatim}
\end{document}

Trotzdem gefällt mir diese Lösung nicht, da sie meiner Meinung nach zu leicht schief gehen kann. Und mit jedem Fall, in dem eine der letzten beiden Lösungen fehlschlägt, steigt die Komplexität des Codes. Dagegen listingsist das Ändern des Zeichens in den Beispielen eine Kleinigkeit.

verwandte Informationen