
Estoy trabajando en un entorno Windows con Miktex. La mayoría de mis documentos se crean con XeLaTeX pero creo que mi problema no es específico del compilador.
Me gustaría crear una plantilla con todo lo que incluye mi paquete, configuración del encabezado y ruta de gráficos, por ejemplo, para incluir logotipos de encabezado. En todos mis documentos que utilizan la plantilla, me gustaría tener solo la configuración y el contenido del documento específicos. Mi problema es que los documentos pueden estar en una carpeta diferente a la de la plantilla, pero aún así me gustaría incluir imágenes de la carpeta de la plantilla. Mi configuración se ve así:
.
├── templates/
│ ├── my_template.tex
│ └── pictures/
│ └── header_logo.pdf
└── documents/
├── my_document.tex
└── pictures/
└── some_picture.png
Ejemplos mínimos podrían ser:
mi_plantilla.tex:
\documentclass[
11pt,
a4paper,
]{scrarticle}
\usepackage{scrextend}
\usepackage{scrlayer-scrpage}
%%%%% Graphics %%%%%
\usepackage{graphicx}
\graphicspath{{./pictures/}}
%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
mi_documento.tex:
\input{../templates/my_template.tex}
\graphicspath{{./pictures/}}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Mi pregunta ahora es, ¿cuál es la forma estándar de lograr este funcionamiento? encontréesta preguntamuy útil, pero necesito un poco más de detalles sobre los diferentes enfoques para determinar cuál es el apropiado. No entiendo completamente la diferencia entre include
y input
en este contexto o si debería convertir mi plantilla en una clase.
Respuesta1
Como enhttps://tex.stackexchange.com/a/250/162943, \input
volverá a escribir el contenido del archivo y includes
lo agregará clearpages
y no se puede anidar. Yo me quedaría con \input
.
El comando \graphicspath
recibe como argumento una lista de carpetas: \graphcispath{{folder1}{folder2}}
, por lo que propongo usar la ruta completa para la carpeta de imágenes de su plantilla (plantillas/imágenes) y una ruta relativa para la carpeta de imágenes de documentos (documentos/imágenes), que supongo que siempre tendrá el mismo nombre.
mi_plantilla.tex:
\documentclass[
11pt,
a4paper,
]{scrarticle}
\usepackage{scrextend}
\usepackage{scrlayer-scrpage}
%%%%% Graphics %%%%%
\usepackage{graphicx}
\graphicspath{{C:/Path/to/template/image/folder}{./pictures/}}
%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
mi_documento.tex:
\input{../templates/my_template.tex}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Otra solución sería utilizar enlaces simbólicos. Cree un enlace simbólico de la carpeta de imágenes de la plantilla dentro de la carpeta de imágenes de su proyecto y use solo \graphicspath{{./pictures/}}
. En este caso, deberá recordar agregar el nombre de la carpeta en cada archivo includegraphics
.
Respuesta2
Para evitar rutas absolutas, puede utilizar el subfiles
paquete (aunque su caso de uso principal es un poco diferente). Los cambios requeridos son:
Haga de la plantilla un documento completo agregando
\begin{document}\end{document}
.Al final del preámbulo de la plantilla, cargue el
subfiles
paquete y luego establezca la ruta de los gráficos, pero dejando que solo haga referencia a los directorios de imágenes relevantes para la plantilla, utilizando rutas relativas.Comience su documento real con la línea
\documentclass[rel.path to template]{subfiles}
En el preámbulo del documento real, agregue más directorios de imágenes locales a la ruta de gráficos.
La ventaja sobre otras soluciones es que la plantilla sólo necesita conocer los directorios de imágenes relevantes para la plantilla, y los documentos pueden mantener sus imágenes específicas en directorios que no tienen por qué ser los mismos. Además, no se requieren rutas absolutas.
Para su ejemplo, estos cambios se ven de la siguiente manera:
% templates/my_template.tex
\documentclass[
11pt,
a4paper,
]{scrarticle}
\usepackage{scrextend}
\usepackage{scrlayer-scrpage}
%%%%% Graphics %%%%%
\usepackage{graphicx}
\usepackage{subfiles}
\graphicspath{{./pictures/}}% <<< PICTURES LOCAL TO template DIRECTORY
%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
\begin{document}% <<< NECESSARY FOR subfiles TO WORK
\end{document}% <<< NECESSARY FOR subfiles TO WORK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% documents/my_document.tex
\documentclass[../templates/my_template]{subfiles}% <<< LOAD PREAMBLE FROM ../templates/my_template.tex
\makeatletter% <<< EXTEND THE GRAPHICS SEARCH PATH BY LOCAL DIRECTORIES
\edef\Ginput@path{\Ginput@path{./pictures/}}% <<<<<<<<<<<<<<<<<
\makeatother% <<<<<<<<<<<<<<<<<
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Respuesta3
Como se menciona en una de las otras respuestas, \input
copie directamente el texto de otro archivo como si los hubiera combinado manualmente. Generalmente, esto es lo más fácil de hacer y se puede anidar para documentos grandes. \include
siempre creará una nueva página para colocar el contenido y no se puede anidar.
El beneficio que \include
le brinda el uso es que al comienzo del documento, puede usarlo \includeonly
con una lista de nombres de archivos y luego se ignorará cualquier inclusión que especifique un nombre de archivo diferente. He usado esto en proyectos muy grandes donde se usaban las secciones principales \include
para no tener que esperar a que se compilaran las otras secciones cuando estaba trabajando en una de ellas. Luego lo usé \input
para las subsecciones ya que no se pueden anidar \include
. También puedes hacerlo al revés ingresando las secciones e incluyendo las subsecciones.
Es muy común poner tu preámbulo en otro archivo. Hay algunas formas de hacer esto que son más o menos correctas que otras. La forma más común de hacer esto es colocar su preámbulo (que no sea \documentclass
) en un archivo separado al que podría llamar como quiera, por ejemplo mypreamble.sty
, tenga en cuenta que debe terminar en .sty
, y luego le puede \usepackage{mypreamble}
gustar cualquier otro paquete. También debes agregar la línea \ProvidesPackage{mypreabmle}
en la parte superior del archivo de preámbulo. También se puede hacer usando, \include
pero no se recomienda ya que \usepackage
realiza algún procesamiento interno y permite parámetros opcionales, etc.
Uno de los otros paquetes que es útil para múltiples archivos se llama import
y permite usar un comando como este: \import{path\to\secton}{sectionname.tex}
. Lo bueno de esto es que si desea importar algo dentro de un archivo que ya importó, puede llamar \subimport{relitive/path/}{plot1.tex}
al que usa una ruta relativa al archivo importado, lo cual es bastante útil.
Respuesta4
Las respuestas de Gernot y Bryce me llevaron a intentar poner mi preámbulo en un .cls
archivo. Tuve que reorganizar algunos de los archivos, para que mi árbol de archivos ahora se vea así:
.
├── templates/
│ └── tex/
│ └── latex/
│ └── my_template/
│ ├── my_template.cls
│ └── header_logo.pdf
└── documents/
├── my_document.tex
└── pictures/
└── some_picture.png
my_template.cls ahora se convierte en
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{my_template}
\LoadClass[
11pt,
a4paper,
]{scrarticle}
\RequirePackage{scrextend}
\RequirePackage{scrlayer-scrpage}
%%%%% Graphics %%%%%
\RequirePackage{graphicx}
\graphicspath{{./pictures/}}
%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
y my_document.tex se convierte
\documentclass{my_template}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
La ruta de gráficos interna my_template.cls
ahora es relativa al archivo, my_document.tex
mientras que cls extrae gráficos directamente desde su propia ubicación. Para que funcione, el templates
directorio debe inicializarse como su propia raíz texmf (lo hice usando Miktex console --> Settings --> Directories --> Add
). La ventaja de esta configuración es que puedo usar la plantilla desde cualquier lugar de mi PC sin la necesidad de proporcionar rutas relativas o absolutas al directorio en el que reside. Esto me ayuda mucho en términos de control de versiones de GIT.
Hay más respuestas para este enfoque y detalles para, por ejemplo, instalaciones transportables aquí:
con especialmenteesteResponda para las rutas predeterminadas.