protect befehl bei \section bzw. wie schütze ich \section?

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


aasaa00
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 57
Registriert: Do 1. Mär 2018, 11:43

protect befehl bei \section bzw. wie schütze ich \section?

Beitrag von aasaa00 »

Hallo, meine Arbeit besteht aus mehreren Kapiteln, die ich durch mehrere \include-Befehle in meine Hauptdatei eingebaut habe.
Nun erhalte ich bei einem dieser Kapitel die Fehlermeldung "tex capacity exceeded, sorry [input stack size=50000] --\protect ->\noexpand \protect". Ich benutze XeLaTeX (wegen der Verwendung mehrerer Sprachen) und konnte den Fehler eingrenzen: Anscheinend ist hängt es mit dem \section bzw- \subsection Befehl zusammen; Wenn ich \section bzw- \subsection weglasse, werden keine Fehler angezeigt und das Programm erstellt die pdf-Datei.

Ich habe jetzt mehrere Stunden recherchiert und weiß, dass "\section" ein fragiler Befehl ist. Ich verstehe nicht, wie ich es schützen kann, z.B.:

\protect\section{Überschrift XYZ}

hat nicht die Lösung gebracht; das Dokument bricht ab und zeigt mir den gleichen Fehler an. Könnt Ihr mir (immernoch ein Latex-Anfänger) sagen, wie ich diesen \section Befehl schütze?

Ich habe es auch mit dem \usepackage{MakeRobust} und \MakeRobustCommand\section{Überschrift XYZ} versucht - hier wird der Text als Überschrift zwar angezeigt, aber leider nicht formatiert wie die anderen Überschriften mit \section.

Ich habe auf die Erstellung eines MWE verzichtet, weil ich nicht weiß - so verstehe ich die Fehlermeldung - wie die hohe Anzahl der \section-Befehle dargestellt werden kann.

Ich würde mich daher freuen, wenn mir sagen kann, wie ich den \section Befehl schützen kann und was ich beim protect-Befehl falsch mache.

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2138
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

Vielleicht liegt es am erforderlichen oder optionalen Argument eines Gliederungsbefehls. Näheres lässt sich ohne ein möglichst minimales Beispiel schwer ergründen.

Gast

Beitrag von Gast »

Man muss fragile Befehle nur in bestimmten Situationen, beispielsweise innerhalb eines moving arguments schützen. \section müsste also nur geschützt werden, wenn es beispielsweise selbst im Argument eines \section-Befehls stehen würde. Die reine Anzahl an Befehlen hat dagegen eher keinen Einfluss (außer eventuell, wenn Du eine sehr, sehr große Zahl an \section-Befehlen nacheinander stehen hast, ohne Text dazwischen).

Daher: Mach ein Minimalbeispiel nach der verlinkten Anleitung. Dann sollte sich der Fehler eingrenzen und das Problem lösen lassen.

aasaa00
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 57
Registriert: Do 1. Mär 2018, 11:43

Beitrag von aasaa00 »

Wie gesagt, ich habe zig Kapitel mit dem Befehl "\section" in meinem Dokument, aber in einem chapter wird er mir als Fehler angelastet ("tex capacity exceeded, sorry [input stack size=50000] --\protect ->\noexpand \protect").

Obwohl ich weiß, dass das MWE (mit \section-Einstellungen) hier funktioniert, wird es vielleicht jetzt deutlicher:

Code: Alles auswählen


\RequirePackage[patch]{kvoptions} 
\documentclass[openany]{book}

\usepackage[a4paper,left=2.5cm,right=2.5cm,top=2.5cm,bottom=2cm]{geometry}

\usepackage{setspace}
\onehalfspace
%\usepackage[style=authoryear, backend=biber]{biblatex} 
% [style=iest] authoryear=Angenedt 2002
% Festlegung Art der Zitierung - Havardmethode: Abkuerzung Autor + Jahr
%\bibliographystyle{alphadin}

