PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Listing morekeywords Problem



Disenchant
22-07-2007, 19:08
Hallo Zusammen,
wer weiss, eventuell kann mir jemand bei folgendem Problem helfen.

Ich mache meine Listings über das gleichnamige Packet und alles funktioniert soweit doch sollte ich über "morekeywords" noch ein paar weitere Keywords markieren können. Nehmen wir folgendes Beispiel:

morekeywords={aaa, bbb, ccc}

Hier funktioniert alles bestens und aaa, bbb sowie ccc erhalten den vordefinierten Style doch nun habe ich Dinge wie a.a, b.b oder c.c und nachfolgendes funktioniert nicht:

morekeywords={a.a, b.b, c.c}

Weiss jemand warum diese Keywords im Listing nicht gefunden werden bzw. wie ich es anstelle, damit diese gefunden werden?

Grüsse,
Disenchant

edico
23-07-2007, 06:51
Du musst lt. Doku Nichtbuchstaben (-zahlen) anmelden (Language definitions).

...
alsodigit = {.}% Users Guide-v1.4-2007-02-22, p.43
...
(ungetestet, da Minimalbeispiel fehlt)

edico

Disenchant
23-07-2007, 08:05
Hi edico,
vielen Dank, es war zwar die alsoletter={} und nicht die alsodigit={} Option doch funktioniert nun das, wonach ich gefragt habe. Leider ist die Sache wohl nocheinmal komplizierter. Wie gewünscht hier ein kurzes "Minimalbeispiel":

...
\lstset{
numbers=left,
numberstyle=\tiny,
showstringspaces=false,
numbersep=5pt,
basicstyle=\small,
breakatwhitespace=true,
breaklines=true,
tabsize=4,
commentstyle=\color{DGrey},
keywordstyle=\bfseries,
breaklines=true,
firstnumber=1,
extendedchars={true},
escapechar={\%},
alsoletter={.}
}
...
\newcommand{\abcdefg}{\textit{this.is.a.string.wit h.dotts}}

\begin{lstlisting}[morekeywords={\abcdefg{}}]{}
%\abcdefg{}
\end{lstlisting}
...

In diesem Listing möchte ich nun, dass "this.is.a.string.with.dotts", was durch \abcdefg{} im Listing und auch in die morekeywords Option eingefügt wird, als Keyword definieren und somit fettgedruckt (Bold) ausgeben lassen.

Leider wird der String nur erkannt, wenn ich ihn direkt in die morekeywords eintrage sowie in's Listing aber über das Command \abcdefg{} funktioniert es nicht.

Würde mich sehr über eine erneute Antwort freuen :)

Grüsse,
Disenchant

edico
23-07-2007, 18:04
Ich versteh das Problem, glaub ich, nicht.
Ist denn morekeywords überhaupt als key=value interface zu nützen? Wenn ich Deine Aussage richtig verstehe unter Berücksichtigung Deines von mir vermuteten Ergebnisses, dann dürfte dies nicht für diesen key gelten.
So
...
morekeywords={this.is.a.string.with.dotts,\abc},
...
ergeben sich auf alle Fälle IMHO die 'richtigen' Ergebnisse.

edico

Disenchant
23-07-2007, 18:30
Hi edico,
da ich noch LaTex Neuling bin, kann ich deine Frage leider nicht direkt beantworten aber ich kann's nochmal mit einem Beispiel versuchen:

...
\lstset{
numbers=left,
numberstyle=\tiny,
showstringspaces=false,
numbersep=5pt,
basicstyle=\small,
breakatwhitespace=true,
breaklines=true,
tabsize=4,
commentstyle=\color{DGrey},
keywordstyle=\bfseries,
breaklines=true,
firstnumber=1,
extendedchars={true},
escapechar={\%},
alsoletter={.}
}
...
\newcommand{\abc}{\textit{this.is.a.string.wit h.dotts}}

\begin{lstlisting}[morekeywords={this.is.a.string.with.dotts,\abc}]
this.is.a.string.with.dotts
%\abc{}
\end{lstlisting}

