0

Intro

While trying to get my head a round my current problem (To add a line to the toc, depending on the comparison of the values of two makros/commands: please see here: Add tocline depending on string compare) I found out, the problem might have more to do with the redefinition of a command, than with the actual logic of strcmp or some other thing.

So here is my attempt to give a structured current state of my files and problem.

Short summary

Ultimately what I want to do is:

  • Include multiple files in a root-file (the files are named KW\i.tex - with \i being a number increased after a file is included)
  • Every file shall renew the value of \Field which holds a string like Dummyfield with the line \renewcommand{\Field}{My Field}
  • Before this override happens I want to save the last file's \Field in \OldField. Currently I'm using \let\OldField\Field as Werner suggested
  • The initial definition of the commands are

    \newcommand{\Field}{Dummyfield}
    
    \newcommand{\OldField}{}
    
  • Compare the values of \Field and \OldField (with pdfstrcmp). If they are different, aka the field changes, add a new entry to the toc. Especially if they are equal, a second identical entry must not be written to the toc

Root-file

% Dokument-Grundeinstellungen
\documentclass[11pt, a4paper, titlepage, parskip=half]{scrbook}
%   \usepackage{tocbasic}
\usepackage[a4paper,lmargin=2cm,rmargin=2cm,tmargin=2.5cm,bmargin=2.5cm]{geometry}  % Format und Seitenraender
\usepackage[onehalfspacing]{setspace}                                                   % Zeilenabstand
%------------------------------------------------------------

% Schriftart
%\usepackage[scaled=.92]{helvet}                    % Helvetica (skaliert) als serifenlose Schriftart (Standard fuer serifenlose Schrift)  -- besser geeigent zum Lesen am BILDSCHIRM
    % \renewcommand{\familydefault}{\sfdefault}     % (Eingestellte) serifenlose Schrift als Standardschrftart (fuer Fliesstext)
\usepackage{lmodern}                                % Besser lesbare Standardschriftart (Serifenschrift) -- besser geeigent zum Lesen auf PAPIER
\usepackage{courier}    % Schritart Courier als Schrift einstellen
    \renewcommand{\familydefault}{\rmdefault}       % (Eingestellte) Serifenschriftart als Standardschrift (fuer Fliesstext)
    \setkomafont{sectioning}{\rmfamily\bfseries}    % Ueberschriften in Serifenschrift (fett)
    %\setkomafont{sectioning}{\rmfamily}            % Ueberschriften in Serifenschrift (plain)
\usepackage{xcolor}                                 % Textfarbe aendern - Fuer Dokument, Paragraph oder diskrete Texteile mit '\textcolor{Farbe}{Text}'



%------------------------------------------------------------

% Kopf- und Fusszeile
\usepackage[markcase=noupper, headsepline=false]{scrlayer-scrpage}  % no uppercasing
        \setkomafont{pageheadfoot}{\sffamily}
        \setlength{\headheight}{2cm}
        \setlength{\footheight}{2cm}
        \newcommand*{\Field}{Dummyfield}
        \newcommand*{\OldField}{}
            %\let\OldField\Field
    \ihead{Name: Jon Doe\\ Field: \Field}
    %\cfoot{\pagemark}

%------------------------------------------------------------

% Ausgabe von Umlauten (vor 'inputenc' einbinden!)
\usepackage[T1]{fontenc}        % Schoene Ausgabe von Umlauten
%------------------------------------------------------------

% Deutsche Eingabe
\usepackage[utf8]{inputenc}     % Umlaute direkt eingeben   UTF-8 zur besseren Zusammenarbeit mit vers. Betriebssystemen
\usepackage[ngerman]{babel}     % deutsche Eingabe (Zur Eingabe von Umlauten wird 'inputenc' benötigt)
%------------------------------------------------------------

% Mathematik-Bibliotheken
\usepackage{amsmath}    % Schoene Formelumgebung - align{, \[ \], ... - NICHT eqnarray, displaymath 
\usepackage{amssymb}    % mathematische Schriftarten, Zeichensaetze und Symbole - laedt automatisch das Paket 'asmfonts'
\usepackage{mathptmx}   % Funktion aktuell Unklar. Vmt: Verbindung von drei Schriftarten fuer serifen, serifenlosund typewriter Fonts: Times/Helvetica/Courier (Helvetica akaliert - siehe Schriftart)
\usepackage[exponent-product = \cdot, decimalsymbol=comma, per=frac ]{siunitx}  % SI-Einheiten verwenden Bsp: 
\usepackage{datetime}
    \renewcommand{\dateseparator}{.}
\usepackage{advdate}                                    % Datumberechnungen anstellen
    \newcommand{\Datum}{00/00/0000}     % Leeres Datum vorbelegen
\usepackage{ifthen}
%------------------------------------------------------------

% Weitere Zeichensaetze
\usepackage{textcomp}   % Erweiterter Zeichensatz
\usepackage{enumitem}   % spez. Nummerierungen z.B. a) b) c)
\usepackage[autostyle=true, german=quotes]{csquotes}
%------------------------------------------------------------