\makeatletter %Abstände Text zu section
\renewcommand\section{\@startsection 
   {section}{1}{0mm}%         % name, ebene, einzug 
   {4\baselineskip}%            % vor-abstand 
   {2\baselineskip}%            % nach-abstand 
   {\bfseries\Large}%      % layout 
   } 
\makeatother 
\makeatletter %Abstände Text zu subsection
\renewcommand\subsection{\@startsection 
   {subsection}{2}{0mm}%      % name, ebene, einzug 
   {4\baselineskip}%            % vor-abstand 
   {2\baselineskip}%            % nach-abstand 
   {\bfseries\large}%           % layout 
   } 
\makeatother 
\makeatletter %Abstände Text zu subsection
\renewcommand\subsubsection{\@startsection 
   {subsubsection}{2}{0mm}%      % name, ebene, einzug 
   {3\baselineskip}%            % vor-abstand 
   {1\baselineskip}%            % nach-abstand 
   {\bfseries\large}%           % layout 
   } 
\makeatother

\makeatletter% siehe De-TeX-FAQ 
\g@addto@macro\quotation{\setstretch{1}\noindent\ignorespaces} 
\makeatother% siehe \makeatletter 


\renewenvironment{quote}
{\small\list{}{\rightmargin=0.9cm \leftmargin=0.9cm}%
\item\relax}
{\endlist}


\begin{document}


\chapter{Die Briefe}


\section{Brief 1}

Das ist ein Brief...

\end{document}

In einem Unterkapitel ist der \section Befehl genauso angegeben und wird mir als Fehler angegeben, während in den anderen Unterkapiteln derselbe Befehl funktioniert.
Daher meine generelle Frage: Wie kann ich den zerbrechlichen \section-Befehl schützen?

aasaa00
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 57
Registriert: Do 1. Mär 2018, 11:43

Beitrag von aasaa00 »

Anonymous hat geschrieben:Man muss fragile Befehle nur in bestimmten Situationen, beispielsweise innerhalb eines moving arguments schützen. \section müsste also nur geschützt werden, wenn es beispielsweise selbst im Argument eines \section-Befehls stehen würde. Die reine Anzahl an Befehlen hat dagegen eher keinen Einfluss (außer eventuell, wenn Du eine sehr, sehr große Zahl an \section-Befehlen nacheinander stehen hast, ohne Text dazwischen).

Daher: Mach ein Minimalbeispiel nach der verlinkten Anleitung. Dann sollte sich der Fehler eingrenzen und das Problem lösen lassen.
Danke für die Erklärung. Damit scheidet die reine Anzahl als Grund aus, da nach dem \section Befehl stets Text folgt. Ich verstehe dann aber nicht die Fehlermeldung: ("tex capacity exceeded, sorry [input stack size=50000] --\protect ->\noexpand \protect"). Ich weiß, dass man das \section in meinem MWE eigentlich nicht schützen bräuchte; aber das Beispiel ist (beinahe) originalgetreu wiedergegeben und der \section-Befehl wird mir als Fehler angezeigt: Ich frage mich daher wie man den \section Befehl in meinem Beispiel schützen könnte?

Gast

Beitrag von Gast »

Höchstwahrscheinlich tut es nichts zur Sache, aber mit dem Paket setspace ist onehalfspacing eine Umgebung, die obendrein zusätzlich (zu der eh impliziten, wenn es denn als Umgebung genutzt wird) noch eine Gruppe öffnet. Daher verursacht der Aufruf von \onehalfspacing, der schon einen kleinen Syntax-Abuse beinhaltet, dann auch eine nicht geschlossene Gruppe:

Code: Alles auswählen

(\end occurred inside a group at level 1)

### semi simple group (level 1) entered at line 7 (\begingroup)
### bottom level
Wahrscheinlich möchtest Du eigenlich den Befehl \onehalfspacing (mit ing). Der Produziert diese Probleme nämlich nicht.

