Seite 1 von 1
lstlisting: Kombination aus literate (replace) und moredelim
Verfasst: So 19. Dez 2010, 17:17
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
Verfasst: Do 23. Dez 2010, 13:07
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
Verfasst: Do 23. Dez 2010, 17:21
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
Verfasst: Fr 24. Dez 2010, 00:58
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
Verfasst: So 26. Dez 2010, 14:32
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