% Bilder, Grafiken und Dokumente einbinden
\usepackage{graphicx}   % Bilder und Grafiken einbinden '\includegraphics[Optionen]{Herkunft/Speicherort}'
\usepackage{here}       % Figures (Bilder) genau an dieser Stelle einbinden / Einbinden erzwingen - Option [H] - !!ACHTUNG!! Als Option fuer Gleitumgebungen gedacht, widerspricht aber dem Sinn einer Gleitumgebung !
\usepackage{pdfpages}   % PDF-Dokumente einbinden
\usepackage{adjustbox}  % Objektgroessen anpassen/skalieren
\usepackage{tabularx}
\usepackage{array}
    \newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\usepackage{colortbl}
\usepackage{multirow}
\usepackage{pgf}
    \usepackage{pgfplots}
        \pgfplotsset{compat=1.16}
    \usepackage{pgffor}     
\usepackage{tikz}
\usepackage[absolute, overlay]{textpos}
    \setlength{\TPHorizModule}{1mm}
    \setlength{\TPVertModule}{1mm}
\usepackage{pdftexcmds}
%------------------------------------------------------------

% Referenzen/Links lauffaehig machen
\usepackage[pdftex]{hyperref}       % Unmittelbares Erzeugen von PDF-Ausgabe / Verknuefpungen/Links herstellen UND Ermoeglichung von urls: \url{}
\usepackage{cleveref}               % Erweiterte Refernzenbefehle -- IMMER NACH hyperref lade
    \crefname{enumi}{Punkt}{Punkte} % Aendert den angezeigten Namen des Labels 'enumi' in 'Punkt' bzw. 'Punkte' (Plural)
    \crefname{figure}{Abbildung}{Abbildungen}
    \crefname{eqation}{Gleichung}{Gleichungen}
    \Crefname{equation}{Gleichung}{Gleichungen}
    \crefname{subsection}{Unterabschnitt}{Unterabschnitte}
    %\Crefname{subsection}{Unterabschnitt}{Unterabschnitte}
\usepackage[version=4]{mhchem}      % Noeatig um cref-Namen neu zu besetzen
\renewcommand{\listfigurename}{Abbildungen}


