Einfärben von Wörtern in Listings

Schriftbild, Absätze und Auflistungen einstellen


danielcramer
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: So 10. Jun 2012, 12:53

Einfärben von Wörtern in Listings

Beitrag 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?

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Hallo mit
\lstdefinestyle{⟨style name⟩}{⟨key=value list⟩}
kannst du sog. Stile erstellen und lokal aufrufen.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


danielcramer
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: So 10. Jun 2012, 12:53

Danke

Beitrag 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}

danielcramer
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: So 10. Jun 2012, 12:53

eine letzte Frage

Beitrag 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?

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag 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.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


danielcramer
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: So 10. Jun 2012, 12:53

Beitrag 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

Antworten