Как использовать символы, отличные от ASCII, в фигурах Matlab (для использования в документе LaTeX)?

Я использую включение фигур, нарисованных Matlab, в LaTeX. Мой обычный рабочий процесс следующий:

  1. Скрипт в Matlab создает фигуру (и),
  2. Я настраиваю то, что мне нужно, в редакторе визуальных фигур,
  3. Рисунок сохраняется как .fig (для будущих изменений) и .eps (для включения в LaTeX),
  4. Я конвертирую файлы .eps в .pdf,
  5. На файлы PDF есть ссылки в исходном коде LaTeX.

Кстати: когда я пытаюсь использовать в метках осей, легенде, заголовках и т. Д. Символы, отличные от ASCII, (точнее: польские национальные символы, например, '', 'ę', 'ś', 'ć') кодирование в редакторе фигур Matlab все в порядке, и символы отображаются правильно. После экспорта в .eps все они неверны (пример: «Głębokość» превращается в «G³êbokoœæ»).

Есть ли способ сделать это правильно, настроив параметры Matlab или изменив рабочий процесс?

Примечание. Я обнаружил, что экспорт в .png или другие не-векторные форматы правильно обрабатывает кодировку символов, но я бы не хотел делать это - я спрашиваю для способа "сохранить вектор". Экспорт непосредственно в .pdf дает тот же эффект, что и .eps, например это дает неправильные результаты.

PS. Matlab - это R2008a, файлы .latex скомпилированы с помощью pdflatex, файлы .eps с epstopdf из MikTeX 2.9 (все под Win7).


person triazotan    schedule 10.02.2011    source источник


Ответы (4)


Вы можете взглянуть на psfrag, это то, что я обычно использую, когда пытаюсь использовать фигуры Matlab в LaTeX. Вы в основном помещаете только теги в рисунок в Matlab и впоследствии заменяете эти теги текстом LaTeX. Самым большим преимуществом является то, что это позволяет использовать одинаковые символы в тексте и на рисунках.

Изменить: при поиске URL-адреса psfrag я нашел сценарий Matlab, чтобы упростить это: LaPrint.

