Programmieren in Latex

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


IrenaSekuta
Forum-Century
Forum-Century
Beiträge: 230
Registriert: Di 2. Dez 2008, 10:05

Programmieren in Latex

Beitrag von IrenaSekuta »

Hallo zusammen,

ich möchte mir gerne eine eigene Variabel erzeugen, die in Abhängigkeit von dem Wert einer anderen Variabel einen Wert zugewiesen bekommen soll.

Ich drücke es einmal in einer anderen Programmiersprache aus (Hier VB.NET):
' Delarieren der Variablen als Zeichenketten
Dim a As String
Dim b as String

' Wert
If b = "0.0" Then
   a = "-"
Else
   a = b 
End if
So, und das gleiche möchte ich nun mit LaTeX machen. Hierbei soll die Variabel b der Abschnittsnummer \section entsprechen
\newcommand{\a}{&
...
}
Folgende Idee steckt dahinter. Ich möchte diese Variabel in meine Kopfzeile einbauen. Auf Seiten, wie z.B. dem Inhalts-, Abbildungs- und Tabellenverzeichnis soll dann dort einfach "-" stehen, auf anderen Seiten die Abschnittsnummer, z.B. "1.3" für Section 1.3.

Ich weiß nicht so genau, on die Frage in diese Rubrik passt. Eventuell wäre es gut, eine neue Rubrik zu erzeugen, wo solche programmtechnischen Fragen geklärt werden können.

Vielleicht kann mir jemand auch Seiten im Netz oder Bücher nennen, wo/womit man das Programmieren in Latex lernen kann.

Gruß,

Irena

IrenaSekuta
Forum-Century
Forum-Century
Beiträge: 230
Registriert: Di 2. Dez 2008, 10:05

Beitrag von IrenaSekuta »

Hallo,

bin etwas weiter gekommen. Mit einbinden des Paktes
\usepackage{xifthen}
erreiche ich Folgendes (Ich weiß nur nicht, ob der Code so funktioniert :-))
\newcommand{\KapitelNr}{}
\ifthenelse{
	\equal{\thesection}{0.0}}
	{\renewcommand{\KapitelNr}{-}}
	{\renewcommand{\KapitelNr}{\thesection}}
Doch wie erreiche ich es nun, das Latex beim Erzeugen jeder Seite die Abfrage durchführt?

Gruß,

Irena

Schweinebacke

Beitrag von Schweinebacke »

Vorsicht! Irgendwelche Makros in die Kopfzeile zu packen, die einen Gliederungszähler enthalten, ist höchst gefährlich. LaTeX hat einer asynchronen Seitenausgabe, so dass der Zähler zu dem Zeitpunkt, wenn er ausgegeben wird, bereits weitergezählt sein kann. Deshalb gibt es bei LaTeX den Mark-Mechanismus. Ich habe das in http://www.golatex.de/viewtopic,p,12834.html#12834 erst kürzlich demonstriert.

Du müsstest die Fallunterscheidung also bereits in \sectionmark oder was immer verwendet wird, um den Zähler per \markboth oder \markright in den Kopf zu bekommen, vornehmen.

IrenaSekuta
Forum-Century
Forum-Century
Beiträge: 230
Registriert: Di 2. Dez 2008, 10:05

Beitrag von IrenaSekuta »

Hallo,

