Pacotes de LaTeX externos | Aspose.TeX para Java

Pacotes de LaTeX externos

Há vários pacotes comuns de LaTeX incluídos na biblioteca Aspose.TeX para Java. Portanto, você não precisa cuidar de como fornecer esses pacotes ao mecanismo Tex da biblioteca. Mas, às vezes (talvez frequentemente), seu arquivo de LaTeX pode exigir um pacote além do pacote “nativamente” suportado “de pacotes. Nesse caso, você pode tentar fornecer a entrada necessária, ou seja, os arquivos de origem do pacote necessário, usando o método setRequiredInputDirectory () da instância da classe texoptions. Veremos como isso funciona com dois exemplos.

Defina inputFile como o caminho completo do documento LaTeX correspondente e outputDirectory como uma pasta de saída existente. Ambos os exemplos de conversão geram PNG a 150 DPI. Importe as classes Aspose.TeX usadas no exemplo escolhido, com.aspose.tex.rendering.ImageDevice, com.aspose.tex.rendering.PngSaveOptions e, para entrada ZIP, java.io.InputStream e java.nio.file.Files. Trate ou declare as exceções no método chamador. Aplique uma licença conforme o guia de licenciamento.

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

Digamos que temos o seguinte arquivo de LaTeX simples, que é `` requerir-input-f-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}
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}

A terceira linha requer o pacote externo fancybox. Defina packagesDirectory como uma pasta local com fancybox.sty e suas dependências. O exemplo completo abaixo atribui essa pasta a RequiredInputDirectory e gera uma imagem PNG. O dispositivo e os diretórios de trabalho permanecem abertos até o término do trabalho e depois são liberados ou fechados.

Documento de saída

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

 1// Render the fancybox document using external package sources from a local folder.
 2// inputFile is the full TeX input path; packagesDirectory contains fancybox.sty.
 3// outputDirectory is an existing output folder.
 4TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
 5OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
 6InputFileSystemDirectory packages = new InputFileSystemDirectory(packagesDirectory);
 7options.setOutputWorkingDirectory(output);
 8options.setRequiredInputDirectory(packages);
 9PngSaveOptions saving = new PngSaveOptions();
10saving.setResolution(150);
11options.setSaveOptions(saving);
12options.setInteraction(Interaction.NonstopMode);
13options.setTerminalOut(new OutputMemoryTerminal());
14ImageDevice device = new ImageDevice();
15TeXJobResult result;
16int pages;
17try {
18    result = new TeXJob(inputFile, device, options).run();
19    pages = device.getPageCount();
20} finally {
21    device.dispose();
22    output.close();
23    packages.close();
24}

Entrada necessária arquivada (pacote pgfplots)

Vamos agora assumir que temos o seguinte arquivo de LaTeX bastante simples, que é requerir-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 terceira linha, vemos 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 conjunto 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

Defina packagesZip como um java.nio.file.Path para o arquivo contendo os fontes genéricos e LaTeX do pacote. O exemplo Java completo abaixo o abre com Files.newInputStream(...) e atribui um InputZipDirectory a RequiredInputDirectory. O argumento de caminho base vazio seleciona o arquivo inteiro. Mantenha o fluxo ZIP e o diretório abertos até o término do trabalho TeX e depois os feche. O resultado é uma imagem PNG com os dois gráficos.

Documento de saída

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

 1// Render the 2D/3D plots using pgfplots package sources from a ZIP archive.
 2// inputFile is the full TeX input path; packagesZip is a java.nio.file.Path.
 3// outputDirectory is an existing output folder; the ZIP includes generic and latex sources.
 4TeXJobResult result;
 5int pages;
 6try (InputStream zipStream = Files.newInputStream(packagesZip)) {
 7    TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
 8    OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
 9    InputZipDirectory packages = new InputZipDirectory(zipStream, "");
10    options.setOutputWorkingDirectory(output);
11    options.setRequiredInputDirectory(packages);
12    PngSaveOptions saving = new PngSaveOptions();
13    saving.setResolution(150);
14    options.setSaveOptions(saving);
15    options.setInteraction(Interaction.NonstopMode);
16    options.setTerminalOut(new OutputMemoryTerminal());
17    ImageDevice device = new ImageDevice();
18    try {
19        result = new TeXJob(inputFile, device, options).run();
20        pages = device.getPageCount();
21    } finally {
22        device.dispose();
23        output.close();
24        packages.close();
25    }
26}

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.

Usando pacotes de fontes externos

