Как использовать не-ASCII символы в рисунках Matlab (для использования в LaTeX doc)? - PullRequest
9 голосов
/ 10 февраля 2011

Я использую включение рисунков 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).

Ответы [ 4 ]

8 голосов
/ 10 февраля 2011

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

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

4 голосов
/ 10 февраля 2011

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

1 голос
/ 08 декабря 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, похоже, не работает.

0 голосов
/ 14 февраля 2013

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

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

  1. Преобразование восьмеричного кода в символ Unicode;
  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, создайте файл file_latin2.eps с кодировкой Latin-2.

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

...