listing - Code mit mehreren Farben für keywordstyle

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: listing - Code mit mehreren Farben für keywordstyle

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

von KOMA » Fr 16. Sep 2022, 10:12

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

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

von ich meine ja nur » Di 13. Sep 2022, 08:48

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.

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

von gotex » Mo 12. Sep 2022, 11:57

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?

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

von KOMA » Do 8. Sep 2022, 14:01

\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.

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

von gotex » Do 8. Sep 2022, 12:55

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.

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

von Gute*r Gȧst*in » Do 8. Sep 2022, 08:50

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.

listing - Code mit mehreren Farben für keywordstyle

von gotex » Mi 7. Sep 2022, 21:38

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

Nach oben