Normalmente, as distribuições de LaTeX vêm com uma seleção de fontes padrão que podem ser usadas para digitar. Além dessas fontes, Aspose.TeX oferece vários pacotes de fontes fora do padrão, como amsfonts, eurosym e wasysym. Como mencionado anteriormente, Aspose.TeX também suporta o uso de pacotes externos, embora nosso foco tenha sido principalmente em pacotes que não incluem fontes. A extensãoObject TexEngine em Aspose.TeX requer mapas de fonte, que são arquivos de texto com a extensão .map que especificam as fontes físicas correspondentes ao nome da fonte interna de cada TEX. Esses mapas de fonte precisam ser carregados na memória do TEX durante a fase de inicialização e devem ser incluídos nos arquivos do pacote. Como o mecanismo não está ciente dos nomes de todos os mapas de fonte, ele procura quaisquer arquivos com a extensão .map. Portanto, a implementação da interface iInputWorkingDirectory usada como o valor da opção requerirInputDirectory deve fornecer uma maneira de acessar coleções de nomes de arquivos com base em sua extensão. Especificamente, essa implementação também deve implementar a interface ifileCollector. As implementações padrão, InputFilesystemDirectory e inputzipDirectory, já atendem a esse requisito.

O RequiredInputDirectory personalizado abaixo implementa ambas as interfaces e lê arquivos locais registrados explicitamente. Salve-o como RequiredInputDirectory.java com os imports incluídos. Registre cada arquivo com storeFileName(...), atribua a instância com options.setRequiredInputDirectory(...) e feche-a após o trabalho. É um registro plano: os nomes dos arquivos devem ser únicos quando solicitados sem um caminho completo. As extensões são comparadas sem diferenciar maiúsculas e minúsculas; o caminho de coleta opcional seleciona um diretório do sistema de arquivos. Registre todos os arquivos necessários de pacotes, mapas de fontes, métricas e fontes físicas. A coleta torna os mapas detectáveis, mas não fornece dados de fontes ausentes.

 1import com.aspose.tex.IInputWorkingDirectory;
 2import com.aspose.tex.IFileCollector;
 3import com.aspose.tex.TeXInputStream;
 4import java.io.IOException;
 5import java.io.UncheckedIOException;
 6import java.nio.file.Files;
 7import java.nio.file.Path;
 8import java.nio.file.Paths;
 9import java.util.ArrayList;
10import java.util.LinkedHashSet;
11import java.util.List;
12import java.util.Locale;
13import java.util.Set;
14
15// Register local package files explicitly, including font maps and their dependencies.
16// Save this class as RequiredInputDirectory.java and close it after the TeX job.
17public class RequiredInputDirectory implements IInputWorkingDirectory, IFileCollector {
18    private final Set<Path> files = new LinkedHashSet<Path>();
19    private final List<TeXInputStream> streams = new ArrayList<TeXInputStream>();
20
21    public void storeFileName(String fileName) {
22        Path file = Paths.get(fileName).toAbsolutePath().normalize();
23        if (!Files.isRegularFile(file)) {
24            throw new IllegalArgumentException("Package file does not exist: " + file);
25        }
26        files.add(file);
27    }
28
29    @Override
30    public TeXInputStream getFile(String fileName, boolean searchSubdirectories) {
31        // This registry is a flat virtual directory; only registered files are accessible.
32        for (Path file : files) {
33            if (file.toString().equals(fileName) || file.getFileName().toString().equals(fileName)) {
34                try {
35                    TeXInputStream stream = new TeXInputStream(Files.newInputStream(file), file.toString());
36                    streams.add(stream);
37                    return stream;
38                } catch (IOException exception) {
39                    throw new UncheckedIOException(exception);
40                }
41            }
42        }
43        return new TeXInputStream(null, fileName);
44    }
45
46    @Override
47    public String[] getFileNamesByExtension(String extension) {
48        return getFileNamesByExtension(extension, null);
49    }
50
51    @Override
52    public String[] getFileNamesByExtension(String extension, String path) {
53        String requested = extension.toLowerCase(Locale.ROOT);
54        if (!requested.isEmpty() && !requested.startsWith(".")) {
55            requested = "." + requested;
56        }
57        Path directory = path == null ? null : Paths.get(path).toAbsolutePath().normalize();
58        List<String> matches = new ArrayList<String>();
59        for (Path file : files) {
60            String name = file.getFileName().toString();
61            int dot = name.lastIndexOf('.');
62            String actual = dot < 0 ? "" : name.substring(dot).toLowerCase(Locale.ROOT);
63            if (actual.equals(requested) && (directory == null || file.getParent().equals(directory))) {
64                matches.add(file.toString());
65            }
66        }
67        return matches.toArray(new String[0]);
68    }
69
70    @Override
71    public void close() throws IOException {
72        IOException failure = null;
73        for (TeXInputStream stream : streams) {
74            try {
75                stream.close();
76            } catch (IOException exception) {
77                if (failure == null) { failure = exception; }
78                else { failure.addSuppressed(exception); }
79            }
80        }
81        streams.clear();
82        files.clear();
83        if (failure != null) { throw failure; }
84    }
85}

Restrições

Um pacote exigido pelo seu arquivo de LaTeX pode ser desenvolvido no kernel LateX3e. Esse pacote provavelmente não funcionará com a biblioteca Aspose.TeX, pois este é baseado no kernel LateX2e.

Além disso, um pacote exigido pelo seu arquivo LaTeX pode chamar diretamente de comandos primitivos dependentes do dispositivo que não são suportados pelo mecanismo Aspose.TeX Library Tex. Infelizmente, esse pacote não funcionará com certeza.