Hallo,

ich habe ein Projekt, in dem Listings auf den Seiten eingebunden werden. Nun möchte ich gerne alle listings auf einen Schlag ausblenden. ist das Möglich?

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{listings}
\begin{document}
\begin{lstlisting}
#...
\end{listing}
Hallo Welt!
\end{document}

Es soll in der PDF nur Hallo Welt! stehen, ohne dass ich das listing aus dem Dokument lösche.

gefragt 20 Sep '14, 15:31

bor44's gravatar image

bor44
994610
Akzeptiert-Rate: 0%

bearbeitet 20 Sep '14, 17:33

Der Satz mag zu den Ohren raushängen, aber: Bitte gib ein vollständiges und Lauffähiges Minmal-Bsp. an (reichen ja ein, zwei listings...). Und Ausblenden heißt was? In der PDF dann, oder wie? Möglich ist alles, aber wie gesagt, sollte man erstmal wissen, was Sache ist. ;)

(20 Sep '14, 16:42) cis

Willst du die listings komplett ignorieren (das Dokument wird kürzer) oder möchtest du den Platz reservieren (und beispielsweise mit Texfarbe = Hintergrundfarbe tricksen)?

(20 Sep '14, 17:08) Johannes

Ich möchte die listings komplett ignorieren, sodass das Dokument kürzer wird.

(20 Sep '14, 17:28) bor44

@cis: Ich finde diese Seite wirklich bemerkenswert und auch sehr praktisch. Allerdings kann in diesem Fall doch keiner was mit einem Minimalbeispiels anfangen. Dafür ist doch die Frage allgemein gestellt, aber bitte..

(20 Sep '14, 17:31) bor44

@bor44 Doch, man kann was damit anfangen: man könnte seinen Lösungsvorschlag direkt am Beispiel erarbeiten und testen, ohne sich selbst ein Beispiel von Null an bauen zu müssen. Es geht nicht immer darum, ob es allgemein oder sonnenklar ist, sondern um einfache Umsetzung. Mach es halt den TeX-Kollegen, wenn Du magst, viel einfacher mit einem Startbeispiel, wenn Du schnell eine Lösung möchtest. Ist nur ein Tipp. Ich poste fast immer nur getestetes.

(20 Sep '14, 17:37) stefan ♦♦

Ich habe meine Frage um ein Minimalbeispiel erweitert. Ich hoffe, dass das hilft.

(20 Sep '14, 18:11) bor44

Das Beispiel läuft nicht fehlerfrei. Abgesehen davon würde ich es mit dem comment Paket versuchen.

(20 Sep '14, 21:17) Ulrike Fischer
Ergebnis 5 von 7 show 2 more comments

Das Paket listings verwendet intern diverse sogenannte Haken (engl. hook), um bei bestimmten Verarbeitungszuständen zusätzliche Befehle auszuführen. Einer dieser Haken ist PreSet und wird ausgeführt, bevor das Listing verarbeitet wird. In diesem Haken setzt listings normalerweise \lst@firstline auf 0 und \lst@lastline auf 9999999. Die beiden Makros geben an, welche Zeilen des Listings ausgegeben werden sollen. Man kann über den genannten Haken die beiden Zähler natürlich auch auf andere Werte setzen:

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{listings}
\makeatletter
\lst@AddToHook{PreSet}{\def\lst@firstline{10000000\relax}%
  \def\lst@lastline{0\relax}\let\lst@linerange\@empty}
\makeatother
\begin{document}
\begin{lstlisting}
#...
\end{lstlisting}% Hier hattest Du einen Fehler in Deinem angeblichen Minimalbeispiel!
Hallo Welt!
\end{document}

Allerdings funktioniert das nicht mehr, wenn man die zugehörigen Optionen bei lstlisting angegeben hat:

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{listings}
\makeatletter
\lst@AddToHook{PreSet}{\def\lst@firstline{10000000\relax}%
  \def\lst@lastline{0\relax}\let\lst@linerange\@empty}
\makeatother
\begin{document}
\begin{lstlisting}[firstline=1,lastline=10]
#...
\end{lstlisting}% Hier hattest Du einen Fehler in Deinem angeblichen Minimalbeispiel!
Hallo Welt!
\end{document}

Es gibt aber einen weiteren Haken, der nach den Optionen ausgewertet wird:

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{listings}
\makeatletter
\lst@AddToHook{Init}{\def\lst@firstline{10000000\relax}%
  \def\lst@lastline{0\relax}\let\lst@linerange\@empty}
\makeatother
\begin{document}
\begin{lstlisting}[firstline=1,lastline=10]
#...
\end{lstlisting}% Hier hattest Du einen Fehler in Deinem angeblichen Minimalbeispiel!
Hallo Welt!
\end{document}

Zwar wird die listlisting-Umgebung so auch noch immer verarbeitet. Es werden aber keine Listings mehr ausgegeben. Für Listings mit caption oder frame o. ä. erhält man aber weiterhin den Titel bzw. den Kasten:

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{listings}
\makeatletter
\lst@AddToHook{Init}{\def\lst@firstline{10000000\relax}%
  \def\lst@lastline{0\relax}\let\lst@linerange\@empty}
\makeatother
\begin{document}
\begin{lstlisting}[firstline=1,lastline=10,caption=Test,frame=tlrb]
#...
\end{lstlisting}% Hier hattest Du einen Fehler in Deinem angeblichen Minimalbeispiel!
Hallo Welt!
\end{document}

Will man auch das nicht, müsste man sich etwas komplett anderes ausdenken, beispielsweise:

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{listings}
\usepackage{filecontents}
\renewcommand*\lstlisting[1][]{\filecontents{dummy.tex}}
\def\endlstlisting{\endfilecontents}
\begin{document}
\begin{lstlisting}[firstline=1,lastline=10,caption=Test,frame=tlrb]
#...
\end{lstlisting}% Hier hattest Du einen Fehler in Deinem angeblichen Minimalbeispiel!
Hallo Welt!
\end{document}

Dabei wird die lstlisting-Umgebung letztlich in eine filecontents-Umgebung umdefiniert. Meine Versuche, ähnliches mit Hilfe des comment-Pakets zu erreichen, ist hingegen nicht gelungen. In diesem Fall werden dann aber auch Optionen wie label nicht mehr ausgewertet, so dass ggf. Querverweise (beispielsweise mit \ref oder \pageref) auf Listings dann nicht mehr aufgelöst werden können.

Man könnte sich natürlich auch eine schönere Lösung basteln, die zwar grundsätzlich wie der letzte Vorschlag funktioniert, bei der aber die dummy-Datei nicht geschrieben wird. Obige Lösung war jedoch schön einfach und relativ leicht zu verstehen. Daher habe ich darauf verzichtet, tiefer einzusteigen.

Welche Lösung, am ehesten in Deinem Sinn ist, kann ich mit den gegebenen Informationen leider nicht beurteilen.

Permanenter link

beantwortet 22 Sep '14, 11:31

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 22 Sep '14, 20:24

Aha, also je nachdem ob -im letzten Code- die Zeile \renewcommand*\lstlisting[1][]{\filecontents{dummy.tex}} auskommentiert wird oder nicht, erscheinen die listings-Blöcke - richtig?

(22 Sep '14, 11:57) cis

Die Umdefinierung von \endlstlisting muss natürlich auch auskommentiert werden, wenn man das Listing wieder haben will. Aber das ist doch eigentlich klar. Man muss ja nur vergleichen, was geändert wurde, um das Listing eben nicht auszugeben …

(22 Sep '14, 14:08) gast3

Ich nehme zwar an, ist wie im Beitrag von @Ijon gemeint, andererseits könnte mit "alle Quellcodes ausblenden" auch gemeint sein, das in der fertigen PDF zu tun. Das lese ich im Startpost nicht raus (!).

Ausgabedatei (tut laut Handbuch mit Adobe Reader, Foxit Reader, evince)

alt text

Open in writeLaTeX
\documentclass{scrreprt}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},  germandbls={ß}}
\usepackage[ngerman]{babel}

\usepackage{listings}
\usepackage{xcolor}

\usepackage{ocgx}
\def\Schalter{%
\switchocg{ocg1}{\fcolorbox{blue}{lightgray}{\textcolor{blue!50!cyan}{\Large Quellcodes ausblenden}}}
}%

\usepackage[automark]{scrlayer-scrpage}
\pagestyle{scrheadings}
\cfoot[\Schalter]{\Schalter}
\chead[\Schalter]{\Schalter}

\usepackage{lipsum}
%=========
\begin{document}
%=========
\lipsum[66]

\begin{ocg}{OCG 1}{ocg1}{1}
\begin{lstlisting}
10 PRINT "HELLO, WORLD!"
20 GOTO 10
30 MAKE IT BEST
\end{lstlisting}
\end{ocg}

\lipsum[66]

\Schalter

\begin{ocg}{OCG 2}{ocg1}{1}
\begin{lstlisting}
10 PRINT "HELLO, WORLD TOO!"
20 Do NOTHING
\end{lstlisting}
\end{ocg}

%=========
\end{document}
%=========
Permanenter link

beantwortet 22 Sep '14, 13:29

cis's gravatar image

cis
9.5k75452491
Akzeptiert-Rate: 29%

Man weiß ja nicht, wofür er das braucht. Z.B. bei einem Beamervortrag könnte so ein ocgx-"Dokumentschalter" nützlich sein.

(22 Sep '14, 16:39) cis
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×22
×2

gestellte Frage: 20 Sep '14, 15:31

Frage wurde gesehen: 9,158 Mal

zuletzt geändert: 22 Sep '14, 23:59