zwei unterschiedliche Layouts für den selben Text in einer Textdatei

Layout von Seiten, Rändern, Fusszeilen, usw, modifizieren


Lakedaimon
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Di 2. Aug 2022, 20:18

zwei unterschiedliche Layouts für den selben Text in einer Textdatei

Beitrag von Lakedaimon »

Hallo,
ich habe einen langen Text, den ich einmal im Standard-Layout benötige und einmal in Normseiten gesetzt.
Dazu habe ich zwei Masterdateien erstellt, einmal mit Vorspann für Standardlayout und einmal mit Vorspann für Normseiten. Beide lasse ich durch pdflatex laufen und habe dann zwei PDFs einmal herkömmlich gesetzt, einmal in Normseiten gesetzt. Bei reinem Fließtext klappt das wunderbar.

Das Problem ist, das einzelne Textabschnitte nicht Fließtext sind und an die Normseite angepasst werden müssen. Den Text in zwei unterschiedlichen Dateien pflegen (zwei mal Korrekturen eingeben etc.) ist aufwändig und fehleranfällig.

Daher möchte ich für die einzelnen Abschnitte, die angepasst werden müssen, in der ein und selben Textdatei je zwei Varianten erstellen, und während des pdflatex-Laufs wählt der Interpreter die jeweils richtige aus und ignoriert die andere.

Mein Lösungsansatz arbeitet mit den Befehlen \iffalse ... \fi. Ich definiere vier Makros:
\stana Anfang des Moduls 1 in der Variante für Standardlayout
\stane Ende des Moduls 1 in der Variante für Standardlayout
\norma Anfang des Moduls 1 in der Variante für Normseite
\norme Ende des Moduls 1 in der Variante für Normseite


In der Textdatei kapitel_01.tex steht:
\stana
Textelement 1 in Variante A -- Besonders gestaltetes Textelement, das nur im Standardlayout funktioniert
\protect\stane

\norma
Textelement 1 in Variante B -- Besonders gestaltetes Element, angepasst an das Layout der Normseite
\norme

Fließtext geht weiter, der von beiden Formaten verarbeitet werden kann.

\stana
Textelement 2 in Variante A -- Besonders gestaltetes Textelement, das nur im Standardlayout funktioniert
\stane

\norma
Textelement 2 in Variante B -- Besonders gestaltetes Element, angepasst an das Layout der Normseite
\norme

In der Masterdatei für das Standard layout definiere ich die Befehle folgendermaßen
\documentclass[12pt]{article}
\usepackage[german]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%
%Makros
\def\norma{\iffalse}%Anfang des Moduls in der Variante für Normseite - Text wird ignoriert
\def\norme{\fi}%Ende des Moduls in der Variante für Normseite
\def\stana{}%Das Makro bleibt leer, die Variante wird vom Interpreter bearbeitet
\def\stane{}%
\begin{document}
\input{kapitel_01.tex}
\end{document}


In der Masterdatei für den Normsatz definiere ich die Befehle genau andersherum
\documentclass[12pt]{article}
\usepackage[german]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[chars=60, lines=30, hyphen=false]{stdpage} %Normseite
\usepackage[onehalfspacing]{setspace} %Normseite Zeilenabstand
%
%Makros
\def\norma{}%Das Makro bleibt leer, die Variante wird vom Interpreter bearbeitet
\def\norme{}%
\def\stana{\iffalse}%Das Modul für die Standardvariante wird unterdrückt. 
\def\stane{\fi}%
\begin{document}
\input{kapitel_01.tex}
\end{document}



Ich bekomme leider folgende Fehlermeldung:
(./kapitel_01.tex)
! Incomplete \iffalse; all text was ignored after line 3.
<inserted text>
\fi
l.21 \input{kapitel_01.tex}

?


Ich verstehe das so, dass einerseits der \iffalse ankommt, aber \fi auf dem Weg bricht. Klar, \fi ist sehr unspezifisch und reagiert auf alle möglichen \if-Schleifen auf seinem Weg und geht dabei verloren. Ihn im Sinne eines zerbrechlichen Befehls mit \protect zu schützen, hat leider nicht geklappt. Nun bin ich mit meinem Latex-Latein am Ende und hoffe auf den Rat eines wizard.

Lakedaimon
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Di 2. Aug 2022, 20:18