\end{document}
...

Die Ausgabe als PDF-File sieht dann etwa wie folgt aus:
this.is.a.string.wit h.dotts
this.is.a.string.wit h.dotts

Mein Problem ist, dass ich auch das zweite "this.is.a.string.wit h.dotts" fett haben möchte. Ich glaube langsam, dass das Zurückspringen in den LaTex Syntax durch "%" (-> aufgrund von escapechar={\%}) dazu führt, dass die Eigenschaften des Listings wie etwa "morekeywords" dort nicht mehr greifen.

edico
23-07-2007, 21:07
Ich vermute mal, der string im command muss definiert werden, weil der ja letztendlich 'verbatim' gesetzt, sprich: so wie vorgefunden, werden soll ...

...
\newcommand{\abc}{\bfseries\textit{this.is.a.strin g.wit h.dotts}}
...

edico

Disenchant
23-07-2007, 21:34
Problem ist hierbei jedoch, dass ich ja \abc direkt im Listing sowie bei der Angabe der Keywords (morekeywords) verwende. Heisst, es ist zwangsläufig das gleiche, egal ob mit zusätzlichem \bfseries in der Definition des neuen Commands \abc oder nicht.

Habe nun gerade das ganze einfach wie folgt gelöst:

...
\lstset{
numbers=left,
numberstyle=\tiny,
showstringspaces=false,
numbersep=5pt,
basicstyle=\small,
breakatwhitespace=true,
breaklines=true,
tabsize=4,
commentstyle=\color{DGrey},
keywordstyle=\bfseries,
breaklines=true,
firstnumber=1,
extendedchars={true},
escapechar={\%},
alsoletter={.}
}
...
\newcommand{\abc}{\textit{this.is.a.string.wit h.dotts}}

\begin{lstlisting}[morekeywords={this.is.a.string.with.dotts}]
this.is.a.string.with.dotts
%\textbf\abc{}
\end{lstlisting}

\end{document}
...

Was zur gewünschten Ausgabe führt (wobei morekeywords nur den ersten String betrifft, aber keinen Einfluss auf \abc hat):
this.is.a.string.wit h.dotts
this.is.a.string.wit h.dotts

PS: Somit ist's fast perfekt, jetzt wäre es aber natürlich genial, wenn mit die Zeile "%\textbf\abc{}" aus dem Beispiel oben nicht "this.is.a.string.wit h.dotts" (fett und kursiv) sondern "this.is.a.string.wit h.dotts" (nur fett) ausgegeben würde, was heisst, ich müsste \abc die Formatierung nehmen können und neu definieren (NICHT! global sondern nur genau in diesem Listing bzw. einmalig an dieser Stelle, somit kein \renewcommand) aber bin auch so schon glücklich :)

Grüsse,
Disenchant

edico
23-07-2007, 21:51
Ja, sehe ich auch so!

Nochmal anders und doch gleich ;-)

\listfiles
\documentclass[a4paper,12pt]{article}
\usepackage[latin1]{inputenc}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{listings}
\lstset{
frame=single,
framerule=.4pt,
framesep=.5\baselineskip,
xleftmargin=36pt,
xrightmargin=36pt,
basicstyle=\small,
keywordstyle=\bfseries\color{blue!50!black!100!},
escapechar={\%},
morekeywords={\Code, hello!},
alsodigit = {!}
}
\newcommand{\Code}{\bfseries\textit{This.Is.A.Stri ng.With.Dotts}}
%%% kann nur fett dargestellt werden, wenn basic nicht textit oder texttt

\begin{document}
here comes the text

\begin{lstlisting}[frame=trb]
hello! this.is.just.a.text.with.dotts
%\Code
\end{lstlisting}

here goes the text
\end{document}

edico

P.S. überhaupt - was ich noch die ganze Zeit bemerken wollte:
es geht doch mit alsodigit, was für einen Punkt an sich auch zutreffen sollte. Aber es funktioniert sehr wohl auch anders ...