Pacotes de LaTeX externos | Aspose.TeX para .NET

Pacotes de LaTeX externos

A biblioteca Aspose.TeX inclui vários pacotes de LaTeX comuns. Portanto, você não precisa se preocupar com como fornecer esses pacotes ao TeX engine da biblioteca. Mas, às vezes (ou com bastante frequência), seu arquivo de LaTeX pode exigir um pacote além do pacote “nativamente” suportado “de pacotes. Se for esse o caso, você pode tentar fornecer a entrada necessária, ou seja, os arquivos de origem do pacote necessário, através da opção RequiredInputDirectory da instância da classe TeXOptions. Veremos como isso funciona com dois exemplos.

Pacote necessário de entrada necessária (pacote FancyBox)

Digamos que temos o seguinte arquivo de LaTeX simples, que é required-input-fs.tex da nossa Solução de exemplo:

 1\documentclass{article}
 2\usepackage[a6paper,landscape]{geometry}
 3\usepackage{fancybox}
 4\begin{document}
 5Test: \fbox{
 6  \begin{Bitemize}[b]
 7  \item First item
 8  \item A second one\\ on two lines
 9  \item(2pt) A third with extra space
10  \end{Bitemize}
11}
12\par\bigskip
13Test: \fbox{
14  \begin{Beqnarray}[t]
15  y & = & x^2 \\
16  a^2 + 2ab + b^2 & = & (a + b)^2 \\
17  \int_0^\infty e^{-ax} dx & = & \frac{1}{a}
18  \end{Beqnarray}
19}
20\end{document}

Na terceira linha, podemos ver que o arquivo requer o pacote FancyBox, que não é suportado” nativamente “. Vamos também assumir que temos o arquivo de origem do pacote ‘FancyBox’. É um pacote simples, por isso realmente consiste em um único arquivo. Podemos colocar esse arquivo em qualquer lugar do nosso sistema de arquivos e especificar o caminho do diretório, como simplesmente como mostrado abaixo:

1options.RequiredInputDirectory = new InputFileSystemDirectory("path-to-directory-where-fancybox.sty-located");

Depois de executar um TeXJob com esta opção (não se esqueça de ajustar as outras opções conforme necessário), obtemos o documento de saída (ou seja, uma imagem PNG).

Documento de saída

Aqui está o código -fonte completo para o exemplo:

 1// External LaTeX packages from file system
 2
 3// Create conversion options for Object LaTeX format upon Object TeX engine extension.
 4TeXOptions options = TeXOptions.ConsoleAppOptions(TeXConfig.ObjectLaTeX);
 5// Specify a file system working directory for the output.
 6options.OutputWorkingDirectory = new OutputFileSystemDirectory(OutputDir);
 7// Specify a file system working directory for the required input.
 8// The directory containing packages may be located anywhere.
 9options.RequiredInputDirectory = new InputFileSystemDirectory(Path.Combine(DataDir, "packages"));
10// Initialize the options for saving in PNG format.
11options.SaveOptions = new PngSaveOptions();
12// Run LaTeX to PNG conversion.
13new TeXJob(Path.Combine(DataDir, "required-input-fs.tex"), new ImageDevice(), options).Run();

Entrada necessária arquivada (pacote pgfplots)

Digamos agora que temos o seguinte arquivo de LaTeX bastante simples, que é required-input-zip.tex da nossa solução de exemplo:

 1\documentclass{article}
 2\usepackage[margin=0.25in]{geometry}
 3\usepackage{pgfplots}
 4\pgfplotsset{width=10cm,compat=1.18}
 5\begin{document}
 6
 7First example is 2D and 3D math expressions plotted side-by-side.
 8
 9%Here begins the 2D plot
10\begin{tikzpicture}
11\begin{axis}
12\addplot[color=red]{exp(x)};
13\end{axis}
14\end{tikzpicture}
15%Here ends the 2D plot
16\hskip 5pt
17%Here begins the 3D plot
18\begin{tikzpicture}
19\begin{axis}
20\addplot3[
21    surf,
22]
23{exp(-x^2-y^2)*x};
24\end{axis}
25\end{tikzpicture}
26%Here ends the 3D plot
27
28\end{document}

