PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pstricks und lstlistings...



einheitlix
18-09-2009, 17:01
Hallo Leute,

um es kurz zu machen, ich moechte in LaTeX fuer meine Bachelor-Arbeit eine Reihe von Programmtransformationen beschreiben.
Dafuer moechte ich immer ein Programm in einer Box darstellen und ein zweites in einer weiteren Box rechts daneben, und zwischen den beiden Boxes soll es einen Pfeil geben.

Leider schaffe ich es nicht, ein lstlisting innerhalb von einer psshadowbox zu machen.

Ich zeige zwei Minimalbeispiele. Das erste funktioniert, das zweite ist nur minimal erweitert, geht aber nicht mehr. Beide Beispiele bitte mit latex beispiel.tex; dvipdf beispiel.dvi kompilieren, da pdflatex beispiel.tex direkt nicht geht, siehe http://tug.org/PSTricks/ unter Punkt 4.

Minimalbeispiel 1: ohne lstlisting geht es wunderbar. So sollte es prinzipiell aussehen:



\documentclass[11pt]{article}
\usepackage{listings}
\usepackage{pstricks} % pstricks zum malen
\usepackage{pst-node} % gehoert zu pstricks

\begin{document}

\begin{figure}[h]
\centering
%\hspace{1.5cm}
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1] \psshadowbox{
test1
}
&
[name=game2] \psshadowbox{
test2
}

%Arrows
\ncline{->}{game1}{game2}
\end{psmatrix}

\caption{first transformation}
\label{first transformation}
\end{figure}

\end{document}


Minimalbeispiel 2: Dieses ist nahezu identisch, ausser dass ich hier jeweils um "test1" und "test2" ein lstlisting gemacht habe.



\documentclass[11pt]{article}
\usepackage{listings}
\usepackage{pstricks} % pstricks zum malen
\usepackage{pst-node} % gehoert zu pstricks

\begin{document}

\begin{figure}[h]
\centering
%\hspace{1.5cm}
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1] \psshadowbox{
\begin{lstlisting}
test1
\end{lstlisting}
}
&
[name=game2] \psshadowbox{
\begin{lstlisting}
test2
\end{lstlisting}
}

%Arrows
\ncline{->}{game1}{game2}
\end{psmatrix}

\caption{first transformation}
\label{first transformation}
\end{figure}

\end{document}


Es kommt folgende Fehlermeldung:



! Argument of \lst@next has an extra }.
<inserted text>
\par
l.16 }

?


...dabei scheint mir die Anzahl von {'s und }'s durchaus korrekt zu sein :)

Bitte helft mir, es ist auch recht dringend!

Vielen, lieben Dank schonmal.

Malte

u_fischer
18-09-2009, 17:32
Das ist eine Variante dieses Problems (listings muss wie verbatim diverse catcodes ändern):

http://www.tex.ac.uk/cgi-bin/texfaq2html?label=verbwithin

einheitlix
18-09-2009, 19:02
Hi,

danke fuer den Tipp. Ich habe es jetzt folgendermassen hinbekommen.

Minimalbeispiel 3: Dies funktioniert, hier wird der Code per \lstinputlisting{datei} eingebunden.



\documentclass[11pt]{article}
\usepackage{amsmath, amsthm, amssymb}
\usepackage{listings}
\usepackage{pstricks} % pstricks zum malen
\usepackage{pst-node} % gehoert zu pstricks

