Seite 1 von 1
listings: verschiedene Strings unterscheiden
Verfasst: Sa 28. Mai 2011, 00:48
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!
Verfasst: Sa 28. Mai 2011, 09:55
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,
Verfasst: Sa 28. Mai 2011, 10:59
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>
Verfasst: Sa 28. Mai 2011, 11:52
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
Verfasst: Sa 28. Mai 2011, 12:39
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.
Verfasst: Sa 28. Mai 2011, 12:50
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.