PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeilennummerierung bei Markers in Listings



naraesk
26-05-2012, 01:32
Hallo,

folgendes Problem:
Ich möchte über lstinputlistings bestimmte Zeilen einer Datei einbinden. Das funktioniert auch. Ich möchte aber, dass die Zeilen in meinem Listing durchgehend nummeriert sind (1, 2, 3 …) und nicht die Zeilennummern aus dem Originaldokument (3,4,9). Ich finde die Sprünge unschön und auch unlogisch. Gebe ich die Zeilennummern direkt an, klappt das auch. Verwende ich hingegen Marker, erhalte ich die zerstückelte Zeilennummerierung des Originaldokuments.

Minimalbeispiel:

Datei min.tex

\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}

\begin{document}
\lstset{rangeprefix=\/\/, rangesuffix = \/\/, numbers = left}
\lstinputlisting[linerange ={s1-e1, s2-e2}, includerangemarker=false]{min.txt}
\lstinputlisting[linerange ={4-5, 10-10}]{min.txt}
\end{document}


Datei min.txt

Hier
steht
//s1//
wichtiger
text
//e1//
Hier steht
unwichtiger Text
//s2//
nochmal wichtiger
//e2//

Interessanter Weise verhalten sich beide Listings unterschiedlich, siehe angehängte pdf.

Ich würde nun gerne mit Markern arbeiten und dennoch 1,2,3 als Ausgabe erhalten.
Ist das irgendwie möglich?

Besten Dank. :)

naraesk
26-05-2012, 12:07
Bin inzwischen der Überzeugung, dass dies nicht möglich ist. Marker sind in der Dokumentation ja auch als experimental bezeichnet. Habe auch andere Probleme mit Markern in Verbindung mit der Option escapeinside.

Gibt es noch andere Möglichkeiten Teile einer Datei einzubinden? Also eine Alternative zum Paket listings?
Zeilennummern sind eben sehr unpraktisch, wenn noch Änderungen an der inkludierten Datei vorgenommen werden können sollen.

rais
26-05-2012, 23:53
Moin moin,

Bin inzwischen der Überzeugung, dass dies nicht möglich ist.

afaics waren Zeilennummern in Verbindung mit solchen Markern nicht vorgesehen (vielmehr die Verwendung eben dieser Marker), aber unmöglich ist das auch nicht.


Gibt es noch andere Möglichkeiten Teile einer Datei einzubinden? Also eine Alternative zum Paket listings?

Siehe in der listings-Doku den Abschnitt `Alternatives'.


Zeilennummern sind eben sehr unpraktisch, wenn noch Änderungen an der inkludierten Datei vorgenommen werden können sollen.
Zumal dann, wenn wie hier kein Bezug der Zeilennummer zum eigentlichen Quelltext besteht ... Du wirst schon wissen, warum Du das so willst.
Eine mögliche Umsetzung wäre, einen eigenen Zeilennummernzähler zu verwenden:


\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\newcounter{numc}
\renewcommand*\thelstnumber{\thenumc}
\makeatletter
\lst@AddToHook{EveryLine}{\stepcounter{numc}}%
\lst@AddToHook{PreInit}{\setcounter{numc}{0}}%
\makeatother
\begin{document}
\lstset{rangeprefix=\/\/, rangesuffix = \/\/, numbers = left}
\lstinputlisting[linerange ={s1-e1, s2-e2}, includerangemarker=false]{min.txt}
\lstinputlisting[linerange ={4-5, 10-10}]{min.txt}
\end{document}

zumindest bekomm ich damit zweimal 1--3.;)

Schöne Pfingsten

naraesk
27-05-2012, 00:20
Siehe in der listings-Doku den Abschnitt `Alternatives'. Danke. Habe ich gar nicht gesehen, da es soweit vorn steht. Klingt jetzt aber auch nicht weltbewegend.



Zumal dann, wenn wie hier kein Bezug der Zeilennummer zum eigentlichen Quelltext besteht ... Du wirst schon wissen, warum Du das so willst.
Ich möchte aus der Quelldatei eben nur einen Teil anzeigen, um eine vereinfachte Version im Listing zu haben, die sozusagen eigenständig lauffähig wäre. Daher ist für mich die Verbindung zum Quelltext nicht das Wichtigste. Muss aber auch sagen, dass ich, je länger ich darüber nachdenke, mit den Originalzeilennummern immer besser leben kann. ;)
Wirkt aber irgendwie seltsam, finde ich.





\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\newcounter{numc}
\renewcommand*\thelstnumber{\thenumc}
\makeatletter
\lst@AddToHook{EveryLine}{\stepcounter{numc}}%
\lst@AddToHook{PreInit}{\setcounter{numc}{0}}%
\makeatother
\begin{document}
\lstset{rangeprefix=\/\/, rangesuffix = \/\/, numbers = left}
\lstinputlisting[linerange ={s1-e1, s2-e2}, includerangemarker=false]{min.txt}
\lstinputlisting[linerange ={4-5, 10-10}]{min.txt}
\end{document}
Danke!

Wie bereits erwähnt, habe ich mit den Markern aber noch ein zweites Problem: Das schaue ich mir noch einmal in Ruhe an. Vielen Dank bis hierhin.

naraesk
27-05-2012, 09:12
Zumal dann, wenn wie hier kein Bezug der Zeilennummer zum eigentlichen Quelltext besteh

Das klappt ja bei der anderen Variante leider auch so nicht richtig. Der auszugebende Text steht in den Zeilen 4,5 und 10, ausgegeben wird jedoch 3,4 und 9.
Marker, Kommentare(sofern man sie ausblenden lässt) und Zeilen mit escape-inside-Anweisungen werden bei der Zählung nicht berücksichtigt.

rais
27-05-2012, 21:47
Das klappt ja bei der anderen Variante leider auch so nicht richtig.

das hab ich auch nicht behauptet.


Marker, Kommentare(sofern man sie ausblenden lässt) und Zeilen mit escape-inside-Anweisungen werden bei der Zählung nicht berücksichtigt.
Im Gegenteil: sie werden berücksichtigt (deshalb beginnt der jeweilige Codeabschnitt mit der Zeilennummer des, hmm, `Startmarkers').
Mit `linerange' sagst Du u. A., ab welcher Zeile (auch wenn diese nur einen Marker enthält) der Code dargestellt werden soll.
Mit `includerangemarker=false' unterdrückst Du die Darstellung dieser Marker, aber nicht die Zählung der Zeile, in der dieser Marker steht.
Einen Versuch Wert wäre vllt, diese Marker nicht in gesonderte Zeilen zu setzen (nicht, daß ich das jetzt getestet hätte;-).

Noch n schönen Pfingstmontag

naraesk
28-05-2012, 09:57
Einen Versuch Wert wäre vllt, diese Marker nicht in gesonderte Zeilen zu setzen
Und Kommentare auch nicht mehr auf eine extra Zeile. Das geht mir dann aber zu sehr auf Kosten der Lesbarkeit meines Quelltexts. Von daher werde ich dann wohl doch die von dir vorgeschlagene Variante mit eigenem Zähler verwenden. Vielen Dank.


Noch n schönen Pfingstmontag

Ebenso. :)