% Dauer-Kommando 
\newcommand{\dauer}[1]{\SI{#1}{\hour}}
% Kalendarwochen-Kommando
\newcommand{\KW}{00} 



\begin{document}
 %------------------------------------------------------------

\tableofcontents                % Inhaltverzeichnis erzeugen
\newpage
%-----------------------------------------------------------
    %\cleardoublepage
    %\cleardoublepage   
    \include{./2018/2018}
    \foreach \i in {00, 01, 02, ..., 99}{%
        \edef\FileName{./2018/Wochen/KW\i}%
        \IfFileExists{\FileName}{%
        \include{\FileName}%
        }
    }
\end{document}

Data-files (KW\i.tex)

% ----------------------------------------EINSTELLUNGEN--------------------------------------------------
% ---------------------------- ANFANGSTAG  UND KW SETZEN ----------------------------------------
                                    \renewcommand{\Datum}{03/09/2018}                           % <--- Datumsvariable neu setzen {TT/MM/JJJJ}
                                    \renewcommand{\KW}{36}                                                  % <--- KW neu setzen; z.B. {36} fuer KW 136
% --------------------------------------------------------------------------------------------------------------
\SetDate[\Datum]%---------------------------------------------------------------------------------------      % \today per advdate aendern
% --------------------------------------------------------------------------------------------------------------
%\show\OldField
\let\OldField\Field% ------------------- Vorherigen Bereich speichern ----------------------
%\expandafter \renewcommand\expandafter\OldField\expandafter{\Field}
%\show\OldField
% ------------------------------------ BEREICH SETZEN ---------------------------------------------------
                            \renewcommand{\Field}{My Field}                                 % <--- Neuen Bereich setzen                 
% --------------------------------------------------------------------------------------------------------------
%\show\OldField 
% --------------------------------------------------------------------------------------------------------------
\section*{KW \KW{} \hspace{12pt}\today{} - \AdvanceDate[4]\today}%----------------
\ifnum\pdfstrcmp{\Field}{\OldField}=0
\else
    \addtocounter{section}{1}
    \addcontentsline{toc}{section}{\Field}%------------------------------------------------------
\fi


%\ifthenelse{ \not\equal{\OldField}{\Field}  }{%---------------------------------------------------
%   \addtocounter{section}{1}%------------------------------------------------------------------------
%   \addcontentsline{toc}{section}{\Field}}{%------------------------------------------------------
%}%-------------------------------------------------------------------------------------------------------------
%  -------------------------------------------------------------------------------------------------------------
\SetDate[\Datum] %-- Datum zurücksetzen auf Wochenanfang-----------------------------
%--------------------------------------------------------------------------------------------------------------

Currently there are two files KW36.tex and KW37.tex. They both have the same field \renewcommand{\Field}{My Field}

I checked the .log-File to see the values of \Field and \OldField at the three points you can see in the Data-Files. This table holds the corresponding values:

Values from the two files at the three specified points in the code

The Question(s)

This behavior begs the simple question: WHY? :D After file KW37.tex renewed the command with \renewcommand{\OldField}{\Field}, shouldn't \Field and \OldField hold the same value My Field?

  • Welcome to TeX.SX! Any chance of cutting this down to a minimal working example. Without wading through you code I wonder if you are setting \Field inside a group. – Andrew Oct 10 '18 at 14:42
  • 1
    To add insult to injury your code doesn't produce the table above at all! In future posts can you please post a minimal working example that compiles, if possible, and is as small as possible to reproduce your problem and what you describe in the question. – Andrew Oct 10 '18 at 14:51
  • You're right. Next time a try to give a slimmer example. To my defence, I never told the code would produce this particular table. The table is "handmade" to see the values of \Field and \OldField at different steps in the code ;) – Michael Schmid Oct 10 '18 at 14:55
1

\foreach executes its contents inside a group, so local definitions are unknown between iterations.

You should make the definitions global by prefixing \global to \let and using \gdef:

% ---------------------------- ANFANGSTAG  UND KW SETZEN ----------------------------------------
                                    \renewcommand{\Datum}{03/09/2018}                           % <--- Datumsvariable neu setzen {TT/MM/JJJJ}
                                    \renewcommand{\KW}{36}                                                  % <--- KW neu setzen; z.B. {36} fuer KW 136
% --------------------------------------------------------------------------------------------------------------
\SetDate[\Datum]%---------------------------------------------------------------------------------------      % \today per advdate aendern
% --------------------------------------------------------------------------------------------------------------
%\show\OldField
\global\let\OldField\Field% ------------------- Vorherigen Bereich speichern ----------------------
%\expandafter \renewcommand\expandafter\OldField\expandafter{\Field}
%\show\OldField
% ------------------------------------ BEREICH SETZEN ---------------------------------------------------
                            \gdef\Field{My Field}                                 % <--- Neuen Bereich setzen                 
% --------------------------------------------------------------------------------------------------------------
%\show\OldField 
% --------------------------------------------------------------------------------------------------------------
\section*{KW \KW{} \hspace{12pt}\today{} - \AdvanceDate[4]\today}%----------------
\ifnum\pdfstrcmp{\Field}{\OldField}=0
\else
    \addtocounter{section}{1}
    \addcontentsline{toc}{section}{\Field}%------------------------------------------------------
\fi


%\ifthenelse{ \not\equal{\OldField}{\Field}  }{%---------------------------------------------------
%   \addtocounter{section}{1}%------------------------------------------------------------------------
%   \addcontentsline{toc}{section}{\Field}}{%------------------------------------------------------
%}%-------------------------------------------------------------------------------------------------------------
%  -------------------------------------------------------------------------------------------------------------
\SetDate[\Datum] %-- Datum zurücksetzen auf Wochenanfang-----------------------------
%--------------------------------------------------------------------------------------------------------------

I just replaced \let\OldField\Field by \global\let\OldField\Field and \renewcommand{\Field}{My Field} by \gdef\Field{My Field}.

  • Thank You! Using \global and \gdef fixed the problem. – Michael Schmid Oct 10 '18 at 16:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.