Na 3ª linha, podemos ver que o arquivo requer o pacote pgfplots, que também não é suportado” nativamente “. Novamente, assumimos que temos os arquivos de origem do pacote pgfplots. É um grande número de arquivos divididos entre dois locais se você os encontrar no diretório de instalação de qualquer aplicativo de tipógrafo de LaTeX. Você pode encontrar a pasta pgfplots nas pastas\tex \generic e \tex \latex. E o conteúdo de ambas as pastas deve ser fornecido conforme a entrada necessária para a biblioteca Aspose.TeX. Queremos que esse arquivo de origem seja embalado em um arquivo zip, então aqui está o layout do arquivo:

Layout do arquivo

E é assim que especificamos o acesso a esses arquivos de origem:

1using (Stream zipStream = File.Open("path-to-zip-with-pgfplots-sources"), FileMode.Open))
2{
3    ...
4    options.RequiredInputDirectory = new InputZipDirectory(zipStream);
5    ...
6}

Depois de executar um TeXJob com esta opção, obtemos o documento de saída:

Documento de saída

Aqui está o código -fonte completo para o exemplo:

 1// External LaTeX packages from ZIP archive
 2
 3// Create conversion options for Object LaTeX format upon Object TeX engine extension.
 4TeXOptions options = TeXOptions.ConsoleAppOptions(TeXConfig.ObjectLaTeX);
 5// Specify a file system working directory for the output.
 6options.OutputWorkingDirectory = new OutputFileSystemDirectory(OutputDir);
 7// Initialize the options for saving in PNG format.
 8options.SaveOptions = new PngSaveOptions();
 9// Create a file stream for the ZIP archive containing the required package.
10// The ZIP archive may be located anywhere.
11using (Stream zipStream = File.Open(Path.Combine(DataDir, "packages\\pgfplots.zip"), FileMode.Open))
12{
13    // Specify a ZIP working directory for the required input.
14    options.RequiredInputDirectory = new InputZipDirectory(zipStream, "");
15    
16    // Run LaTeX to PNG conversion.
17    new TeXJob(Path.Combine(DataDir, "required-input-zip.tex"), new ImageDevice(), options).Run();
18}

NOTA: O resultado foi verificado através do pacote pgfplots versão 1.18.1. Quanto à versão do pacote pfg incluída na biblioteca Aspose.TeX é a 3.1.9a.

Empregando pacotes de fontes externos

