\write von listings Thema ist als GELÖST markiert

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Klaus

\write von listings

Beitrag von Klaus »

ich möchte z.B. ein Python Listing als Tex File ausgeben. Gibt es eine Möglichkeit dies zu tun?
...
\usepackage{color}
\usepackage{listings}
\begin{document}%
\lstloadlanguages{Python}

\newwrite\OutputFile
\openout\OutputFile=out.tex
\write\OutputFile{%
\begin{lstlisting}[numbers=left,name=PySource.py,commentstyle=\itshape,stringstyle=\color{blue}]
import sys;
class test:
    def __init__(self):
        pass;
\end{lstlisting}
}
\end{document}
Bei meinen Versuch dies zu tun ist folgende Fehlermeldung aufgetreten:

("Z:\OfficePackete\latex\MiKTeX 2.7\tex\latex\listings\lstlang1.sty"
File: lstlang1.sty 2004/09/05 1.3 listings language file
)
\OutputFile=\write4
[1
! Undefined control sequence.
\lstlisting ->\def \lstenv@name
{lstlisting}\begingroup \lst@setcatcodes \ca...
l.52 \end{document}
The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Du hast ganz falsche Vorstellungen von der Arbeitsweise von LaTeX. Wenn ich das richtig verstehe, willst Du einen TeX-Code haben, der danach ohne Verwendung von listings einfach per \input wieder eingelesen werden kann. Das ist auf diesem Weg nicht möglich. In dem Fall musst Du ein externes Programm verwenden, das TeX-Code ausspuckt.

Wenn Du hingegen eine listings-Umgebung in eine externe Datei schreiben willst, dann geht das nur, wenn man bei der Ausgabe Expansion verhindert. Vermutlich die einfachste Lösung dürfte in dem Fall das Paket filecontents sein. So richtig sinnvoll ist das aber eigentlich auch nicht, da man dann auch gleich den Python-Code in eine Datei schreiben und an geeigneter Stelle wieder mit \lstinputlisting laden kann.

Ansonsten sei in meiner Eigenschaft als Moderator noch auf den goLaTeX-Knigge und die dortigen Hinweise zu Minimalbeispielen verwiesen. Vollständige Minimalbeispiele sind nämlich nicht das gleiche wie Codeschnippsel.

Oftmals ist es auch sinnvoll, ein paar Worte über den Hintergrund einer Frage zu verlieren. Ich hatte nämlich bei der Antwort wirklich das Problem, dass ich nicht wusste, was da soll, und deshalb auch nicht wusste, in welche Richtung die Antwort gehen sollte - nicht zuletzt, um ggf. alternative Ansätze anzubieten.

Klaus

Beitrag von Klaus »

Leider jedoch macht filecontent etwas anderes als ich eigendlich haben moechte.

ich ging davon aus daß eine expansion insoweit erfolgt daß z.B.
\begin{verbatim}
import sys;
class test:
    def __init__(self):
        pass;
\end{verbatim}
ein ouputfile ergibt dass etwa so oder aehnlich aussieht:
import sys; \\
class test: \\
\indent def  \textunderscore  \textunderscore  init\textunderscore\textunderscore (self): \\
\indent \indent pass: \\
So wie den Latexprozess glaube zu verstehen, werden die einzelnen Makros schrittweise expandiert und das vollexpandierte Ergebnis z.B. in ein dvi-File umgewandelt.

Ich ging davon aus daß ich mit \write das Teil- bzw. vollexpandierte Ergebnis in eine Datei schreiben kann.
Gibt es eine Möglichkeit dies zu tun?


Ich moechte die Moeglichkeiten und Grenzen der Nutzung von Latex bzw. Tex ausloten, und mich auch tiefer in die Materia der Tex-Makroprogramierung und dem erstellen von eigenen Latexstrukturen einarbeiten.

Mit Programmiersprachen wie CPP, Java, Pythen usw. habe ich viel Erfahrung.
So etwas wie z.B. die Makroexpansion in Tex ist fuer mich jedoch komplett neu.

Was den Hinweis mit der GoLarex-Knigge angeht, ich habe nach dem Verfassen des ersten Beitrags nicht daran gedacht zu prüfen ob, dieser Beitrag in diese Kategorie passt. Tut mir leid. Dies ist das erste Forum auf dem ich selbst einen Beitrag verfasst habe. Ich hoffe daß ich in Zukunft immer die richte Sparte treffe, wenn nicht bitte ich um nachsehen. Trotz danke fuer den Hinweis.

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

Das Problem ist die Arbeitsweise dest listings-Pakets. Um Quellcode analysieren zu können, müssen bereits vor der Makroexpansion interne Parameter verwendest werden. Deswegen ist die Verwendung einer listings-Umgebung im Argument von \write nicht möglich. Dies wäre nur möglich, wenn die Arbeitsweise des listings-Paketes völlig auf Expansion beruhen würde.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Selbst wenn eine lstlisting-Umgebung voll expandierbar wäre, würde man nicht das bekommen, was Klaus sucht, weil nach der Expansion ja beispielsweise gerade kein \textunderscore mehr vorhanden wäre, sondern ein character-Token (vermutlich vom Typ other) ggf. mit vorheriger und anschließender Schriftumschaltung.

Bernd hat auf TeX-D-L dieser Tage sehr schön erklärt, wie das Zusammenspiel von Bauch, Mund und Zähnen bei TeX funktioniert. Ich könnte das jetzt einfach wiedergeben, aber es gibt hier offenbar Leute, denen solche Erklärungen, die darauf abzielen, das Verständnis zu verbessern, ein Dorn im Auge sind. Also sage ich nur: Klaus sucht IMHO etwas, was leider zu keinem Zeitpunkt physisch vorhanden ist. Man müsste eine ganz neue Umgebung lstoutput schreiben, der dann zwar die Lesemethode von listings noch verwendet, aber dabei nicht expandiert, sondern Code produziert. In dem Fall dürfte das nicht ganz einfach sein, weil eben auch mit Token-Klassen zu jonglieren ist.

Klaus

Beitrag von Klaus »

Herzlichen Dank

Die Rückmeldungen geben mir eine gute Orientierung für die Komplexität der Materie.

Antworten