
Ich habe in meinem Dokument viele Verbatim
Umgebungen, 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 fancyvrb
interpretieren ? (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 .aux
Datei:
\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}
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 VerwendungPaketlistings
anstelle 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}
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}
listings
Weitere 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 foo
mit 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 listings
ist das Ändern des Zeichens in den Beispielen eine Kleinigkeit.