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.

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}[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, vemos que o arquivo requer o pacote FancyBox, que não é suportado” nativamente “. Também assumimos que temos o arquivo de origem do pacote ‘FancyBox’. É um pacote simples, por isso realmente consiste em apenas um arquivo. Podemos colocar esse arquivo em qualquer lugar do nosso sistema de arquivos e especificar o caminho do diretório como simplesmente o seguinte:

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

Depois de executar um trabalho de Tex 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// Create conversion options for Object LaTeX format upon Object TeX engine extension.
 2TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
 3// Specify a file system working directory for the output.
 4options.setOutputWorkingDirectory(new OutputFileSystemDirectory(Utils.getOutputDirectory()));
 5// Specify a file system working directory for the required input.
 6// The directory containing packages may be located anywhere.
 7options.setRequiredInputDirectory(new InputFileSystemDirectory(Utils.getInputDirectory() + "packages"));
 8// Initialize the options for saving in PNG format.
 9options.setSaveOptions(new PngSaveOptions());
10// Run LaTeX to PNG conversion.
11new TeXJob(Utils.getInputDirectory() + "required-input-fs.tex", new ImageDevice(), options).run();

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

E aqui está como especificamos o acesso a esses arquivos de origem:

1final Stream zipStream = File.Open("path-to-zip-with-pgfplots-sources"), FileMode.Open))
2try {
3    ...
4    options.setRequiredInputDirectory(new InputZipDirectory(zipStream));
5    ...
6} finally {
7    if (zipStream != null)
8        zipStream.close();
9}

Depois de executar um trabalho de Tex 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// Create conversion options for Object LaTeX format upon Object TeX engine extension.
 2TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
 3// Specify a file system working directory for the output.
 4options.setOutputWorkingDirectory(new OutputFileSystemDirectory(Utils.getOutputDirectory()));
 5// Initialize the options for saving in PNG format.
 6options.setSaveOptions(new PngSaveOptions());
 7// Create a file stream for the ZIP archive containing the required package.
 8// The ZIP archive may be located anywhere.
 9final InputStream stream = new FileInputStream(Utils.getInputDirectory() + "packages\\pgfplots.zip");
10try {
11    // Specify a ZIP working directory for the required input.
12    options.setRequiredInputDirectory(new InputZipDirectory(stream, ""));
13    
14    // Run LaTeX to PNG conversion.
15    new TeXJob(Utils.getInputDirectory() + "required-input-zip.tex", new ImageDevice(), options).run();
16} finally {
17    if (stream != null)
18        stream.close();
19}

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.

Abaixo, apresentamos um exemplo de um diretório de entrada personalizado que também implementa a interface ifileCollector. Nossa ênfase principal é a coleta de nomes de arquivos com base em sua extensão e omitimos intencionalmente os detalhes do armazenamento e recuperação de arquivos.

 1// This is an implementation of IInputWorkingDirectory that is suitable for the TeX job's RequiredInputDirectory option
 2// in case required input contains fonts provided by external packages.
 3// The class additionally implements IFileCollector, which provides access to file collections by extension.
 4// This is necessary to load external font maps, which are files (outside TeX syntax) that map TeX's
 5public class RequiredInputDirectory implements IInputWorkingDirectory, IFileCollector
 6{
 7    private Map<String, Map<String, String>> _fileNames = new HashMap<String, Map<String, String>>();
 8
 9    public RequiredInputDirectory()
10    { 
11    }
12
13    // This method should preliminarily be called for each file entry that is supposed to be located inside
14    // the required input directory. Inside is an example of how the dictionary of file names could be organized
15    // for easy collection of file names by extension.
16    // Here fileName is a full file name. This can be a file path on a file system, a URL, or whatever else (theoretically).
17    public void storeFileName(String fileName)
18    {
19        String extension = getExtension(fileName);
20        String name = getFileNameWithoutExtension(fileName);
21
22        Map<String, String> files = _fileNames.get(extension);
23        if (files == null)
24            _fileNames.put(extension, files = new HashMap<String, String>());
25
26        files.put(name, fileName);
27    }
28
29    // The IInputWorkingDirectory implementation.
30    public TeXInputStream getFile(String fileName, boolean searchSubdirectories)
31    {
32        return new TeXInputStream(null, fileName); // Here we actually return a stream for the file requested by its name.
33    }
34    
35    // Here is how we gather file collections by extension.
36    public String[] getFileNamesByExtension(String extension)
37    {
38    	return getFileNamesByExtension(extension, null);
39    }
40
41    // Here is how we gather file collections by extension.
42    public String[] getFileNamesByExtension(String extension, String path)
43    {
44        Map<String, String> files = _fileNames.get(extension);
45        if (files == null)
46            return new String[0];
47        
48        return files.values().toArray(new String[0]);
49    }
50    
51    private String getExtension(String fileName)
52    {
53    	int pos = fileName.indexOf('.');
54    	if (pos < 0)
55    		return "";
56    	
57    	return fileName.substring(pos);
58    }
59    
60    private String getFileNameWithoutExtension(String fileName)
61    {
62    	int pos = fileName.lastIndexOf('/');
63    	if (pos >= 0)
64    		fileName = fileName.substring(pos + 1);
65    	
66    	pos = fileName.indexOf('.');
67    	if (pos < 0)
68    		return fileName;
69    	
70    	return fileName.substring(0, pos);
71    }
72
73    public void close()
74    {
75        _fileNames.clear();
76    }
77}

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.

Have any questions about Aspose.TeX?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.