Anzeige:
Ergebnis 1 bis 10 von 10

Thema: pstricks und lstlistings...

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.07.2009
    Beiträge
    23

    [solved] pstricks und lstlistings...

    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:

    Code:
    \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.

    Code:
    \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:

    Code:
    ! 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
    Geändert von einheitlix (21-09-2009 um 17:02 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Das ist eine Variante dieses Problems (listings muss wie verbatim diverse catcodes ändern):

    http://www.tex.ac.uk/cgi-bin/texfaq2...bel=verbwithin

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.07.2009
    Beiträge
    23
    Hi,

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

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

    Code:
    \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:
    Code:
    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:
    Code:
    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

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    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:

    Code:
    \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}

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.07.2009
    Beiträge
    23
    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
    Geändert von einheitlix (20-09-2009 um 13:08 Uhr)

  6. #6
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hallo,


    Zitat Zitat von einheitlix Beitrag anzeigen
    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:
    Code:
    \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

  7. #7
    Registrierter Benutzer
    Registriert seit
    09.07.2004
    Beiträge
    2.365
    Code:
    \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

  8. #8
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von einheitlix Beitrag anzeigen
    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!

    Code:
    \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

  9. #9
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von u_fischer Beitrag anzeigen
    Das ist eine Variante dieses Problems (listings muss wie verbatim diverse catcodes ändern):

    http://www.tex.ac.uk/cgi-bin/texfaq2...bel=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

  10. #10
    Registrierter Benutzer
    Registriert seit
    02.07.2009
    Beiträge
    23
    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/showthre...019#post301019

    Beste Gruesse,

    Malte

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •