listing - Code mit mehreren Farben für keywordstyle

Schriftbild, Absätze und Auflistungen einstellen


gotex
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Mo 5. Sep 2022, 12:38

listing - Code mit mehreren Farben für keywordstyle

Beitrag von gotex »

Hey, ich habe einen Code aus Python den ich gerne in meine Arbeit integrieren würde. Klappt alles auch soweit. Nun ist das Problem, dass ich mit den Standard Befehlen wie keywordstyle, commandstyle etc. arbeiten kann. Jedoch möchte ich dass einige Zeichen wie %,=,+,Zahlen,... auch in einer bestimmten Farbe dargestellt werden sollen. Dazu habe ich eine Möglichkeit gefunden die aber nur für % gilt und wenn ich den gleichen Code einfach nur mehrmals mit den anderen Zeichen Wiederhole funktioniert es auch nicht. Gibt es denn generell ne Möglichkeit es wie bei keywordstyle oder so zu implementieren oder wenn nicht welche Tricks könnte ich sonst anwenden um mehrere Arten von Zeichen farbig darzustellen? Mein Minimalbeispiel ist so:
\documentclass[12pt,a4paper,oneside,ngerman]{scrbook}
\usepackage[english,ngerman]{babel}

\usepackage{textcomp,amsmath,amsfonts,booktabs,microtype,graphicx,enumitem,caption,nicematrix,eurosym}
\usepackage{xcolor}
\usepackage{listings}

\definecolor{light-gray}{gray}{0.95}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{codegray}{rgb}{0.4,0.4,0.4}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codered}{rgb}{0.8,0.25,0.33}
\definecolor{codeblue}{rgb}{0,0.58,0.71}
\lstset{literate={\%}{{{\color{codepurple}\%}}}1}


\lstdefinestyle{mystyle}{
  backgroundcolor=\color{light-gray},  commentstyle=\color{codeblue},
  stringstyle=\color{codered},
  keywordstyle=\color{codegreen},
  numberstyle=\tiny\color{codegray},
  basicstyle=\ttfamily\footnotesize,
  breakatwhitespace=false,         
  breaklines=true,                 
  captionpos=b,                    
  keepspaces=true,                 
  numbers=left,                    
  numbersep=5pt,                  
  showspaces=false,                
  showstringspaces=false,
  showtabs=false,                  
  tabsize=2
}

\lstset{style=mystyle}

\begin{document}

\begin{lstlisting} [language=Python]
tasks = []
for y in range(1,worksheet.nrows): 
    tasks.append((worksheet.cell_value(y,1))) 
\end{lstlisting}

\end{document}
Ich habe den Codezeile für das farbig machen von % fett hervorgehoben. Wie man sieht funktioniert das Grün wie es soll, das lila für % auch aber genau dass soll auch das = farbig machen. Vielen Dank

Gute*r Gȧst*in

Re: listing - Code mit mehreren Farben für keywordstyle

Beitrag von Gute*r Gȧst*in »

Bei mir funktioniert:
\documentclass[12pt,a4paper,oneside,ngerman]{scrbook}
\usepackage[english,ngerman]{babel}

\usepackage{textcomp,amsmath,amsfonts,booktabs,microtype,graphicx,enumitem,caption,nicematrix,eurosym}% min. textcomp braucht es AFAIK inzwischen nicht mehr
\usepackage{xcolor}
\usepackage{listings}

\definecolor{light-gray}{gray}{0.95}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{codegray}{rgb}{0.4,0.4,0.4}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codered}{rgb}{0.8,0.25,0.33}
\definecolor{codeblue}{rgb}{0,0.58,0.71}
\lstset{literate={\%}{{{\color{codepurple}\%}}}1}


\lstdefinestyle{mystyle}{
  backgroundcolor=\color{light-gray},  commentstyle=\color{codeblue},
  stringstyle=\color{codered},
  keywordstyle=\color{codegreen},
  numberstyle=\tiny\color{codegray},
  basicstyle=\ttfamily\footnotesize,
  breakatwhitespace=false,         
  breaklines=true,                 
  captionpos=b,                    
  keepspaces=true,                 
  numbers=left,                    
  numbersep=5pt,                  
  showspaces=false,                
  showstringspaces=false,
  showtabs=false,                  
  tabsize=2
}

\lstset{style=mystyle}

\begin{document}

\begin{lstlisting} [language=Python,literate={=}{{{\color{codepurple}=}}}1]
tasks = []
for y in range(1,worksheet.nrows): 
    tasks.append((worksheet.cell_value(y,1))) 
\end{lstlisting}

\end{document}
Ich vermute daher, dass du in erster Linie die Reihenfolge von Einstellungen nicht beachtet hast. Wenn du sowohl mit \lstdefinestyle, als auch \lstset, als auch Optionen zu lstlisting arbeitest, dann kann es natürlich passieren, dass beispielsweise die Sprachauswahl frühere Einstellungen von \lstset wieder überschreibt. Ebenso kann eine spätere style-Einstellung vorherige Einstellungen, die nicht an den Stil gebunden sind, überschreiben. Wenn du also spezielle Einstellungen für Python haben willst, dann definiere einen Stil, bei dem erst die Sprache und dann die davon abweichenden Einstellungen vorgenommen werden. Oder definiere gleich eine neue Umgebung PythonCode (Anleitung dazu beachten!), bei der alle Einstellungen wunschgemäß vorgenommen werden.

BTW: Mir gefällt übrigens die Darstellung mit minted besser. Ob damit auch die Farbe einzelner Zeichen geändert werden kann, weiß ich aber nicht. Solche Anforderungen hatte ich noch nie. Eine weitere Alternative wäre hvpygmentex. Das habe ich mir aber noch nicht angeschaut.

gotex
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Mo 5. Sep 2022, 12:38

Re: listing - Code mit mehreren Farben für keywordstyle

Beitrag von gotex »

Wie kann ich im Vorfeld definieren, dass alle meine Codes in der Sprache Python sind, ohne das dann bei \begin{lstlistings} eingeben zu müssen? Ich nehme mal an, dass das der Vorschlag war.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2879
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Re: listing - Code mit mehreren Farben für keywordstyle

Beitrag von KOMA »

\documentclass[12pt,a4paper,oneside,% Einseitig gedrucktes Buch??? Oder doch eher scrreprt?
  ngerman]{scrbook}
\usepackage[english,ngerman]{babel}

\usepackage{xcolor}
\usepackage{listings}

\definecolor{light-gray}{gray}{0.95}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{codegray}{rgb}{0.4,0.4,0.4}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codered}{rgb}{0.8,0.25,0.33}
\definecolor{codeblue}{rgb}{0,0.58,0.71}

\lstdefinestyle{Python}{% Stil definieren
  language=Python,% einschließlich Sprache
  backgroundcolor=\color{light-gray},  commentstyle=\color{codeblue},
  stringstyle=\color{codered},
  keywordstyle=\color{codegreen},
  numberstyle=\tiny\color{codegray},
  basicstyle=\ttfamily\footnotesize,
  breakatwhitespace=false,         
  breaklines=true,                 
  captionpos=b,                    
  keepspaces=true,                 
  numbers=left,                    
  numbersep=5pt,                  
  showspaces=false,                
  showstringspaces=false,
  showtabs=false,                  
  tabsize=2,
  literate={\%}{{{\color{codepurple}\%}}}1,% und allem
  literate={=}{{{\color{codepurple}=}}}1% anderen
}

\begin{document}

% Stil verwenden (Sprache ist in obiger Stildefinition enthalten):
\begin{lstlisting}[style=Python]
tasks = []
for y in range(1,worksheet.nrows): 
    tasks.append((worksheet.cell_value(y,1))) 
\end{lstlisting}

\end{document}
Hinweis: Fragen und Lösungen zu listings liegen außerhalb meiner Wohlfühlzone. Ich habe deshalb auch nur den gezeigten Code entsprechend der Frage angepasst.

Hinweis: Alternativ kann man auch einige Einstellungen in einem allgemeinen Stil definieren, den man dann im Stil Python nach dem Einstellen der Sprache ebenfalls aufruft. Man kann also in einer Stildefinition eine andere Stildefinition verwenden.

Hinweis: Man kann auch eine eigene Umgebung mit \lstnewenvironment definieren, wie das in Abschnitt 4.5 von listings am Beispiel einer Umgebung für Pascal-Code gezeigt wird. Dabei würde man dann im Prinzip alles aus obiger Stildefinition in eine entsprechende \lstset-Anweisung packen.

gotex
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Mo 5. Sep 2022, 12:38

Re: listing - Code mit mehreren Farben für keywordstyle

Beitrag von gotex »

Bei der Lösung von KOMA funktioniert das immer nur für ein Zeichen, d.h. wenn % farbig angezeigt wird dann = nicht und anders rum genauso. Wie kann ich das für mehrere Zeichen implementieren?

ich meine ja nur

Re: listing - Code mit mehreren Farben für keywordstyle

Beitrag von ich meine ja nur »

Kurzer Blick in Abschnitt 5.4 der listings-Anleitung offenbart, dass man mehrere literate-Argumente direkt hintereinander setzen kann
\documentclass[12pt,a4paper,oneside,% Einseitig gedrucktes Buch??? Oder doch eher scrreprt?
  ngerman]{scrbook}
\usepackage[english,ngerman]{babel}

\usepackage{xcolor}
\usepackage{listings}

\definecolor{light-gray}{gray}{0.95}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{codegray}{rgb}{0.4,0.4,0.4}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codered}{rgb}{0.8,0.25,0.33}
\definecolor{codeblue}{rgb}{0,0.58,0.71}

\lstdefinestyle{Python}{% Stil definieren
  language=Python,% einschließlich Sprache
  backgroundcolor=\color{light-gray},  commentstyle=\color{codeblue},
  stringstyle=\color{codered},
  keywordstyle=\color{codegreen},
  numberstyle=\tiny\color{codegray},
  basicstyle=\ttfamily\footnotesize,
  breakatwhitespace=false,         
  breaklines=true,                 
  captionpos=b,                    
  keepspaces=true,                 
  numbers=left,                    
  numbersep=5pt,                  
  showspaces=false,                
  showstringspaces=false,
  showtabs=false,                  
  tabsize=2,
  literate={\%}{{{\color{codepurple}\%}}}1% und allem
  {=}{{{\color{codepurple}=}}}1% anderen
}

\begin{document}

% Stil verwenden (Sprache ist in obiger Stildefinition enthalten):
\begin{lstlisting}[style=Python]
tasks = [] % 5
for y in range(1,worksheet.nrows): 
    tasks.append((worksheet.cell_value(y,1))) 
\end{lstlisting}

\end{document}
Man kann auch Strings und Kommentare von der Ersetzung ausnehmen. Wie steht ebenfalls in der Erklärung zu literate im genannten Abschnitt der Anleitung.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2879
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Re: listing - Code mit mehreren Farben für keywordstyle

Beitrag von KOMA »

@ich meine ja nur: Danke für die Korrektur. Wie gesagt: listings ist nicht meins.

Antworten