PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu \foreach{} und \input{}



Odie
26-01-2011, 15:12
Gibt es so etwas wie ein FOREACH Statement für Paketoptionen in LaTeX?
Wie kann ich aus einem mittels \input{} eingebundenen File auf Schlüssel oder Makros eines Paketes zugreifen, dass bereits in der Hauptdatei eingebunden wurde?

Im Moment versuche ich ein größeres Projekt mittels LaTeX zu realisieren. Dabei sollen die einzelnen Bereiche (chapter, section) in verschiedenen Dateien verfasst werden. Jedes Chapter soll in Abhängigkeit bestimmter Steuerflags die dazu passenden Section's nachladen (wieder input) oder aktivieren.

Die Auswahl der gewünschten Kapitel soll als Paketoption an ein Paket Namens ContentLoader übergeben werden. Dieses kennt und kontrolliert die inhaltlichen Abhängigkeiten der Content-Files und bindet diese bei Bedarf via \input{} ein.

Als MiniTest habe ich die folgenden drei Dateien erstellt, die diese Aufgabe bewerkstelligen sollen. Leider kann ich jedoch aus den via \input{} eingebundenen Dateien nicht mehr auf die Steuer-Flags des ContentLoaders zugreifen.

Fehlermeldung: Undefined control sequence. 1.3 \key@ifundefined{MT}{key}

Inhalt MTMain.tex:

\documentclass{scrbook}

\usepackage[A,B]{MTContentLoader}

\begin{document}
\loadContent
\end{document}

Inhalt MTContentLoader.sty (sorry ist leider etwas länger, aber ich weiss nicht, wie ich das noch haette kuerzen sollen):

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{MTContentLoader}[2012/01/16 v 0.1 Paket zum Laden des Contents]

\RequirePackage{xkeyval} %Paket für den Umgang mit Schlüsseln und Werten
\RequirePackage{ifthen} %Paket für den Umgang mit Verzweigungen

\DefineFamily{MT}
\DefineFamilyMember{MT}

% Regisrieren von Flag A (boolscher Schlüssel
\define@boolkey+{MT}{keyA}{%
\ifKV@MT@keyA
\PackageInfo{ContentLoader}{Content A on}%
\else
\PackageInfo{ContentLoader}{Content A off}%
\fi
}{%
\PackageWarning{ContentLoader}{wrong input}%
}

% Regisrieren von Flag B (boolscher Schlüssel
\define@boolkey+{MT}{keyB}{%
\ifKV@MT@keyB
\PackageInfo{ContentLoader}{Content B on}%
\else
\PackageInfo{ContentLoader}{Content B off}%
\fi
}{%
\PackageWarning{ContentLoader}{wrong input}%
}

% Deklarieren der Paketoptionen
\DeclareOption{A}{
\setkeys{MT}{keyA=true}
}
\DeclareOption{B}{
\setkeys{MT}{keyB=true}
}
% Warnung bei unbekannten Paketoptionen
\DeclareOption*{\PackageWarning{ContentLoader}{Unb ekannte Klassenoption: "\CurrentOption"}}

% Verarbeiten der Paketoptionen
\ProcessOptions\relax

% Makro zum laden des Contents
\newcommand{\loadContent}{
\key@ifundefined{MT}{keyA}{
\PackageWarning{myPackage}{"content A" not defined}
}{
\ifKV@MT@keyA
\input{MTContent}
\fi
}
}

Inhalt von MTContent.tex:

\chapter{here is the master}

\key@ifundefined{MT}{keyB}{
\PackageWarning{myPackage}{"content B" not defined}
}{
\ifKV@MT@keyB
\section{and here ist the servant}
\fi
}

Falls mein Vorgehen gänzlich falsch sein sollte, lasse ich mich gern eines Besseren belehren.

Xenara
26-01-2011, 16:41
Ohne, dass ich jetzt behaupten würde, ich hätte alles verstanden: Es läuft fehlerfrei durch, wenn man in MTContent.tex \makeatletter und \makeatother verwendet, da du das @ in \key@ifundefined verwendest.

So habe ich es getestet:


\documentclass{scrbook}
\usepackage{filecontents}

\begin{filecontents}{MTContentLoader.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{MTContentLoader}[2012/01/16 v 0.1 Paket zum Laden des Contents]

\RequirePackage{xkeyval} %Paket für den Umgang mit Schlüsseln und Werten
\RequirePackage{ifthen} %Paket für den Umgang mit Verzweigungen

\DefineFamily{MT}
\DefineFamilyMember{MT}

% Regisrieren von Flag A (boolscher Schlüssel
\define@boolkey+{MT}{keyA}{%
\ifKV@MT@keyA
\PackageInfo{ContentLoader}{Content A on}%
\else
\PackageInfo{ContentLoader}{Content A off}%
\fi
}{%
\PackageWarning{ContentLoader}{wrong input}%
}

% Regisrieren von Flag B (boolscher Schlüssel
\define@boolkey+{MT}{keyB}{%
\ifKV@MT@keyB
\PackageInfo{ContentLoader}{Content B on}%
\else
\PackageInfo{ContentLoader}{Content B off}%
\fi
}{%
\PackageWarning{ContentLoader}{wrong input}%
}

% Deklarieren der Paketoptionen
\DeclareOption{A}{
\setkeys{MT}{keyA=true}
}
\DeclareOption{B}{
\setkeys{MT}{keyB=true}
}
% Warnung bei unbekannten Paketoptionen
\DeclareOption*{\PackageWarning{ContentLoader}{Unb ekannte Klassenoption: "\CurrentOption"}}

% Verarbeiten der Paketoptionen
\ProcessOptions\relax

% Makro zum laden des Contents
\newcommand{\loadContent}{
\key@ifundefined{MT}{keyA}{
\PackageWarning{myPackage}{"content A" not defined}
}{
\ifKV@MT@keyA
\input{MTContent}
\fi
}
}

\end{filecontents}

\begin{filecontents}{MTContent.tex}
\chapter{here is the master}

\makeatletter
\key@ifundefined{MT}{keyB}{
\PackageWarning{myPackage}{"content B" not defined}
}{
\ifKV@MT@keyB
\section{and here ist the servant}
\fi
}
\makeatother
\end{filecontents}

\usepackage[A,B]{MTContentLoader}

\begin{document}
\loadContent
\end{document}

Odie
27-01-2011, 11:57
Besten Dank für die Hilfe. Damit läuft das Ganze erst einmal so, wie vorgesehen