Como regra, as distribuições de LaTeX fornecem um conjunto de fontes padrão disponíveis para o tipothting. Exceto essas fontes, Aspose.TeX Inclui vários pacotes de fontes não padrão. Por exemplo, amsfonts, eurosym e wasysym '. Como vimos acima, Aspose.TeX também permite empregar pacotes externos. Mas principalmente estávamos conversando sobre pacotes que não contêm fontes. O **Aspose.TeX** 's*Object TeX*A extensão do motor precisa de mapas de fonte (que são arquivos de texto em um determinado formato com a extensão .mappor convenção) para determinar quais fontes físicas correspondem ao nome da fonte interna de cada Tex. Esses mapas de fonte devem ser carregados na TeX memory durante a fase de inicialização. E, é claro, eles devem estar presentes entre os arquivos do pacote que você está conectando. Como o mecanismo não sabe os nomes de todos os mapas de fonte, ele procura todos os arquivos com a extensão.map`. Portanto, uma implementação da interface IInputWorkingDirectory que é usada como um valor da opção RequiredInputDirectory deve fornecer uma maneira de acessar coleções de nomes de arquivos por extensão. Mais especificamente, essa implementação também deve implementar a interface IFileCollector. As implementações padrão - InputFileSystemDirectory e InputZipDirectory - já o fazem.

Abaixo, fornecemos um exemplo ilustrativo de um diretório de entrada personalizado que também implementa a interface IFileCollector. Enquanto focamos em coletar nomes de arquivos por extensão, omitimos intencionalmente os detalhes do armazenamento e recuperação de arquivos.

 1// Custom implementation of IInputWorkingDirectory for external packages with fonts
 2
 3// This is an implementation of IInputWorkingDirectory that is suitable for the TeX job's RequiredInputDirectory option
 4// in case required input contains fonts provided by external packages.
 5// The class additionally implements IFileCollector, which provides access to file collections by extension.
 6// This is necessary to load external font maps, which are files (outside TeX syntax) that map TeX's
 7// internal font names to file names of physical fonts.
 8public class RequiredInputDirectory : IInputWorkingDirectory, IFileCollector
 9{
10    private Dictionary<string, Dictionary<string, string>> _fileNames =
11        new Dictionary<string, Dictionary<string, string>>();
12
13    public RequiredInputDirectory()
14    {
15    }
16
17    // This method should preliminarily be called for each file entry that is supposed to be located inside
18    // the required input directory. Inside is an example of how the dictionary of file names could be organized
19    // for easy collection of file names by extension.
20    // Here fileName is a full file name. This can be a file path on a file system, a URL, or whatever else (theoretically).
21    public void StoreFileName(string fileName)
22    {
23        string extension = Path.GetExtension(fileName);
24        string name = Path.GetFileNameWithoutExtension(fileName);
25        
26        Dictionary<string, string> files;
27        if (!_fileNames.TryGetValue(extension, out files))
28            _fileNames.Add(extension, files = new Dictionary<string, string>());
29
30        files[name] = fileName;
31    }
32
33    // The IInputWorkingDirectory implementation.
34    public NamedStream GetFile(string fileName, bool searchSubdirectories = false)
35    {
36        // Try to find the file in our stored files
37        foreach (var extFiles in _fileNames.Values)
38        {
39            foreach (var file in extFiles.Values)
40            {
41                if (file.EndsWith(fileName) || Path.GetFileName(file) == fileName)
42                {
43                    return new NamedStream(File.OpenRead(file), fileName);
44                }
45            }
46        }
47        // If not found in stored files, return null (file not available)
48        return new NamedStream(null, fileName);
49    }
50
51    // Here is how we gather file collections by extension.
52    public string[] GetFileNamesByExtension(string extension, string path = null)
53    {
54        Dictionary<string, string> files;
55        if (!_fileNames.TryGetValue(extension, out files))
56            return new string[0];
57
58        return new List<string>(files.Values).ToArray();
59    }
60
61    public void Dispose()
62    {
63        _fileNames.Clear();
64    }
65}

Restrições

Pode acontecer que um pacote exigido pelo seu arquivo de LaTeX seja desenvolvido no kernel LaTeX3e. Esse pacote provavelmente não funcionará com a biblioteca Aspose.TeX, pois este é baseado no kernel LaTeX2e.

Também pode acontecer que um pacote exigido pelo seu arquivo de LaTeX chame diretamente comandos primitivos dependentes do dispositivo que não são suportados pelo mecanismo Object TeX da biblioteca Aspose.TeX. Infelizmente, esse pacote não funcionará com certeza.

Criação de um Agente de IA para Otimização de Pacotes LaTeX Incorporado

Se precisar de criar um agente de IA que otimize o conteúdo para o inventário de pacotes integrado sem recuperações de rede dinâmicas e lentas ou pesquisas no sistema de ficheiros durante a geração, pode utilizar o fluxo de trabalho descrito abaixo.

Em vez de obrigar um LLM a adivinhar quais os pacotes que são seguros ou rápidos de utilizar, o agente utiliza este inventário de pacotes pré-compilado específico para garantir uma composição de documentos 100% fiável.

Arquitetura de Montagem de Documentos Incorporada do Agente de IA

  1. Extração da intenção de layout (camada de análise do LLM) O utilizador fornece dados não estruturados em múltiplos formatos ou diretivas conversacionais. O LLM mapeia os pedidos diretamente para a lista de pacotes incorporados do Aspose (colortbl para sombreado de linhas, geometry para margens, hyperref para espaçamento entre letras e tabularx para colunas de largura variável).

  2. Isolamento da AST e injeção de preâmbulo Em vez de escrever importações de pacotes inchadas, o agente verifica os requisitos do código em relação ao seu manifesto pré-armazenado de motores nativos.

Escreve caminhos de otimização estrutural diretamente na string do preâmbulo do código.

  1. Isolamento e execução de fluxo (Nó do motor Aspose.TeX) O fluxo de tokens compilado, juntamente com os seus ambientes de macro, é despachado para os nomes de trabalhadores isolados. O sistema configura um perfil de tempo de execução da aplicação TeXOptions estrito utilizando o perfil de assembly otimizado (por exemplo, TeXConfig.ObjectLaTeX). Executa com segurança um pipeline de execução TeXJob não bloqueante inteiramente dentro do buffer de fluxo de memória.
1\usepackage[a4paper,margin=0.5in]{geometry}
2\usepackage{amsmath,tabularx,colortbl,hyperref}
  1. Serialização de ativos (Camada de renderização de saída) O sistema mapeia alvos de coordenadas e processa limites de saída, utilizando matrizes de execução vetorial (PdfDevice ou SvgDevice) para devolver layouts de documentação nítidos instantaneamente para a interface do cliente.