lstlisting: Kombination aus literate (replace) und moredelim

Schriftbild, Absätze und Auflistungen einstellen


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

lstlisting: Kombination aus literate (replace) und moredelim

Beitrag von iTob »

Hallo,


ich suche nach einer Lösung, in – via lstlisting gesetztem – LaTeX-Code, die Argumente von Befehlen automatisch Kursiv und in spitzen Klammern zu setzten.
Hier zunächst das Beispiel:
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{beramono}
\usepackage{listings}
\lstloadlanguages{[LaTeX]TeX}
\lstset{%
	language=[LaTeX]TeX,
	basicstyle=\ttfamily,
	tabsize=3,
	flexiblecolumns,
	literate={<}{$\langle$}{1} {>}{$\rangle$}{1},% evtl. auskommentieren
	morecomment=*[s][\bfseries\color{blue}]{[}{]},
	morecomment=*[s][\bfseries]{\{}{\}},
	moredelim=**[s][\normalfont\itshape]{<}{>},
	morecomment=**[l][\color{red}\normalfont\itshape]{\%},
}
	
\begin{document}
so sieht es aus -- je nachdem ob man die literate-Zeile
auskommentiert
\begin{lstlisting}
	\usepackage{<Paketname>}
\end{lstlisting}


Aber so soll es aussehen \texttt{\textbackslash \textbf{usepackage\{}{\normalfont\itshape$\langle$Paketname$\rangle$}\texttt{\}}}
\end{document}
Dabei kann ich jetzt entweder dafür sorgen, dass das Argument kursiv wird und in Größer-Kleiner-Zeichen gesetzt wird, dazu nutze ich dann die moredelim-Funktion oder aber ich ersetze die Größer-Kleiner-Zeichen durch richtige spitze Klammern (l/rangle oder text(l/r)angle).
Hat jemand eine Idee, wie ich beides Kombinieren kann?


Viele Grüße
Tobi

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

Beitrag von iTob »

Hat keiner eine Idee?


