
Estou trabalhando em um ambiente Windows com Miktex. A maioria dos meus documentos é criada com XeLaTeX, mas acho que meu problema não é específico do compilador.
Gostaria de criar um modelo com todos os meus pacotes incluídos, configuração de cabeçalho e caminho gráfico, por exemplo, para incluir logotipos de cabeçalho. Em todos os meus documentos que usam o modelo, gostaria de ter apenas configurações e conteúdos específicos do documento. Meu problema é que os documentos podem estar em uma pasta diferente do modelo, mas ainda assim gostaria de incluir imagens da pasta do modelo. Minha configuração é assim:
.
├── templates/
│ ├── my_template.tex
│ └── pictures/
│ └── header_logo.pdf
└── documents/
├── my_document.tex
└── pictures/
└── some_picture.png
Exemplos mínimos poderiam ser:
meu_modelo.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}
meu_documento.tex:
\input{../templates/my_template.tex}
\graphicspath{{./pictures/}}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Minha pergunta agora é: qual é a maneira padrão de conseguir esse trabalho. eu encontreiessa questãomuito útil, mas preciso de um pouco mais de detalhes sobre as diferentes abordagens para descobrir qual delas é apropriada. Não entendo completamente a diferença entre include
e input
neste contexto ou se devo transformar meu modelo em uma classe.
Responder1
Como emhttps://tex.stackexchange.com/a/250/162943, \input
redigitará o conteúdo do arquivo e includes
adicionará clearpages
e não poderá ser aninhado. Eu ficaria com \input
.
O comando \graphicspath
recebe como argumento uma lista de pastas: \graphcispath{{folder1}{folder2}}
, então proponho usar o caminho completo para a pasta de imagens do seu modelo (modelos/fotos) e um caminho relativo para a pasta de imagens dos documentos (documentos/fotos), que suponho que sempre terá o mesmo nome.
meu_modelo.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}
meu_documento.tex:
\input{../templates/my_template.tex}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
Outra solução seria usar links simbólicos. Crie um link simbólico da pasta de imagens do modelo dentro da pasta de imagens do seu projeto e use apenas arquivos \graphicspath{{./pictures/}}
. Neste caso você precisaria lembrar de adicionar o nome da pasta em cada arquivo includegraphics
.
Responder2
Para evitar caminhos absolutos, você poderia usar o subfiles
pacote (mesmo que seu caso de uso principal seja um pouco diferente). As alterações necessárias são:
Transforme o modelo em um documento completo, adicionando
\begin{document}\end{document}
.Ao final do preâmbulo do template, carregue o
subfiles
pacote, e a seguir defina o caminho gráfico, mas deixando-o referir-se apenas aos diretórios de imagens relevantes para o template, utilizando caminhos relativos.Comece seu documento real com a linha
\documentclass[rel.path to template]{subfiles}
No preâmbulo do documento real, adicione outros diretórios de imagens locais ao caminho gráfico.
A vantagem sobre outras soluções é que o modelo só precisa saber sobre os diretórios de imagens relevantes para o modelo, e os documentos podem manter suas imagens específicas em diretórios que não precisam ser iguais. Além disso, não há caminhos absolutos necessários.
Para o seu exemplo, essas alterações são as seguintes:
% 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}
Responder3
Conforme mencionado em uma das outras respostas, \input
copie diretamente o texto de outro arquivo como se você os tivesse combinado manualmente. Geralmente, essa é a coisa mais fácil de fazer e pode ser aninhada para documentos grandes. \include
sempre criará uma nova página para colocar o conteúdo e não poderá ser aninhada.
O benefício que o uso \include
oferece é que, no início do documento, você pode usar \includeonly
uma lista de nomes de arquivos e, em seguida, qualquer inclusão que especifique um nome de arquivo diferente será ignorada. Eu usei isso em projetos muito grandes, onde as seções principais eram usadas \include
para que eu não tivesse que esperar a compilação das outras seções quando estava trabalhando em uma delas. Usei então \input
para as subseções, já que você não pode aninhar \include
. Você também pode fazer isso de outra maneira, inserindo as seções e incluindo as subseções.
É muito comum colocar seu preâmbulo em outro arquivo. Existem algumas maneiras de fazer isso que são mais ou menos corretas do que outras. A maneira mais comum de fazer isso é colocar seu preâmbulo (diferente de \documentclass
) em um arquivo separado que você pode chamar de qualquer coisa, digamos mypreamble.sty
, observe que deve terminar em .sty
, e então você pode \usepackage{mypreamble}
gostar de qualquer outro pacote. Você também deve adicionar a linha \ProvidesPackage{mypreabmle}
no topo do arquivo de preâmbulo. Também pode ser feito usando, \include
mas isso não é recomendado, pois \usepackage
faz algum processamento interno e permite parâmetros opcionais, etc.
Um dos outros pacotes úteis para vários arquivos é chamado, import
que permite um comando usado assim: \import{path\to\secton}{sectionname.tex}
. O bom disso é que se você quiser importar algo dentro de um arquivo que já importou, você pode chamar \subimport{relitive/path/}{plot1.tex}
which usa um caminho relativo ao arquivo importado, o que é bastante útil.
Responder4
As respostas de Gernot e Bryce me levaram a tentar colocar meu preâmbulo em um .cls
arquivo. Tive que reorganizar alguns dos arquivos, para que minha árvore de arquivos agora se parecesse com:
.
├── templates/
│ └── tex/
│ └── latex/
│ └── my_template/
│ ├── my_template.cls
│ └── header_logo.pdf
└── documents/
├── my_document.tex
└── pictures/
└── some_picture.png
my_template.cls agora se torna
\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}
e meu_documento.tex se torna
\documentclass{my_template}
\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}
O caminho gráfico interno my_template.cls
agora é relativo ao arquivo, my_document.tex
enquanto o cls extrai gráficos diretamente de seu próprio local. Para funcionar, o templates
diretório precisa ser inicializado como sua própria raiz texmf (fiz isso usando Miktex console --> Settings --> Directories --> Add
). A vantagem dessa configuração é que posso usar o modelo em qualquer lugar do meu PC, sem a necessidade de fornecer caminhos relativos ou absolutos para o diretório em que ele reside. Isso me ajuda muito em termos de controle de versão do GIT.
Existem mais algumas respostas para esta abordagem e detalhes, por exemplo, para instalações transportáveis aqui:
com especialmenteesseresponda pelos caminhos padrão.