listings: verschiedene Strings unterscheiden

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


knox
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Mo 23. Mai 2011, 21:11

listings: verschiedene Strings unterscheiden

Beitrag von knox »

Hallo zusammen,

ist es möglich beim Definieren einer eigenen Sprache mittels \lstdefinelanguage verschiedene strings zu unterscheiden und somit unterschiedlich hervorzuheben? Z.B. "Strings mit doppelten Hochkomma" anders als 'Strings in einzelnen Hochkomma'.

Kommentare benötige ich aber seperat.

Viele Grüße und besten Dank!

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Du kannst die Optionen morecomment und moredelim verwenden. Mehr dazu in der Anleitung. Wenn du damit Probleme hast, fertige bitte ein vollständiges Minimalbeispiel mit einer konkreten Fragestellung an,

knox
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Mo 23. Mai 2011, 21:11

Beitrag von knox »

Hi, dank dir für die schnelle antwort.

Anbei ein funktionierendes Minimalbeispiel das an sich bereits alles tut was es soll. Nun hätte ich es allerdings gerne, dass bei den Strings die " nicht mit eingefärbt werden.

Hat dazu jemand einen Tipp, oder ist das gar nicht so einfach möglich?
\documentclass{scrreprt} 

\usepackage[usenames,dvipsnames]{color}
\usepackage{listings}
\usepackage{color}

\definecolor{gray}{rgb}{0.4,0.4,0.4}
\definecolor{darkblue}{rgb}{0.0,0.0,0.6} 
\definecolor{cyan}{rgb}{0.0,0.6,0.6} 

\lstset{ 
  basicstyle=\ttfamily, 
  columns=fullflexible, 
  showstringspaces=false, 
  commentstyle=\color{gray}\upshape 
} 


\lstdefinelanguage{XML} 
{ 
  morecomment=[s][\color{red}]{"}{"},
  morestring=[s]{>}{<}, 
  morecomment=[s]{<?}{?>}, 
  stringstyle=\color{black}, 
  identifierstyle=\color{darkblue}, 
  keywordstyle=\color{cyan}, 
  morekeywords={xmlns,version,type,TimeStamp,TempUnit,Interval,IntervalUnit,StartTime,serializeAs} % name
} 

\begin{document} 
\lstinputlisting[language=XML]{listing1.xml}
\end{document}


listing1.xml
<?xml version="1.0" encoding="utf-8"?>
<TempLog TempUnit="Celsius" Interval="1" IntervalUnit="Second" StartTime="21.05.11 20:13" EndTime="21.05.11 20:14">
  <probe TimeStamp="21.05.11 20:13:40">21</probe>
</TempLog>

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Gutes Beispiel. Man hätte noch ein paar Zeilen sparen können, wenn man die vordefinierten Farben nimmt. Und warum lädst du color zweimal? Es wird ohnehin empfohlen xcolor stattdessen zu benutzen.

Hier eine mögliche Lösung, in der die farbigen " einfach ersetzt (literate) werden durch schwarze Zeichen.
\begin{filecontents*}{listing1.xml}
<?xml version="1.0" encoding="utf-8"?> 
<TempLog TempUnit="Celsius" Interval="1" IntervalUnit="Second" StartTime="21.05.11 20:13" EndTime="21.05.11 20:14"> 
  <probe TimeStamp="21.05.11 20:13:40">21</probe> 
</TempLog>
\end{filecontents*}

\documentclass{scrreprt} 

\usepackage{listings} 
\usepackage{xcolor} 


\lstset{ 
  basicstyle=\ttfamily, 
  columns=fullflexible, 
  showstringspaces=false, 
  commentstyle=\color{gray}\upshape 
} 


\lstdefinelanguage{XML} 
{ 
  morecomment=[s][\color{red}]{"}{"}, 
  morestring=[s]{>}{<}, 
  morecomment=[s]{<?}{?>}, 
  stringstyle=\color{black}, 
  identifierstyle=\color{blue}, 
  keywordstyle=\color{green}, 
  morekeywords={xmlns,version,type,TimeStamp,TempUnit,Interval,IntervalUnit,StartTime,serializeAs}, % name 
  literate={"}{\textcolor{black}{"}}{1},
} 

\begin{document} 
\lstinputlisting[language=XML]{listing1.xml} 
\end{document}
Außerdem habe ich dein Beispiel mal so geändert, dass das Listing direkt eingebunden ist. Mehr zu filecontents findest du auch im Wiki des Forums …

Tobi

knox
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Mo 23. Mai 2011, 21:11

Beitrag von knox »

Vielen Dank. Nun Sind die Strings aber wieder blau statt rot. Das mit den XML-Files ist so gewollt, da sie aus anderen Programmen exportiert werden und etwas länger sind als hier angegeben.

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Das du „in echt“ mit deinen Listings bzw. dem Einbinden selbiger anders umgehst ist klar, die filecontents-Umgebung wollte ich dir nur für Minimalbeispiele zeigen.

Das das Rot dann verschwindet hab’ ich nicht gesehen, sorry. Dann fällt mir nur ein, mit zwei Zeichen zu arbeiten.
\documentclass{scrreprt} 

\usepackage{listings} 
\usepackage{xcolor} 


\lstset{ 
  basicstyle=\ttfamily, 
  columns=fullflexible, 
  showstringspaces=false, 
  commentstyle=\color{gray}\upshape 
} 


\lstdefinelanguage{XML} 
{ 
  moredelim=*[is][\color{red}]{+}{+}, 
  morestring=[s]{>}{<}, 
  morecomment=[s]{<?}{?>}, 
  stringstyle=\color{black}, 
  identifierstyle=\color{blue}, 
  keywordstyle=\color{green}, 
  morekeywords={xmlns,version,type,TimeStamp,TempUnit,Interval,IntervalUnit,StartTime,serializeAs,"}, % name 
%  literate={"}{+"}{1},
} 

\begin{document} 
\begin{lstlisting}[language=XML]
  <probe TimeStamp="+21.05.11 20:13:40+">21</probe> 
\end{lstlisting}
\end{document}
Das i in der Definition vom Plus, sorgt dafür, dass es nicht ausgegeben wird.

Antworten