Wie nutzt man \BeforeFile

Klassen und Pakete zur einfachen Umsetzung individueller Vorstellungen


en.ko
Forum-Anfänger
Forum-Anfänger
Beiträge: 12
Registriert: Do 20. Nov 2014, 14:02

Wie nutzt man \BeforeFile

Beitrag von en.ko »

Hallo,

ich versuche die Funktion \BeforeFile zu nutzen um ein Kommando in einer anderen Datei zu ändern. Allerdings passiert nicht das was ich erwarte. Leider ist die Dokumentation zu dem Befehl sehr dürftig und im Netz findet man auch nichts.

Die erste Datei hat folgenden Code:
% Datei: Kopf.tex
\providecommand{\OPTIONENgraphicx}{}
\usepackage[\OPTIONENgraphicx]{graphicx}
und wird wie folgt in eine Datei mit diesem Code eingebungen:
\documentclass[]{scrreprt}
\input{Kopf}
\BeforeFile{Kopf.tex}%
{\newcommand{\OPTIONENgraphicx}{draft}}

\begin{document}
\includegraphics[]{Beispielgrafik.png}
\end{document}
Ich erwarte, dass die Grafik nicht angezeigt wird sondern als Kästchen mit Dateinamen (entsprechend der Option draft) erscheint.

Auch nach mehrmaligem Kompilieren wird aber die Grafik normal angezeigt. Ich komme einfach nicht dahinter wo mein Fehler liegt. Wenn ich die Datei nach dem \newcommand einbinde, dann klappt es. Der Code ist also grundsätzlich in Ordnung. Der Befehl \BeforeFile arbeitet aber nicht wie erwartet.

Danke im Voraus für Hilfe.

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

Wenn du zwei Minuten vor Konzertbeginn zum Platzanweiser gehst und sagst: Pass auf, für xyz liegt eine Nachricht von seiner Frau da, bevor du ihn rein lässt, gib ihm die Nachricht.

Was denkst du wie der dich anschaut? Es sitzen doch alle schon.


Ähnliches Scenario, aber eine halbe Stunde vor Einlassbeginn. Antwort des Platzanweisers: Alles klar Chef, mach ich.
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

Bevor du anfängst dich auf Autorebene zu begeben, solltest du einiges an Zeit investieren und sowohl usrguide und besonders auch clsguide gelesen und verstanden haben.

Dann weißt du auch, wie man korrekt Optionen an andere Pakete übergibt.
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

en.ko
Forum-Anfänger
Forum-Anfänger
Beiträge: 12
Registriert: Do 20. Nov 2014, 14:02

Beitrag von en.ko »

Ich bin kein LaTeX-Neuling, aber ich habe vor kurzem angefangen mein Basisskript komplett neu aufzusetzen auf Grundlage von KOMA-Skript. Da die Anleitung aber 481 Seiten stark ist bin ich erst bei Seite 245 angekommen.

Wahrscheinlich bin ich über einen internen Querverweis über den Befehl auf Seite 295 gestolpert, jedenfalls stand im scrguide, dass \BeforeFile eine Anweisung vor dem nächsten Laden der Datei ausführt. Habe ich das falsch interpretiert?

Mein Ziel ist es ein allgemeines Skript mit allen Paketen und ein spezielles Skript mit allen Optionen und dem eigentlichen Text zu haben. Da Beispielsweise das Paket graphicx (scheinbar) keine nachträglichen Optionen erlaubt, musste ich das so machen.

Jetzt die Frage: Wie schaffe ich es, dass ich die Datei mit den Paketen einbinden kann und später erst die Optionen ändern kann.

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

en.ko hat geschrieben:Jetzt die Frage: Wie schaffe ich es, dass ich die Datei mit den Paketen einbinden kann und später erst die Optionen ändern kann.
Das geht nur bei vergleichweise wenigen Paketen. Optionen an Pakete werden vor dem Laden festgelegt (\PassOptionsToPackage) oder direkt beim Laden.

Den Befehl \BeforeFile hast du schon richtig verstanden, aber in deinem Beispiel wird das erst ausgeführt, als die Datei schon längst gelesen ist, Herr Müller also schon auf seinem Platz sitzt. Das gilt für den aktuellen LaTeX-Lauf. Willst du etwas für das nächste Konzert hinterlegen, dann musst du die Info am Eingang abgeben. Ist aber viel leichter dem Platzanweiser hinreichend zeitig Bescheid zu geben.


Das Aufdröseln deiner Datei halte ich im übrigen für Zeitverschwendung. Es bringt einfach nicht genügend Nutzen das zu tun.
Schlimmer noch, solch verworrener Spaghetticode findet sich zu oft im Internet als Vorlage für Anfänger wieder. Du bist keiner und verwirrt, für Anfänger ist so eine einfache und verständliche Vorlage wie ein Schlag ins Gesicht (mit nem immateriellen Backstein).
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

Besserwisser

Beitrag von Besserwisser »

Zunächst einmal lädst du nicht Kopf.tex, sondern Kopf. Dass dann das darunter liegende TeX-System auf Implementierungsebene daraus Kopf.text macht, ändert daran nichts. Daher ist es besser, bei \input die Dateiendung mit anzugeben (im Unterschied zu \include, dort fügt LaTeX die Endung hinzu).

Desweiteren lädst Du erst die Datei und rufst dann \BeforeFile auf. Wenn die Datei bereits geladen ist, wird die Anweisung auch nicht mehr ausgeführt. Also ein Fall von: Wer zu spät kommt …

Das ist letztlich nichts anderes, als wenn du zu jemandem, der gerade dein Zimmer betreten hat, sagst: Bevor Sie hereinkommen …

Du musst also \BeforeFile{Kopf.tex}{…} vor \input{Kopf.tex} aufrufen.

