Seite 1 von 1

Einfärben von Wörtern in Listings

Verfasst: Fr 27. Jul 2012, 08:09
von danielcramer
Moin Leute,

ich habe folgenden Code
\documentclass[11pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{listings}
\usepackage{color} 
\definecolor{hellgelb}{rgb}{1,1,0.9}
\definecolor{colKeys}{RGB}{0,0,255}
\definecolor{colIdentifier}{rgb}{0,0,0}
\definecolor{colComments}{rgb}{1,0,0}
\definecolor{buchstaben}{RGB}{64,64,128}
\definecolor{colString}{rgb}{0.25,0.25,0.5}

\lstset{
	numbers=left,numberstyle=\tiny,breaklines=true,
	classoffset=0,
	morekeywords={},keywordstyle=\color{black},
	classoffset=1,
	morekeywords={Material,Zeit,Lieferant,delta,lambda,gamma,q,z,p,d,s},keywordstyle=\color{buchstaben},
	classoffset=2,
	morekeywords={int, string, dvar, {int+}, sum, forall, in, boolean, minimize, subject to, execute, tuple, float},keywordstyle=\color{blue},
	classoffset=0}% restore default
	
\begin{document}

\begin{lstlisting} [caption={ein paar Zeilen code}\label{lst:test123},captionpos=t] 
SELECT Count(*) AS Anforderungen, Bestellanforderung.[Lieferant-Name], Sum(Bestellanforderung.Kosten) AS Gesamtkosten, Sum([Bestellanforderung-Inhalte].Anforderungsmenge) AS Gesamtverbrauch
FROM Materialart, [Bestellanforderung-Inhalte], Bestellanforderung
WHERE ((([Bestellanforderung-Inhalte].[Materialart-Materialnummer])=[Materialart].[Materialnummer]) AND ((Bestellanforderung.Bestellanforderungsnummer)=[Bestellanforderung-Inhalte].[Bestellanforderung-Bestellanforderungsnummer]) AND ((Bestellanforderung.Bestellanforderungsposition)=[Bestellanforderung-Inhalte].[Bestellanforderung-Bestellanforderungsposition]))
GROUP BY Bestellanforderung.[Lieferant-Name]
HAVING (((Count(*))>=15) AND ((Sum(Bestellanforderung.Kosten))>=1500) AND ((Sum([Bestellanforderung-Inhalte].Anforderungsmenge))>=10));
 \end{lstlisting}

\begin{lstlisting}[caption={Definition der Parameter},label={parameter_OPL1},firstnumber=5,literate=%
{ü}{{\"u}}1 
{ä}{{\"a}}1 
{ö}{{\"o}}1]
{string}	Material    = ...;
{int}   	Zeit		= ...;
{string}	Lieferant  	= ...;

float z[Material]				= ...;
float p[Material][Lieferant]	= ...;
float d[Material][Zeit]			= ...;
float s[Material]				= ...;

dvar int+        	  	 q[Material][Zeit];
dvar boolean      gamma[Material][Zeit];
dvar boolean     lambda[Material][Zeit];
dvar boolean      delta[Material][Lieferant];
\end{lstlisting}

\end{document}
Ich habe in meiner Arbeit 2 verschiedene Listings sowie vordefinierte Farben für bestimmte Wörter. Ich möchte jedoch, dass die Einfärbungen bei dem 1.Listing nicht vorgenommen werden, sondern nur bei dem 2. (und ggf. folgenden).
(In Listing 1 ist "Lieferant" eingefärbt (dieser soll hier aber schwarz sein) - in Listing 2 ist das so gewollt)

Hat jemand einen Rat?

Verfasst: Fr 27. Jul 2012, 08:22
von bloodworks
Hallo mit
\lstdefinestyle{⟨style name⟩}{⟨key=value list⟩}
kannst du sog. Stile erstellen und lokal aufrufen.

Danke

Verfasst: Fr 27. Jul 2012, 09:18
von danielcramer
Frage wurde beantwortet!

Hier nochmal mein Beispiel mit deinen Hinweisen (ggf. für den Rest der Community)
\documentclass[11pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{listings}
\usepackage{color} 
\definecolor{hellgelb}{rgb}{1,1,0.9}
\definecolor{colKeys}{RGB}{0,0,255}
\definecolor{colIdentifier}{rgb}{0,0,0}
\definecolor{colComments}{rgb}{1,0,0}
\definecolor{buchstaben}{RGB}{64,64,128}
\definecolor{colString}{rgb}{0.25,0.25,0.5}

\lstdefinestyle{OPLStyle}{numbers=left,numberstyle=\tiny,breaklines=true,
	classoffset=0,
	morekeywords={},keywordstyle=\color{black},
	classoffset=1,
	morekeywords={Material,Zeit,Lieferant,delta,lambda,gamma,q,z,p,d,s},keywordstyle=\color{buchstaben},
	classoffset=2,
	morekeywords={int, string, dvar, {int+}, sum, forall, in, boolean, minimize, subject to, execute, tuple, float},keywordstyle=\color{blue},
	classoffset=0}% restore default}
	
\lstdefinestyle{SQLStyle}{numbers=left,numberstyle=\tiny,breaklines=true,
	classoffset=0,
	morekeywords={},keywordstyle=\color{black},
	classoffset=1,
	morekeywords={Material,Zeit,delta,lambda,gamma,q,z,p,d,s},keywordstyle=\color{buchstaben},
	classoffset=0
	columns=flexible,
	    tabsize=2,
	    frame=single,
	    extendedchars=true,
	    showspaces=false,
	    showstringspaces=false,
	    numbers=left,
	    numberstyle=\tiny,
	    breaklines=true,
	    backgroundcolor=\color{hellgelb},
	    breakautoindent=true,
	}% restore default}	
	
\begin{document}

\begin{lstlisting} [caption={ein paar Zeilen code}\label{lst:test123},captionpos=t, style=SQLStyle] 
SELECT Count(*) AS Anforderungen, Bestellanforderung.[Lieferant-Name], Sum(Bestellanforderung.Kosten) AS Gesamtkosten, Sum([Bestellanforderung-Inhalte].Anforderungsmenge) AS Gesamtverbrauch
FROM Materialart, [Bestellanforderung-Inhalte], Bestellanforderung
WHERE ((([Bestellanforderung-Inhalte].[Materialart-Materialnummer])=[Materialart].[Materialnummer]) AND ((Bestellanforderung.Bestellanforderungsnummer)=[Bestellanforderung-Inhalte].[Bestellanforderung-Bestellanforderungsnummer]) AND ((Bestellanforderung.Bestellanforderungsposition)=[Bestellanforderung-Inhalte].[Bestellanforderung-Bestellanforderungsposition]))
GROUP BY Bestellanforderung.[Lieferant-Name]
HAVING (((Count(*))>=15) AND ((Sum(Bestellanforderung.Kosten))>=1500) AND ((Sum([Bestellanforderung-Inhalte].Anforderungsmenge))>=10));
 \end{lstlisting}

\begin{lstlisting}[caption={Definition der Parameter},label={parameter_OPL1},style=OPLStyle]
{string}	Material    = ...;
{int}   	Zeit		= ...;
{string}	Lieferant  	= ...;
float z[Material]				= ...;
float p[Material][Lieferant]	= ...;
float d[Material][Zeit]			= ...;
float s[Material]				= ...;
dvar int+        	  	 q[Material][Zeit];
dvar boolean      gamma[Material][Zeit];
dvar boolean     lambda[Material][Zeit];
dvar boolean      delta[Material][Lieferant];
\end{lstlisting}

\end{document}

eine letzte Frage

Verfasst: Fr 27. Jul 2012, 09:33
von danielcramer
In meinem Codeschnipsel habe ich ein keyword eingetragen (int+) - dieses soll in einer Farbe ausgegeben werden. LaTex nimmt sich dem aber nicht an, d.h. dass er den mathematischen Operator schwarz setzt - dieser soll aber ebenso blau sein, jedoch nur im Zusammenhang mit dem "int".
Weiß jemand was?

Verfasst: Fr 27. Jul 2012, 10:03
von bloodworks
Hi ich habe mal das Bsp etwas vereinfacht:
Zudem die classofset rausgenommen. Der Sinn ist mir hier nicht ganz klar, zumal das Ergebnis das gleiche ist.
\documentclass[11pt,a4paper]{article} 
\usepackage[latin1]{inputenc} 
\usepackage{listings} 
\usepackage{color} 
\definecolor{hellgelb}{rgb}{1,1,0.9} 
\definecolor{colKeys}{RGB}{0,0,255} 
\definecolor{colIdentifier}{rgb}{0,0,0} 
\definecolor{colComments}{rgb}{1,0,0} 
\definecolor{buchstaben}{RGB}{64,64,128} 
\definecolor{colString}{rgb}{0.25,0.25,0.5} 

\lstdefinestyle{OPLStyle}{numbers=left,numberstyle=\tiny,breaklines=true, columns=fixed,basewidth={.6em,.45em},
    morekeywords={Material,Zeit,Lieferant,delta,lambda,gamma,q,z,p,d,s},keywordstyle=\color{buchstaben}, 
    morekeywords={int, string, dvar, sum, forall, in, boolean, minimize, subject to, execute, tuple, float},keywordstyle=\color{blue}, 
    literate={ {int+}}{{\color{blue}\  i\kern.2em n\kern.2em t+}}4 {+}{{\color{black}+}}1
}% restore default} 

\begin{document} 


\begin{lstlisting}[caption={Definition der Parameter},label={parameter_OPL1},style=OPLStyle] 
{string}   Material    = ...; 
{int}      Zeit      = ...; 
{string}   Lieferant     = ...; 
 float z[Material]            = ...; 
 float p[Material][Lieferant]   = ...; 
 float d[Material][Zeit]         = ...; 
 float s[Material]            = ...; 
 dvar int+                 q[Material][Zeit]; 
 dvar boolean      gamma[Material][Zeit]; 
 dvar boolean     lambda[Material][Zeit]; 
 dvar boolean      delta[Material][Lieferant]; 
 ++ int int +
\end{lstlisting} 

\end{document} 
  
  
Kurz zu Erklärung ich habe die literate (ersetzten) Funktion von listings verwendet um genau das int+ Konstrukt herauszufiltern. Im zweiten literate filtere ich dann das + heraus und setzte es schwarz. Das sollte jetzt eigentlich in jeder Situation funktionieren.

Verfasst: Sa 28. Jul 2012, 09:19
von danielcramer
Danke für die Hilfe - funktioniert genau so, wie ich es wollte...

Eine abschließende Frage habe ich jedoch noch:

Die ganze Keyword-Geschichte benutze ich zum Einfärben von Wörtern. Ich möchte zum Schluss einen ganzen Quellcode ausgeben: Dabei habe ich das Wörtchen "in" in meinem normalen Style blau eingefärbt (für das Listing ist das auch so gewünscht). Jedoch habe ich ab einer bestimmten Zeile den Wunsch, dass das "in" nun rot dargestellt wird (beachte: immernoch im selben Listing).
Kann ich daher innerhalb eines Listings den Style abändern?
%\lstset{literate={ {in}}{{\color{yellow}\  i\kern.2em n\kern.2em t+}}4 {+}{{\color{black}+ }}1} %
%\lstset{emph={in},emphstyle=\color{yellow}}%
%\lstset{morekeywords={for,var,if,in,else},keywordstyle=\color{ausgabe}}%
Hatte an sowas gedacht (sind 3 verschiedene Varianten) -- aber keins funktioniert so richtig...
P.S.: % ist als escapechar in lstset definiert