根据字符串比较添加 tocline

根据字符串比较添加 tocline

!! 注意力 !!

由于这个主题变得有些复杂,我尝试根据新收集的信息重新构建该主题。请参阅此帖子以了解最新详细信息:从不同文件多次使用 \renewcommand{} 覆盖宏 - toc addcontentsline


我想根据两个字符串的比较,在目录中添加一行。

初始设置

在根文件中我定义了两个命令

\newcommand{\Field}{Dummyfield}
\newcommand{\OldField}{}

根文件获取大量要读取的章节文件。每个章节都会重新定义 -command \Field{}。我想要做的是比较Field{}和中的字符串\OldField{},如果它们不相等,我想在目录中添加一行,说明任何内容\Field{}

我的文件是: (根文件)

% 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
    \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{color}                                  % 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}{}
    \ihead{Name: Jon Doe\\ Ausbildungsbereich: \Field}
    \ohead{\includegraphics[height=1.8cm]{./Bilder/Logo.jpg}}
    %\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{courier} % Schritart Courier als Typewriter-Font einstellen
\usepackage[exponent-product = \cdot, decimalsymbol=comma, per=frac ]{siunitx}  % SI-Einheiten verwenden Bsp: \SI{100}{\degreeCelsius}
\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{wrapfig}    % umfliessende Grafiken '\begin{wrapfigure}{Position{Breite} ..'
\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}
%------------------------------------------------------------

% 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}
% Tabellenfarbe definier
\definecolor{tabcol}{rgb}{0.75, 0.75, 0.75}


\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}

其中之一内容文件s(部分):

% ----------------------------------------EINSTELLUNGEN--------------------------------------------------
% ---------------------------- ANFANGSTAG  UND KW SETZEN ----------------------------------------
                                    \renewcommand{\Datum}{00/00/0000}                           % Datumsvariable neu setzen {TT/MM/JJJJ}
                                    \renewcommand{\KW}{36}                                                  % KW neu setzen; z.B. {36} fuer KW 136
% --------------------------------------------------------------------------------------------------------------
\SetDate[\Datum]%---------------------------------------------------------------------------------------      % \today per advdate aendern
% --------------------------------------------------------------------------------------------------------------
% ------------------------------------ BEREICH SETZEN ---------------------------------------------------
\renewcommand{\OldField}{\Field}% ------------------- Vorherigen bereich speichern ------
                            \renewcommand{\Field}{Testfield I}                              % Neuen Bereich setzen                  
% --------------------------------------------------------------------------------------------------------------
% --------------------------------------------------------------------------------------------------------------
\section*{KW \KW{} \hspace{12pt}\today{} - \AdvanceDate[4]\today}%---------------
\ifthenelse{ \not\equal{\OldField}{\Field}  }{%
    \addtocounter{section}{1}
    \addcontentsline{toc}{section}{\Field}}{
}
%  -------------------------------------------------------------------------------------------------------------
\SetDate[\Datum] %-- Datum zurücksetzen auf Wochenanfang-----------------------------
%--------------------------------------------------------------------------------------------------------------
%
%

我希望有人能帮助我。问候

遵循沃纳的想法

考虑到@Werner的回答,我修改了我的代码。但我认为我对机制的理解仍然存在某种问题。下面是我尝试内容文件

\let\OldField\Field% ------------------- Vorherigen Bereich speichern ----------------------
% ------------------------------------ BEREICH SETZEN ---------------------------------------------------
                            \renewcommand{\Field}{Service Desk}                                 % <--- Neuen Bereich setzen                 
% --------------------------------------------------------------------------------------------------------------
% --------------------------------------------------------------------------------------------------------------
\section*{KW \KW{} \hspace{12pt}\today{} - \AdvanceDate[4]\today}%----------------
\ifnum\pdfstrcmp{\Field}{\OldField}=0
\else
    \addtocounter{section}{1}
    \addcontentsline{toc}{section}{\Field}%------------------------------------------------------
\fi

但它仍然会为我包含的每个文件添加一个新的目录条目,无论文件是否不同。


价值观 \Field \OldField 在代码的不同位置

我让 .log 文件显示我的代码中不同点的所有值\Field以及\OldFiled根文件可以读取的(当前)两个文件的所有值。

\show\OldField %respectively \show\Field
\let\OldField\Field% ------------------- Vorherigen Bereich speichern ----------------------
%\show\OldField %respectively \show\Field
% ------------------------------------ BEREICH SETZEN ---------------------------------------------------
                            \renewcommand{\Field}{Service Desk}                                 % <--- Neuen Bereich setzen                 
% --------------------------------------------------------------------------------------------------------------
%\show\OldField %respectively \show\Field
% --------------------------------------------------------------------------------------------------------------
\section*{KW \KW{} \hspace{12pt}\today{} - \AdvanceDate[4]\today}%----------------
\ifnum\pdfstrcmp{\Field}{\OldField}=0
\else
    \addtocounter{section}{1}
    \addcontentsline{toc}{section}{\Field}%------------------------------------------------------
\fi

这些是价值观 三点处的值

所以对我来说,似乎 的值\OldField总是从newcommand{\OldField}{Dummyfield}根文件中的初始值中获取。这很糟糕。现在完全有道理, 永远不会为strcmp0,因此运行else-statement。然而问题是,为什么 \OldField 总是显示命令定义中的初始值?更重要的是:有解决办法吗?

答案1

复制\Field\OldField使用

\renewcommand{\OldField}{\Field}

无法实现您想要的效果,因为 的内容\Field不会在 的(重新)定义 时扩展\OldField。相反,\OldField被定义为与 相同\Field,您会在后续定义中更改它。因此,\OldField始终与 相同\Field,并且您永远不会发现任何变化。

相反,你可以将整个定义复制\Field\OldField使用中

\let\OldField\Field

然后使用\ifxpdf string co mparison 进行调节:

在此处输入图片描述

\documentclass{article}

\begin{document}

% \Field and \OldField are the same
\newcommand{\OldField}{One}
\newcommand{\Field}{One}

\ifx\Field\OldField
  \verb|\Field| = \verb|\OldField| = \Field
\else
  \verb|\Field| = \Field; \verb|\OldField| = \OldField
\fi

\ifnum\pdfstrcmp{\Field}{\OldField}=0
  \verb|\Field| = \verb|\OldField| = \Field
\else
  \verb|\Field| = \Field; \verb|\OldField| = \OldField
\fi

\bigskip

% \Field and \OldField are different
\let\OldField\Field % Copy \Field into \OldField
\renewcommand{\Field}{Two}

\ifx\Field\OldField
  \verb|\Field| = \verb|\OldField| = \Field
\else
  \verb|\Field| = \Field; \verb|\OldField| = \OldField
\fi

\ifnum\pdfstrcmp{\Field}{\OldField}=0
  \verb|\Field| = \verb|\OldField| = \Field
\else
  \verb|\Field| = \Field; \verb|\OldField| = \OldField
\fi

\end{document}

\ifx<cmdA><cmdB>检查定义匹配<cmdA><cmdB>,而\pdfstrcmp{<strA>}{<strB>}检查 (扩展)文本 <strA>匹配<strB>,如果匹配则返回 0。这样就可以使用 来检查\ifnum<pdfstrmp>=0

答案2

您的\OldField宏将始终扩展为\Field,因此测试将返回 true。

你需要

\expandafter\renewcommand\expandafter\OldField\expandafter{\Field}

所以\OldField会扩展到的当前内容\Field,您稍后会重新定义。

一个更简单的方法,一旦你掌握了窍门,就是

\let\OldField\Field

相关内容