介绍
当我试图弄清楚我当前的问题时(根据两个 makros/命令的值的比较,向目录中添加一行:请参见此处:根据字符串比较添加 tocline) 我发现,问题可能与命令的重新定义有关,而不是与 strcmp 的实际逻辑或其他东西有关。
因此,我尝试提供我的文件和问题的结构化当前状态。
简短的摘要
我最终想要做的是:
- 包括多个文件根文件(文件名为千瓦
\i
.特克斯-\i
包含文件后数字会增加) - 每个文件都应更新其值,
\Field
该值包含一个字符串,类似于Dummyfield
以下行\renewcommand{\Field}{My Field}
- 在此覆盖发生之前,我想保存最后一个文件
\Field
。\OldField
目前我正在使用\let\OldField\Field
Werner 建议的 命令的初始定义是
\newcommand{\Field}{Dummyfield} \newcommand{\OldField}{}
\Field
比较和的值\OldField
(使用 pdfstrcmp)。如果它们不同,即字段发生变化,则向目录中添加一个新条目。特别是如果它们相等,不得将第二个相同的条目写入目录
根文件
% 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}
数据文件(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-----------------------------
%--------------------------------------------------------------------------------------------------------------
目前有两个文件 KW36.tex 和 KW37.tex。它们都具有相同的字段\renewcommand{\Field}{My Field}
我检查了 .log 文件,查看了数据文件中三个点的\Field
和值。此表包含相应的值:\OldField
问题
这种行为引出了一个简单的问题:为什么?:D 文件之后KW37.tex用 更新命令,和\renewcommand{\OldField}{\Field}
不应该 保持相同的值吗?\Field
\OldField
My Field
答案1
\foreach
在组内执行其内容,因此迭代之间局部定义是未知的。
\global
您应该通过在前面加上前缀\let
并使用来使定义成为全局的\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-----------------------------
%--------------------------------------------------------------------------------------------------------------
我只是用\let\OldField\Field
by\global\let\OldField\Field
和\renewcommand{\Field}{My Field}
by替换了\gdef\Field{My Field}
。