\lstset{basicstyle=\small,escapechar=\&}
\newcommand{\sel}{\leftarrow}
\newcommand{\gen}[1]{\langle#1\rangle}
\newcommand{\card}[1]{\lvert#1\rvert}

\begin{document}

\begin{figure}[h]
\centering
%\hspace{1.5cm}
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1] \psshadowbox{
\lstinputlisting{test.lst}
}
&
[name=game2] \psshadowbox{
\lstinputlisting{test2.lst}
}

%Arrows
\ncline{->}{game1}{game2}
\end{psmatrix}

\caption{first transformation}
\label{first transformation}
\end{figure}

\end{document}


Wundert euch nicht ueber das hinzugekommene lstset und die 3 newcommand's, die brauche ich bei der Schilderung des nun auftretenden Folgeproblems ;)
Wir kommen der Sache aber schon sehr viel naeher!

Solange als Text nur "test" oder "test2" in den *.lst Dateien steht, geht es genau, wie ich es mir vorgestellt habe. Wenn ich nun aber den "richtigen" Programmcode in diese Dateien schreibe, sind die psshadowboxes viel zu klein und der Text geht ueber den Rahmen hinaus :(

Nehmt das Minimalbeispiel 3 und als test.lst folgendes:


let (e, d) &$\sel$& :encGen ElGamal: &$1^n$&
(&$m_1$&, &$m_2$&, a) &$\sel$& :A: (&$1^n$&, e)
c &$\sel$& :encEnc ElGamal: (&$1^n$&, e, &$m_1$&)
in :A': (&$1^n$&, &$m_1$&, &$m_2$&, a, e, c)

und als test2.lst folgendes:


let x &$\sel$& fun(uniform, &$\card{\gen{g_n}}$&)
(e, d) &$\sel$& (&$g_n^x$&, x)
(&$m_1$&, &$m_2$&, a) &$\sel$& :A: (&$1^n$&, e)
y &$\sel$& fun(uniform, &$\card{\gen{g_n}}$&)
c &$\sel$& (&$g_n^y$&, &$m_1 \times e^y$&)
in :A': (&$1^n$&, &$m_1$&, &$m_2$&, a, e, c)


Wie ihr seht, macht LaTex zwar nun prinzipiell das richtige, aber die psshadowboxes werden viel zu klein dargestellt.

Wieso passiert das? Sollte die psshadowbox nicht automatisch die Groesse annehmen, die sie braucht? Wie koennte ich das nun beheben?

Danke schonmal fuer euer Interesse :)

Malte

u_fischer
19-09-2009, 16:18
Wenn du zu LaTeX "excape"st, bringt das den "Breitenmesser" von listings durcheinander. Da bleibt dir nicht viel mehr übrig als manuel die Länge zu korrigieren:


\documentclass[11pt]{article}
\usepackage{listings}
\usepackage{amsmath}

\newcommand{\sel}{\leftarrow}
\newcommand{\gen}[1]{\langle#1\rangle}
\newcommand{\card}[1]{\lvert#1\rvert}

\begin{document}

\fbox{\lstinputlisting{test2.lst}}

\fbox{\lstinputlisting[escapechar=\&]{test2.lst}}

\fbox{\lstinputlisting[escapechar=\&]{test2.lst}\hspace{4em}}

\end{document}

einheitlix
20-09-2009, 14:05
Hallo Ulrike,

vielen Dank, du hast mir wirklich sehr geholfen. :)
Und nebenbei hab ich noch einige Feinheiten von LaTeX gelernt!

Eine letzte Frage haette ich noch. Ich habe deine Tricks angewendet und es sieht jetzt soweit gut aus, nur ein Detail sollte noch behoben werden: LaTex stellt die Grafik so weit rechts dar, dass die Grafik insgesamt ueber das Blatt hinausgeht und an der rechten Seite "abgeschnitten" wird. Sie wuerde aber problemlos draufpassen, wenn ich LaTeX dazu bringen koennte, die Grafik weiter links darzustellen.

Kann man das irgendwie erzwingen?

Ich haenge mal eine test.{tar,zip} (je nach Praeferenz) an, die folgendes enthaelt:
- test.tex
- test.lst
- test2.lst
...das ganze ohne uebergeordnetes Verzeichnis. (Das tar ist ein bisschen groesser, da man hier im Forum anscheinend keine .tgz oder .tar.bz2 anhaengen kann)

Ausserdem habe ich noch eine zweite Moeglichkeit gefunden, das ganze nett darzustellen, und zwar ganz ohne lstlisting, dafuer mit tabular :) Beide Moeglichkeiten sind in der test.tex dargestellt.

Insgesamt haette ich also noch zwei kurze Fragen:
1. Wie kann ich LaTex dazu bringen, die Grafiken weiter links darzustellen?
2. Welche von beiden Moeglichkeiten, findet ihr, sieht besser aus? :)

Malte

mechanicus
20-09-2009, 14:21
Hallo,




Insgesamt haette ich also noch zwei kurze Fragen:
1. Wie kann ich LaTex dazu bringen, die Grafiken weiter links darzustellen?
2. Welche von beiden Moeglichkeiten, findet ihr, sieht besser aus? :)