Ich müsste ja nur irgendwie die Reihenfolge von delim und literate steuern können oder aber bei delim das mit literate ersetze Zeichen ansprechen. Letzteres ist mir aber bisher nicht gelungen :(



Viele Grüße
Tobi

CrazyHorse
Forum-Guru
Forum-Guru
Beiträge: 252
Registriert: Di 16. Mär 2010, 09:39

Beitrag von CrazyHorse »

iTob hat geschrieben: Ich müsste ja nur irgendwie die Reihenfolge von delim und literate steuern können oder aber bei delim das mit literate ersetze Zeichen ansprechen. Letzteres ist mir aber bisher nicht gelungen :(
eine bessere weiß ich auch nicht:
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{beramono}
\usepackage{listings}
\lstloadlanguages{[LaTeX]TeX}
\lstset{%
   language=[LaTeX]TeX,
   basicstyle=\ttfamily,
   tabsize=3,
   flexiblecolumns,
   literate={<}{$\langle$}{1} {>}{$\rangle$}{1},% evtl. auskommentieren
   morecomment=*[s][\bfseries\color{blue}]{[}{]},
   morecomment=*[s][\bfseries]{\{}{\}},
   morecomment=**[l][\color{red}\normalfont\itshape]{\%},
  escapeinside={<}{>}
}
   
\begin{document}
so sieht es aus -- je nachdem ob man die literate-Zeile
auskommentiert
\begin{lstlisting}
   \usepackage{<\it Paketname>}
\end{lstlisting}

\end{document}
Herbert

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

Beitrag von iTob »

Nabend und danke Herbert,

aber das Hilft mir leider wenig. Ich wollte ja gerne, dass es automatisch geht. Das Problem – in meinem Beispiel – ist offensichtlich dass, zunächst die Ersetzungen ausgeführt werden (also < durch $\langle$) und anschließend nach den delimitern (< und >) gesucht wird, die dann natürlich nicht mehr gefunden werden. Wenn ich jetzt aber ganz naiv versuche $\langle$ als Delimiter anzugeben, bekomme ich den Fehler
[...]

! Improper alphabetic constant.
<to be read again>
\langle
l.19 }
A one-character control sequence belongs after a ` mark.
So I'm essentially inserting \0 here.
! Missing $ inserted.

[...]
Das geht aber leider nicht.

Gäbe es denn eventuell ein anderes Paket, das meine Wünsche erfüllen könnte.


Außerdem hat mich dein Vorschlag noch auf einen Workaround gebracht. (Lösung 2)
\documentclass{article} 
\usepackage[latin1]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage{xcolor} 
\usepackage{beramono} 
\usepackage{listings} 
\lstloadlanguages{[LaTeX]TeX} 
\lstset{% 
   language=[LaTeX]TeX, 
   basicstyle=\ttfamily, 
   tabsize=3, 
   flexiblecolumns,
   escapechar={*}, % Lösung 2
%   literate={<}{$\langle$}{1} {>}{$\rangle$}{1},% Lösung 1
   morecomment=*[s][\bfseries\color{blue}]{[}{]}, 
   morecomment=*[s][\bfseries]{\{}{\}},
%   moredelim=**[is][\normalfont\itshape]{<}{>},% Lösung 1
   morecomment=**[l][\color{red}\normalfont\slshape]{\%},
} 

\newcommand{\marg}[1]{% Lösung 2
   {\normalfont\textit{$\langle$#1$\rangle$}}%
}


\begin{document} 

%Lösung 1
%\begin{lstlisting} 
%   \usepackage{<Paketname>} 
%\end{lstlisting} 

Lösung 2
\begin{lstlisting} 
   \usepackage{*\marg{Paketname}*} 
\end{lstlisting} 

\end{document}

Viele Grüße!
Tobi

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

Beitrag von iTob »

Hallo,


ich hoffe, ihr habe alle Weihnachten gut überstanden!
Mir ist eben noch eine dritte Lösung – eher ein zweiter Wokraround – eingefallen, ich verwende einfach zwei Zeichen, eines (<,>), dass mir die spitzen Klammern liefert und ein Anderes (*), dass für die Formatierung sorgt.

Hier das entsprechend ergänzte Beispiel:
\documentclass{article}
\usepackage[latin1]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage{xcolor} 
\usepackage{beramono,textcomp} 
\usepackage{listings} 
\lstloadlanguages{[LaTeX]TeX} 
\lstset{% 
   language=[LaTeX]TeX, 
   basicstyle=\ttfamily, 
   tabsize=3, 
   flexiblecolumns,
%   escapechar={*}, % Lösung 2
   literate={<}{\textlangle}{1} {>}{\textrangle}{1},% Lösung 1 und 3
   morecomment=**[s][\bfseries\color{blue}]{[}{]},% bei Lösung 3 mit **, sonst mit * 
   morecomment=*[s][\bfseries]{\{}{\}},
%   moredelim=**[is][\normalfont\itshape]{<}{>},% Lösung 1
   moredelim=**[is][\rmfamily\mdseries]{*}{*},% Lösung 3
   morecomment=**[l][\color{red}\normalfont\itshape]{\%},   
} 

\newcommand{\marg}[1]{% Lösung 2
   \textit{$\langle$#1$\rangle$}%
}
\newcommand{\oarg}[1]{% Lösung 2
   \textcolor{blue}{\textit{$\langle$#1$\rangle$}}%
}


\begin{document} 

%Lösung 1
%\begin{lstlisting} 
%   \usepackage{<Paketname>} 
%\end{lstlisting} 

%Lösung 2
%\begin{lstlisting} 
%   \usepackage[*\oarg{Paketoptionen}*]{*\marg{Paketname}*} 
%\end{lstlisting}

Lösung 3
\begin{lstlisting} 
   \usepackage[*<opt. Argument>*]{*<Paketname>*}% Kommentarzeile
\end{lstlisting} 

\end{document}

Würde mich aber dennoch über Vorschläge freuen, wie ich mit nur < und > das gewünschte Ergebnis erzielen kann.


Viele Grüße und
schonmal
guten Rutsch!
Tobi

Antworten