erst einmal recht herzlichen Dank für deine Antwort. Hhabe den von Dir geposteten Code:
\documentclass[12pt]{scrreprt}
\usepackage{fancyhdr}
\pagestyle{fancy}
\usepackage{colortbl}
\usepackage{color}
\definecolor{darkblue}{rgb}{0,0,0.5}
\rhead{\color{black}Seite \thepage}
\DeclareRobustCommand*{\sectionmarkbox}[1]{%
  \begin{tabular}{>{\columncolor{darkblue}\color{white}}c|||>{\columncolor{white}}c}
    \large\bfseries~~#1&~
  \end{tabular}
}
\renewcommand{\sectionmarkformat}{%
  \sectionmarkbox{\thesection}%
}
\lhead{\color{darkblue}\bfseries\leftmark}
\renewcommand*\sectionmark[1]{\markboth{\sectionmarkformat\MakeUppercase{#1}}{}}

\usepackage{lipsum}

\begin{document}
\section{First Section}
\lipsum[2-4]\lipsum[4]
\section{Second Section}
\lipsum
\end{document}
ausprobiert (musste in Zeile 16 das \newcommand{\sectionmarkformat}{...} in \renewcommand{\sectionmarkformat}{...} ändern, damit er fehlerfrei ausgeführt wird, dennoch sehe ich keine Unterschied zu dem Code, wenn ich direkt \thesection in der Kopfzeile eingeben würde.

Auf der ersten Seite steht bei mir "0.2 SECTION". Genau so wie bei direkter Verwendung des Zählers \thesection.

Kann jemand anderes eventuell dieses Verhalten bestätigen, oder mache ich mal wieder etwas falsch. :)

Unabhängig davon, ist das von Dir in dem Posting angesprochene Problem genau das, was ich als nächstes angesprochene hätte. :)



Gruß,

Irena

Schweinebacke

Beitrag von Schweinebacke »

Du hast eben nicht meinen Code ausprobiert. Du hast erst meinen Code geändert und ihn dann ausprobiert. Das ist, als würdest Du mir sagen, dass die teure weiße Farbe, die ich Dir verkauft habe, entgegen meiner Behauptung auf einer roten Wand nicht beim ersten Anstrich decken, ich dann dunkelblaue Abtönfarbe dazugeben und damit dann beweisen wollte, dass Deine Behauptung falsch sei. Deine Änderung ist lediglich etwas schwerer aufzuspüren, so dass ein unbedarfter Beobachter sich von Dir sogar reinlegen lassen könnte.

In meinem Beispiel wird die Klasse paper verwendet. Du verwendest aber die Klasse scrreprt. Du kannst Dir vielleicht vorstellen, dass der Umbruch auch von der Klasse abhängt und ein Beispiel, bei dem der (asynchrone) Seitenumbruch eine Rolle spielt, sich durch die Änderung der Klasse ändert. Wenn Du genau mein erstes Beispiel verwendest sollte im Kopf "2 First Section" stehen.

Das heißt jetzt nicht, dass bei scrreprt das Problem nicht auftritt. Es tritt nur zufällig in dem Beispiel nicht auf, wenn man die Klasse paper durch scrreprt ersetzt, weil der Umrbuch anders ist. Mit nur einem geänderten Zeichen hast Du das Problem auch bei scrreprt:
\documentclass[12pt]{scrreprt}
\usepackage{fancyhdr}
\pagestyle{fancy}
\usepackage{colortbl}
\usepackage{color}
\definecolor{darkblue}{rgb}{0,0,0.5}
\rhead{\color{black}Seite \thepage}
\lhead{\begin{tabular}{>{\columncolor{darkblue}\color{white}}c|||%
      >{\columncolor{white}}c}
    \large\bfseries~~\thesection&~
  \end{tabular}\color{darkblue}\bfseries\leftmark}
\renewcommand*\sectionmark[1]{\markboth{\MakeUppercase{#1}}{}}

\usepackage{lipsum}

\begin{document}
\section{First Section}
\lipsum[1-4]\lipsum[4]
\section{Second Section}
\lipsum
\end{document}
Sicherheitshalber gebe ich Dir jetzt noch die Klassen- und Paketversionen an, die ich verwendet habe:
 *File List*
scrreprt.cls    2009/04/03 v3.03a KOMA-Script document class (report)
scrkbase.sty    2009/04/03 v3.03a KOMA-Script package (KOMA-Script-dependent basics and keyval usage)
 scrbase.sty    2009/04/03 v3.03a KOMA-Script package (KOMA-Script-independent basics and keyval usage)
  keyval.sty    1999/03/16 v1.13 key=value parser (DPC)
scrlfile.sty    2009/03/25 v3.03 KOMA-Script package (loading files)
tocbasic.sty    2009/01/20 v3.02a(package)
scrsize12pt.clo    2009/04/03 v3.03a KOMA-Script font size class option (12pt)
typearea.sty    2009/04/03 v3.03a KOMA-Script package (type area)
fancyhdr.sty    
colortbl.sty    2001/02/13 v0.1j Color table columns (DPC)
   array.sty    2005/08/23 v2.4b Tabular extension package (FMi)
   color.sty    2005/11/14 v1.0j Standard LaTeX Color (DPC)
   color.cfg    2007/01/18 v1.5 color configuration of teTeX/TeXLive
  pdftex.def    2008/09/08 v0.04l Graphics/color for pdfTeX
  lipsum.sty    2005/01/26 v1.0 150 paragraphs of Lorem Ipsum dummy text
supp-pdf.tex
Genau darum, dass dieses Problem auftreten kann und man im Voraus nicht sagen kann, ob es bei einem Dokument auftreten wird, geht ist. Diese schwere Vohersagbarkeit, die Schwierigkeit, dass eine kleine Änderung das Problem auslösen kann, macht es umso schwerwiegender. Denn solche kleinen Änderungen macht man üblicherweise 5 Minuten bevor das Dokument in Druck geht. Und beim anschließenden mal eben drüberschauen, merkt das garantiert niemand. Das fällt dann erst dem aufmerksamen Leser auf und dann ist es zu spät. Also sollte man sich solche Fallen gar nicht erst stellen, sondern Zähler und Überschrift immer per Mark-Mechanismus in den Kolumnentitel schreiben. Der Mark-Mechanismus berücksichtigt nämlich den asynchronen Seitenumbruch, so dass das Problem nicht auftritt.

IrenaSekuta
Forum-Century
Forum-Century
Beiträge: 230
Registriert: Di 2. Dez 2008, 10:05

Beitrag von IrenaSekuta »

Hallo Schweinebacke,

herzlichen Dank für deine tolle Antwort. Und entschuldige bitte, dass ich übersehen hatte, dass ich einen von mir leicht veränderten Code als deinen ausgab.

Habe zwar nicht alles verstanden, aber es immerhin geschafft, deinen Lösungsvorschlag auf mein Problem anzuwenden.
\documentclass[ngerman,twoside=false]{scrreprt}

\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}	% Input-Encodung
\usepackage[ngerman]{babel}		% Neue Rechtschreibung 
\usepackage[automark]{scrpage2} % Kopf und Fußzeilen
\usepackage{blindtext}
\usepackage[
	left=25mm,
	right=25mm,
	top=30mm,
	bottom=20mm,
	headheight=20mm,
	headsep=5mm,
	footskip=24pt,
]{geometry}
\usepackage[user,lastpage]{zref}
\usepackage{array}

% ========== Voreinstellungen ändern ==========
\renewcommand*{\chapterpagestyle}{scrheadings}

\DeclareRobustCommand*{\sectionmarkbox}[1]{#1}

\renewcommand*\sectionmark[1]{
	\markboth{\sectionmarkbox{\thesection}}{}
}

% ========== scrpage2: Kopfzeile gestalten ==========
\setheadwidth[0pt]{\textwidth}
\setheadsepline{0.4 pt}
\ihead{\large{\textbf{Irgendeine \\ Firmen AG}}}
\chead{\large{\textbf{Erste Zeile\\ Zweite Zeile}}}
\ohead{
	\renewcommand{\arraystretch}{0.95}
	\begin{tabular}{l c r@{}}
		\small{Kapitel} & \small{:} & \small{\leftmark} \\
		\small{Seite} 	& \small{:} & \small{\thepage/\zpageref{LastPage}} \\
		\small{Stand} 	& \small{:} & \small{31.12.2009}
	\end{tabular}
}

% ========== scrpage2: Fußzeile gestalten ==========
\setfootwidth[0pt]{\textwidth}
\setfootsepline{0.4pt}
\cfoot{}
\ofoot{\rule{0pt}{15pt}\leftmark}

\begin{document}
	\pagestyle{scrheadings}
	\blinddocument
	\blinddocument
\end{document}
Herzlichen Dank !!!

Hast Du eventuell einen Tipp, wo ich den Unterschied zwischen der Stern und Nicht-Sternvariante von \renewcommand nachlesen könnte?

Gruß,

Irena

ratte

Beitrag von ratte »

Der Unterschied ist derselbe wie bei \newcommand und \newcommand*. Der müsste im usrguide bei der Erklärung der Anweisungen stehen. Kurz gesagt, die Sternvariante erlaubt keinen Absatz im Argument, hat aber den Vorteil, dass man bei einer vergessenen End-Klammer früher eine Fehlermeldung erhält und den Fehler in der Regel leichter findet. Ich verwende eigentlich immer die Sternform, außer ich erstelle bewusst eine Anweisung, die über mehrere Absätze gehen soll.

IrenaSekuta
Forum-Century
Forum-Century
Beiträge: 230
Registriert: Di 2. Dez 2008, 10:05

Beitrag von IrenaSekuta »

Hallo ratte,

um mich noch einmal zu vergewisseren, ob ich unter "Absatz" auch alles richtig verstanden habe:
\renewcommand*\sectionmark[1]{
\markboth{\sectionmarkbox{\thesection}}{}
}
wäre falsch und
\renewcommand\sectionmark[1]{
\markboth{\sectionmarkbox{\thesection}}{}
}
rcihtig?

Ungeachtet dessen, würde ich ergen verstehen, warum bei mir in der Kopfzeile nach Kapitel statt "0.1" die "0.2" erscheint:
\documentclass[ngerman,twoside=false]{scrreprt}

\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}   % Input-Encodung
\usepackage[ngerman]{babel}      % Neue Rechtschreibung
\usepackage[automark]{scrpage2} % Kopf und Fußzeilen
\usepackage{blindtext}
\usepackage[
   left=25mm,
   right=25mm,
   top=30mm,
   bottom=20mm,
   headheight=20mm,
   headsep=5mm,
   footskip=24pt,
]{geometry}
\usepackage[user,lastpage]{zref}
\usepackage{array}

% ========== Voreinstellungen ändern ==========
\renewcommand{\chapterpagestyle}{scrheadings}

\DeclareRobustCommand{\sectionmarkbox}[1]{#1}

\renewcommand{\sectionmark}[1]{
   \markboth{\sectionmarkbox{\thesection}}{}
}

% ========== scrpage2: Kopfzeile gestalten ==========
\setheadwidth[0pt]{\textwidth}
\setheadsepline{0.4 pt}
\ihead{\large{\textbf{Irgendeine \\ Firmen AG}}}
\chead{\large{\textbf{Erste Zeile\\ Zweite Zeile}}}
\ohead{
   \renewcommand{\arraystretch}{0.95}
   \begin{tabular}{l c r@{}}
      \small{Kapitel} & \small{:} & \small{\leftmark} \\
      \small{Seite}    & \small{:} & \small{\thepage/\zpageref{LastPage}} \\
      \small{Stand}    & \small{:} & \small{31.12.2009}
   \end{tabular}
}

% ========== scrpage2: Fußzeile gestalten ==========
\setfootwidth[0pt]{\textwidth}
\setfootsepline{0.4pt}
\cfoot{}
\ofoot{\rule{0pt}{15pt}\leftmark}

\begin{document}
   \pagestyle{scrheadings}
	\section{Erster Abschnitt}
	\blindtext
	\section{Zweiter Abschnitt}
	\blindtext
\end{document}[/quote]



Gruß,

Irena

Antworten