zu 1.:
meinst du es so:

\documentclass[11pt]{article}
\usepackage{amsmath, amsthm, amssymb}
\usepackage{listings}
\usepackage{pstricks} % pstricks zum malen
\usepackage{pst-node} % gehoert zu pstricks

\lstset{basicstyle=\small,escapechar=\&}
\newcommand{\sel}{\leftarrow}
\newcommand{\gen}[1]{\langle#1\rangle}
\newcommand{\card}[1]{\lvert#1\rvert}
\usepackage{showframe}
\begin{document}

\begin{figure}[h]
\centering
\makebox[0pt][c]{%
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1] \psshadowbox{
\small
\begin{tabular}{llcl}
let & ($e$, $d$) & $\sel$ & :encGen ElGamal: $1^n$\\
& ($m_1$, $m_2$, $a$) & $\sel$ & :A: ($1^n$, $e$)\\
& $c$ & $\sel$ & :encEnc ElGamal: ($1^n$, $e$, $m_1$)\\
in & \multicolumn{3}{l}{:A': ($1^n$, $m_1$, $m_2$, $a$, $e$, $c$)}\\
\end{tabular}
}
&
[name=game2] \psshadowbox{
\small
\begin{tabular}{llcl}
let & $x$ & $\sel$ & fun(uniform, $\card{\gen{g_n}}$)\\
& ($e$, $d$) & $\sel$ & ($g_n^x$, $x$)\\
& ($m_1$, $m_2$, $a$) & $\sel$ & :A: ($1^n$, $e$)\\
& $y$ & $\sel$ & fun(uniform, $\card{\gen{g_n}}$)\\
& $c$ & $\sel$ & ($g_n^y$, $m_1 \times e^y$)\\
in & \multicolumn{3}{l}{:A': ($1^n$, $m_1$, $m_2$, $a$, $e$, $c$)}\\
\end{tabular}
}

%Arrows
\ncline{->}{game1}{game2}
\end{psmatrix}%
}
\caption{first transformation}
\label{first transformation}
\end{figure}

\begin{figure}[h]
\centering
\makebox[0pt][c]{%
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1b] \psshadowbox{
\lstinputlisting{test.lst}
\hspace{4em}
}
&
[name=game2b] \psshadowbox{
\lstinputlisting{test2.lst}
\hspace{5em}
}

%Arrows
\ncline{->}{game1b}{game2b}
\end{psmatrix}%
}
\caption{first transformation}
\label{first transformation}
\end{figure}

\end{document}


zu 2.: Mir gefällt die Lösung mit tabular besser. Sieht übersichtlicher aus. ;)

Gruß
Marco

edico
20-09-2009, 14:22
\documentclass[paper=a4,pagesize,10pt]{scrartcl}
\usepackage{showframe}% demo

\usepackage[svgnames]{xcolor}
\usepackage{amsmath,calc}

%%% ------------------------------------------------------------------
%%% PSTricks
%%% ------------------------------------------------------------------
\usepackage{pstricks,pst-node,pst-pdf}
\newcommand{\PSshadowbox}[1]{%
\psshadowbox[shadowsize=3pt,framesep=3pt]{%
\begin{minipage}[b]{0.45\textwidth-3pt}%
#1% ^^^ shadowsize
\end{minipage}%
}%
}

%%% ------------------------------------------------------------------
%%% Listings
%%% ------------------------------------------------------------------
\usepackage{listings}
\usepackage{marvosym}
\lstset{basicstyle=\footnotesize,
breakautoindent = true,
breakindent = 2em,
breaklines = true,
postbreak = ,
prebreak = {\Righttorque}
}
%%% ------------------------------------------------------------------

\newcommand{\sel}{\leftarrow}
\newcommand{\gen}[1]{\langle#1\rangle}
\newcommand{\card}[1]{\lvert#1\rvert}



\begin{document}

\section{FAQ}

Setze zwei Programmcodes in shadowboxes mit Pfeil nebeneinander (PSTricks).

\bigskip
\fbox{\lstinputlisting{test2.lst}}
\par\medskip
\fbox{\lstinputlisting[escapechar=\&]{test2.lst}}
\par\medskip
\fbox{\lstinputlisting[escapechar=\&]{test2.lst}\hspace{4em}}

\bigskip
Dies ist eine Variante dieses Problems (listings muss wie verbatim diverse catcodes \"andern):
http://www.tex.ac.uk/cgi-bin/texfaq2...bel=verbwithin


\newpage

\section{Solution}
\subsection{Prinzip (by Ulrike Fischer)}
\begin{figure}[!ht]
\centering
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1] \psshadowbox{
\lstinputlisting[escapechar=\&]{test1.lst}
\hspace{4em}
}
&
[name=game2] \psshadowbox{
\lstinputlisting[escapechar=\&]{test2.lst}
\hspace{4em}
}
% Arrows
\ncline{->}{game1}{game2}
\end{psmatrix}

\caption{transformation}
\label{transformationi}
\end{figure}


\subsection{breaklines + minipage}
\begin{figure}[!hb]
\centering
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1] \psshadowbox{
\begin{minipage}[b]{0.45\textwidth}
\lstinputlisting[escapechar=\&]{test1.lst}
\end{minipage}
}
&
[name=game2] \psshadowbox{
\begin{minipage}[b]{0.45\textwidth}
\lstinputlisting[escapechar=\&]{test2.lst}
\end{minipage}
}
% Arrows
\ncline{->}{game1}{game2}
\end{psmatrix}

\caption{transformation}
\label{transformationii}
\end{figure}


\subsubsection{\ldots + psshadowbox als macro }
\begin{figure}[!hb]
\centering
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1]
\PSshadowbox{\lstinputlisting[escapechar=\&]{test1.lst}}
&
[name=game2]
\PSshadowbox{\lstinputlisting[escapechar=\&]{test2.lst}}
% Arrows
\ncline[linewidth=.4pt]{->}{game1}{game2}
\end{psmatrix}
\caption{transformation}
\label{transformationiii}
\end{figure}

\end{document}


edico

voss
20-09-2009, 23:03
Leider schaffe ich es nicht, ein lstlisting innerhalb von einer psshadowbox zu machen.

Ich zeige zwei Minimalbeispiele. Das erste funktioniert, das zweite ist nur minimal erweitert, geht aber nicht mehr. Beide Beispiele bitte mit latex beispiel.tex; dvipdf beispiel.dvi kompilieren, da pdflatex beispiel.tex direkt nicht geht, siehe http://tug.org/PSTricks/ unter Punkt 4.


einfach den verbatim Modus einschalten!


\documentclass[11pt]{article}
\usepackage{listings,pst-node}

\begin{document}

\begin{figure}[h]
\centering
\psverbboxtrue
\begin{psmatrix}[mnode=r,colsep=0.8,rowsep=0.4]
[name=game1]\psshadowbox{\begin{lstlisting}
test1
\end{lstlisting}}
& [name=game2]\psshadowbox{\begin{lstlisting}
test2
\end{lstlisting}}
%Arrows
\end{psmatrix}
\ncline[arrowscale=3]{->}{game1}{game2}
\caption{first transformation}\label{first transformation}
\end{figure}

\end{document}


Herbert

voss
20-09-2009, 23:13
Das ist eine Variante dieses Problems (listings muss wie verbatim diverse catcodes ändern):

http://www.tex.ac.uk/cgi-bin/texfaq2html?label=verbwithin

das ist eigentlich keine Variante, denn PSTricks hat de facto
nichts mit LaTeX zu tun und somit auch nicht den Stress mit
verbatim.

Herbert

einheitlix
21-09-2009, 18:02
Hallo Leute,

vielen Dank fuer all eure Hilfe und Unterstuetzung! Ich hab durch eure Beispiele und Erklaerungen eine Menge gelernt :)

Ich habe mich am Ende fuer die Loesung mit tabular entschieden, da, wie mechanicus schon sagte, es einfach uebersichtlicher aussieht. Alles, was ich hier ueber lstlistings gelernt habe, werde ich mittelfristig aber bestimmt auch noch brauchen koennen...

Ich bin dann auch direkt ins naechste Problem gerannt, aber da dass nicht wirklich zum Originalthema passt, habe ich dafuer mal einen neuen Thread aufgemacht:
http://www.mrunix.de/forums/showthread.php?p=301019#post301019

Beste Gruesse,

Malte