Ich erstelle eine Beamer-Präsentation und möchte Terminalbefehle in einer terminalähnlichen Box anzeigen. Ich habe mit tkiz erstellt, was ich möchte, aber jetzt habe ich ein Problem damit, es als neue Umgebung zu definieren, weil der Präprozessor vermutlich Klammern falsch gesetzt hat. Hier ist der Block, den ich in eine Umgebung umwandeln möchte.
% Define box and box title style
\tikzstyle{terminal} = [draw=white, text=white, font=courier, fill=black, very thick,
rectangle, inner sep=10pt, inner ysep=20pt]
\tikzstyle{terminalTitle} =[fill=black, text=white, draw=white]
\begin{tikzpicture}
\node [terminal] (box){ % 1: this
\begin{minipage}{0.90\textwidth}
\begin{lstlisting}
$ python -c " print 'x'*80 + '\x01' " | ./test1
Enter password:
You win!
$
\end{lstlisting}
\end{minipage}
}; % 2: matches this
\node[terminalTitle, rounded corners, right=10pt] at (box.north west) {\texttt{tty1: /bin/bash}};
\end{tikzpicture}
Hier ist das Ergebnis:
Aber wenn ich versuche, es in eine neue Umgebung zu bringen, stimmt der Präprozessor mit Klammer Nr. 2 überein und wirft Fehler aus. Ich habe versucht, das Paket zu verwendenUmgebungetwa so:
\NewEnviron{terminal}{
\tikzstyle{terminal} = [draw=white, text=white, font=courier, fill=black, very thick,
rectangle, inner sep=10pt, inner ysep=20pt]
\tikzstyle{terminalTitle} =[fill=black, text=white, font=\ttfamily, draw=white]
\begin{tikzpicture}
\node [terminal] (box){%
\begin{minipage}{0.90\textwidth}
\begin{lstlisting}
\BODY
\end{lstlisting}
\end{minipage}
};
\node[terminalTitle, rounded corners, right=10pt] at (box.north west) {tty: /bin/bash}};
\end{tikzpicture}%
}
Aber ich bekomme immer noch Fehler. Gibt es eine Möglichkeit, die verschachtelten Klammern in dieser Umgebung zu umgehen?
Auch hier ist die Präambel:
\documentclass{article}
\usepackage{tikz}
\usepackage{listings}
\usepackage{lipsum}
\usepackage{courier}
\usepackage{environ}
\usetikzlibrary{shapes}
\lstset{basicstyle=\ttfamily,breaklines=true}
Antwort1
Das Verstecken lstlisting
in einer mit definierten Umgebung \NewEnviron
kann nicht wirklich funktionieren, da die lstlisting
Umgebung den Code auf eine Art und Weise aufmöbeln muss, die nicht möglich ist, wenn der Code bereits in aufgenommen wurde \BODY
.
Hier ist eine funktionierende Version (fast, Sie müssen das Größenproblem lösen):
\documentclass{article}
\usepackage{tikz}
\usepackage{listings}
\usetikzlibrary{shapes}
\lstset{basicstyle=\ttfamily,breaklines=true}
\newsavebox\terminalbox
\lstnewenvironment{terminal}[1][]
{\lstset{#1}\setbox\terminalbox=\vbox\bgroup\hsize=0.7\textwidth}
{\egroup
\tikzstyle{terminal} = [
draw=white, text=white, font=courier, fill=black, very thick,
rectangle, inner sep=10pt, inner ysep=20pt
]
\tikzstyle{terminalTitle} = [
fill=black, text=white, font=\ttfamily, draw=white
]
\begin{tikzpicture}
\node [terminal] (box){\usebox{\terminalbox}};
\node[terminalTitle, rounded corners, right=10pt] at (box.north west) {tty: /bin/bash};
\end{tikzpicture}
}
\begin{document}
\begin{terminal}
$ python -c " print 'x'*80 + '\x01' " | ./test1
Enter password:
You win!
$
\end{terminal}
\end{document}
Ein besserer LaTeX-Stil würde verwenden lrbox
, aber es stellt sich heraus, dass \lstnewenvironment
es das nicht mag.
Überprüfen Sie auch das tcolorbox
Paket.
Antwort2
Danke, egreg, für deine Antwort. Basierend auf deiner Lösung und unter Verwendung von resizebox aus dem Paket graphicx habe ich das Größenproblem gelöst und die Breite gleich der Textbreite gemacht. Ich poste es hier für alle, die das verwenden möchten. Dasselbe mit tcolorbox zu machen, sollte auch einfacher sein, aber dafür sind keine CTAN-Pakete erforderlich.
\usepackage{graphicx}
\usepackage{listings}
\usepackage{color}
\usepackage{courier}
\usepackage{tikz}
\usetikzlibrary{shapes}
\lstset{basicstyle=\ttfamily\footnotesize,breaklines=true}
\newsavebox\terminalbox
\lstnewenvironment{terminal}[1][]
{\lstset{#1}\setbox\terminalbox=\vbox\bgroup\hsize=0.8\textwidth}
{\egroup
\tikzstyle{terminal} = [
draw=white, text=white, font=courier, fill=black, very thick,
rectangle, inner sep=2pt, inner ysep=8pt
]
\tikzstyle{terminalTitle} = [
fill=black, text=white, font=\ttfamily, draw=white
]
\noindent\resizebox{\textwidth}{!}{ % This line fits the box to textwidth
\begin{tikzpicture}
\node [terminal] (box){\usebox{\terminalbox}};
\node[terminalTitle, rounded corners, right=10pt] at (box.north west) {tty: /bin/bash};
\end{tikzpicture}}
}
\begin{document}
\begin{terminal}
$ python -c " print 'x'*80 + '\x01' " | ./test1
Enter password:
You win!
$
\end{terminal}
\end{document}