
Por ejemplo
Tengo dos proyectos TeX con una estructura de nombre de archivo similar:
El master.tex tiene una estructura como esta:
\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}
El propósito es: puedo cambiar fácil y rápidamente el grupo de archivos de capítulos para ingresar.
\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}
un enfoque simple pero no elegante es:
\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}
la pregunta de esta solución es, si no compilo en el archivo maestro TeX, da errores como
Secuencia de control indefinida....{Project_\prjindex_Literature.tex}.
Así que vine aquí en busca de una solución más elegante.
Respuesta1
Parece que necesita un "mecanismo" para la detección automática \prjindex
en situaciones en las que no se proporciona una definición \prjindex
"manualmente".
Observaciones preliminares:
Generalmentela expansión de la primitiva \jobname
forma el nombre de ese archivo (sin extensión) que se utilizó para iniciar la compilación.
Por ejemplo, si compila un proyecto cuyo archivo principal se realiza testfile.tex
a través de la línea de comandos
latex testfile.tex
, la primitiva \jobname
se expandirá a la frase testfile
.
Los tokens de caracteres en las frases entregadas por \jobname
siempre serán del código de categoría 12 (otros), mientras que los espacios siempre serán del código de categoría 10 (espacio).
La frase testfile
que proviene de expandir \jobname
se usará para
- creando el archivo .log: El archivo .log se llamará
testfile.log
. - creando el archivo .aux principal: que se llamará
testfile.aux
. - creando el archivo .toc que contiene datos para la tabla de contenido: se llamará
testfile.toc
. - creando el archivo .lof que contiene datos para la lista de figuras: Eso se llamará
testfile.lof
. - creando el archivo .lot que contiene datos para la lista de tablas: se llamará
testfile.lot
. - etc.
Pero con la mayoría de las distribuciones TeX actuales puedes tener (La)TeXdesviarse de la forma habitual de manejar las cosas:
Con la mayoría de las distribuciones TeX actuales, en la línea de comandos puede proporcionar una opción de línea de comandos (la ‑‑jobname
opción -) que le permite cambiar la frase que \jobname
se entregará.
Por ejemplo, si compila un proyecto cuyo archivo principal se realiza testfile.tex
a través de la línea de comandos
latex --jobname=foobar testfile.tex
, la primitiva \jobname
se expandirá a la frase foobar
.
En este caso se utilizará la frase foobar
que proviene de expandir para\jobname
- creando el archivo .log: El archivo .log se llamará
foobar.log
. - creando el archivo .aux principal: que se llamará
foobar.aux
. - creando el archivo .toc que contiene datos para la tabla de contenido: se llamará
foobar.toc
. - creando el archivo .lof que contiene datos para la lista de figuras: Eso se llamará
foobar.lof
. - creando el archivo .lot que contiene datos para la lista de tablas: se llamará
foobar.lot
. - etc.
Con mi sugerencia a continuación, es un requisito que LaTeX maneje las cosas.en elmanera usual, es decir, las cosas deben compilarsesinproporcionando algunos‑‑jobname
-opción.
Por lo tanto, mi sugerencia a continuación no es adecuada para personas que usan plataformas LaTeX/editores TeX/interfaces de usuario (en línea) donde, bajo el capó, las cosas están configuradas para hacer uso de la ‑‑jobname
opción -.
En caso
- los nombres de todos aquellos archivos durante cuya compilación la definición de
\prjindex
será "autodetectada" (ya que no se definirá "a mano") son de patrón , ambos denotan el proyecto y no están vacíos ni contienen guiones bajos ( ).Projekt_⟨#1⟩_⟨#2⟩.tex
⟨#1⟩
_
- llamar a latex para archivos de "compilación independiente" durante cuya compilación
\prjindex
siempre se realiza la definición de "detección automática"sininvocando la‑‑jobname
opción (lo que implica que la expansión de la\jobname
primitiva forma el nombre de ese archivo (sin extensión) que se usó para iniciar la compilación)
\GetPrjindexFromJobnameIfUndefined
que actúa de la siguiente manera:
En caso de que la macro \prjindex
ya esté definida, no hace nada.
En caso de que la macro \prjindex
no esté definida, comprueba si la expansión de la \jobname
-primitiva es de patrón . Si no sigue ese patrón, se activará un mensaje de error. Si es de ese patrón, se examinará si estará vacío. Si este es el caso, se activará un mensaje de error. Si este no es el caso, la macro se definirá para expandirse a .Projekt_⟨#1⟩_⟨#2⟩
⟨#1⟩
\prjindex
⟨#1⟩
No puedo tomar una decisión sobre si esa rutina es útil para usted porque no reveló con demasiado detalle cómo está organizada esa parte de la estructura de archivos de su proyecto, lo que hace posible compilar los archivos individuales, ambos "independientes". y cuando se invoca desde un archivo tex maestro mediante o .Projekt_⟨#1⟩_⟨#2⟩.tex
\input
\include
En caso de que todos los archivos del proyecto compartan de alguna manera el mismo preámbulo, probablemente pueda hacer que esta rutina esté disponible para todos los archivos del proyecto a través de ese preámbulo.
Probablemente puedas incluir esa rutina (y la llamada a ella) en tu preamble.tex.
Esa rutina no hace nada en caso de que \prjindex
ya esté definida.
Por lo tanto
- dentro de
master.tex
ti puedes definir\prjindex
antesingresandopreamble.tex
. - el escenario de compilación independiente de uno de sus archivos conduce a ingresar while aún no está definido, lo que a su vez conduce a la rutina de "detección automática" y definición al examinar el resultado de la expansión de .
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}
Por cierto: para probar la rutina guardé el ejemplo anterior test.tex
y lo compilé, invocando la ‑‑jobname
opción -con diferentes valores.
La compilación mediante el comando latex test.tex
produjo el resultado esperado:
! 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
Esto era de esperarse ya que en este caso \jobname
se amplió a test
lo cual no es de patrón .
Projekt_⟨#1⟩_⟨#2⟩
La compilación mediante el comando latex ‑‑jobname=Projekt_A_4 test.tex
produjo el resultado esperado:
\prjindex=macro:
->A.
l.82 \show\prjindex
(Obtendría lo mismo cuando el ejemplo se guardara Projekt_A_4.tex
y compilara mediante el comando latex Projekt_A_4.tex
).
La compilación mediante el comando latex ‑‑jobname=Projekt_B_4 test.tex
produjo el resultado esperado:
\prjindex=macro:
->B.
l.82 \show\prjindex
(Obtendría lo mismo cuando el ejemplo se guardara Projekt_B_4.tex
y compilara mediante el comando latex Projekt_B_4.tex
).
La compilación mediante el comando latex ‑‑jobname=Projekt_JohannGambolputty_12345 test.tex
produjo el resultado esperado:
\prjindex=macro:
->JohannGambolputty.
l.82 \show\prjindex
(Obtendría lo mismo cuando el ejemplo se guardara Projekt_JohannGambolputty_12345.tex
y compilara mediante el comando latex Projekt_JohannGambolputty_12345.tex
).
Por cierto:
A veces organizo los archivos de mi proyecto de la siguiente manera:
Preámbulo.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.
Postámbulo.tex
\csname @\ifnum\inputlevel>1 second\else first\fi oftwo\endcsname
{%
\end{document}%
}{%
\xdef\inputlevel{\number\numexpr\inputlevel-1\relax}%
}%
Proyecto_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}%
%----------------------
Proyecto_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}%
%----------------------
Proyecto_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}%
%----------------------
Proyecto_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}%
%----------------------
Proyecto_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}%
%----------------------
Proyecto_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}%
%----------------------
De esta manera , cada uno de los archivos Projekt_A_cp1.tex
, respectivamente Projekt_A_cp2.tex
, Projekt_A_cp3.tex
cada uno de los archivos Projekt_B_cp1.tex
, se puede utilizar tanto para compilar "independiente" como para ser invocado a través de otro archivo del mismo proyecto.Projekt_B_cp2.tex
Projekt_B_cp3.tex
\input
\include
Preamble.tex
puede contener código donde se produce la bifurcación dependiendo del significado de \prjindex
, por lo que las cosas se pueden manejar de manera diferente para diferentes proyectos dentro del mismo archivo de preámbulo.
Respuesta2
No estoy seguro de cuál es el problema, pero seguramente necesitas hacer un cambio en tu código: el argumento \include
debenotiene la .tex
extensión.
\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}
Aquí está el resultado del terminal al compilar este código.
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).
Si cambio a \newcommand{\projectindex}{A}
, después de dos ejecuciones de LaTeX obtengo
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.
Como puede ver, se incluyen los archivos esperados.