
Zum Beispiel
Ich habe zwei TeX-Projekte mit einer ähnlichen Dateinamenstruktur:
Die Datei master.tex hat folgende Struktur:
\input{preamble.tex} % <- \bibliography{Projekt_A_Literature} in preamble
% ...
\begin{document}
% ...
\include{chapter/Projekt_A_cp1.tex}
\include{chapter/Projket_A_cp2.tex}
\include{chapter/Projekt_A_cp3.tex}
% ...
\end{document}
Der Zweck ist: Ich kann die Dateigruppe der einzugebenden Kapitel einfach und schnell ändern.
\include{chpater/Project_A_cp1.tex} \include{chpater/Project_B_cp1.tex}
\include{chpater/Project_A_cp2.tex} ==> \include{chpater/Project_B_cp2.tex}
\include{chapter/Project_A_cp3.tex} \include{chpater/Project_B_cp3.tex}
Ein einfacher, aber nicht eleganter Ansatz ist:
\newcommand{\prjindex}{A} $ or \def\prjindex{A}
%...
\begin{document}
\include{chpater/Project_\prjindex_cp1.tex}
\include{chpater/Project_\prjindex_cp2.tex}
\include{chpater/Project_\prjindex_cp3.tex}
\end{document}
die Frage dieser Lösung ist, wenn ich nicht in der Master-TeX-Datei kompiliere, gibt es Fehler wie
Undefinierte Steuersequenz ....{Project_\prjindex_Literature.tex}.
Also bin ich hierher gekommen, um eine elegantere Lösung zu finden
Antwort1
Sie scheinen einen „Mechanismus“ zur automatischen Erkennung in Situationen zu benötigen , in denen keine „manuelle“ \prjindex
Definition bereitgestellt wird.\prjindex
Vorbemerkungen:
NormalerweiseDie Erweiterung des Grundelements \jobname
bildet den Namen der Datei (ohne Erweiterung), die zum Starten der Kompilierung verwendet wurde.
Wenn Sie beispielsweise ein Projekt kompilieren, dessen Hauptdatei testfile.tex
über die Befehlszeile aufgerufen wird
latex testfile.tex
, wird das Primitiv \jobname
zu der Phrase erweitert testfile
.
Zeichen-Token in Phrasen, die von bereitgestellt werden, \jobname
haben immer den Kategoriecode 12 (andere), während Leerzeichen immer den Kategoriecode 10 (Leerzeichen) haben.
Der Ausdruck testfile
, der aus der Erweiterung kommt, \jobname
wird verwendet für
- Erstellen der .log-Datei: Die .log-Datei erhält den Namen
testfile.log
. - Erstellen der Haupt-AUX-Datei: Diese erhält den Namen
testfile.aux
. - Erstellen der .toc-Datei mit den Daten für das Inhaltsverzeichnis: Diese erhält den Namen
testfile.toc
. - Erstellen der .lof-Datei mit den Daten für das Abbildungsverzeichnis: Diese erhält den Namen
testfile.lof
. - Erstellen der .lot-Datei mit den Daten für die Tabellenliste: Diese erhält den Namen
testfile.lot
. - usw.
Aber mit den meisten heutigen TeX-Distributionen können Sie (La)TeXvon der üblichen Art und Weise, Dinge zu handhaben, abweichen:
Bei den meisten heutigen TeX-Distributionen können Sie in der Befehlszeile eine Befehlszeilenoption (die ‑‑jobname
-Option) angeben, mit der Sie ändern können, welche Phrase \jobname
ausgegeben wird.
Wenn Sie beispielsweise ein Projekt kompilieren, dessen Hauptdatei testfile.tex
über die Befehlszeile aufgerufen wird
latex --jobname=foobar testfile.tex
, wird das Grundelement \jobname
zu der Phrase erweitert foobar
.
In diesem Fall wird der Ausdruck foobar
, der aus der Erweiterung stammt, verwendet für\jobname
- Erstellen der .log-Datei: Die .log-Datei erhält den Namen
foobar.log
. - Erstellen der Haupt-AUX-Datei: Diese erhält den Namen
foobar.aux
. - Erstellen der .toc-Datei mit den Daten für das Inhaltsverzeichnis: Diese erhält den Namen
foobar.toc
. - Erstellen der .lof-Datei mit den Daten für das Abbildungsverzeichnis: Diese erhält den Namen
foobar.lof
. - Erstellen der .lot-Datei mit den Daten für die Tabellenliste: Diese erhält den Namen
foobar.lot
. - usw.
Bei meinem Vorschlag unten ist es Voraussetzung, dass LaTeX die Dinge handhabtimnormaler Weg, d. h., die Dinge müssen zusammengestellt werdenohneBereitstellung einiger‑‑jobname
-Möglichkeit.
Daher ist mein folgender Vorschlag nicht für Personen geeignet, die solche (Online-)LaTeX-Plattformen/TeX-Editoren/Benutzeroberflächen verwenden, bei denen die Dinge unter der Haube so konfiguriert sind, dass die ‑‑jobname
-Option verwendet wird.
Falls
- die Namen aller Dateien, bei deren Kompilierung die Definition von
\prjindex
„automatisch erkannt“ werden soll (da sie nicht „von Hand“ definiert wird), dem Muster entsprechen — sie bezeichnen das Projekt, sind nicht leer und enthalten keine Unterstriche ( ) —Projekt_⟨#1⟩_⟨#2⟩.tex
⟨#1⟩
_
- Aufruf von Latex zum "Standalone-Kompilieren" von Dateien, bei deren Kompilierung die Definition von
\prjindex
"automatisch erkannt" immer erfolgtohneAufrufen der‑‑jobname
-Option (was bedeutet, dass die Erweiterung des\jobname
-Primitivs den Namen der Datei (ohne Erweiterung) bildet, die zum Einleiten der Kompilierung verwendet wurde)
\GetPrjindexFromJobnameIfUndefined
, das wie folgt funktioniert:
Falls das Makro \prjindex
bereits definiert ist, tut es nichts.
Falls das Makro \prjindex
nicht definiert ist, prüft es, ob die Expansion des \jobname
-Primitivs dem Muster entspricht . Wenn sie nicht diesem Muster entspricht, wird eine Fehlermeldung ausgelöst. Wenn sie diesem Muster entspricht, wird geprüft, ob leer ist. Wenn dies der Fall ist, wird eine Fehlermeldung ausgelöst. Wenn dies nicht der Fall ist, wird das Makro so definiert, dass es nach expandiert .Projekt_⟨#1⟩_⟨#2⟩
⟨#1⟩
\prjindex
⟨#1⟩
Ob diese Routine für Dich von Nutzen ist, kann ich nicht beurteilen, da Du nicht allzu detailliert dargelegt hast, wie der Teil der Dateistruktur Deines Projektes organisiert ist, der das Kompilieren der einzelnen Dateien sowohl "standalone" als auch beim Aufruf aus einer Master-Tex-Datei über oder ermöglicht .Projekt_⟨#1⟩_⟨#2⟩.tex
\input
\include
Falls alle Projektdateien irgendwie dieselbe Präambel teilen, können Sie diese Routine wahrscheinlich über diese Präambel allen Projektdateien verfügbar machen.
Wahrscheinlich können Sie diese Routine (und den Aufruf derselben) in Ihre Routine einbinden. preamble.tex.
Diese Routine tut nichts, falls \prjindex
sie bereits definiert ist.
Daher
- innerhalb
master.tex
können Sie definieren\prjindex
VorEingabepreamble.tex
. - Das Szenario der eigenständigen Kompilierung einer Ihrer -Dateien führt zur Eingabe von while ist noch nicht definiert, was wiederum dazu führt, dass die Routine es „automatisch erkennt“ und für Sie definiert, indem sie das Ergebnis der Erweiterung von untersucht .
Projekt_⟨#1⟩_⟨#2⟩.tex
\preamble.tex
\prjindex
\GetPrjindexFromJobnameIfUndefined
\prjindex
\jobname
\documentclass{article}
%%========Code for \GetPrjindexFromJobnameIfUndefined=========
\begingroup
\makeatletter
\def\prjprephrase{Projekt_}%
\def\prjpostphrase{_}%
% \jobname delivers everything but the space (which will be of catcode 10)
% with catcode 12(other). Therefore "sanitizing" is needed for turning
% everything but the space into catcode 12(other):
\@onelevel@sanitize\prjprephrase
\@onelevel@sanitize\prjpostphrase
\newcommand\GetPrjindexFromJobnameIfUndefined[2]{%
\endgroup
\newcommand\GetPrjindexFromJobnameIfUndefined{%
\@ifundefined{prjindex}{%
\expandafter\GetPrjindexCheckPattern\jobname$#1#2$&%
}{}%
}%
\@ifdefinable\GetPrjindexCheckPattern{%
\def\GetPrjindexCheckPattern##1#1##2#2##3$##4&{%
\GetPrjindexPatternfork
&##4&{\expandafter\GetPrjindexExtractfrompattern\jobname$}%
#2$&{%
\GenericError{(\string\prjindex)\space}{%
Error on input line \the \inputlineno:\MessageBreak
\string\GetPrjindexFromJobnameIfUndefined\space cannot extract the\MessageBreak
\string\prjindex\space from \string\jobname's expansion.\MessageBreak
(\string\GetPrjindexFromJobnameIfUndefined\space is defined\MessageBreak
\space somewhere in this document.)\@gobble
}{Have a look at the comments in this document.}%
{%
\string\GetPrjindexFromJobnameIfUndefined\space can extract the \string\prjindex\MessageBreak
from \string\jobname's expansion only in case \string\jobname's expansion is\MessageBreak
of pattern\MessageBreak
\@spaces #1\string####1#2\string####2\MessageBreak
while \string####1 is not empty.\MessageBreak
If this is the case, the expansion of \string\prjindex\space will be \string####1.\MessageBreak
\string####1 will not contain underscores (\string_).\MessageBreak
\string####2 can contain underscores.\MessageBreak
}%
}%
&&&&%
}%
}%
\@ifdefinable\GetPrjindexPatternfork{%
\def\GetPrjindexPatternfork##1#2$&##2##3&&&&{##2}%
}%
\@ifdefinable\GetPrjindexExtractfrompattern{%
\def\GetPrjindexExtractfrompattern#1##1#2##2${%
\ifx\relax##1\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{%
\GenericError{(\string\prjindex)\space}{%
Error on input line \the \inputlineno:\MessageBreak
\string\prjindex\space is empty.\MessageBreak
(\string\GetPrjindexFromJobnameIfUndefined\space is defined\MessageBreak
\space somewhere in this document.)\@gobble
}{Have a look at the comments in this document.}%
{%
\string\GetPrjindexFromJobnameIfUndefined\space can extract the \string\prjindex\MessageBreak
from \string\jobname's expansion only in case \string\jobname's expansion is\MessageBreak
of pattern\MessageBreak
\@spaces #1\string####1#2\string####2\MessageBreak
while \string####1 is not empty.\MessageBreak
If this is the case, the expansion of \string\prjindex\space will be \string####1.\MessageBreak
\string####1 will not contain underscores (\string_).\MessageBreak
\string####2 can contain underscores.\MessageBreak
}%
}%
{\newcommand*\prjindex{##1}}%
}%
}%
}%
\expandafter\expandafter\expandafter\GetPrjindexFromJobnameIfUndefined
\expandafter\expandafter\expandafter{\expandafter\prjprephrase\expandafter}%
\expandafter{\prjpostphrase}%
%%=====End of code for \GetPrjindexFromJobnameIfUndefined=====
\GetPrjindexFromJobnameIfUndefined
\show\prjindex
\begin{document}
Some document
\end{document}
Übrigens: Zum Testen der Routine habe ich das obige Beispiel unter gespeichert test.tex
und kompiliert, wobei ich die ‑‑jobname
-Option mit verschiedenen Werten aufgerufen habe.
Das Kompilieren über den Befehl latex test.tex
ergab wie erwartet:
! Error on input line 80:
(\prjindex) \GetPrjindexFromJobnameIfUndefined cannot extract the
(\prjindex) \prjindex from \jobname's expansion.
(\prjindex) (\GetPrjindexFromJobnameIfUndefined is defined
(\prjindex) somewhere in this document.)
Have a look at the comments in this document.
Type H <return> for immediate help.
...
l.80 \GetPrjindexFromJobnameIfUndefined
?
> \prjindex=undefined.
l.82 \show\prjindex
Dies war zu erwarten, da in diesem Fall \jobname
eine Erweiterung erfolgte test
, die nicht dem Muster entspricht .
Projekt_⟨#1⟩_⟨#2⟩
Das Kompilieren über den Befehl latex ‑‑jobname=Projekt_A_4 test.tex
ergab wie erwartet:
\prjindex=macro:
->A.
l.82 \show\prjindex
(Sie würden dasselbe erhalten, wenn das Beispiel Projekt_A_4.tex
unter dem Befehl gespeichert und kompiliert würde latex Projekt_A_4.tex
.)
Das Kompilieren über den Befehl latex ‑‑jobname=Projekt_B_4 test.tex
ergab wie erwartet:
\prjindex=macro:
->B.
l.82 \show\prjindex
(Sie würden dasselbe erhalten, wenn das Beispiel Projekt_B_4.tex
unter dem Befehl gespeichert und kompiliert würde latex Projekt_B_4.tex
.)
Das Kompilieren über den Befehl latex ‑‑jobname=Projekt_JohannGambolputty_12345 test.tex
ergab wie erwartet:
\prjindex=macro:
->JohannGambolputty.
l.82 \show\prjindex
(Sie würden dasselbe erhalten, wenn das Beispiel Projekt_JohannGambolputty_12345.tex
unter dem Befehl gespeichert und kompiliert würde latex Projekt_JohannGambolputty_12345.tex
.)
Übrigens:
Manchmal organisiere ich meine Projektdateien wie folgt:
Präambel.tex
% Check whether the \documentclass-command was already invoked.
% If so, increment \inputlevel and stop inputting.
% If not so, don't stop imputting and thus do all the
% preamble-stuff, inclusive defining \inputlevel:
\expandafter\ifx\csname @twoclasseserror\endcsname\documentclass
\xdef\inputlevel{\number\numexpr\inputlevel+1\relax}%
\expandafter\endinput
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass{article}%
%
\newcommand*\inputlevel{1}%
\global\let\inputlevel=\inputlevel
%
% Whatsoever preamble-commands, etc.
%
% Here you can also place the code for defining \GetPrjindexFromJobnameIfUndefined
% and then invoke it for defining \prjindex:
%
%%========Code for \GetPrjindexFromJobnameIfUndefined=========
\begingroup
\makeatletter
\def\prjprephrase{Projekt_}%
\def\prjpostphrase{_}%
% \jobname delivers everything but the space (which will be of catcode 10)
% with catcode 12(other). Therefore "sanitizing" is needed for turning
% everything but the space into catcode 12(other):
\@onelevel@sanitize\prjprephrase
\@onelevel@sanitize\prjpostphrase
\newcommand\GetPrjindexFromJobnameIfUndefined[2]{%
\endgroup
\newcommand\GetPrjindexFromJobnameIfUndefined{%
\@ifundefined{prjindex}{%
\expandafter\GetPrjindexCheckPattern\jobname$#1#2$&%
}{}%
}%
\@ifdefinable\GetPrjindexCheckPattern{%
\def\GetPrjindexCheckPattern##1#1##2#2##3$##4&{%
\GetPrjindexPatternfork
&##4&{\expandafter\GetPrjindexExtractfrompattern\jobname$}%
#2$&{%
\GenericError{(\string\prjindex)\space}{%
Error on input line \the \inputlineno:\MessageBreak
\string\GetPrjindexFromJobnameIfUndefined\space cannot extract the\MessageBreak
\string\prjindex\space from \string\jobname's expansion.\MessageBreak
(\string\GetPrjindexFromJobnameIfUndefined\space is defined\MessageBreak
\space somewhere in this document.)\@gobble
}{Have a look at the comments in this document.}%
{%
\string\GetPrjindexFromJobnameIfUndefined\space can extract the \string\prjindex\MessageBreak
from \string\jobname's expansion only in case \string\jobname's expansion is\MessageBreak
of pattern\MessageBreak
\@spaces #1\string####1#2\string####2\MessageBreak
while \string####1 is not empty.\MessageBreak
If this is the case, the expansion of \string\prjindex\space will be \string####1.\MessageBreak
\string####1 will not contain underscores (\string_).\MessageBreak
\string####2 can contain underscores.\MessageBreak
}%
}%
&&&&%
}%
}%
\@ifdefinable\GetPrjindexPatternfork{%
\def\GetPrjindexPatternfork##1#2$&##2##3&&&&{##2}%
}%
\@ifdefinable\GetPrjindexExtractfrompattern{%
\def\GetPrjindexExtractfrompattern#1##1#2##2${%
\ifx\relax##1\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{%
\GenericError{(\string\prjindex)\space}{%
Error on input line \the \inputlineno:\MessageBreak
\string\prjindex\space is empty.\MessageBreak
(\string\GetPrjindexFromJobnameIfUndefined\space is defined\MessageBreak
\space somewhere in this document.)\@gobble
}{Have a look at the comments in this document.}%
{%
\string\GetPrjindexFromJobnameIfUndefined\space can extract the \string\prjindex\MessageBreak
from \string\jobname's expansion only in case \string\jobname's expansion is\MessageBreak
of pattern\MessageBreak
\@spaces #1\string####1#2\string####2\MessageBreak
while \string####1 is not empty.\MessageBreak
If this is the case, the expansion of \string\prjindex\space will be \string####1.\MessageBreak
\string####1 will not contain underscores (\string_).\MessageBreak
\string####2 can contain underscores.\MessageBreak
}%
}%
{\newcommand*\prjindex{##1}}%
}%
}%
}%
\expandafter\expandafter\expandafter\GetPrjindexFromJobnameIfUndefined
\expandafter\expandafter\expandafter{\expandafter\prjprephrase\expandafter}%
\expandafter{\prjpostphrase}%
%%=====End of code for \GetPrjindexFromJobnameIfUndefined=====
%
% This will define \prjindex depending on the expansion of \jobname
% while \jobname usually represents the name of the file used for
% initiating compilation:
%
% !!! I don't know whether, e.g., online-latex-plattforms like overleaf
% !!! invoke latex using the -jobname-option, which would lead to
% !!! the expansion of \jobname deviating from the name of the file
% !!! used for initiating compilation.
%
\GetPrjindexFromJobnameIfUndefined
%
% With subsequent preamble-commands you can, if you wish, fork depending on
% the expansion of \prjindex. But be aware that like \jobname \prjindex also
% holds only characters of catcode 12(other) and spaces of catcode 10(space).
% Therefore when storing a string in a temporary macro (this should, like
% \prjindex not be defined in terms of \long, which is the case with
% \def or \newcommand*) and \ifx-comparing that temporary macro to \prjindex,
% make sure that the definition of that temporary macro is "sanitized" by
% means of \@onelevel@sanitize before doing the \ifx-comparison.
%
% \usepackage...
% \usepackage...
%
\begin{document}%
\endinput
|
| Place whatsoever comments remarks and explanations and manuals you wish to place
| here. They won't be processed because LaTeX ceases reading and processing this
| file when encountering \endinput.
Postamble.tex
\csname @\ifnum\inputlevel>1 second\else first\fi oftwo\endcsname
{%
\end{document}%
}{%
\xdef\inputlevel{\number\numexpr\inputlevel-1\relax}%
}%
Projekt_A_cp1.tex
%----------------------
\input{Preamble.tex}%
%----------------------
This is file \texttt{Projekt\string_A\string_cp1.tex}\par
This is the text in file \texttt{Projekt\string_\prjindex\string_cp1.tex}.\par
The file \texttt{Projekt\string_\prjindex\string_cp1.tex} invokes the file \texttt{Projekt\string_\prjindex\string_cp2.tex}:\par
\input{Projekt_\prjindex_cp2.tex}%
%----------------------
\input{Postamble.tex}%
%----------------------
Projekt_A_cp2.tex
%----------------------
\input{Preamble.tex}%
%----------------------
This is file \texttt{Projekt\string_A\string_cp2.tex}\par
This is the text in file \texttt{Projekt\string_\prjindex\string_cp2.tex}.\par
The file \texttt{Projekt\string_\prjindex\string_cp2.tex} invokes the file \texttt{Projekt\string_\prjindex\string_cp3.tex}:\par
\input{Projekt_\prjindex_cp3.tex}%
%----------------------
\input{Postamble.tex}%
%----------------------
Projekt_A_cp3.tex
%----------------------
\input{Preamble.tex}%
%----------------------
This is file \texttt{Projekt\string_A\string_cp3.tex}\par
This is the text in file \texttt{Projekt\string_\prjindex\string_cp3.tex}.\par
%----------------------
\input{Postamble.tex}%
%----------------------
Projekt_B_cp1.tex
%----------------------
\input{Preamble.tex}%
%----------------------
This is file \texttt{Projekt\string_B\string_cp1.tex}\par
This is the text in file \texttt{Projekt\string_\prjindex\string_cp1.tex}.\par
The file \texttt{Projekt\string_\prjindex\string_cp1.tex} invokes the file \texttt{Projekt\string_\prjindex\string_cp2.tex}:\par
\input{Projekt_\prjindex_cp2.tex}%
%----------------------
\input{Postamble.tex}%
%----------------------
Projekt_B_cp2.tex
%----------------------
\input{Preamble.tex}%
%----------------------
This is file \texttt{Projekt\string_B\string_cp2.tex}\par
This is the text in file \texttt{Projekt\string_\prjindex\string_cp2.tex}.\par
The file \texttt{Projekt\string_\prjindex\string_cp2.tex} invokes the file \texttt{Projekt\string_\prjindex\string_cp3.tex}:\par
\input{Projekt_\prjindex_cp3.tex}%
%----------------------
\input{Postamble.tex}%
%----------------------
Projekt_B_cp3.tex
%----------------------
\input{Preamble.tex}%
%----------------------
This is file \texttt{Projekt\string_B\string_cp3.tex}\par
This is the text in file \texttt{Projekt\string_\prjindex\string_cp3.tex}.\par
%----------------------
\input{Postamble.tex}%
%----------------------
Auf diese Weise kann jede der Dateien Projekt_A_cp1.tex
, Projekt_A_cp2.tex
, Projekt_A_cp3.tex
bzw. jede der Dateien Projekt_B_cp1.tex
, Projekt_B_cp2.tex
, sowohl zum „Standalone“-Kompilieren verwendet werden als auch über oder durch eine andere Datei desselben Projekts Projekt_B_cp3.tex
aufgerufen werden .\input
\include
Preamble.tex
kann Code enthalten, bei dem je nach Bedeutung von eine Verzweigung stattfindet \prjindex
, so dass die Dinge innerhalb derselben Präambeldatei für unterschiedliche Projekte unterschiedlich gehandhabt werden können.
Antwort2
Ich bin nicht sicher, wo das Problem liegt, aber Sie müssen auf jeden Fall eine Änderung an Ihrem Code vornehmen: Das Argument für \include
mussnichthabe die .tex
Erweiterung.
\documentclass{book}
% why shouldn't this be elegant
\newcommand{\projectindex}{B}
\begin{document}
\include{chapter/Project_\projectindex_cp1}
\include{chapter/Project_\projectindex_cp2}
\include{chapter/Project_\projectindex_cp3}
\end{document}
Hier ist die Terminalausgabe beim Kompilieren dieses Codes
pdflatex sun
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./sun.tex
LaTeX2e <2019-10-01> patch level 3
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/book.cls
Document Class: book 2019/10/25 v1.4k Standard LaTeX document class
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/bk10.clo)) (./sun.aux
(./chapter/Project_B_cp1.aux) (./chapter/Project_B_cp2.aux)
(./chapter/Project_B_cp3.aux)) (./chapter/Project_B_cp1.tex
Chapter 1.
) [1{/usr/local/texlive/2019/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
(./chapter/Project_B_cp2.tex [2]
Chapter 2.
) [3] (./chapter/Project_B_cp3.tex [4]
Chapter 3.
) [5] (./sun.aux (./chapter/Project_B_cp1.aux) (./chapter/Project_B_cp2.aux)
(./chapter/Project_B_cp3.aux)) )</usr/local/texlive/2019/texmf-dist/fonts/type1
/public/amsfonts/cm/cmbx12.pfb></usr/local/texlive/2019/texmf-dist/fonts/type1/
public/amsfonts/cm/cmr10.pfb></usr/local/texlive/2019/texmf-dist/fonts/type1/pu
blic/amsfonts/cm/cmsl10.pfb>
Output written on sun.pdf (5 pages, 30009 bytes).
Wenn ich zu ändere \newcommand{\projectindex}{A}
, erhalte ich nach zwei LaTeX-Durchläufen
pdflatex sun
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./sun.tex
LaTeX2e <2019-10-01> patch level 3
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/book.cls
Document Class: book 2019/10/25 v1.4k Standard LaTeX document class
(/usr/local/texlive/2019/texmf-dist/tex/latex/base/bk10.clo)) (./sun.aux
(./chapter/Project_A_cp1.aux) (./chapter/Project_A_cp2.aux)
(./chapter/Project_A_cp3.aux)) (./chapter/Project_A_cp1.tex
Chapter 1.
) [1{/usr/local/texlive/2019/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
(./chapter/Project_A_cp2.tex [2]
Chapter 2.
) [3] (./chapter/Project_A_cp3.tex [4]
Chapter 3.
) [5] (./sun.aux (./chapter/Project_A_cp1.aux) (./chapter/Project_A_cp2.aux)
(./chapter/Project_A_cp3.aux)) )</usr/local/texlive/2019/texmf-dist/fonts/type1
/public/amsfonts/cm/cmbx12.pfb></usr/local/texlive/2019/texmf-dist/fonts/type1/
public/amsfonts/cm/cmr10.pfb></usr/local/texlive/2019/texmf-dist/fonts/type1/pu
blic/amsfonts/cm/cmsl10.pfb>
Output written on sun.pdf (5 pages, 29893 bytes).
Transcript written on sun.log.
Wie Sie sehen, sind die erwarteten Dateien enthalten.