person groovingandi    schedule 10.02.2011
comment
Я как-то упустил информацию о том, что использую pdflatex. Есть ли у вас какие-нибудь идеи по поводу не такого уж уродливого обходного пути? - person triazotan; 10.02.2011
comment
Matlab может интерпретировать латекс прямо в текстовых полях. Вы пытались поместить латексную конструкцию, такую ​​как \ 'c, в текстовое поле Matlab и установить интерпретатор на латекс вместо прямого ввода ć? - person groovingandi; 10.02.2011
comment
Да, у меня есть. Приведенный вами пример работает, но это единственное решение для трех польских акцентов: острый ударение (\ '), точка над буквой (\.) И L с чертой (\ L). Ogonek (то есть диакритический знак в 'ą' или 'ę') обозначается \ k {} и не интерпретируется должным образом в Matlab. Одним из решений этого является использование седиллы (\ c {}), но это не совсем то же самое и выглядит немного странно. - person triazotan; 10.02.2011
comment
Я думал, что версия Matlab для Windows будет лучше с точки зрения интерпретации LaTeX, я знаю, что в версии для Linux есть некоторые проблемы. Если это не сработает, я вижу единственное решение - psfrag. Это не означает, что вы больше не можете использовать pdflatex для своего полного документа, но, конечно, сложно создавать дополнительные документы для ваших фигур, компилировать их с помощью латекса и вставлять вывод в ваши основные документы. - person groovingandi; 11.02.2011
comment
На этот раз я использовал cedilla-solution, потому что документ, который я сейчас делаю, срочен и слишком велик для разработки общего решения для (по крайней мере) полуавтоматической компиляции фигур. Тем не менее, Psfrag - отличный совет для будущих рабочих процессов, спасибо! - person triazotan; 11.02.2011

Другое возможное решение - использовать matlab2tikz. Он создает исходный файл tikz / pgfplot, который может быть включен непосредственно вашим источником латекса. Это означает, что он использует возможности LaTeX для рендеринга шрифтов. Вы можете напрямую редактировать сгенерированный файл, чтобы настроить ярлыки и тому подобное. К сожалению, это работает не для всех фигур MATLAB.

person mbauman    schedule 10.02.2011

char(2048) will be shown by `print -depsc` as 'à ',
char(5064) as 'á',
char(28808) as 'ç',
char(37000) as 'é',
char(32904) as 'è', ...

Для других символов в кодировке latin1 посмотрите:

for j=0:4*64;clf;subplot(1,1,1);plot(eye(2));leg='';for i=4*(j+1)-1:-1:max(1,4*j);
str=['     ',num2str(i*64)];leg(i,:)=[str(end-4:end),':',char(64*i+(0:63))];
end;
title(leg,'interpreter','none');print('-depsc',['ascii',num2str(j),'.ps']);
end;

Я использую pdflatex, поэтому psfrag не вариант, а pdfrack, похоже, не работает.

person Daniel    schedule 08.12.2011

Для экспорта фигуры Matlab с символами, отличными от ASCII ISO-8859-1, в Windows нет проблем, но в Linux с локалью UTF-8 есть ошибка Matlab и временное решение. Вопрос здесь нацелен на символы, которых нет в ISO-8859-1, что более сложно. Вот решение, которое я опубликовал по соответствующему вопросу.

Если количество необходимых символов меньше 256 (8-битный формат) и в идеале в стандартном наборе кодировок, то одно из решений:

  1. Преобразуйте восьмеричный код в символ Юникода;
  2. Сохраните файл в целевом стандарте кодировки (в 8-битном формате);
  3. Добавьте вектор кодирования для целевого набора кодировок.

Например, если вы хотите экспортировать польский текст, вам необходимо преобразовать файл в ISO-8859-2. Вот реализация на Python (мультиплатформенная):

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys,codecs
input = sys.argv[1]
fo = codecs.open(input[:-4]+'_latin2.eps','w','latin2')
with codecs.open(input,'r','string_escape') as fi:
    data = fi.readlines()
with open('ISOLatin2Encoding.ps') as fenc:
    for line in data:
        fo.write(line.decode('utf-8').replace('ISOLatin1Encoding','MyEncoding'))
        if line.startswith('%%EndPageSetup'):
            fo.write(fenc.read())
fo.close()

сохраняется как eps_lat2.py; затем запустив команду python eps_lat2.py file.eps, где file.eps - это eps, созданный Matlab, создаст file_latin2.eps с кодировкой Latin-2. Файл ISOLatin2Encoding.ps содержит вектор кодирования:

/MyEncoding
% The first 144 entries are the same as the ISO Latin-1 encoding.
ISOLatin1Encoding 0 144 getinterval aload pop
% \22x
    /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
    /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
% \24x
    /nbspace /Aogonek /breve /Lslash /currency /Lcaron /Sacute /section
    /dieresis /Scaron /Scedilla /Tcaron /Zacute /hyphen /Zcaron /Zdotaccent
    /degree /aogonek /ogonek /lslash /acute /lcaron /sacute /caron
    /cedilla /scaron /scedilla /tcaron /zacute /hungarumlaut /zcaron /zdotaccent
% \30x
    /Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla
    /Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron
    /Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply
    /Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /Tcedilla /germandbls
% \34x
    /racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla
    /ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron
    /dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide
    /rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /tcedilla /dotaccent
256 packedarray def

Вот еще одна реализация в Linux с Bash:

#!/bin/bash
name=$(basename "$1" .eps)
ascii2uni -a K "$1" > /tmp/eps_uni.eps
iconv -t ISO-8859-2 /tmp/eps_uni.eps -o "$name"_latin2.eps
sed -i -e '/%EndPageSetup/ r ISOLatin2Encoding.ps' -e 's/ISOLatin1Encoding/MyEncoding/' "$name"_latin2.eps

сохраняется как eps_lat2; затем выполнение команды sh eps_lat2 file.eps создает файл_latin2.eps в кодировке Latin-2.

Его можно легко адаптировать к другим 8-битным стандартам кодирования, изменив вектор кодирования и параметр iconv (или codecs.open) в скрипте.

person guimillet    schedule 14.02.2013