Re: zwei unterschiedliche Layouts für den selben Text in einer Textdatei

Beitrag von Lakedaimon »

... triffst du nur das Zauberwort...

Ja, "Bedingter Satz" war das Zauberwort. Hier die Lösung.

https://alvinalexander.com/blog/post/latex/use-versions-package-in-latex-control-your-output/

und da weitere Möglichkeiten.

https://ctan.org/topic/cond-comp

Wenn jemand Erfahrung mit den Paketen hat und eine besonders für den oben beschriebenen Zweck taugt, bin ich für eine Anwort dankbar.

ich meine ja nur

Re: zwei unterschiedliche Layouts für den selben Text in einer Textdatei

Beitrag von ich meine ja nur »

Mal erklärt, was da schief läuft: TeX behandelt \if(true|false) … \else … \fi sehr speziell. Nach \iffalse wird direkt nach einem \else oder \fi (und nach weiteren \iftrue und \iffalse gescannt. Anderer Code wird überhaupt nicht beachtet bzw. expandiert und darf deshalb auch in weiten Bereichen fehlerhaft sein. Nun ist bei dir das Ende aber per \norme festgelegt und das ist nicht \fi, sondern wird erst durch Expansion zu \fi. Um das zu beheben, müsste man \let\norme\fi verwenden.

Allerdings löst das noch nicht alle Probleme, während nämlich: \iftrue \iffalse … \fi \fi einwandfrei funktioniert, wäre das (mit der oben erwähnten Korrektur) bei \iftrue \norma … \norme \fi dann noch immer nicht der Fall. Der Grund ist hier, dass \norma ebenfalls erst durch Expansion zu \iffalse wird. Da mit der oben erwähnten Änderung \norme ein \fi ist, hätte man also ein \fi zuviel. Also müsste auch \let\norma\iffalse verwendet werden.

Einfacher wird es mit \newif:
\documentclass[12pt]{article}
\usepackage[german]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[chars=60, lines=30, hyphen=false]{stdpage} %Normseite
\usepackage[onehalfspacing]{setspace} %Normseite Zeilenabstand
%
\newif\ifstan
\makeatletter
\@ifpackageloaded{stdpage}{\stanfalse}{\stantrue}
\makeatother

\begin{document}
\ifstan
Textelement 1 in Variante A -- Besonders gestaltetes Textelement, das nur im Standardlayout funktioniert
\else
Textelement 1 in Variante B -- Besonders gestaltetes Element, angepasst an das Layout der Normseite
\fi

Fließtext geht weiter, der von beiden Formaten verarbeitet werden kann.

\ifstan
Textelement 2 in Variante A -- Besonders gestaltetes Textelement, das nur im Standardlayout funktioniert
\else
Textelement 2 in Variante B -- Besonders gestaltetes Element, angepasst an das Layout der Normseite
\fi

\end{document}
oder
\newif\ifstan
\stantrue% oder wahlweise \stanfalse

\documentclass[12pt]{article}
\usepackage[german]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\ifstan
  \usepackage[chars=60, lines=30, hyphen=false]{stdpage} %Normseite
\fi
\usepackage[onehalfspacing]{setspace} %Normseite Zeilenabstand

\begin{document}
\ifstan
Textelement 1 in Variante A -- Besonders gestaltetes Textelement, das nur im Standardlayout funktioniert
\else
Textelement 1 in Variante B -- Besonders gestaltetes Element, angepasst an das Layout der Normseite
\fi

Fließtext geht weiter, der von beiden Formaten verarbeitet werden kann.

\ifstan
Textelement 2 in Variante A -- Besonders gestaltetes Textelement, das nur im Standardlayout funktioniert
\else
Textelement 2 in Variante B -- Besonders gestaltetes Element, angepasst an das Layout der Normseite
\fi

\end{document}
In der ersten Variante wird durch Auskommentieren des Pakets stdpage umgeschaltet. In der zweiten Variante durch Wechsel von \stantrue zu \stanfalse.

Es sei darauf hingewiesen, dass die Verwendung von \if… … \else … \fi einige Beschränkungen hat (beispielsweise die erwähnte Schachtelbarkeit, wenn irgendwer in ähnlicher Weise pfuscht wie du, was leider auch in manchen Paketen bzw. Vorlagen zu finden ist). Deshalb gibt es die erwähnten Pakete.

Antworten