en.ko
Forum-Anfänger
Forum-Anfänger
Beiträge: 12
Registriert: Do 20. Nov 2014, 14:02

Beitrag von en.ko »

OK, dann ist der Befehl einfach nicht so wie ich es gehofft habe. Ich dachte ich könnte damit die zeilenweise Abarbeitung überlisten.

Es war auch eher die Überlegung Optionen nachträglich zu ändern, wie bei \KOMAoptions um die Einstellung an einer (nahezu) beliebigen Stelle definieren zu können.

Zum Aufdröseln: als ich mit LaTeX angefangen habe hatte ich auch für jedes Dokument eine komplett eigene Datei. Wenn man aber während des Lernvorgangs mehrere Dokumente parallel bearbeitet kommt es vor, dass man Funktionen, die man in einer Datei verwendet hat in einer anderen Datei noch nicht eingefügt hat, und dann auf Fehlersuche gehen muss. Daher die Lösung allgemeine Pakete in einem zentralen Paket einzubinden und Dokumentenspezifische Einstellungen in ein anderes Skript zu verpacken. Auch für ein "Corporate Design" eignet sich eine solche Vorgehensweise hervorragend. Für mich hat das mehr Vorteile als Nachteile, aber das muss jeder für sich selbst entscheiden.

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

Bei manchen Paketen muss du dich beim Laden entscheiden, was du haben willst. Ein Beispiel: biblatex; je nachdem, welche Option angegeben wird, wird im Hintergrund ein spezielles Paket geladen.


Momentan klingt das für mich als würdest du ein Großunternehmen der Bauindustrie bestellen. Erst mal alle ran, 70 m hohe Kräne, Betonmischer für den Bau von Schwimmbädern, etc. Dann kannst du für jedes Projekt einzeln entscheiden, ob der 70 m Kran für die Gartenhütte nötig ist.

Das Projekt entscheidet, welche Resourcen aufgebracht werden, niemals andersrum. Also teil dein Paket lieber in verwandte Einzelgebiete auf. Funktionalität zu teilen ist eine Sache, aber nicht jeder braucht alles. CDs geben oft Farbschemas und Schriften vor, das wird wohl bei allen der gemeinsame Nenner sein, egal ob Jahresbericht, Geschäftsbrief oder Präsentation.
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

en.ko
Forum-Anfänger
Forum-Anfänger
Beiträge: 12
Registriert: Do 20. Nov 2014, 14:02

Beitrag von en.ko »

Das ist ein interessantes Thema, das wir aber besser in ein eigenes Thema verschieben. Ich bezweifle, dass es hierfür ein abschließendes Ergebnis gibt. Es wird dabei bleiben, dass es jeder etwas anders sieht.

Deine Metapher mit dem Großunternehmen der Bauindustrie ist zwar insofern richtig, dass damit ein überdimensioniertes Skript geladen wird. Es wird aber impliziert, dass hier ein enormer Aufwand getrieben wird. Das ist nur hinsichtlich der vorhandenen Rechenleistung korrekt. Und Rechenleistung steht in der Regel ausreichend zur Verfügung. Für den Benutzer ist es schneller ein vollständiges Skript zu laden und sofort anfangen zu können ohne sich vorher Gedanken darüber machen zu müssen welche Pakete er im Laufe seiner Arbeit brauchen wird. Denn häufig weiß man das nicht oder es kommen Pakete hinzu, die man vorher nicht erwartet hatte.

Eine passendere Metapher wäre also: ein Sanitäter überlegt sich auch nicht vorher welche Ausrüstung er zu einem Unfallort mitnimmt. Er setzt sich in den Krankenwagen und kann dann damit rechnen, dass er alles dabei hat. Wenn er glaubt, dass doch etwas fehlt, dann kann er es noch dazu packen. Und die wenigsten Patienten werden sagen: "Das meiste davon brauchen Sie doch gar nicht, warum haben sie das mitgenommen?".

Hinzu kommt der Faktor Übersichtlichkeit. Ich arbeite sehr viel mit Kommentaren. Mein derzeitiges, unfertiges Optionen-Skript hat bereits über 1200 Zeilen, auch wenn für die tatsächliche Arbeit vieles wieder rausfallen wird. Ich schreibe mir zu vielen Funktionen kommentierte Alternativen auf. Dadurch kann man sehr schnell Änderungen vornehmen und wird an die Alternativen erinnert.

Wenn ich also eine neue Arbeit beginne, dann habe ich nur ein paar Zeilen bis zum \begin{document} und habe trotzdem alle Pakete und Optionen, mit denen ich es gewohnt bin zu arbeiten.

Und wenn ich zu einem späteren Zeitpunkt eine alte Arbeit bearbeiten will, weiß ich auch, dass mir alle gewohnten Befehle zur Verfügung stehen. Ich habe hier noch nie Kompatibilitätsprobleme gehabt.

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

Rettungssanitäter und Assistenten werden entsprechend ausgebildet, sie wissen was und wo es im RTW (NEF etc.) zu finden ist.

Du sprachst von Corporate Design, das impliziert, dass auch andere Leute es nutzen werden. Damit sind wir dann beim Ottonormalverbraucher, der einfach in den RTW gesetzt wird und weder weiß, wo das Material zu finden ist, noch wie man den Funk bedient, noch nie mit Sondersignal gefahren ist, die rechtliche Situation nicht kennt ... Das führt zu verletzten, und die landen dann früher oder später in Supportforen.

https://github.com/johannesbottcher/templateConfusion

Wenn du deinen eigenen Rucksack packst, und genau weißt was drin ist und wo, habe ich damit absolut kein Problem. Erst wenn du diesen vorgepackten Rucksack an andere weiter gibst, dann wird es stressig für alle.
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

Antworten