Ansonsten wird mir zumindest aus dem bis jetzt gezeigten Code absolut nicht klar, wie das Problem bei Dir auftritt. Ich bin mir auch nicht ganz sicher, ob Dein Problem überhaupt ist, dass \section nicht geschützt ist, da es bei normalem Gebrauch eigentlich nicht geschützt werden müsste. Deine Fehlermeldung ist ja auch nur eine gute alte Endlosschleife, die TeX dann irgendwann aus Speicherproblemen abbrechen muss.

Der LaTeX Kern hat \def\@unexpandable@protect{\noexpand\protect\noexpand} und nutzt diese Definition für \protect z.B. in \protected@edef. Eventuell ist da etwas in die falsche Ecke gerutscht. Was kann ich Dir ohne Minimalbeispiel, das den Fehler reproduziert, aber beim besten Willen nicht sagen. Nach meiner Erfahrung ist es aber bei solchen Fehlern fast immer möglich, mit etwas Arbeit auch große Dokumente auf ein einfaches Minimalbeispiel herunterzubrechen, das das Problem reproduziert. Die Halbierungssuche, bei der Du immer die Hälfte Deines Dokuments löschst/auskommentierst und überprüfst, ob der Fehler noch da ist, kann auch sehr große Dokument recht schnell herunterbrechen.

Wann genau tritt der Fehler denn auf? Bei allen \sections? Nur bei einer? Geht der Fehler weg, wenn Du das vorheriger Kapitel auskommentierst? Hast Du vielleicht am Ende des Kapitels vor dem problematischen Befehl besonderen Code stehen?

aasaa00
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 57
Registriert: Do 1. Mär 2018, 11:43

Beitrag von aasaa00 »

Danke für den Hinweis. Zum Problem: Ich habe mehrere Chapter, die ich durch \include in das Hauptdokument eingebunden sind. Beim letzten Chapter ist die genannte Fehlermeldung plötzlich aufgeteilt, obwohl es sich um copy+paste handelt. In dem genannten Chapter steht wirklich nur:

Code: Alles auswählen


\chapter{Die Briefe des ...}


\section{Brief XY...}

Text xyz

So beginne ich auch alle anderen Chapter und da ist es kein Fehler - nur in diesem Chapter gibt es eine Fehlermeldung. Wenn ich aber in dem besagten Chapter den Befehl \section lösche, verschwindet die Fehlermeldung und das Dokument wird fehlerlos (also ohne Fehlermeldung) erstellt.
Es muss also von diesem \section-Befehl herkommen. Ich habe jetzt den Problem-chapter vor den funktionierenden Chaptern gestellt, aber die Fehlermeldung bleibt, d.h. es kann nicht von einem Chapter kommen, der vorher auftritt;
Ich gehe das Latex-Dokument durch und versuche ein MWE zu erstellen; aber ich verstehe nicht, wie ein identischer Befehl in unterschiedlichen Kapiteln mit der gleichen Umgebung in einem Chapter eine Fehlermeldung verursacht, aber in den anderen einwandfrei funktioniert.

aasaa00
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 57
Registriert: Do 1. Mär 2018, 11:43

Beitrag von aasaa00 »

Manchmal konzentriert man sich auf einen Punkt zu stark und vergisst das offensichtliche:

Die Endlosschleife wurde nicht durch \section, sondern durch einen \index-Befehl in \chapter ausgelöst. Da sich nur in diesem Kapitel der Name einer Person auffindet, hatte ich den \index-Befehl in die Kapitelüberschrift eingefügt. Seitdem ich diesen Befehl gelöscht habe, klappt alles wunderbar. Wenn man den \index-Befehl in einem \section-Befehl setzt, wird dieser Fehler komischerweise nicht angezeigt.
Sei's drum, Problem gelöst und vielen Dank für die hilfreichen Beiträge!

Antworten