Ich muss einen (allgemeinen) Auflistungscode in eine Grundstücksüberschrift einfügen. Aus irgendeinem Grund listings
funktioniert (inline) nicht gut mit . \addlegendentry
Was kann ich tun, damit derselbe Code außerhalb und innerhalb einer \addlegendentry
Umgebung funktioniert?
Beachten Sie, dass es sogar ein merkwürdiges Ergebnis gibt (siehe Bild), bei dem die Phrase in der falschen Reihenfolge steht.
\documentclass[]{article}
\usepackage{pgfplots}
\usepackage[]{listings}
\begin{document}
\lstinline[]|(double x){bbbb}| %ok
\begin{tikzpicture}
\begin{axis}[]
\addlegendentry{\lstinline[]|(double x){bbbb;}|}; %not ok, garbage
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {
( 1, 2 )
( 3, 4)
};
\end{axis}
\end{tikzpicture}
\end{document}
\{
Eine Problemumgehung, die ich gefunden habe, besteht darin , ... \}
in den Fall einzufügen \legendentry
, aber dies bewirkt nicht dasselbe außerhalb des pgfplot
und ich möchte denDasselbetikzpicture
Code, wenn möglich, unabhängig davon. Vielleicht ist die Lösung eine Option, die ich an die Umgebung, das tikz
Paket oder das weitergeben muss listing
.
(Diese verb
-ähnlichen Umgebungen bereiten mir immer Kopfschmerzen.)
BEARBEITEN: Dank Gonzalos Klarstellung habe ich diesen Code erstellt, der die Verwendung des gleichen Codes innerhalb und außerhalb der Überschrift ermöglicht. Er verwendet einen Hack ( \textrm
, andere Lösungen sind willkommen):
\documentclass[]{article}
\usepackage{pgfplots}
\usepackage[]{listings}
\begin{document}
\textrm{\lstinline[]|(double x)\{bbbb\}|} %ok
\begin{tikzpicture}
\begin{axis}[small]
\addlegendentry{\textrm{\lstinline[]|(double x)\{bbbb\}|}}; %now ok
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {( 1, 2 )};
\addlegendentry{\lstinline[]|(double x){bbbb;}|}; % not ok, garbage
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {( 1, 2 )};
\addlegendentry{\lstinline[]|(double x)\{bbbb\}|}; % not what one expects
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {( 1, 2 )};
\end{axis}
\end{tikzpicture}
\end{document}
Antwort1
Die Verwendung von \lstinline
Inside-Argumenten ist experimentell; siehe diesen Unterabschnitt in der Dokumentation:
5.1 Auflistungen innerhalb von Argumenten
Wenn Sie oder die Listing-Umgebung innerhalb von Argumenten verwenden möchten, müssen Sie einige Dinge beachten
\lstinline
. Da TeX das Argument liest, bevor das „lst-Makro“ ausgeführt wird, kann dieses Paket nichts tun, um die Eingabe zu erhalten: Leerzeichen werden auf ein Leerzeichen reduziert, der Tabulator und das Zeilenende werden in Leerzeichen umgewandelt, TeXs Kommentarzeichen sind nicht druckbar usw. Sie müssen also etwas mehr tun. Sie müssen vor jedes der folgenden vier Zeichen einen Backslash setzen:\{}%
. Darüber hinaus müssen Sie Leerzeichen auf die gleiche Weise schützen, wenn: (i) zwei oder mehr Leerzeichen hintereinander stehen oder (ii) das Leerzeichen das erste Zeichen in der Zeile ist. Das reicht nicht: Jede Zeile muss mit einem „Line Feed“ abgeschlossen werden^^J
. Und Sie können innerhalb solcher Listings nicht nach LaTeX wechseln!
Ich fürchte, die einzige Lösung besteht dann darin, wie in der Dokumentation vorgeschlagen, \{
und zu verwenden \}
:
\documentclass[]{article}
\usepackage{pgfplots}
\usepackage[]{listings}
\begin{document}
\begin{tikzpicture}
\begin{axis}[]
\addlegendentry{\lstinline[]|(double x)\{bbbb;\}|};
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {
( 1, 2 )
( 3, 4)
};
\end{axis}
\end{tikzpicture}
\end{document}
Eine Alternative wäre, die listings
Schnittstelle zu nutzen fancyvrb
(oder direkt zu verwenden fancyvrb
):
\documentclass[]{article}
\usepackage{pgfplots}
\usepackage{fancyvrb}
\fvset{commandchars=\\\{\}}
\begin{document}
\Verb!(double x)\{bbbb;\}!
\begin{tikzpicture}
\begin{axis}[]
\addlegendentry{\Verb!(double x)\{bbbb;\}!};
\addplot+[mark=none, line join=round, fill opacity = 0.5, ] coordinates {
( 1, 2 )
( 3, 4)
};
\end{axis}
\end{tikzpicture}
\end{document}