Внешние пакеты LaTeX | Java

Внешние пакеты LaTeX

Существует ряд общих пакетов LaTeX, включенных в библиотеку Aspose.TeX для Java. Таким образом, вам не нужно заботиться о том, как предоставить эти пакеты движку TeX библиотеки. Но иногда (возможно, часто) вашему файлу LaTeX может потребоваться пакет, выходящий за рамки «изначально» поддерживаемого «пакета» пакетов. В этом случае вы можете попытаться предоставить требуемые входные данные, то есть исходные файлы требуемого пакета, используя метод setRequiredInputDirectory() экземпляра класса TeXOptions. Мы увидим, как это работает, на двух примерах.

Распакованный требуемый ввод (пакет «fancybox»)

Допустим, у нас есть следующий простой файл LaTeX, который называется required-input-fs.tex из нашего примера решения:

 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}

В третьей строке мы видим, что для файла требуется пакет «fancybox», который «изначально» не поддерживается. Мы также предполагаем, что у нас есть исходный файл пакета «fancybox». Это простой пакет, поэтому он состоит всего из одного файла. Мы можем разместить этот файл в любом месте нашей файловой системы и указать путь к каталогу следующим образом:

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

После запуска задания TeX с этой опцией (не забудьте настроить другие параметры по мере необходимости) мы получим выходной документ (т. е. изображение PNG).

Выходной документ

Вот полный исходный код примера:

 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();

Заархивированные необходимые данные (пакет pgfplots)

Давайте теперь предположим, что у нас есть следующий также довольно простой файл LaTeX, который называется required-input-zip.tex из нашего примера решения:

 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}

В третьей строке мы видим, что для файла требуется пакет pgfplots, который также не поддерживается «изначально». Опять же, мы предполагаем, что у нас есть исходные файлы пакета pgfplots. Это довольно большой набор файлов, которые разделены между двумя местами, если вы найдете их в каталоге установки любого приложения для набора текста LaTeX. Вы можете найти папку pgfplots в папках \tex\generic и \tex\latex. И содержимое обеих этих папок должно быть предоставлено в качестве входных данных для библиотеки Aspose.TeX. Мы хотим, чтобы эти исходные файлы были упакованы в ZIP-архив, поэтому вот макет архива:

макет архива

И вот как мы указываем доступ к этим исходным файлам:

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}

После запуска задания TeX с этой опцией мы получим выходной документ:

Выходной документ

Вот полный исходный код примера:

 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}

NOTE: The result was verified using the pgfplots package version 1.18.1. While the version of the pfg package included in the Aspose.TeX library is 3.1.9a.

Использование внешних пакетов шрифтов

Обычно дистрибутивы LaTeX поставляются с набором шрифтов по умолчанию, которые можно использовать для набора текста. В дополнение к этим шрифтам Aspose.TeX предлагает несколько нестандартных пакетов шрифтов, таких как «amsfonts», «eurosym» и «wasysym». Как упоминалось ранее, Aspose.TeX также поддерживает использование внешних пакетов, хотя мы в основном фокусировались на пакетах, не включающих шрифты. Расширение движка Object TeX в Aspose.TeX требует карт шрифтов, которые представляют собой текстовые файлы с расширением .map, которые определяют физические шрифты, соответствующие внутреннему имени шрифта каждого TeX. Эти карты шрифтов необходимо загрузить в память TeX на этапе инициализации и включить в файлы пакета. Поскольку движку неизвестны названия всех карт шрифтов, он ищет любые файлы с расширением .map. Следовательно, реализация интерфейса IInputWorkingDirectory, используемого в качестве значения опции RequiredInputDirectory, должна предоставлять способ доступа к коллекциям имен файлов на основе их расширения. В частности, эта реализация также должна реализовывать интерфейс IFileCollector. Стандартные реализации InputFileSystemDirectory и InputZipDirectory уже удовлетворяют этому требованию.

Ниже мы представляем пример пользовательского обязательного входного каталога, который также реализует интерфейс IFileCollector. Наш основной акцент делается на сборе имен файлов на основе их расширения, и мы намеренно опускаем детали хранения и поиска файлов.

 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}

Ограничения

Пакет, необходимый для вашего файла LaTeX, может быть разработан под ядром LaTeX3e. Такой пакет, скорее всего, не будет работать с библиотекой Aspose.TeX, поскольку последняя основана на ядре LaTeX2e.

Кроме того, пакет, необходимый для вашего файла LaTeX, может напрямую вызывать зависящие от устройства примитивные команды, которые не поддерживаются механизмом Object TeX библиотеки Aspose.TeX. Такой пакет, к сожалению, точно не подойдет.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.